CentOS7防止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

 

查看哪些ip連接了,以及每個ip有多少個連接。左邊的數字是連接數:

netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

 

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目錄,其它目錄/文件一般很少用到,如果需要詳細了解可自行搜索。

fail2ban 結構

/etc/fail2ban ## fail2ban 服務配置目錄
/etc/fail2ban/action.d ## iptables 、mail 等動作文件目錄
/etc/fail2ban/filter.d ## 條件匹配文件目錄,過濾日志關鍵內容
/etc/fail2ban/jail.conf ## fail2ban 防護配置文件
/etc/fail2ban/fail2ban.conf ## fail2ban 配置文件,定義日志級別、日志、sock 文件位置等

 

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),可能每天都會被掃描,我們可以修改端口盡量避免被掃或者可以使用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防護的作用。

fail2ban在/etc/fail2ban/filter.d這個目錄已經內置了很多規則可以參考。如:nginx-limit-req.conf,Nginx的limit_req_zone用法詳細請見:https://blog.csdn.net/keketrtr/article/details/75315330

當然也可以自己新建規則:

#需要先新建一個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日志路徑。

使用如下命令,可以測試正則規則的有效性:

fail2ban-regex /usr/local/nginx/logs/access.log /etc/fail2ban/filter.d/nginx-cc.conf

 

防止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 restart fail2ban
#開機啟動
systemctl enable fail2ban
#是配置立即生效
systemctl daemon-reload
#查看是否開機啟動
systemctl is-enabled fail2ban
#查看被ban IP,其中sshd為名稱,比如上面的[wordpress]
fail2ban-client status sshd
#刪除被ban IP
fail2ban-client set sshd unbanip 192.168.111.111
或
fail2ban-client set sshd delignoreip 192.168.111.111
#如果用以上命令刪除被ban IP發現這個IP還是無法連接,是因為在臨時策略中的ipset集合,只有電腦重啟或者從這里面刪除IP才行。
#查看臨時策略中的ipset集合:“ipset list”,刪除ipset集合中IP:“ipset del fail2ban-sshd 192.168.111.111 -exist”
#查看日志
tail /var/log/fail2ban.log

 

start 啟動fail2ban server和監獄
reload 重新加載配置文件
stop 暫停fail2ban和監獄
status 查看運行的監控服務數量和列表
set loglevel  設置日志等級,有 CRITICAL, ERROR, WARNING,NOTICE, INFO, DEBUG
get loglevel 獲取當前日志的等級
set <JAIL> idle on|off  設置某個監控(監獄)的狀態。
set <JAIL> addignoreip <IP> 設置某個監控(監獄)可以忽略的ip
set <JAIL> delignoreip <IP> 刪除某個監控(監獄)可以忽略的ip
set <JAIL> banip <IP> 將ip加入 監控(監獄)
set <JAIL> unbanip <IP> 將ip從監控(監獄)移除

 

 

fail2ban郵件預警

1.在/etc/mail.rc末尾配置發件人的信息:

set ssl-verify=ignore
set from=djx
set smtp=smtps://mail.163.com:25
set smtp-auth-user=dj
set smtp-auth-password=
set smtp-auth=login
set nss-config-dir=/root/.certs

2.然后在jail.local(自己的配置文件里),加入:

mail-whois[name=SSH, dest=收件人@qq.com, sender=發送人@163.com]

 

注意的問題

 

問題1-時間文件: 當我們更改了時區后,然后日志的時間並沒有修改過來,導致兩者的時間不一致,這樣fail2ban的工作就失效了。

解決辦法:重啟日志服務:systemctl restart rsyslog,保證兩者的時間一致。

 

問題2-修改端口問題:sshd更改端口號后使用fail2ban需要注意在填寫配置的時候也需要更改端口號。否則會出現就算會將ip添加到防火牆,但是由於我更改了端口號,是起不到禁止作用的。

解決辦法:在配置文件/etc/fail2ban/jail.local中修改新的端口號。

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM