Try   HackMD

Fail2ban 限定登入錯誤次數

參考文章:
http://www.shunze.info/forum/thread.php?threadid=1889&boardid=3&sid=88fa90b4c493529c66704a5cdbc8cf9f

下載fail2ban

sudo apt-get install fail2ban

其中 jail.conf 會因套件的更新而被覆寫,所以fail2ban要求使用者先建立一個副本 jail.local,所有的設定均於 jail.local 進行編輯。

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

設定檔 fail2ban.conf 裏,主要是對log的層級進行定義,維持預設即可,
裏面有一個重要參數 logtarget 定義了fail2ban的log檔,預設路徑如下,
當fail2ban在執行上有問題時,可於log檔中尋找問題線索。

logtarget = /var/log/fail2ban.log

而 jail.conf 的 [DEFAULT] 區段裏,則可對白名單、封鎖時間、允許密碼猜測次數、封鎖動作,等進行定義。
其中 ignoreip 參數是用來定義白名單,預設只有 127.0.0.1/8 本機網段,有需要增加網段時,以空白字元分隔即可。

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的檢視指令,來查看被封鎖的規則。

iptables -L

由於fail2ban是透過iptables來進行封鎖的,若要解鎖就要查出它是對應到哪條規則,然後再去刪除掉這條規則。

iptables -L --line-numbers

舉個例子為例,透過 iptables -L line-numbers 查出的chain-name為fail2ban-ssh,遭封鎖IP 192.168.0.2的line-number為1,那我們就可以下如下的指令將這條規則刪除,以解除192.168.0.2的封鎖。

iptables -D fail2ban-ssh 1

如果想要更狠一點,一偵測到密碼猜測的行為,就直接封鎖該IP,
管它用的是SSH還是FTP,完全拒絕提供該IP任何服務,那要怎麼做?

首先,先在 jail.local 中查看 banaction 參數的內容(預設是iptables-multiport)。

banaction = iptables-multiport

以預設的 iptables-multiport 為例,接著到 /etc/fail2ban/action.d/ 目錄下,修改對應的設定檔 iptables-multiport.conf,將 actionban 與 actionunban 這兩個iptables的規則改為完全封鎖的設定。

#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服務即可~

service fail2ban restart

重開機或重啟服務後,因iptables中對應的chain重新載入,之前封鎖的IP就不見。