Shunze 學園 >電腦資訊學系 >吃軟不吃硬 > 《分享》Ubuntu安裝fail2ban 哈囉,還沒有註冊或者登入。請你[註冊|登入]
« 上一篇主題 下一篇主題 » 顯示成列印模式 | 增加到我的最愛
發表新主題 發表回覆
作者
主題
shunze
工友伯伯


註冊日期: 2002 04
來自: 潮汐終止之地
文章: 2334

shunze 離線
《分享》Ubuntu安裝fail2ban引用回覆 編輯/刪除文章 搜尋由  發表的其他文章 回報給版主 IP 位置 回此頁最上方

前陣子在Youtube上看了駭客工具的demo影片,
對於駭客工具掃port以及破解密碼的速度著實嚇了一跳。

我想,對於任何一個IT人員,暴力破解密碼總是讓人擔心的,
不論是Windows的RDP或是Linux的SSH,一旦被暴力破解了,再多的安全防護,也是形同虛設。

那麼在Ubuntu上,有沒有防制暴力破解的套件?
發現某IP在密碼測試錯了幾次之後,就強制封顉該IP使用此服務一段時間?
甚至是該將惡意IP永久封鎖,不得再使用此服務?

像這樣重要且普遍的需求,自然是有的。
那就是 fail2ban 套件。

以下順子以Ubuntu 14.04為環境,進行fail2ban的安裝。

  1. 安裝fail2ban套件。
    apt-get install fail2ban


  2. 安裝完fail2ban套件後,其安裝路徑是在 /etc/fail2ban。
    該目錄下,有兩個重要的設定檔 fail2ban.conf 與 jail.conf,
    其中 jail.conf 會因套件的更新而被覆寫,所以fail2ban要求使用者先建立一個副本 jail.local,
    所有的設定均於 jail.local 進行編輯。
    cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local


    設定檔 fail2ban.conf 堙A主要是對log的層級進行定義,維持預設即可,
    堶惘酗@個重要參數 logtarget 定義了fail2ban的log檔,預設路徑如下,
    當fail2ban在執行上有問題時,可於log檔中尋找問題線索。
    logtarget = /var/log/fail2ban.log


    而 jail.conf 的 [DEFAULT] 區段堙A則可對白名單、封鎖時間、允許密碼猜測次數、封鎖動作,等進行定義。
    其中 ignoreip 參數是用來定義白名單,預設只有 127.0.0.1/8 本機網段,有需要增加網段時,以空白字元分隔即可。
    ignoreip = 127.0.0.1/8 192.168.0.1/32


    bantime 參數,則是定義封鎖時間,預設是600秒,若想永久封鎖,可改為-1。
    bantime = -1


    findtime 參數,則是定義距離上一次錯誤密碼的時間,預設是600秒。
    maxretry 參數,則是允許密碼猜測的最多次數,預設為3次。
    以上以預設條件綜合起來說,就是600秒內,若該IP嘗試3次錯誤的猜測,第4次就會被fail2ban進行封鎖,預設封鎖時間為600秒。

    接下來三個參數 destemail,sendername,mta 則是跟發送通知郵件有關的參數。
    destemail 參數,是收件人的email。
    sendername 參數,是寄件人的顯示名稱。
    mta 參數,則發送郵件的agent,預設是sendmail。

    若你跟順子一樣,裝了exim4套件,想透過Gmail來發信,那麼這三個參數可以修改如下。
    destemail = 你的帳號@gmail.com
    sendername = Fail2Ban
    mta = mail


    接來一個重要的參數是 action,此參數決定了封鎖IP時的做法,預設有如下三種。
    # The simplest action to take: ban only
    action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]

    # ban & send an e-mail with whois report to the destemail.
    action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
    %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s", sendername="%(sendername)s"]

    # ban & send an e-mail with whois report and relevant log lines
    # to the destemail.

    action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
    %(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s", sendername="%(sendername)s"]

    action 預設參數是 action_,此預設參數並不會寄發郵件通知;
    若要改為寄發郵件通知,可以修改為 action_mwaction_mwl
    action = %(action_mw)s


  3. jail.conf 通用區段堛滌捊く]定好了,接著就可以在設定檔的後半段來進行個別服務的設定。
    fail2ban預設只對SSH啟用,所以在jail.conf的 [ssh] 區段堙A我們可以看到 enabled 參數是 true 啟用的;
    而其它 [sasl]、[vsftpd]、[postfix]、[dovecot]…區段的 enabled 參數則是 false,預設狀態下未啟用。
    這部分請依實際需求來進行啟用,這篇文章媔隊l只測試了SSH的封阻功能。

    所有支援的服務,其相關偵測過濾細節,則是放在 /etc/fail2bain/filter.d/ 目錄中,
    以SSH為例,其設定檔就是 /etc/fail2bain/filter.d/sshd.conf,有興趣的朋友可以自行研究。

    若要啟用服務的參數不同於 [DEFAULT] 堛熙q用設定,那麼我們可以在服務區段中,再設定一次參數;
    服務區段中的參數,其優先權大於 [DEFAULT] 堛熙q用設定。

    設定好,重啟一下fail2ban服務,然後我們就可以進行測試了。
    service fail2ban restart


  4. 在SSH的測試上,我們可以故意使用錯誤的密碼來登入SSH進行測試。
    在失敗次數達最大值後,理論上我們會被強迫踢出,
    然後我們可以透過iptables的檢視指令,來查看被封鎖的規則。
    iptables -L



    若偵測服務的 action 參數是含有mail通知的 action_mwaction_mwl
    那麼我們的email也會收到Fail2Ban寄來的通知信。



  5. 那被封鎖的IP如何解除封鎖呢?
    由於fail2ban是透過iptables來進行封鎖的,
    所以要解除封鎖,也要從iptables來下手,先查出它是對應到哪條規則,然後再去刪除掉這條規則。
    iptables -L --line-numbers
    iptables -D <chain-name> <line-number>



    以順子的例子為例,透過 iptables -L --line-numbers 查出的chain-name為fail2ban-ssh,
    遭封鎖IP 192.168.0.2的line-number為1,
    那我們就可以下如下的指令將這條規則刪除,以解除192.168.0.2的封鎖。
    iptables -D fail2ban-ssh 1


    另外還有一個fail2ban-client指令,據說可以用來解除IP的封鎖?
    但順子試了一整個晚上,還是試不出來,這部分就不誤導大家了...

  6. root帳號無法偵測封鎖!?
    最後在測試中順子發現,以root帳號進行ssh登入測試,fail2ban是不會擋的。
    網路上有人跟順子一樣有相同結果,但有些人的版本又可以擋root帳號。

    如果跟順子一樣擋不掉root帳號,
    那就參考網路上的文章,把root帳號於ssh中,設定為禁止登入。
    反正對ubuntu而言,root帳號本就不提供使用,
    在ssh中設定禁止root登入?也是剛好而已∼

    修改 /etc/ssh/sshd_config 文件,並將 PermitRootLogin 參數設定為 no 即可。
    PermitRootLogin no


  7. 如果想要更狠一點,一偵測到密碼猜測的行為,就直接封鎖該IP,
    管它用的是SSH還是FTP,完全拒絕提供該IP任何服務,那要怎麼做?

    首先,先在 jail.local 中查看 banaction 參數的內容(預設是iptables-multiport)。
    banaction = iptables-multiport

    以預設的 iptables-multiport 為例,接著到 /etc/fail2ban/action.d/ 目錄下,修改對應的設定檔 iptables-multiport.conf,
    將 actionban 與 actionunban 這兩個iptables的規則改為完全封鎖的設定。
    #actionban = iptables -I fail2ban-<name> 1 -s <ip> -j <blocktype>
    actionban = iptables -I INPUT -s <ip> -j DROP
    ...
    #actionunban = iptables -D fail2ban-<name> -s <ip> -j <blocktype>
    actionunban = iptables -D INPUT -s <ip> -j DROP

    最後再重啟fail2ban服務即可∼
    service fail2ban restart


  8. 重開機後,封鎖還有效嗎?
    很遺憾的,重開機或重啟服務後,因iptables中對應的chain重新載入,之前封鎖的IP就不見了...
    不過網路上有一篇文章可以達到永久封鎖的效果 - How to make fail2ban bans persistent

    它的工作原理是在進行IP封鎖時,也同時將封鎖的IP寫入一個檔案,例如ip.blacklist,
    然後在啟動服務時,再將此檔案中的IP載入iptables的chain,以達持續封鎖的效果。
    actionban = iptables -I fail2ban-<name> 1 -s <ip> -j DROP
        echo <ip> >> /etc/fail2ban/ip.blacklist

    actionstart = iptables -N fail2ban-<name>
        iptables -A fail2ban-<name> -j RETURN
        iptables -I INPUT -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
        cat /etc/fail2ban/ip.blacklist | while read IP; do iptables -I fail2ban-<name> 1 -s $IP -j DROP; done


    這個做法是可行的,不過透過iptables -D fail2ban-XXX來解除IP封鎖時,
    並未同步刪除ip.blacklist檔案中的IP,所以管理員必需手動刪除此檔的IP。

    另外在同時監控多個服務的情況下,不同服務的IP寫入同一個檔案會造成一個IP有多筆記錄;
    同時重啟服務時,也會把不同服務的封鎖IP,無差別的載入所有iptables的chain中,造成非預期的意外狀況。

    在同時監控多種服務時,這個IP名單記錄檔ip.blacklist需對應不同的監控服務手動建立多筆,
    例如ssh服務的,就命名為ip.ssh.blacklist,
    vsftpd服務的,就命名為ip.vsftpd.blacklist;
    然後在 actionban 與 actionstart 中把服務名稱變數<name>加到記錄檔的檔名之中,這樣才不會出錯。
    actionban = iptables -I fail2ban-<name> 1 -s <ip> -j DROP
        echo <ip> >> /etc/fail2ban/ip.<name>.blacklist

    actionstart = iptables -N fail2ban-<name>
        iptables -A fail2ban-<name> -j RETURN
        iptables -I INPUT -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
        cat /etc/fail2ban/ip.<name>.blacklist | while read IP; do iptables -I fail2ban-<name> 1 -s $IP -j DROP; done



參考資料
CentOS安裝fail2ban記事
How To Install and Use Fail2ban on Ubuntu 14.04
STEP 3: INSTALLING FAIL2BAN
以 fail2ban 偵測網頁連線攻擊
How to make fail2ban bans persistent



♥順子老婆的網拍,請多關照∼

If you don't like something, change it.
If you can't change it, change your attitude.
Don't complain!




2015-05-08, 22:17 shunze 的個人資料 把 shunze 加入好友列表 發送Email給 shunze 瀏覽 shunze 的網站 MSN : shunze@gmail.com
  « 上一篇主題 下一篇主題 »
發表新主題 發表回覆
跳到:

Powered by: Burning Board 1.1.1 2001 WoltLab GbR