在最近一次雲上線的過程當中,頻繁遇到綁定公網浮動IP的雲主機遭受外界SSH暴力破解***及用戶設置弱密碼的問題,由此引起的安全問題引發了針對防護SSH暴力破解的思考。python
SSH暴力破解算法
hydra 和medusa是世界頂級密碼暴力破解工具,支持幾乎全部協議的在線密碼破解,功能強大,密碼可否被破解關鍵取決於破解字典是否足夠強大。在網絡安全***過程當中,hydra 和medusa是必備的測試工具,配合社工庫進行社會工程學***,有時會得到意想不到的效果。圖示兩款工具使用密碼字典窮舉SSH密碼的過程。安全
iptables限制ssh訪問頻率服務器
面對暴力破解,根據其工做原理可知:下降其試錯頻率,提升其試錯次數,從而將破解時間提升到不可容忍的程度,是一條有效的防範手段。網絡
提升***方試錯次數,無非是提高密碼長度,擴展密碼複雜度,按期更換密碼這些手段。而下降***方的試錯頻率其實也是一條值得一試的防護手段。運維
經過調用iptables的state模塊與recent模塊,實現對SSH訪問的頻率限制。這裏重點解釋下不經常使用的recent擴展模塊。ssh
recent模塊tcp
Recent,該擴展可以動態的建立IP地址列表,用於後期以多種不一樣形式作出匹配。該擴展支持如下多種選項:ide
iptables規則內容工具
要實現對SSH訪問頻率的控制,iptables規則以下兩條:
#如果SSH訪問,源IP在最近訪問列表中,且60秒內訪問次數大於等於3次,則丟棄。
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSH_RECENT --rcheck --seconds 60 --hitcount 3 -j DROP
#如果SSH訪問,則將源IP加入最近訪問列表中。
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSH_RECENT –set
實現效果
實現效果以下圖所示。高頻率的密碼試錯將被終結,直至一分鐘超時後纔可從新開始。
在/proc/net/xt_recent目錄中,存在名爲SSH_RECENT的一個日誌文件。文件中記錄了上面輸入的iptables規則記錄的最近訪問SSH服務的源IP信息以及訪問時間。其中默認記錄的oldest_pkt是20個,能夠經過modprobe ipt_recent ip_pkt_list_tot=50調大。默認記錄的源IP是100個,能夠經過modprobe ipt_recent ip_list_tot=1024 擴大記錄數量。
iptables實現遠程開啓ssh功能
任何一次靠譜的網絡***都起步於網絡偵查。若是***者在網絡偵查階段未發現目標開啓SSH登陸服務,這也將挫敗其針對SSH發起***的計劃。這裏經常使用的操做都是更改SSH的默認22端口至其餘端口號上以迷惑端口掃描軟件。實際經過nmap等工具仍是能夠掃描到端口上捆綁的具體服務,以下圖所示。這裏經過一個取巧的辦法,利用指定報文長度的ICMP做爲鑰匙,開啓主機上的SSH服務。經過這種方式隱藏SSH服務端口。
iptables規則內容
以指定包長的ICMP報文,做爲鑰匙,開啓對端的SSH服務。具體iptables規則以下所示。
#用78字節的icmp數據包做爲鑰匙(包含IP頭部20字節,ICMP頭部8字節),將源IP加入SSH白名單 iptables -A INPUT -p icmp --icmp-type 8 -m length --length 78 -m recent --name SSH_ALLOW --set -j ACCEPT
#檢查訪問SSH服務的源IP是否在白名單中,且白名單中的IP有效期爲15秒。若在白名單中則放行通信。
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSH_ALLOW --rcheck --seconds 15 -j ACCEPT
#對於已創建的SSH鏈接放行
iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT
#其餘SSH無關匹配所有拒止
iptables -A INPUT -p tcp --dport 22 -j DROP
實現效果
最終能夠實現下圖所示效果。在未使用指定包長ICMP以前,SSH服務沒法通行(步驟1)。在使用指定包長ping以後(步驟2),使用SSH能夠正常鏈接(步驟3)。以此實現了指定包長ICMP做爲鑰匙開啓SSH通訊服務的效果。其原理與上節限制SSH通訊頻率的原理一致。
Fail2ban防止SSH暴力破解
安裝:
Centos上能夠直接經過yum install fail2ban –y安裝。安裝完成後,可在/etc/fail2ban路徑下找到程序運行的相應文件。在filter.d目錄下存放有fail2ban支持的全部過濾器,action.d目錄下存放有fail2ban支持的全部動做。經過在jail配置文件中組合多種過濾器與動做,能夠實現各類自定義的防護功能(不只限於SSH防禦)。
配置及運行:
對於fail2ban而言,每一個.conf配置文件均可以被同名的.local文件重寫。程序先讀取.conf文件,而後讀取.local文件。.local中的配置優先級更高。經過新建jail.local,增長下述配置,運行fail2ban-client start來實現對SSH暴力破解的防護。
[DEFAULT]
#白名單
ignoreip = 127.0.0.1/8
#解封禁時間
bantime = 600
#試錯窗口時間
findtime = 600
#允許試錯次數
maxretry = 3
[ssh-iptables]
#使能
enabled = true
#選擇過濾器
filter = sshd
#選擇防護動做
action = iptables[name=SSH, port=ssh, protocol=tcp]
#郵件通知
sendmail-whois[name=SSH,dest=yang.hongyu@99cloud.net, sender=test@email.com]
#SSH日誌路徑
logpath = /var/log/secure
#允許試錯次數(優先級比default高)
maxretry = 1
運行效果:
經過對目標主機的SSH試錯,/var/log/secure日誌中記錄了SSH登陸的錯誤信息。fail2ban經過對該文件的分析,識別出當前正在遭遇到SSH的暴力破解,繼而觸發防護功能。fail2ban-client status命令能夠查看當前fail2ban的運行狀態,遭遇SSH暴力破解後,識別到的***IP被添加至Banned IP list中,實際阻斷功能則是fail2ban經過在iptables中下發針對***IP的阻斷規則來實現。
Denyhost防止SSH暴力破解
Denyhost工做原理與Fail2ban基本一致,一樣是分析SSH的日誌文件,定位重複的暴力破解IP。與Fail2ban經過寫iptables規則阻斷***IP的訪問不一樣,Denyhost經過將***IP記錄到hosts.deny文件來實現屏蔽***IP對SSH的訪問。
Denyhost安裝:
wget "downloads.sourceforge.net/project/denyhosts/denyhosts/2.6/DenyHosts-2.6.tar.gz"
tar -xzf DenyHosts-2.6.tar.gz
cd DenyHosts-2.6
python setup.py install
Denyhost配置及運行:
#生成配置文件副本
cd /usr/share/denyhosts/
#生成配置文件副本
cp denyhosts.cfg-dist denyhosts.cfg
#生成執行文件副本
cp daemon-control-dist daemon-control
chmod 700 daemon-control
#自定義配置文件denyhosts.cfg
#SSH log路徑
SECURE_LOG = /var/log/secure
#存儲SSH拒止host信息的配置文件路徑
HOSTS_DENY = /etc/hosts.deny
#拒止時間,此處配置爲10分鐘
PURGE_DENY = 10m
#無效用戶登陸重試次數限制
DENY_THRESHOLD_INVALID = 5
#有效用戶登陸重試次數限制
DENY_THRESHOLD_VALID = 10
#ROOT用戶登陸重試次數限制
DENY_THRESHOLD_ROOT = 1
#啓動運行
./daemon-control start
Denyhost效果:
從Denyhost的運行日誌中看出,對目標主機的屢次SSH密碼試錯觸發了Denyhost的防護功能。***者的IP被添加至hosts.deny文件,該IP下的SSH訪問也被拒止。
網絡安全,何來一招鮮
可能有些人要說使用密鑰登陸就能完美解決SSH暴力破解的問題。這裏要說一段歷史。2006年Debian Linux發行版中發生了一件有意思的事,軟件自動分析工具發現了一行被開發人員註釋掉的代碼。這行被註釋掉的代碼用來確保建立SSH祕密鑰的信息量足夠大。該代碼被註釋後,密鑰空間大小的熵值下降到215。這意味着不論哪一種算法和密鑰長度,最終生成的密鑰一共只有32767個,複雜度比一個純6位數字的密碼的複雜度更差。該錯誤在兩年以後才被發現,無疑至關多的服務器上都利用這這種存在缺陷的弱密鑰。(引用自:Violent Python:A Cookbook for Hackers)
網絡安全沒有一招鮮。前文中列舉的四種安全加固方式也沒法抵禦運維人員設置的弱密碼,及***者的社工密碼庫。運維人員,惟有提升自身安全意識,合理利用安全工具,才能保障網絡安全。
最後說一句:道路千萬條,安全第一條。操做不規範,運維兩行淚。