Fail2ban防暴力破解
企業案例
生產環境發現總是有人嘗試ssh暴力破解密碼:
grep 'Failed' /var/log/secure
頻繁登陸不僅危險,而且造成大量日志消耗性能,所以使用Fail2ban防止暴力破解
簡介
Fail2ban可以監視你的系統日志,然后匹配日志的錯誤信息(正則式匹配)執行相應的屏蔽動作(一般情況下是調用防火牆),例如當有人在試探你的SSH、SMTP、FTP密碼,只要達到你預設的次數,fail2ban就會調用防火牆屏蔽這個IP,而且可以發送e-mail通知系統管理員,是一款很實用、很強大的IP自動屏蔽工具!
簡潔的說,就是fail2ban通過對日志的監控, 發現具有破壞性的行為IP調用防火牆將它屏蔽一段時間
生產環境fail2ban常被放在跳板機上使用,將入口保護起來,如果不帶公網地址就不需要每台安裝,如果都有公網的話就都可以使用fail2ban
功能、特性
- 支持大量服務:sshd 、apache 、qmail 等
- 支持多作動作:iptables 、tcp-wrapper 、shorewall 、mail notifications 等
- logpath 選項中支持通配符
- 需要 Gamin 支持(Gamin 用於監控文件和目錄是否更改)
- 如果需要郵件通知,則系統事先要確保能夠正常發送郵件
安裝
環境檢查
- Python版本必須大於2.4.3
- 防火牆iptables必須開啟
安裝
# 需要epel源
yum -y install epel-release yum -y install fail2ban
目錄結構
/etc/fail2ban/ ├── action.d # iptables 、mail 等動作文件目錄 ├── fail2ban.conf # fail2ban 配置文件,定義日志級別、日志、sock 文件位置等 ├── filter.d # 條件匹配文件目錄,過濾日志關鍵內容 ├── jail.conf # fail2ban 防護配置文件
配置fail2ban實現防暴力破解
配置
官方的文檔寫到:在配置時,我們應該避免修改由fail2ban安裝創建的文件,我們應該去編寫具有.local擴展名的新文件。在.local新文件里配置的內容會覆蓋jail.conf內容里相同的值。當我們的配置發生改變了我們可以使用 fail2ban-client reload ,來加載新的配置。
vim /etc/fail2ban/jail.d/jail.local
文件內容:
# defalut這里是設定全局設置,如果下面的監控沒有設置就以全局設置的值設置。 [DEFAULT] # 用於指定哪些地址ip可以忽略 fail2ban 防御,以空格間隔。 ignoreip = 127.0.0.1/8 # ssh客戶端主機被禁止的時長(默認單位為秒) bantime = 3600 # 過濾的時長(秒) findtime = 600 # 匹配到的閾值(允許失敗次數) maxretry = 3 [ssh-iptables] # 是否開啟 enabled = true # 過濾規則 filter = sshd # 動作 action = iptables[name=SSH, port=ssh, protocol=tcp] # 日志文件的路徑 logpath = /var/log/secure # 匹配到的閾值(次數) maxretry = 3
在這里需要注意一點就是:我們上面的action設置的時候,port=ssh,如果我們更改了sshd服務的端口號,我能需要在這里設置對應的端口號,否則配置不生效。
啟動:
/etc/init.d/fail2ban start
如果修改了配置需要重啟生效:
fail2ban-client reload
測試
故意輸入錯誤密碼3次,再進行登錄時,會拒絕登錄
[root@hostname ~]# ssh 192.168.1.87 root@192.168.1.87's password: Permission denied, please try again. root@192.168.1.87's password: Permission denied, please try again. root@192.168.1.87's password: Permission denied (publickey,password). [root@hostname ~]# ssh 192.168.1.87 ssh: connect to host 192.168.1.87 port 22: Connection refused
我們可以查看當前被禁止登陸的ip:
[root@hostname jail.d]# fail2ban-client status ssh-iptables Status for the jail: ssh-iptables |- Filter | |- Currently failed: 0 # 當前失敗次數 | |- Total failed: 3 # 總失敗次數 | `- File list: /var/log/secure # 日志文件路徑列表 `- Actions |- Currently banned: 1 # 當前禁止訪問的IP數量 |- Total banned: 1 # 禁止IP總數 `- Banned IP list: 192.168.1.77 # 被禁IP列表
Fail2ban常用命令
啟動/重啟/停止/狀態
/etc/init.d/fail2ban start/restart/stop/status
fail2ban-client常用命令
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-client set ssh-iptables banip 192.168.1.77
fail2ban-regex
測試篩選規則設否匹配當前的日志格式:
fail2ban-regex /var/log/secure /etc/fail2ban/filter.d/sshd.conf
Fail2ban郵件報警
配置mail.rc
vim /etc/mail.rc 最后插入: set from=xxxxxxxxx@163.com smtp=smtp.163.com set smtp-auth-user=xxxxxxxx smtp-auth-password=xxxxxxxx
測試:echo test | mailx -v -s "test" test@qq.com
然后在jail.local(自己的配置文件里),加入:
mail-whois[name=SSH, dest=xxxxx@qq.com]
dest 是填入收件人郵箱
最后重新加載下配置即可。
史前巨坑
郵件配置一定要在action后面,而且一定要是下面的格式,否則你會折騰一下午找收不到郵件的原因,fk
# 動作 action = iptables[name=SSH, port=ssh, protocol=tcp] mail-whois[name=SSH, dest=xxxxxxxx@qq.com]
注意的問題:
python版本問題
是由於更新系統默認python 版本,而 配置自動找尋的是 python 2.6,所以需要重新配置 引導python版本: 編輯: /usr/bin/fail2ban-server 和 /usr/bin/fail2ban-client 更改 第一行: #!/usr/bin/python -Es 更改為 #!/usr/bin/python2.6 -Es
時區問題:
http://www.fail2ban.org/wiki/index.php/FAQ_english:If time reference is not the same everywhere, then fail2ban won't ban any IP!
當我們更改了時區后,然后日志的時間並沒有修改過來,導致兩者的時間不一致,這樣fail2ban的工作就失效了
解決辦法:重啟日志服務:systemctl restart rsyslog,保證兩者的時間一致。
修改端口問題:
sshd更改端口號后使用fail2ban需要注意在填寫配置的時候也需要更改端口號。否則會出現就算會將ip添加到防火牆,但是由於我更改了端口號,是起不到禁止作用的。
解決方法:配置文件中 action = iptables[name=SSH, port=ssh, protocol=tcp] ,port位置修改為新的端口。
結語
防止服務器被入侵還有很多方法,比如:
- 用密鑰登陸,不用密碼登陸
- 盡量不給服務器外網IP
- 修改SSH端口號
- 開啟SSH只監聽內網地址,通過VPN登陸跳板機,然后登陸
- 對外只開放80及443端口
- 最小化安裝(因為軟件安裝要給它授權)
其實包括fail2ban等等這些操作還是很有必要的,因為入侵者會用nmap掃描開放的端口然后會嘗試登陸,一是,頻繁登陸會生成日志浪費系統性能,二是,萬一密碼被破解后果不堪設想,而責任都在身為運維的你身上