在上一篇的文章中我談到有關封鎖的一些觀念,在這篇文章中我將用 fail2ban 這個套件來針對一些服務進行嘗試登入錯誤的封鎖。
前面提到有些應用程式本身就帶有封鎖的功能,但是因為每個應用程式的設定與管理方式不盡相同,甚至並不是所有的應用程式都具備這樣的功能,因此透過 fail2ban 這樣的套件可以讓封鎖的行為擁有一致性以方便管理。fail2ban 支援許多應用程式 (如 ssh, vsftpd, pop 等),主要利用應用程式所留下的日誌找出可疑的行為,並進行封鎖的行為,封鎖的方式則包含 hosts.deny, iptables, ipfw 等。
fail2ban 屬於單機作業的套件,因此今天的測試環境相當單純,只要一台 Linux 主機即可,我今天準備的是一台 CentOS 6.x 的系統。接下來我們就一步一步地完成今天的目標:
- 啟用 epel 這個 repository
以 CentOS 6.x 而言,所需的指令為rpm –ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm
- 安裝 fail2ban 的 rpm 套件,指令為
yum install fail2ban
- 修改設定檔
fail2ban 有兩個主要的設定檔,一個是 /etc/fail2ban/fail2ban.conf,用來指定一些基本的設定。在正常的情況下,這些設定並不需要進行修改。至於要指定哪些服務需要加以偵測並封鎖,則是必須透過另外一個設定檔 /etc/fail2ban/jail.conf 。在這次測試的環境中,我們要設定 fail2ban 支援 ssh 與 pure-ftpd 這兩個應用程式。- 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
- 同樣在 /etc/fail2ban/jail.local 加上下列設定
其中 filter 與 logpath 分別用來指定比對的規則與日誌檔的位置,如果設定錯誤將造成功能的異常。至於 action 參數的 PureFTPD 字串則為 iptables 的規則名稱,可以依據自己的需求自行修改。[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
- 修改 pure-ftpd 的比對規則,也就是 /etc/fail2ban/filter.d/pure-ftpd.conf
將
改為failregex = pure-ftpd(?:\[\d+\])?: (.+?@<HOST>) \[WARNING\] %(__errmsg)s \[.+\]$
failregex = pure-ftpd: \(\?@<HOST>\) \[WARNING\] %(__errmsg)s \[.+\]$
- fail2ban 預設就已經開啟對 ssh 的支援,但是我們仍然需要修改寄發通知的訊息,以提供更為清楚的標示。新增設定檔 /etc/fail2ban/jail.local,輸入下列設定(更新一)。
- 設定 fail2ban 開機時自動啟動,指令為
chkconfig fail2ban on
- 啟動 fail2ban 的服務,指令為
service fail2ban start
- 確認 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
- 查看 fail2ban 的狀態,指令為
可以看到類似下列的資訊fail2ban-client status
Status |- Number of jail: 2 `- Jail list: pure-ftpd-iptables, ssh-iptables
- 使用另外一台主機嘗試登入這台主機的 ssh,此時當然要故意打錯密碼。嘗試過後我們可以透過下列指令了解 fail2ban 是否已經偵測到這個錯誤的登入行為。
如果看到類似下列的資訊表示 fail2ban 已經正常運作。fail2ban-client status ssh-iptables
但是如果所有的數字都為0,表示 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
- 繼續使用錯誤的密碼登入,直到被封鎖為止。恭喜你,你又完成了另外一個目標。
- 可以利用下列指令確認 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
- 將 /etc/fail2ban/jail.conf 內的 backend 參數由 auto 改為 polling,修改後重新啟動 fail2ban 的服務再行測試。
- 將 /etc/fail2ban/fail2ban.conf 內的 loglevel 由 3 改為 4,修改後重新啟動 fail2ban 的服務再行測試。測試時請注意 /var/log/fail2ban.log 內的相關訊息。
更新一 (2012/07/12):原先建議各位修改 jail.conf,但是根據原始文件的建議,任何客製化的修改應該是放在 jail.local 這個檔案,而非 jail.conf。jail.local 內的設定檔將會蓋掉 jail.conf 內的預設值。
沒有留言:
張貼留言