萬盛學電腦網

 萬盛學電腦網 >> 服務器教程 >> 如何配置fail2ban保護Apache HTTP服務器

如何配置fail2ban保護Apache HTTP服務器

   生產環境中的Apache HTTP服務器可能會遭到各種不同方式的攻擊。攻擊者可能采用蠻力攻擊或執行惡意腳本,企圖訪問未經授權的目錄或禁止訪問的目錄。一些惡意機器人程序可能會掃描你的網站,查找任何可能存在的安全漏洞,或者收集電子郵件地址或網站表單,以便發送垃圾郵件。

  Apache HTTP服務器隨帶全面的日志功能,可以捕獲及記錄表明此類攻擊的異常事件。不過,系統性地分析詳細的Apache日志,並迅速應對潛在攻擊(比如禁止/取消禁止冒犯性的IP地址)仍然很重要。這時候fail2ban派得上用場,可以簡化系統管理員的工作。

  fail2ban是一款開源入侵預防工具,可以根據系統日志來檢測各種各樣的攻擊,並且自動采取預防行動,比如說使用iptables禁止IP地址,通過/etc/hosts.deny阻止連接,或者通過電子郵件通知事件。fail2ban隨帶一組預先定義的“jail”(暫譯“監獄”),這些jail使用針對特定應用程序的日志過濾器來檢測常見攻擊。你還可以編寫自定義的jail,阻止針對任意應用程序的任何特定的攻擊。

  我在本教程中將演示你如何可以配置fail2ban,以保護Apache HTTP服務器。我假設你事先已經安裝好了Apache HTTP服務器和fail2ban。至於fail2ban的安裝,請參閱另一篇教程:http://xmodulo.com/how-to-protect-ssh-server-from-brute-force-attacks-using-fail2ban.html。

  fail2ban Jail是什麼?

  首先允許我比較詳細地介紹一下fail2ban jail。jail定義了針對特定應用程序的策略,fail2ban根據該策略來觸發保護某個應用程序的行動。針對Apache、Dovecot、Lighttpd、MySQL、Postfix和SSH之類的流行應用程序,fail2ban隨帶幾個在/etc/fail2ban/jail.conf中預先定義的jail。每個jail依靠針對特定應用程序的日志過濾器(位於/etc/fail2ban/fileter.d)來檢測常見攻擊。不妨看一個示例性的jail:SSH jail。

  [ssh]

  enabled = true

  port = ssh

  filter = sshd

  logpath = /var/log/auth.log

  maxretry = 6

  banaction = iptables-multiport

  這個SSH jail的配置由幾個參數來定義:

  •[ssh]:jail的名稱,帶方括號。

  •enabled:該jail是不是激活。

  •port:要保護的端口號(數字編號或公共名)。

  •filter:用來檢測攻擊的分析日志的規則。

  •logpath:要仔細分析的日志文件。

  •maxretry:禁止之前最多失敗次數。

  •banaction:禁止動作。

  jail配置中定義的任何參數將覆蓋對應的適用整個fail2ban范圍的默認參數。反過來,任何遺漏的參數會被賦予在[DEFAULT]部分中定義的默認值。

  預先定義的日志過濾器位於/etc/fail2ban/filter.d,可用的動作位於/etc/fail2ban/action.d。

  如果你想覆蓋fail2ban默認參數或者定義任何自定義的jail,只要通過創建/etc/fail2ban/jail.local文件就能實現。我在本教程中將使用/etc/fail2ban/jail.local。

  啟用預先定義的Apache Jail

  默認安裝的fail2ban為Apache HTTP服務器提供了幾種預先定義的jail和過濾器。我准備啟用那些內置的Apache jail。由於Debian配置和紅帽配置略有差異,我為它們單獨提供了fail2ban jail配置。

  在Debian或Ubuntu上啟用Apache Jail

  想在基於Debian的系統上啟用預先定義的Apache jail,就要創建/etc/fail2ban/jail.local,如下所示。

  $ sudo vi /etc/fail2ban/jail.local

  # 檢測密碼驗證失敗

  [apache]

  enabled = true

  port = http,https

  filter = apache-auth

  logpath = /var/log/apache*/*error.log

  maxretry = 6

  # 檢測搜索安全薄弱環節和php漏洞的潛在行為

  [apache-noscript]

  enabled = true

  port = http,https

  filter = apache-noscript

  logpath = /var/log/apache*/*error.log

  maxretry = 6

  # 檢測Apache溢出企圖

  [apache-overflows]

  enabled = true

  port = http,https

  filter = apache-overflows

  logpath = /var/log/apache*/*error.log

  maxretry = 2

  # 檢測未能在服務器上找到主目錄的活動

  [apache-nohome]

  enabled = true

  port = http,https

  filter = apache-nohome

  logpath = /var/log/apache*/*error.log

  maxretry = 2

  由於上述沒有一個jail指定動作,所有這些jail被觸發後將執行默認動作。想弄清楚默認動作,尋找/etc/fail2ban/jail.conf中[DEFAULT]部分下面的“banaction”。

  banaction = iptables-multiport

  在這個情況下,默認動作是iptables-multiport(在/etc/fail2ban/action.d/iptables-multiport.conf中定義)。該動作使用iptables以及multiport模塊禁止IP地址。

  啟用jail後,你必須重啟fail2ban,以便裝入jail。

  $ sudo service fail2ban restart

  在CentOS/RHEL或Fedora上啟用Apache jail

  想在基於紅帽的系統上啟用預先定義的Apache jail,就要創建/etc/fail2ban/jail.local,如下所示。

  $ sudo vi /etc/fail2ban/jail.local

  # 檢測密碼驗證失敗

  [apache]

  enabled = true

  port = http,https

  filter = apache-auth

  logpath = /var/log/httpd/*error_log

  maxretry = 6

  # 檢測搜索電子郵件地址的垃圾郵件機器人程序

  [apache-badbots]

  enabled = true

  port = http,https

  filter = apache-badbots

  logpath = /var/log/httpd/*access_log

  bantime = 172800

  maxretry = 1

  #檢測搜索安全薄弱環節和php漏洞的潛在行為vulnerabilities

  [apache-noscript]

  enabled = true

  port = http,https

  filter = apache-noscript

  logpath = /var/log/httpd/*error_log

  maxretry = 6

  # 檢測Apache溢出企圖

  [apache-overflows]

  enabled = true

  port = http,https

  filter = apache-overflows

  logpath = /var/log/httpd/*error_log

  maxretry = 2

  # 檢測未能在服務器上找到主目錄的活動

  [apache-nohome]

  enabled = true

  port = http,https

  filter = apache-nohome

  logpath = /var/log/httpd/*error_log

  maxretry = 2

  # 檢測未能執行與幾種流行Web服務

  # (比如webmail,phpMyAdmin,WordPress)

  # 有關的不存在腳本

  port = http,https

  filter = apache-botsearch

  logpath = /var/log/httpd/*error_log

  maxretry = 2

  請注意:所有這些jail的默認動作是iptables-multiport(定義為/etc/fail2ban/jail.conf中[DEFAULT]下面的“banaction”)。該動作使用iptable以及multiport模塊禁止IP地址。

  啟用jail後,你必須重啟fail2ban,將jail裝入到fail2ban中。

  在Fedora或CentOS/RHEL 7上:

  $ sudo systemctl restart fail2ban

  在CentOS/RHEL 6上:

  $ sudo service fail2ban restart

  檢查和管理Fail2ban禁止狀態

  一旦jail被激活,你可以使用fail2ban-client命令行工具,監控當前的禁止狀態。

  想查看活動jail列表:

  $ sudo fail2ban-client status

  想查看某一個jail的狀態(包括被禁止IP列表):

  $ sudo fail2ban-client status [name-of-jail]

  你還可以手動禁止或取消禁止IP地址。

  想讓某一個jail禁止IP地址:

  $ sudo fail2ban-client set [name-of-jail] banip [ip-address]

  想取消禁止某個jail阻止的IP地址:

  $ sudo fail2ban-client set [name-of-jail] unbanip [ip-address]

  結束語

  這篇教程介紹了fail2ban jail是如何工作的,以及如何使用內置的Apache jail保護Apache HTTP服務器。你可能需要改動現有的jail,或者編寫自定義的jail和日志過濾器,這要看你的環境以及需要保護的Web服務的具體類型。參閱outfail2ban的官方Github頁面:https://github.com/fail2ban/fail2ban,即可了解jail和過濾器的最新例子。

  你是否在任何生產環境中使用fail2ban?歡迎交流經驗和心得。

copyright © 萬盛學電腦網 all rights reserved