對 于Linux來說,使用SSH連接可以實現遠程訪問。不過,這也成了黑客重點攻擊的目標。如果黑客破譯了連接密碼,就可以輕松的對SSH服務器進行滲透和破壞。因此,如何保護SSH服務的安全,是管理員必須重視的問題。除了使用各種安全軟件外,利用Linux中內置的NetFilter防火墻模塊,通過編寫簡單的規則,就可以有力的保護SSH連接的安全。
對于SSH來說,最好的使用方法是隨用隨開。當使用完畢后,自動將其關閉。這樣,不僅利于管理,還可以有效防范黑客偷襲。其實,只有合理配置規則,就可以實現上述功能。例如管理員可以自定義ping數據包的大小,當發送特定大小的ping數據包時,可以開啟或者關閉TCP 22端口。執行“iptables-A INPUT -p icmp -icmptype echo-request -m length -length 1028 LOG-log-prefix "autossh"”命令,可以在“Filter”表中的“INPUT”鏈中追加一條規則,其作用是對于發送長度為1028字節的ping數據包的網絡連接進行記錄,將其添加“autossh”的前綴信息,存放到系統日志中。
其中的“-p icmp”參數表示處理ICMP協議,“-icmp-type echo-request”參數表示匹配ICMP連接類型,這里為請求連接的ping數據包。“-m”參數表示使用擴展匹配選項,“length-length 1028”參數表示匹配特定長度的ICMP數據包,這里長度為1028字節。“-log-prefix”參數表示執行記錄操作,并添加指定的前綴。執行“iptables -A INPUT -p icmp-icmp-type echo-request-mlength-length 968-m recent -set -name opendoor -rsource -j ACCEPT”命令,可以追加一條規則,對于符合上述長度要求的ICMP連接進行記錄,記 錄 文 件 為“opendoor”。“--rsource”參數表示同步記錄源地址。
執行“iptables -A INPUT -p tcp -dport 22-syn -m recent -rcheck-s econds 60 -name opendoor -rsource -j ACCEPT”命令,來追加一條規則。其作用是檢測在60秒時間內,在名為“opendoor”的記錄文件內是否存在地址記錄信息,如果有的話,就允許其連接本機TCP 22端口。執行“iptables -A INPUT-p icmp -icmp-type echorequest -m length -length 1098 -m recent -set-name opendoor -rmove -j ACCEPT”命令,可以追加一條規則,其作用是當接收到客戶端發來長度為1098字節的ICMP數據包時,將其地址從名為“opendoor”的記錄文件中刪除,其中的“-rmove”參數表示刪除記錄文件內容。當然,對于已經存在的連接是允許的。
執行“iptables -A INPUT -m state -state ESTABLISHED -j ACCEPT”命令,添加所需規則即可。這樣,在客戶端執行“ping xxx.xxx.xxx.xxx -l 1008”,向 Linux服務器(假設其地址為“xxx.xxx.xxx.xxx”)發送長度為 1008的ICMP包,其中的“-l”參數可以指定數據包大小,注意因為ICMP和IP頭長度之和為20字節,所以實際發送的指定的長度應該為1008,當Linux服務器接收到該長度的ICMP數據包后,依據上述規則,Linux服務器就允許其使用SSH連接訪問了。對應的,執行“ping xxx.xxx.xxx.xxx -l 1078”名命令,向服務器發送長度為1078的ICMP數據包,服務器就會按照預設規則禁止其建立新的SSH連接。對于已經建立的SSH連接,則不予攔截。
SYN攻擊屬于DoS攻擊的一種,它利用TCP協議缺陷,通過發送大量的半連接請求,耗費服務器CPU和內存資源。SYN攻擊除了能影響主機外,還可以危害路由器、防火墻等網絡系統,事實上SYN攻擊并不管目標是什么系統,只要這些系統打開TCP服務就可以實施。對于非偽造IP發起的SYN洪水攻擊,可以使用對應的IPTables規則進行防御,這對于防御CC攻擊同樣有效。
執行“iptables -A INPUT -p tcp -dport 80-syn recent -name antidos-rcheck -seconds 30-hitcount 10 -j LOG -log-prefix ‘fyhs:’ -logip-options”命令,可以追加一條規則,其作用是當客戶端針對Linux服務器的TCP 80端口發起連接時,如果在30秒內連接的次數超過10個,就記錄客戶端的IP等信息,其中的“-log-ipoptions”參數表示記錄連接著的IP。執行“iptables-A INPUT -p tcp -dport 80 -syn recent -name antidos -rcheck -seconds 30 -hitcount 10 -j DROP”命令,來添加一條規則,當滿足以上連接條件后,禁止其繼續連接。執行“iptables-A INPUT -p tcp -dport 80 -syn -m recent -name antodos -ser -j ACCEPT”命令,添加一條規則,其作用是創建名為“antidos”的記錄文件,記錄符合要求的連接信息,例如10條以內的連接信息等。
為便于遠程管理Linux服務器,一般會開啟SSH連接通道,讓管理員可以遠程登錄到Linux服務器執行各種操作。黑客為非法控制目標Linux服務器,也會想方設法破解SSH連接密碼。黑客往往會借助專用的破解工具,配合密碼字典來加快密碼破解速度。為防范這種入侵,可以執行“iptables -A INPUT -p tcp -syn -dport 22 -m recent -name caice-update -seconfs 120-hitcount 4 -j DROP”命令,在“Filter”表中的“INPUT”鏈中追加一條規則,其作用是如果在120秒內檢測到針對TCP 22端口的首次連接的數量超過4次,就對其進行攔截。
其中的“-p tcp”參數表示針對TCP協議生效,因為SSH使用的是TCP 22端口。“-dport”參數表示目標端口為 22,“-name caice”參 數表示記錄文件名為“caice”。執行“iptables -A Input-p -syn -dport 22 -m recent -name caice --set-j ACCEPT”命令,追加一條防火墻規則,其作用是創建名為“caice”的記錄文件,將首個SSH連接信息寫入到該記錄文件中,作為上一條規則的檢測條件。
即如果黑客在2分鐘內連續建立的連接超過預設值,就被視為非法破解密碼行為,防火墻即可對其進行攔截。使用VI命令打開“/etc/ssh/sshd_config”文件,在其中的“MaxAuthTries”參數中存儲的是最大允許連接次數,默認為6。為安全起見,建議為其設置一個更小的數值,例如只允許嘗試3次連接等。若黑客使用專用破解工具的話,會在終止連接后,自動向Linux服務器發送帶有SYN標記的數據包來欺騙服務器實現連續猜測密碼。利用上述防火墻規則,就可對其進行有效防御了。
對于非加密連接是可以針對其發送的數據包中的特征字符串進行過濾攔截的。如對郵件服務器,其提供的POP3服務提供收信功能。若黑客破解用戶郵箱密碼,使用WireShark等嗅探工具,針對POP3的連接過程進行分析,可發現當使用錯誤密碼連接時,在返回的數據包中出現“-ERR Authentication failed”字樣。
當黑客對POP3服務器進行密碼破解時,也必然在返回的數據包中出現以上內容,因為黑客必須經過很多次的嘗試方可。因此執行“iptables -A OUTPUT -p tcp --algo bm -sport 110 -m string-algo bm -string "-ERR Authentication failed "-m recent -name mailcc-update -seconds 600-hitcount 6 -j REJECT”命令,可以在“Filter”表中的“OUTPUT”鏈中追加一條規則,其作用是檢測針對源TCP 110端口發出的數據包的內容進行過濾,如果發現其中包含“-ERR Authentication failed”內容,并且在名為“mailcc”的記錄文件中記錄的連接數量在600秒內超過6次時,就對其攔截。
其中的“OUTPUT”參數表示針對的是“OUTPUT”鏈,因為POP3服務器會將應答信息通過該“OUTPUT”鏈返回給客戶端。“-sport 110”參數表示源端口為110,“--algo bm”參數表示使用的匹配的算法為Boyer-Mppre,參數“-string”表示匹配指定的字符串,“-j REJECT”參數表示執行攔截操作,但是會給客戶端發送一個ICMP包給客戶端。表示網絡連接出現了問題。繼續執行“iptables-A OUTPUT -p tcp --algo bm -sport 110 -m string-algo bm -string "-ERR Authentication failed "-m recent -name mailcc-set”命令,來追加一條規則,其作用是創建名為“mailcc”的記錄文件,記錄下針對滿足以上條件的網絡連接,為上一條規則提供檢測基礎。