2015年6月29日 星期一

ownCloud 8.x 在 R-Proxy 後方啟用 Fail2Ban 功能

本文是參考  Secure Owncloud Server
http://www.rojtberg.net/711/secure-owncloud-server/

但由於我的 ownCloud 是在 R-Proxy 之後,所以無法使用 iptables 來阻擋,所以只能從程式下手


我的 R-Proxy 是使用 Nginx,所以必須要加入 X-Forwarded-For 才能讓後方的網站取得實際的IP
proxy_set_header X-Forwarded-For $remote_addr;



ownCloud 必須要先安裝 Extra Security 0.2.0 這個套件

https://apps.owncloud.com/content/show.php/ExtraSecurity?content=168084&PHPSESSID=mcuc695bok6ptj576kt2k4dbu7

套件中的說明有一句話:
    Some built-in attack blocking functions, like fail2ban, will be enabled in upcoming releases.

原本期待作者作者什麼時候更新版本,但好像等很久沒下文,所以乾脆自己弄了


安裝後,系統有提示要修改 remote.php ,所以開頭修改成如下

<?php
require_once 'apps/extrasecurity/lib/intercept.php';



要先啟用登入失敗的 Log 紀錄功能,修改 config/config.php,將檔案後面加入4行設定如下

  'logtimezone' => 'Asia/Taipei',
  'logfile' => '/var/log/owncloud.log',
  'loglevel' => '2',
  'log_authfailip' => true,
);



修改 Extra Security 套件,檔名為  apps/extrasecurity/hooks/userhooks.php ,修改成如下
目前的寫法是只要一小時整點內錯三次就會擋起來,這是我偷懶的寫法

        public function invalidUserAccess( $user, $ip, $time ){
                $invalidAccess = false;
                $rules = \OCA\extrasecurity\extrasecurity::getRules();

                for($i = 0; $i < sizeof($rules); $i++){
                        if( $invalidAccess === false ){
                                $invalidAccess = $this->checkRule( $rules[$i], $user, $ip, $time );
                        }
                }

                // add by garry start
                exec("/bin/grep \"X-Forwarded-For: '$ip'\" /var/log/owncloud.log | /bin/grep `date +%Y-%m-%dT%H` | /usr/bin/wc -l",$n);
                if ($n[0] > 2) {
                        $invalidAccess = true;
                }
                // add by garry end

                 return $invalidAccess;



這樣就大功告成了,可以試試看是否錯三次就無法登入。



但是為了效能,我不想讓 owncloud.log 太大,所以我會設定 crontab 排程將檔案改名,並保留三天

0 0 * * * /bin/cp /var/log/owncloud.log.2 /var/log/owncloud.log.3 ; /bin/cp /var/log/owncloud.log.1 /var/log/owncloud.log.2 ; /bin/cp /var/log/owncloud.log /var/log/owncloud.log.1 ; echo > /var/log/owncloud.log