一、背景
開放到公網的主機無時無刻不在遭受攻擊,其中ssh暴力破解頻率最高,會有無數機器不分日夜地搜索公網上的獵物,然后進行弱密碼嘗試
如果你的公網機器恰巧設的弱密碼,估計剛裝上系統,沒過幾小時別人就進來動手腳了
當然我們設置的密碼如果夠強,8位以上混合大小寫+數字,是不會被爆破出來的。攻擊者為了效率着想,廣撒網,一般只會對你進行三四千次嘗試,不過攻擊的人會比較多,平均下來你每天也會被攻擊8000次這樣
如何查看自己有沒有被攻擊呢?看ssh日志即可
grep 'Failed password' /var/log/secure -c
直接看到你被攻擊過多少次,因為歷史日志會被自動備份,所以這是你近幾天的量
find /var/log -name 'secure*'|xargs ls -l
查看所有ssh日志文件信息
grep 'Failed password' /var/log/secure|tail -10
查看最近10條被攻擊記錄
其他日志文件:有關當前登錄用戶的信息記錄在文件utmp中;登錄進入和退出紀錄在文件wtmp中;最后一次登錄消息在lastlog中。三者都是二進制文件,無法直接查看,需要用命令查看
who # 顯示所有當前登錄的shell,包括用戶、時間和IP
users # 顯示所有當前登錄的用戶
who /var/log/wtmp # 顯示歷史登錄記錄
一般的防御方法:
-
密碼設得超強——別人爆破我無所謂,覺得日志文件太大看着不舒服再關閉日志、調整等級
-
更改端口號,其實無效,攻擊者會端口掃描
-
禁止root用戶遠程登錄,增大破解難度。仍要超級管理員登錄可以添加一個和root一樣權限的用戶,別去改root的用戶名,系統軟件會出問題
-
自己寫腳本,檢查/var/log/secure 內登錄失敗次數超過某個閾值的ip並將它添加到/etc/hosts.deny,檢查secure的頻率要夠高,秒級別的,不然別人都爆破完了腳本還沒反應過來
-
寫腳本難度大可以用別人寫的工具,這里推薦fail2ban,他除了能防護ssh,還能防護web服務免於目錄爆破,GitHub項目地址
二、fail2ban原理及安裝
fail2ban使用python編寫,原理簡單理解為掃描日志,發現危害行為,然后去配置防火牆規則,把危險ip給ban掉
官方手冊指出,fail2ban掃描日志頻率是1s
以centos7為例,默認安裝了python2.7,無需手動安裝。默認防火牆是firewalld,所以安裝的版本應該是fail2ban-firewalld。如果你防火牆是iptables,則安裝fail2ban即可
yum -y install fail2ban-firewalld
三、配置
使用默認配置的話很簡單
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vi /etc/fail2ban/jail.local
# 顯示行號
:set nu
# 把23、24行的注釋給去掉,保存退出
# [sshd]
# enabled = true
到這里就能啟動了,如果想修改配置,這里提供一些參考
配置文件雖然有近千行,但是大部分是注釋,而用於ssh的就幾行
# [DEFAULT] 配置大概從87行開始
#ignoreself = true
#ignoreip = 127.0.0.1/8 ::1
ignorecommand =
# "bantime" is the number of seconds that a host is banned.
bantime = 24h
# A host is banned if it has generated "maxretry" during the last "findtime "
# seconds.
findtime = 1h
# "maxretry" is the number of failures before a host get banned.
maxretry = 2
# "maxmatches" is the number of matches stored in ticket (resolvable via ta g <matches> in actions).
maxmatches = %(maxretry)s
# [sshd] 在280行
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
重要的參數在[DEFAULT]中,意思是掃描日志文件的最后findtime(分鍾),發現有maxretry次登錄失敗記錄,則把這個ip拉黑bantime(分鍾),時間單位可以是 s、m、h
ignoreip 是白名單,[sshd] 中可以改端口,但沒必要
四、啟動和狀態查看
啟動、關閉、重啟、狀態、開機自啟:systemctl start|stop|restart|status|enable fail2ban.service
查看服務具體信息:
# 查看fail2ban正守護着哪些服務
fail2ban-client status
# 查看ssh黑名單
fail2ban-client status sshd
測試規則是否生效:
拿另一台機器 ssh root@your_ip
,密碼錯誤會提示 Permission denied,ip被ban提示 Connection refused。ssh密碼錯誤會再讓你輸兩次,這其中恰好被ban的話會卡住,ctrl+c即可
使用fail2ban后,每天被嘗試密碼的次數能降到100條以內。