--- tags: linux,server --- # Fail2ban 限定登入錯誤次數 參考文章: http://www.shunze.info/forum/thread.php?threadid=1889&boardid=3&sid=88fa90b4c493529c66704a5cdbc8cf9f 下載fail2ban ```shell= sudo apt-get install fail2ban ``` 其中 jail.conf 會因套件的更新而被覆寫,所以fail2ban要求使用者先建立一個副本 jail.local,所有的設定均於 jail.local 進行編輯。 ```shell= sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local ``` 設定檔 fail2ban.conf 裏,主要是對log的層級進行定義,維持預設即可, 裏面有一個重要參數 logtarget 定義了fail2ban的log檔,預設路徑如下, 當fail2ban在執行上有問題時,可於log檔中尋找問題線索。 ```shell= logtarget = /var/log/fail2ban.log ``` 而 jail.conf 的 [DEFAULT] 區段裏,則可對白名單、封鎖時間、允許密碼猜測次數、封鎖動作,等進行定義。 其中 ignoreip 參數是用來定義白名單,預設只有 127.0.0.1/8 本機網段,有需要增加網段時,以空白字元分隔即可。 ```bash= ignoreip = 127.0.0.1/8 192.168.0.1/32 bantime = -1 #定義封鎖時間,預設是3600秒,若想永久封鎖,可改為-1。 findtime 參數 #則是定義距離上一次錯誤密碼的時間,預設是600秒。 maxretry 參數 #允許密碼猜測的最多次數,預設為3次。 destemail 參數 #是收件人的email。 sendername 參數 #是寄件人的顯示名稱。 mta 參數 #發送郵件的agent,預設是sendmail。 #若想透過Gmail來發信,那麼這三個參數可以修改如下。 destemail = 你的帳號@gmail.com sendername = Fail2Ban mta = mail ``` 現有服務設定 ``` [DEFAULT] #允許通過ip區段 ignoreip = 127.0.0.1/8 [sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log # backend = systemd maxretry = 5 findtime = 600 bantime = -1 # 檢測密碼認證失敗 [apache] enabled = true port = http,https filter = apache-auth logpath = /var/log/apache*/*access.log maxretry = 2 bantime = -1 # 檢測漏洞和 PHP 脆弱性掃描 [apache-noscript] enabled = true port = http,https filter = apache-noscript logpath = /var/log/apache*/*error.log maxretry = 6 bantime = -1 # 檢測 Apache 溢位攻擊 [apache-overflows] enabled = true port = http,https filter = apache-overflows logpath = /var/log/apache*/*error.log maxretry = 2 bantime = -1 # 檢測在伺服器尋找主目錄的嘗試 [apache-nohome] enabled = true port = http,https filter = apache-nohome logpath = /var/log/apache*/*error.log maxretry = 2 bantime = -1 # Apache 機器人 [apache-badbots] enabled = true port = http,https filter = apache-badbots logpath = /var/log/apache*/*access.log maxretry = 2 bantime = -1 # Apache error 404 444 403 400 301 [apache-error] enabled = true port = http,https logpath = /var/log/apache*/access.log maxretry = 2 bantime = -1 # PingTools [PingTools] enabled = true port = http,https logpath = /var/log/apache*/access.log maxretry = 2 bantime = -1 ``` 通用區段裏的參數設定好了,接著就在設定檔的後半段來進行個別服務的設定。 fail2ban預設只對SSH啟用,所以在jail.conf的 [ssh] 區段裏,我們可以看到 enabled 參數是 true 啟用的;而其它 [sasl]、[vsftpd]、[postfix]、[dovecot]…區段的 enabled 參數則是 false,預設狀態下未啟用。這部分請依實際需求來進行啟用。 使用錯誤的密碼來登入SSH進行測試,在失敗次數達最大值後,理論上我們會被強迫踢出, 我們可以透過iptables的檢視指令,來查看被封鎖的規則。 ```shell= iptables -L ``` 由於fail2ban是透過iptables來進行封鎖的,若要解鎖就要查出它是對應到哪條規則,然後再去刪除掉這條規則。 ```shell= iptables -L --line-numbers ``` 舉個例子為例,透過 iptables -L --line-numbers 查出的chain-name為fail2ban-ssh,遭封鎖IP 192.168.0.2的line-number為1,那我們就可以下如下的指令將這條規則刪除,以解除192.168.0.2的封鎖。 ```shell= iptables -D fail2ban-ssh 1 ``` 如果想要更狠一點,一偵測到密碼猜測的行為,就直接封鎖該IP, 管它用的是SSH還是FTP,完全拒絕提供該IP任何服務,那要怎麼做? 首先,先在 jail.local 中查看 banaction 參數的內容(預設是iptables-multiport)。 ```bash= banaction = iptables-multiport ``` 以預設的 iptables-multiport 為例,接著到 /etc/fail2ban/action.d/ 目錄下,修改對應的設定檔 iptables-multiport.conf,將 actionban 與 actionunban 這兩個iptables的規則改為完全封鎖的設定。 ```bash= #actionban = iptables -I fail2ban-<name> 1 -s <ip> -j <blocktype> actionban = iptables -I INPUT -s <ip> -j DROP ... #actionunban = iptables -D fail2ban-<name> -s <ip> -j <blocktype> actionunban = iptables -D INPUT -s <ip> -j DROP ``` 最後再重啟fail2ban服務即可~ ```shell= service fail2ban restart ``` :::info 重開機或重啟服務後,因iptables中對應的chain重新載入,之前封鎖的IP就不見。 :::