ssh服務是最常用的遠程登錄服務,雖然其比telnet安全多,但是也存在一定的安全漏洞。一些不友好的小夥伴們會使用一些不和諧程序對ssh服務進行暴力破解。對ssh服務進行適當的配置可以完全杜絕暴力破解。同時對sshd服務進行優化配置可以加快連接速度,減少耗費帶寬。
編輯/etc/ssh/sshd_config
Port 2222 ListenAddress 0.0.0.0 #若禁止外網用戶訪問,填寫內網IP地址(IPV4和IPV6) Protocol 2 #僅使用SSH協議版本2會更安全,SSH協議版本1有安全問題 PermitRootLogin no #禁止root用戶登陸,降低遠程登陸的用戶權限。 AllowUsers rd #僅允許指定用戶和組登錄 PubkeyAuthentication yes #使用公鑰認證,推薦使用安全高效! PasswordAuthentication no #禁止使用用戶名和密碼登陸,使用公鑰登陸,防止針對用戶名和密碼的暴力破解。 PermitEmptyPasswords no #不允許空密碼登錄,這個太危險啦。 UsePAM no # 利用 PAM 管理使用者認證有很多好處,可以記錄與管理。 # 所以這裏我們建議你使用 UsePAM 且 ChallengeResponseAuthentication 設定爲 no # 如果不用LDAP之類的登陸,建議關閉,優化性能。 ChallengeResponseAuthentication no # 允許任何的密碼認證!所以,任何 login.conf 規定的認證方式,均可適用! # 但目前我們比較喜歡使用 PAM 模塊幫忙管理認證,因此這個選項可以設定爲 no 喔! UseDNS no # 一般來說,爲了要判斷客戶端來源是正常合法的,因此會使用 DNS 去反查客戶端的主機名 # 不過如果是在內網互連,這項目設定爲 no 會讓聯機達成速度比較快。 GSSAPIAuthentication no #不基於 GSSAPI 的用戶認證,關閉,優化性能。 SyslogFacility AUTH #設置在記錄來自sshd的消息的時候,是否給出“facility code”。 X11Forwarding no #如果沒有使用x11轉發最好關閉掉,優化性能。 PrintLastLog no #不打印最後登陸信息,減少惡意登陸者獲取的信息量,防止被惡意利用。 TCPKeepAlive yes #保持長連接,加快連接速度,優化性能。 Banner none #不顯示系統banner信息,如果開啓會在每次登陸時顯示系統信息,減少惡意登陸者獲取的信息量,防止被惡意利用。 LoginGraceTime 30 #限制用戶必須在指定的時限內認證成功,建議設置低,增加暴力破解難度,單位爲秒。 MaxAuthTries 3 #最多登錄嘗試次數,建議設置低一些,加大暴力破解難度。 ClientAliveInterval 300 #服務器端向客戶端每5分鐘發送一次請求消息, 然後客戶端響應, 這樣就保持長連接了.默認是0, 不發送 ClientAliveCountMax 3 #服務器發出請求後客戶端沒有響應的次數達到一定值, 就自動斷開. 默認是3 AuthorizedKeysFile .ssh/authorized_keys # 是否允許用戶自行使用成對的密鑰系統進行登入行爲,僅針對 version 2。 # 至於自制的公鑰數據就放置於用戶家目錄下的 .ssh/authorized_keys 內
使用TCP wrappers僅允許指定的主機連接
如果你想在你的網絡上只允許特定的主機才能連接到你的SSH服務,但又不想使用或弄亂你的iptables配置,那這個方法非常有用,你可以使用TCP wrappers。
在/etc/hosts.deny中創建一個規則,如下:
sshd: ALL
這意味着默認情況下所有主機被拒絕訪問SSH服務,這是應該的,否則所有主機都能訪問SSH服務,因爲TCP wrappers首先在hosts.deny中查找,如果這裏沒有關於阻止SSH服務的規則,任何主機都可以連接。
接下來,在/etc/hosts.allow中創建一個規則允許指定的主機使用SSH服務:
sshd: 192.168.1 193.180.177.13
現在,只有來自192.168.1.0/24和193.180.177.13的主機能夠訪問SSH服務了,其他主機在連接時還沒有到登陸提示符時就被斷開了,並收到錯誤提示,如下:
ssh_exchange_identification: Connection closed by remote host
使用iptables允許特定的主機連接
可以使用iptables來限制SSH訪問(但可以同時使用這個兩個的),允許一個特定的主機連接到你的SSH服務:
~# iptables -A INPUT -p tcp -m state --state NEW --source 193.180.177.13 --dport 22 -j ACCEPT
並確保沒有其他的主機可以訪問SSH服務:
~# iptables -A INPUT -p tcp --dport 22 -j DROP
保存你的新規則,你的任務就完成了,規則是立即生效的
SSH時間鎖定技巧
你可以使用不同的iptables參數來限制到SSH服務的連接,讓其在一個特定的時間範圍內可以連接,其他時間不能連接。你可以在下面的任何例子中使用/second、/minute、/hour或/day開關。
第一個例子,如果一個用戶輸入了錯誤的密碼,鎖定一分鐘內不允許在訪問SSH服務,這樣每個用戶在一分鐘內只能嘗試一次登陸:
~# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT ~# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -j DROP
第二個例子,設置iptables只允許主機193.180.177.13連接到SSH服務,在嘗試三次失敗登陸後,iptables允許該主機每分鐘嘗試一次登陸:
~# iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT ~# iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -j DROP