--- 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就不見。 :::
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.