1. 程式人生 > >CentOS 7安裝fail2ban+Firewalld防止SSH爆破與CC攻擊

CentOS 7安裝fail2ban+Firewalld防止SSH爆破與CC攻擊

fail2ban介紹

fail2ban可以監視你的系統日誌,然後匹配日誌的錯誤資訊執行相應的遮蔽動作。網上大部分教程都是關於fail2ban+iptables組合,考慮到CentOS 7已經自帶Firewalld,所以這裡我們也可以利用fail2ban+Firewalld來防CC攻擊和SSH爆破。

準備工作

1、檢查Firewalld是否啟用

#如果您已經安裝iptables建議先關閉
service iptables stop
#檢視Firewalld狀態
firewall-cmd --state
#啟動firewalld
systemctl start firewalld
#設定開機啟動
systemctl enable firewalld.service

啟用Firewalld後會禁止所有埠連線,因此請務必放行常用的埠,以免被阻擋在外,以下是放行SSH埠(22)示例,供參考:

#放行22埠
firewall-cmd --zone=public --add-port=22/tcp --permanent
#過載配置
firewall-cmd --reload
#檢視已放行埠
firewall-cmd --zone=public --list-ports

2、安裝fail2ban

fail2ban可以監控系統日誌,並且根據一定規則匹配異常IP後使用Firewalld將其遮蔽,尤其是針對一些爆破/掃描等非常有效。

#CentOS內建源並未包含fail2ban,需要先安裝epel源
yum -y install epel-release
#安裝fial2ban
yum -y install fail2ban

安裝成功後fail2ban配置檔案位於/etc/fail2ban,其中jail.conf為主配置檔案,相關的匹配規則位於filter.d目錄,其它目錄/檔案一般很少用到,如果需要詳細瞭解可自行搜尋。

3、配置規則

新建jail.local來覆蓋fail2ban的一些預設規則:

#新建配置
vi /etc/fail2ban/jail.local
#預設配置
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime  = 86400
findtime = 600
maxretry = 5
#這裡banaction必須用firewallcmd-ipset,這是fiewalll支援的關鍵,如果是用Iptables請不要這樣填寫
banaction = firewallcmd-ipset
action = %(action_mwl)s

引數說明:

ignoreip:IP白名單,白名單中的IP不會遮蔽,可填寫多個以(,)分隔
bantime:遮蔽時間,單位為秒(s)
findtime:時間範圍
maxretry:最大次數
banaction:遮蔽IP所使用的方法,上面使用firewalld遮蔽埠

防止SSH爆破

如果您還在使用預設SSH埠(22),可能每天都會被掃描,我們可以修改埠儘量避免被掃,參考: https://www.moerats.com/archives/394/ ,或者可以使用fail2ban將惡意IP遮蔽。

繼續修改jail.local這個配置檔案,在後面追加如下內容:

[sshd]
enabled = true
filter  = sshd
port    = 22
action = %(action_mwl)s
logpath = /var/log/secure

引數說明:

[sshd]:名稱,可以隨便填寫
filter:規則名稱,必須填寫位於filter.d目錄裡面的規則,sshd是fail2ban內建規則
port:對應的埠
action:採取的行動
logpath:需要監視的日誌路徑

到這一步,我們jail.local的規則看起來可能像下面這樣子:

[DEFAULT]
ignoreip = 127.0.0.1/8
bantime  = 86400
findtime = 600
maxretry = 5
banaction = firewallcmd-ipset
action = %(action_mwl)s

[sshd]
enabled = true
filter  = sshd
port    = 22
action = %(action_mwl)s
logpath = /var/log/secure

上面的配置意思是如果同一個IP,在10分鐘內,如果連續超過5次錯誤,則使用Firewalld將他IP ban了。輸入systemctl start fail2ban啟動fail2ban來試試效果。

使用另一臺伺服器不斷嘗試連線SSH,並且不斷的將密碼輸入錯誤,你會發現連續超過5次後直接連不上,說明IP被ban了,可以輸入:fail2ban-client status sshd檢視被ban的IP,如下截圖。

防止CC攻擊

這裡僅以Nginx為例,使用fail2ban來監視nginx日誌,匹配短時間內頻繁請求的IP,並使用firewalld將其IP遮蔽,達到CC防護的作用。

#需要先新建一個nginx日誌匹配規則
vi /etc/fail2ban/filter.d/nginx-cc.conf
#填寫如下內容
[Definition]
failregex =  -.*- .*HTTP/1.* .* .*$
ignoreregex =

繼續修改jail.local追加如下內容:

[nginx-cc]
enabled = true
port = http,https
filter = nginx-cc
action = %(action_mwl)s
maxretry = 20
findtime = 60
bantime = 3600
logpath = /usr/local/nginx/logs/access.log

上面的配置意思是如果在60s內,同一IP達到20次請求,則將其IP ban 1小時,上面只是為了測試,請根據自己的實際情況修改。logpath為nginx日誌路徑。

防止Wordpress爆破

如果您經常分析日誌會發現有大量機器人在掃描wordpress登入頁面wp-login.php,雖然對方可能沒成功,但是為了避免萬一還是將他IP幹掉為好。

#需要先新建一個nginx日誌匹配規則
vi /etc/fail2ban/filter.d/wordpress.conf
#填寫如下內容
[Definition]
failregex = ^ -.* /wp-login.php.* HTTP/1\.."
ignoreregex =

繼續修改jail.local追加如下內容:

[wordpress]
enabled = true
port = http,https
filter = wordpress
action = %(action_mwl)s
maxretry = 20
findtime = 60
bantime = 3600
logpath = /usr/local/nginx/logs/access.log

當然,別忘記輸入systemctl restart fail2ban重啟fail2ban使其生效。

常用命令

#啟動
systemctl start fail2ban
#停止
systemctl stop fail2ban
#開機啟動
systemctl enable fail2ban
#檢視被ban IP,其中sshd為名稱,比如上面的[wordpress]
fail2ban-client status sshd
#刪除被ban IP
fail2ban-client set sshd delignoreip 192.168.111.111
#檢視日誌
tail /var/log/fail2ban.log

總結

fail2ban已經內建很多匹配規則,位於filter.d目錄下,包含了常見的SSH/FTP/Nginx/Apache等日誌匹配,如果都還無法滿足您的需求,您也可以自行新建規則來匹配異常IP。使用fail2ban+Firewalld來阻止惡意IP是行之有效的辦法,可極大提高伺服器安全。

防cc指令碼: https://www.moerats.com/archives/484/