您好,登錄后才能下訂單哦!
在最近一次云上線的過程中,頻繁遇到綁定公網浮動IP的云主機遭受外界SSH暴力破解***及用戶設置弱密碼的問題,由此引發的安全問題引起了針對防御SSH暴力破解的思考。
SSH暴力破解
hydra 和medusa是世界頂級密碼暴力破解工具,支持幾乎所有協議的在線密碼破解,功能強大,密碼能否被破解關鍵取決于破解字典是否足夠強大。在網絡安全***過程中,hydra 和medusa是必備的測試工具,配合社工庫進行社會工程學***,有時會獲得意想不到的效果。圖示兩款工具使用密碼字典窮舉SSH密碼的過程。
iptables限制ssh訪問頻率
面對暴力破解,根據其工作原理可知:降低其試錯頻率,提高其試錯次數,從而將破解時間提高到不可容忍的程度,是一條有效的防范手段。
提高***方試錯次數,無非是提升密碼長度,擴展密碼復雜度,定期更換密碼這些手段。而降低***方的試錯頻率其實也是一條值得一試的防御手段。
通過調用iptables的state模塊與recent模塊,實現對SSH訪問的頻率限制。這里重點解釋下不常用的recent擴展模塊。
recent模塊
Recent,該擴展能夠動態的創建IP地址列表,用于后期以多種不同形式做出匹配。該擴展支持以下多種選項:
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)
網絡安全沒有一招鮮。前文中列舉的四種安全加固方式也無法抵御運維人員設置的弱密碼,及***者的社工密碼庫。運維人員,唯有提高自身安全意識,合理利用安全工具,才能保障網絡安全。
最后說一句:道路千萬條,安全第一條。操作不規范,運維兩行淚。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。