2013年1月10日 星期四

利用 Fail2ban 封鎖暴力破解

前輩丟出個功課找些好方法來自動偵測+阻擋。

Fail2ban 就是一個非常實用的套件!

官方網頁:http://www.fail2ban.org

環境:
  • CentOS release 5.8 (Final)
  • Dovecot 1.0.7
  • Postfix 2.3.3 
  • fail2ban 0.8.4
安裝:# yum -y install fail2ban

若無法安裝,用 # yum search fail2ban 也無法找到套件,需編輯以下資料。

# vim /etc/yum.repos.d/CentOS-Base.repo

[atrpms]
name=Red Hat Enterprise Linux $releasever - $basearch - ATrpms
baseurl=http://dl.atrpms.net/el$releasever-$basearch/atrpms/stable
gpgkey=http://ATrpms.net/RPM-GPG-KEY.atrpms
gpgcheck=1
enabled=1





套件架構:
  • 安裝位置:/etc/fail2ban
  • 設定檔:
    •  fail2ban.conf      fail2ban 設定
    •  jail.conf               各服務阻擋參數設定
      2013.03.19 取自官方文件
      Every .conf file can be overridden with a file named .local. The .conf file is read first, then .local, with later settings overriding earlier ones. Thus, a .local file doesn't have to include everything in the corresponding .conf file, only those settings that you wish to override.
      因此有任何客製化的設定,要另外建立 jail.local
    • filter.d/*. conf       過濾規則、判斷式 
  • jail.conf 內的各個設定,必須在filter.d有一個對應的 conf 檔案。
    例如:在 jail.conf內新增 [dovecot-check] 設定,且filter設為 dovecot-check,那就必須在 filter.d資料夾新增 dovecot-check.conf
 fail2ban.conf 設置說明:
  • 沒什麼特別的地方,重點放在log設置位置
    logtarget = /var/log/fail2ban.log
 jail.local 設置說明:
  • 主要為各個需要偵測的服務設定。
  • 範例:
    新增 dovecot-check 設定
    [dovecot-check]
    enabled = true
    #過濾名稱,對應filter.d/*.conf 
    filter = dovecot-check 
    #iptables設定 
    action =  iptables-multiport[name=dovecot-check, port="pop3,pop3s,imap,imaps",  protocol=tcp]
              sendmail-whois[name=dovecot, dest=xxx@example.com, sender=xxx@example.com] 
     
    #需要掃描的記錄檔
    logpath = /var/log/secure
    #排除的ip、網域
    ignoreip = 168.192.0.1  192.168.1.0/24
    #阻擋的時間,-1表示永久阻擋 
    bantime  = 86400
    #監視的log時間區段
    findtime  = 300
    #最高嘗試錯誤次數
    maxretry =  3
    其中部份參數說明如下:
    • action中的port:可直接打上標準的服務名稱或是port number。
    • sendmail-whois中的dest:預設是寄到 root ,也就是本機端的root帳戶的信箱。
    • sendmail-whois中的sender:這個設定會顯示在寄信的來源位置,預設是 fail2ban@mail.com 。
      sendmail-whois 可省略。
    • logpath:mail log預設值是 /var/log/secure。每個Linux發行版的服務記錄登入訊息的位置都不太一樣,dovecot會將訊息記錄在 /var/log/secure ,因此參數必須設置成此路徑。
    • maxretry:最高嘗試錯誤次數。一旦登入錯誤超過這個次數,fail2ban就會發生阻擋事件,將該IP擋在門外。預設是使用 [DEFAULT] 區塊中的maxretry ,可另外在這邊重新指定。實際上,嘗試登入時可以比maxretry還多一次,例如maxretry = 3,那麼登入時可以錯誤4次才會被擋下。
    • bantime:發生阻擋事件之後,阻擋該IP的時間。預設是用 [DEFAULT] 區塊中的 bantime ,單位是秒,也就是10分鐘。但是這個阻擋時間實在太短,有人設定為 86400,也就是一整天。若設定為 -1 ,表示永久阻擋。
filter.d/*. conf設置說明:
  • 比照 jail.local 的設定,由於新增了 dovecot-check,因此也在 filter.d資料夾新增 dovecot-check.conf
  •  dovecot-check.conf 內容範例:
    [Definition]
    #掃描log檔時的過濾規則
    failregex =  (?: Authentication failure|Aborted login|Disconnected).*rip=(?:::f{4,6}:)?(?P<host>\S*),
    .*
    #排除部份
    ignoreregex  = (?: Disconnected: Logged out).*
    • failrege:可自行使用正規表示式修改成需要的內容(由於小弟不熟,直接套用網路上的設定後再做測試)

測試 filter 內設定是否正確:
  • fail2ban-regex [log路徑] [filter路徑]
    fail2ban-regex /var/log/dovecot.log /etc/fail2ban/filter.d/dovecot-check.conf 
啟動 fail2ban 的服務:
  •  service fail2ban start
    {start|stop|status|restart}
重新載入 fail2ban 的設定:
  • fail2ban-client reload
查看iptable的設定:
  • iptables –L
查看 fail2ban 的狀態:
  • fail2ban-client status 
查看某服務過濾情況:
  • fail2ban-client status [jail.conf 設定的名稱]
    fail2ban-client status dovecot-check
 設定 fail2ban 開機時自動啟動:
  • chkconfig fail2ban on


補充說明:
  • 如果在 dovecot 有另外指定log位置,jail.local內的設定要指到相對應的log。
  • dovecot 會將登入失敗的訊息會放在 /var/log/secure /var/log/maillog(預設) 內,2邊都做測試會比較保險。



參考:

5 則留言:

  1. 防堵網頁攻擊

    # vim /etc/fail2ban/jail.conf

    [apache-badbots]
    enabled = true
    filter = apache-badbots
    action = iptables-multiport[name=BadBots, port="http,https"]
    logpath = /var/log/httpd/access_log
    bantime = 172800
    maxretry = 1

    [httpd]
    enabled = true
    filter = httpd
    action = iptables[name=httpd, port=80, protocol=tcp]
    logpath = /var/log/httpd/access_log
    maxretry = 3
    bantime = 86400


    # vim /etc/fail2ban/filter.d/httpd.conf
    [Definition]
    failregex = ^ -.*"(GET|POST).*HTTP.*" (202|400|403|404)

    回覆刪除
    回覆
    1. http.conf改為
      failregex = [[]client < HOST >[]] (File does not exist): .*

      --
      < HOST > 中間的空白要拿掉

      刪除
  2. 雖然官方文件建議有新的規則要用 name.local 的方式另外建新檔案設定,但是我還是比較習慣修改原檔案

    回覆刪除
  3. 新增 FreeBSD 安裝方式
    # cd /usr/ports/security/py-fail2ban
    # make install clean

    開機時啟動
    # vim /etc/rc.conf
    加入下面一行
    fail2ban_enable="YES"

    啟動 fail2ban
    # /usr/local/etc/rc.d/fail2ban start

    fail2ban 設定檔位置
    /usr/local/etc/fail2ban/

    設定的部份同 centos

    查看 ipfw firewall 是否有阻擋下來
    # ipfw list

    回覆刪除
  4. # vim /etc/fail2ban/jail.conf
    [secure-check]
    enabled = true
    filter = secure-check
    action = iptables-multiport[name=secure-check, port="pop3,pop3s,imap,imaps,ssh", protocol=tcp]
    sendmail-whois[name=securei-check, dest=dns, sender=fail2ban@chief.com.tw]
    logpath = /var/log/secure
    # bantime = 60*60*24*5 (5 day)
    bantime = 432000
    findtime = 180
    maxretry = 3

    # vim /etc/fail2ban/filter.d/httpd.conf
    failregex = authentication failure.* rhost= < HOST >
    ignoreregex = (?: Disconnected: Logged out).*

    回覆刪除