使用 fail2ban 防禦 SSH 伺服器的暴力破解攻擊及保護Apache

來源:互聯網
上載者:User

如何使用 fail2ban 防禦 SSH 伺服器的暴力破解攻擊

對於SSH服務的常見的攻擊就是暴力破解攻擊——遠程攻擊者通過不同的密碼來無限次地進行登入嘗試。當然SSH可以設定使用非密碼驗證驗證方式來對抗這種攻擊,例如公開金鑰驗證或者雙步驟驗證。將不同的驗證方法的優劣處先放在一邊,如果我們必須使用密碼驗證方式怎麼辦?你是如何保護你的 SSH 伺服器免遭暴力破解攻擊的呢?

在這篇指導教程中,我會示範如何安裝並配置 fail2ban 來保護 SSH 伺服器以避免來自遠程IP地址的暴力密碼破解攻擊。

在linux上安裝Fail2ban

為了在CentOS 或 RHEL上安裝fail2ban,首先設定EPEL倉庫,然後運行以下命令。

    $ sudo yum install fail2ban

在Fedora上安裝fail2ban,簡單地運行以下命令:

    $ sudo yum install fail2ban

在ubuntu,Debian 或 Linux Mint上安裝fail2ban:

    $ sudo apt-get install fail2ban

為SSH伺服器配置Fail2ban

現在你已經準備好了通過配置 fail2ban 來加強你的SSH伺服器。你需要編輯其設定檔 /etc/fail2ban/jail.conf。 在設定檔的“[DEFAULT]”區,你可以在此定義所有受監控的服務的預設參數,另外在特定服務的配置部分,你可以為每個服務(例如SSH,Apache等)設定特定的配置來覆蓋預設的參數配置。

在針對服務的監獄區(在[DEFAULT]區後面的地方),你需要定義一個[ssh-iptables]區,這裡用來定義SSH相關的監獄配置。真正的禁止IP地址的操作是通過iptables完成的。

下面是一個包含“ssh-iptables”監獄配置的/etc/fail2ban/jail.conf的檔案範例。當然根據你的需要,你也可以指定其他的應用監獄。

    $ sudo vi /etc/fail2ban/jail.local

    [DEFAULT]
    # 以空格分隔的列表,可以是 IP 位址、CIDR 首碼或者 DNS 主機名稱
    # 用於指定哪些地址可以忽略 fail2ban 防禦
    ignoreip = 127.0.0.1 172.31.0.0/24 10.10.0.0/24 192.168.0.0/24
    
    # 用戶端主機被禁止的時間長度(秒)
    bantime = 86400
    
    # 用戶端主機被禁止前允許失敗的次數
    maxretry = 5
    
    # 尋找失敗次數的時間長度(秒)
    findtime = 600
    
    mta = sendmail
    
    [ssh-iptables]
    enabled = true
    filter = sshd
    action = iptables[name=SSH, port=ssh, protocol=tcp]
    sendmail-whois[name=SSH, dest=your@email.com, sender=fail2ban@email.com]
    # Debian 系的發行版
    logpath = /var/log/auth.log
    # Red Hat 系的發行版
    logpath = /var/log/secure
    # ssh 服務的最大嘗試次數
    maxretry = 3

根據上述配置,fail2ban會自動禁止在最近10分鐘內有超過3次訪問嘗試失敗的任意IP地址。一旦被禁,這個IP地址將會在24小時內一直被禁止訪問 SSH 服務。這個事件也會通過sendemail發送郵件通知。

一旦設定檔準備就緒,按照以下方式重啟fail2ban服務。

在 Debian, Ubuntu 或 CentOS/RHEL 6:

    $ sudo service fail2ban restart

在 Fedora 或 CentOS/RHEL 7:

    $ sudo systemctl restart fail2ban

為了驗證fail2ban成功運行,使用參數'ping'來運行fail2ban-client 命令。 如果fail2ban服務正常運行,你可以看到“pong(嘭)”作為響應。

    $ sudo fail2ban-client ping
    Server replied: pong

測試 fail2ban 保護SSH免遭暴力破解攻擊

為了測試fail2ban是否能正常工作,嘗試通過使用錯誤的密碼來用SSH串連到伺服器類比一個暴力破解攻擊。與此同時,監控 /var/log/fail2ban.log,該檔案記錄在fail2ban中發生的任何敏感事件。

    $ sudo tail -f /var/log/fail2ban.log

根據上述的記錄檔,Fail2ban通過檢測IP地址的多次失敗登入嘗試,禁止了一個IP地址192.168.1.8。

檢查fail2ban狀態並解禁被鎖住的IP地址

由於fail2ban的“ssh-iptables”監獄使用iptables來阻塞問題IP地址,你可以通過以下方式來檢測當前iptables來驗證禁止規則。

    $ sudo iptables --list -n

    Chain INPUT (policy ACCEPT)
    target prot opt source destination
    fail2ban-SSH tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
    
    Chain FORWARD (policy ACCEPT)
    target prot opt source destination
    
    Chain OUTPUT (policy ACCEPT)
    target prot opt source destination
    
    Chain fail2ban-SSH (1 references)
    target prot opt source destination
    DROP all -- 192.168.1.8 0.0.0.0/0
    RETURN all -- 0.0.0.0/0 0.0.0.0/0

如果你想要從fail2ban中解鎖某個IP地址,你可以使用iptables命令:

    $ sudo iptables -D fail2ban-SSH -s 192.168.1.8 -j DROP

當然你可以使用上述的iptables命令手動地檢驗和管理fail2ban的IP阻塞列表,但實際上有一個適當的方法就是使用fail2ban-client命令列工具。這個命令不僅允許你對"ssh-iptables"監獄進行管理,同時也是一個標準的命令列介面,可以管理其他類型的fail2ban監獄。

為了檢驗fail2ban狀態(會顯示出當前活動的監獄列表):

    $ sudo fail2ban-client status

為了檢驗一個特定監獄的狀態(例如ssh-iptables):

    $ sudo fail2ban-client status ssh-iptables

上面的命令會顯示出被禁止IP地址清單。



為瞭解鎖特定的IP地址:

    $ sudo fail2ban-client set ssh-iptables unbanip 192.168.1.8

注意,如果你停止了Fail2ban 服務,那麼所有的IP地址都會被解鎖。當你重啟 Fail2ban,它會從/etc/log/secure(或 /var/log/auth.log)中找到異常的IP地址清單,如果這些異常地址的發生時間仍然在禁止時間內,那麼Fail2ban會重新將這些IP地址禁止。

設定 Fail2ban 自動啟動


一旦你成功地測試了fail2ban之後,最後一個步驟就是在你的伺服器上讓其在開機時自動啟動。在基於Debian的發行版中,fail2ban已經預設讓自動啟動生效。在基於Red-Hat的發行版中,按照下面的方式讓自動啟動生效。

在 CentOS/RHEL 6中:

    $ sudo chkconfig fail2ban on

在 Fedora 或 CentOS/RHEL 7:

    $ sudo systemctl enable fail2ban

總結

在該教程中,我示範了如何安裝並配置fail2ban來保護一個SSH伺服器。當然fail2ban可以緩解暴力密碼攻擊,但是請注意,這並不能保護SSH伺服器避免來自複雜的分布式暴力破解組織,這些攻擊者通過使用成千上萬個機器控制的IP地址來繞過fail2ban的防禦機制。



如何配置 fail2ban 來保護 Apache 伺服器

生產環境中的 Apache 伺服器可能會受到不同的攻擊。攻擊者或許試圖通過暴力密碼破解攻擊或者執行惡意指令碼來擷取未經授權或者禁止訪問的目錄。一些惡意爬蟲或許會掃描你網站下的各種安全性漏洞,或者通過收集email地址和web表單來發送垃圾郵件。

Apache伺服器具有全面的日誌功能,可以捕捉到各種攻擊所反映的例外狀況事件。然而,它還不能系統地解析具體的apache 日誌並迅速地對潛在的攻擊進行反應(比如,禁止/解禁IP地址)。這時候fail2ban可以解救這一切,解放了系統管理員的工作。

fail2ban是一款入侵防禦工具,可以基於系統日誌檢測不同的工具並且可以自動採取保護措施比如:通過iptables禁止ip、通過 /etc/hosts.deny 阻止串連、或者通過郵件發送通知。fail2ban具有一系列預定義的“監獄”,它使用特定程式日誌過濾器來檢測通常的攻擊。你也可以編寫自訂的規則來檢測來自任意程式的攻擊。

在本教程中,我會示範如何配置fail2ban來保護你的apache伺服器。我假設你已經安裝了apache和fail2ban。對於安裝,請參考另外一篇教程。

什麼是 Fail2ban 監獄

讓我們更深入地瞭解 fail2ban 監獄。監獄定義了具體的應用策略,它會為指定的程式觸發一個保護措施。fail2ban在 /etc/fail2ban/jail.conf 下為一些流行程式如Apache、Dovecot、Lighttpd、MySQL、Postfix、SSH 等預定義了一些監獄。每個監獄都通過特定的程式日誌過濾器(在/etc/fail2ban/fileter.d 下面)來檢測通常的攻擊。讓我看一個例子監獄:SSH監獄。

    [ssh]
    enabled = true
    port = ssh
    filter = sshd
    logpath = /var/log/auth.log
    maxretry = 6
    banaction = iptables-multiport

SSH監獄的配置定義了這些參數:

    [ssh]: 方括弧內是監獄的名字。
    enabled:是否啟用監獄
    port: 連接埠號碼(或者對應的服務名稱)
    filter: 檢測攻擊的日誌解析規則
    logpath: 所檢測的記錄檔
    maxretry: 最大失敗次數
    banaction: 所進行的禁止操作

定義在監獄配置中的任意參數都會覆蓋fail2ban-wide 中相應的預設配置參數。相反,任何缺少的參數都會使用定義在[DEFAULT] 欄位的預設值。

預定義的日誌過濾器都放在/etc/fail2ban/filter.d,而可以採取的禁止操作放在 /etc/fail2ban/action.d。



如果你想要覆蓋fail2ban的預設操作或者定義任何自訂監獄,你可以建立/etc/fail2ban/jail.local*檔案。本篇教程中,我會使用/etc/fail2ban/jail.local。

啟用預定義的apache監獄

fail2ban的預設安裝為Apache服務提供了一些預定義監獄和過濾器。我要啟用這些內建的Apache監獄。由於Debian和RedHat配置的稍微不同,我會分別提供它們的設定檔。

在Debian 或者 Ubuntu啟用Apache監獄

要在基於Debian的系統上啟用預定義的apache監獄,如下建立/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

由於上面的監獄沒有指定措施,這些監獄都將會觸發預設的措施。要查看預設的措施,在/etc/fail2ban/jail.conf中的[DEFAULT]下找到“banaction”。

    banaction = iptables-multiport

本例中,預設的操作是iptables-multiport(定義在/etc/fail2ban/action.d/iptables-multiport.conf)。這個措施使用iptable的多連接埠模組禁止一個IP地址。

在啟用監獄後,你必須重啟fail2ban來載入監獄。

    $ sudo service fail2ban restart

在CentOS/RHEL 或者 Fedora中啟用Apache監獄


要在基於紅帽的系統中啟用預定義的監獄,如下建立/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 脆弱性掃描
    [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
    # 檢測執行不存在的指令碼的企圖
    # 這些都是流行的網站服務程式
    # 如:webmail, phpMyAdmin,WordPress
    port = http,https
    filter = apache-botsearch
    logpath = /var/log/httpd/*error_log
    maxretry = 2

注意這些監獄檔案預設的操作是iptables-multiport(定義在/etc/fail2ban/jail.conf中[DEFAULT]欄位下的“banaction”中)。這個措施使用iptable的多連接埠模組禁止一個IP地址。

啟用監獄後,你必須重啟fail2ban來載入監獄。

在 Fedora 或者 CentOS/RHEL 7中:

    $ sudo systemctl restart fail2ban

在 CentOS/RHEL 6中:

    $ sudo service fail2ban restart

檢查和管理fail2ban禁止狀態

監獄一旦啟用後,你可以用fail2ban的用戶端命令列工具來監測當前的禁止狀態。

查看啟用的監獄列表:

    $ sudo fail2ban-client status

查看特定監獄的狀態(包含禁止的IP列表):

    $ sudo fail2ban-client status [監獄名]

你也可以手動禁止或者解禁IP地址:

要用制定監獄禁止IP:

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

要解禁指定監獄屏蔽的IP:

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

總結

本篇教程解釋了fail2ban監獄如何工作以及如何使用內建的監獄來保護Apache伺服器。依賴於你的環境以及要保護的web伺服器類型,你或許要調整已有的監獄或者編寫自訂監獄和日誌過濾器。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.