生産環境中的 apache 伺服器可能會受到不同的攻擊。攻擊者或許試圖通過暴力攻擊或者執行惡意腳本來擷取未經授權或者禁止通路的目錄。一些惡意爬蟲或許會掃描你網站下的各種安全漏洞,或者通過收集email位址和web表單來發送垃圾郵件。
apache伺服器具有全面的日志功能,可以捕捉到各種攻擊所反映的異常事件。然而,它還不能系統地解析具體的apache 日志并迅速地對潛在的攻擊進行反應(比如,禁止/解禁ip位址)。這時候<code>fail2ban</code>可以解救這一切,解放了系統管理者的工作。
<code>fail2ban</code>是一款入侵防禦工具,可以基于系統日志檢測不同的工具并且可以自動采取保護措施比如:通過<code>iptables</code>禁止ip、通過 /etc/hosts.deny 阻止連接配接、或者通過郵件發送通知。fail2ban具有一系列預定義的“監獄”,它使用特定程式日志過濾器來檢測通常的攻擊。你也可以編寫自定義的規則來檢測來自任意程式的攻擊。
<a target="_blank"></a>

<code>[ssh]</code>
<code>enabled = true</code>
<code>port = ssh</code>
<code>filter = sshd</code>
<code>logpath = /var/log/auth.log</code>
<code>maxretry = 6</code>
<code>banaction = iptables-multiport</code>
ssh監獄的配置定義了這些參數:
[ssh]: 方括号内是監獄的名字。
enabled:是否啟用監獄
port: 端口号(或者對應的服務名稱)
filter: 檢測攻擊的日志解析規則
logpath: 所檢測的日志檔案
maxretry: 最大失敗次數
banaction: 所進行的禁止操作
定義在監獄配置中的任意參數都會覆寫<code>fail2ban-wide</code> 中相應的預設配置參數。相反,任何缺少的參數都會使用定義在[default] 字段的預設值。
預定義的日志過濾器都放在/etc/fail2ban/filter.d,而可以采取的禁止操作放在 /etc/fail2ban/action.d。
如果你想要覆寫<code>fail2ban</code>的預設操作或者定義任何自定義監獄,你可以建立/etc/fail2ban/jail.local*檔案。本篇教程中,我會使用/etc/fail2ban/jail.local。
<code>fail2ban</code>的預設安裝為apache服務提供了一些預定義監獄和過濾器。我要啟用這些内建的apache監獄。由于debian和redhat配置的稍微不同,我會分别提供它們的配置檔案。
要在基于debian的系統上啟用預定義的apache監獄,如下建立/etc/fail2ban/jail.local。
<code>$ sudo vi /etc/fail2ban/jail.local</code>
<code># 檢測密碼認證失敗</code>
<code>[apache]</code>
<code>enabled = true</code>
<code>port = http,https</code>
<code>filter = apache-auth</code>
<code>logpath = /var/log/apache*/*error.log</code>
<code>maxretry = 6</code>
<code></code>
<code># 檢測漏洞和 php 脆弱性掃描</code>
<code>[apache-noscript]</code>
<code>filter = apache-noscript</code>
<code># 檢測 apache 溢出攻擊</code>
<code>[apache-overflows]</code>
<code>filter = apache-overflows</code>
<code>maxretry = 2</code>
<code># 檢測在伺服器尋找主目錄的嘗試</code>
<code>[apache-nohome]</code>
<code>filter = apache-nohome</code>
由于上面的監獄沒有指定措施,這些監獄都将會觸發預設的措施。要檢視預設的措施,在/etc/fail2ban/jail.conf中的[default]下找到“banaction”。
本例中,預設的操作是iptables-multiport(定義在/etc/fail2ban/action.d/iptables-multiport.conf)。這個措施使用iptable的多端口子產品禁止一個ip位址。
在啟用監獄後,你必須重新開機fail2ban來加載監獄。
<code>$ sudo service fail2ban restart</code>
要在基于紅帽的系統中啟用預定義的監獄,如下建立/etc/fail2ban/jail.local。
<code>logpath = /var/log/httpd/*error_log</code>
<code># 檢測抓取郵件位址的爬蟲</code>
<code>[apache-badbots]</code>
<code>filter = apache-badbots</code>
<code>logpath = /var/log/httpd/*access_log</code>
<code>bantime = 172800</code>
<code>maxretry = 1</code>
<code># 檢測執行不存在的腳本的企圖</code>
<code># 這些都是流行的網站服務程式</code>
<code># 如:webmail, phpmyadmin,wordpress</code>
<code>filter = apache-botsearch</code>
注意這些監獄檔案預設的操作是iptables-multiport(定義在/etc/fail2ban/jail.conf中[default]字段下的“banaction”中)。這個措施使用iptable的多端口子產品禁止一個ip位址。
啟用監獄後,你必須重新開機fail2ban來加載監獄。
在 fedora 或者 centos/rhel 7中:
<code>$ sudo systemctl restart fail2ban</code>
在 centos/rhel 6中:
監獄一旦激活後,你可以用fail2ban的用戶端指令行工具來監測目前的禁止狀态。
檢視激活的監獄清單:
<code>$ sudo fail2ban-client status</code>
檢視特定監獄的狀态(包含禁止的ip清單):
<code>$ sudo fail2ban-client status [監獄名]</code>
你也可以手動禁止或者解禁ip位址:
要用制定監獄禁止ip:
<code>$ sudo fail2ban-client set [name-of-jail] banip [ip-address]</code>
要解禁指定監獄屏蔽的ip:
<code>$ sudo fail2ban-client set [name-of-jail] unbanip [ip-address]</code>
本篇教程解釋了fail2ban監獄如何工作以及如何使用内置的監獄來保護apache伺服器。依賴于你的環境以及要保護的web伺服器類型,你或許要調整已有的監獄或者編寫自定義監獄和日志過濾器。
你有在生産環境中使用fail2ban麼?分享一下你的經驗吧。
----------------------------------------------------------------------------------------------------------------------------