搜尋此網誌

2012年4月6日 星期五

[工具介紹] 利用 fail2ban 避免密碼遭受暴力破解法(錯誤嘗試)


在上一篇的文章中我談到有關封鎖的一些觀念,在這篇文章中我將用 fail2ban 這個套件來針對一些服務進行嘗試登入錯誤的封鎖。
前面提到有些應用程式本身就帶有封鎖的功能,但是因為每個應用程式的設定與管理方式不盡相同,甚至並不是所有的應用程式都具備這樣的功能,因此透過 fail2ban 這樣的套件可以讓封鎖的行為擁有一致性以方便管理。fail2ban 支援許多應用程式 (如 ssh, vsftpd, pop 等),主要利用應用程式所留下的日誌找出可疑的行為,並進行封鎖的行為,封鎖的方式則包含 hosts.deny, iptables, ipfw 等。
fail2ban 屬於單機作業的套件,因此今天的測試環境相當單純,只要一台 Linux 主機即可,我今天準備的是一台 CentOS 6.x 的系統。接下來我們就一步一步地完成今天的目標:
  1. 啟用 epel 這個 repository
    以 CentOS 6.x 而言,所需的指令為
    rpm –ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm
  2. 安裝 fail2ban 的 rpm 套件,指令為
    yum install fail2ban
  3. 修改設定檔
    fail2ban 有兩個主要的設定檔,一個是 /etc/fail2ban/fail2ban.conf,用來指定一些基本的設定。在正常的情況下,這些設定並不需要進行修改。至於要指定哪些服務需要加以偵測並封鎖,則是必須透過另外一個設定檔 /etc/fail2ban/jail.conf 。在這次測試的環境中,我們要設定 fail2ban 支援 ssh 與 pure-ftpd 這兩個應用程式。
    1. fail2ban 預設就已經開啟對 ssh 的支援,但是我們仍然需要修改寄發通知的訊息,以提供更為清楚的標示。新增設定檔 /etc/fail2ban/jail.local,輸入下列設定(更新一)。
      [ssh-iptables]
      enabled  = true 
      filter   = sshd 
      action   = iptables[name=SSH, port=ssh, protocol=tcp]
                  sendmail-whois[name=通知信標題, dest=收件者信箱, sender=寄件者信箱] 
      logpath  = /var/log/secure 
      maxretry = 5
    2. 同樣在 /etc/fail2ban/jail.local 加上下列設定
      [pure-ftpd-iptables]
      enabled  = true 
      filter   = pure-ftpd 
      action   = iptables[name=PureFTPD, port=ftp, protocol=tcp]
                  sendmail-whois[name=通知信標題, dest=收信者信箱, sender=寄件者信箱] 
      logpath  = /var/log/messages 
      maxretry = 5
      其中 filter 與 logpath 分別用來指定比對的規則與日誌檔的位置,如果設定錯誤將造成功能的異常。至於 action 參數的 PureFTPD 字串則為 iptables 的規則名稱,可以依據自己的需求自行修改。
    3. 修改 pure-ftpd 的比對規則,也就是 /etc/fail2ban/filter.d/pure-ftpd.conf
      failregex = pure-ftpd(?:\[\d+\])?: (.+?@<HOST>) \[WARNING\] %(__errmsg)s \[.+\]$
      改為
      failregex = pure-ftpd: \(\?@<HOST>\) \[WARNING\] %(__errmsg)s \[.+\]$
  4. 設定 fail2ban 開機時自動啟動,指令為
    chkconfig fail2ban on
  5. 啟動 fail2ban 的服務,指令為
    service fail2ban start
  6. 確認 iptables 的狀態,指令為
    iptables –L –n
    如果看到下列的資訊,表示規則已經生效。
    Chain fail2ban-PureFTPD (1 references) 
    target     prot opt source               destination 
    RETURN     all  --  0.0.0.0/0            0.0.0.0/0
    Chain fail2ban-SSH (1 references) 
    target     prot opt source               destination 
    RETURN     all  --  0.0.0.0/0            0.0.0.0/0
  7. 查看 fail2ban 的狀態,指令為
    fail2ban-client status
    可以看到類似下列的資訊
    Status 
    |- Number of jail:      2 
    `- Jail list:           pure-ftpd-iptables, ssh-iptables
  8. 使用另外一台主機嘗試登入這台主機的 ssh,此時當然要故意打錯密碼。嘗試過後我們可以透過下列指令了解 fail2ban 是否已經偵測到這個錯誤的登入行為。
    fail2ban-client status ssh-iptables
    如果看到類似下列的資訊表示 fail2ban 已經正常運作。
    Status for the jail: ssh-iptables 
    |- filter 
    |  |- File list:        /var/log/secure 
    |  |- Currently failed: 1 
    |  `- Total failed:     2 
    `- action    |- Currently banned: 0    |  `- IP list:    `- Total banned:     0
    但是如果所有的數字都為0,表示 fail2ban 並沒有正確地判斷到這個錯誤的登入行為。
  9. 繼續使用錯誤的密碼登入,直到被封鎖為止。恭喜你,你又完成了另外一個目標。
fail2ban 其實是一個相當容易操作的安全套件,不過如果測試時發現 fail2ban 無法偵測到錯誤的登入行為時,要找出原因還是需要一番功夫。建議可以從下列幾個地方查起:
  1. 可以利用下列指令確認 jail.conf 內設定值與 filter 是否正確。
    fail2ban-regex /var/log/secure /etc/fail2ban/filter.d/sshd.conf
    或是
    fail2ban-regex /var/log/messages /etc/fail2ban/filter.d/pure-ftpd.conf
  2. 將 /etc/fail2ban/jail.conf 內的 backend 參數由 auto 改為 polling,修改後重新啟動 fail2ban 的服務再行測試。
  3. 將 /etc/fail2ban/fail2ban.conf 內的 loglevel 由 3 改為 4,修改後重新啟動 fail2ban 的服務再行測試。測試時請注意 /var/log/fail2ban.log 內的相關訊息。
前面提到 fail2ban 屬於單機的封鎖軟體,在管理大量的主機時可能會較為不便。幸好 fail2ban 在設定過後幾乎不太需要額外的管理,所以倒也不致於造成過多的管理負擔。如果還是有所擔心的話,使用集中管控的套件 (如 ossec) 可以簡化許多管理的複雜度。有關 ossec 的介紹,就留待以後再來分享了。

更新一 (2012/07/12):原先建議各位修改 jail.conf,但是根據原始文件的建議,任何客製化的修改應該是放在 jail.local 這個檔案,而非 jail.conf。jail.local 內的設定檔將會蓋掉 jail.conf 內的預設值。

About