OpenSSH是SSH協議的一種實現,它是遠程登入,通過scp或sftp實現備份和遠程檔案傳輸等的推薦安全性通訊協定,SSH保證兩個網路或兩個系統之間資料互動的機密性和完整性,它的主要優點是通過公開金鑰加密技術實現伺服器身分識別驗證。但時有OpenSSH零日漏洞爆出,因此OpenSSH伺服器本身也需要調整才能提高整體安全性。
預設設定檔和SSH連接埠
/etc/ssh/sshd_config:OpenSSH伺服器設定檔;
/etc/ssh/ssh_config:OpenSSH用戶端設定檔;
~/.ssh/:使用者SSH配置目錄;
~/.ssh/authorized_keys:使用者公開金鑰(RSA或DSA);
/etc/nologin:如果存在這個檔案,sshd會拒絕除root使用者外的其它使用者登入;
/etc/hosts.allow和/etc/hosts.deny:定義tcp-wrapper執行的存取控制清單;
SSH預設連接埠:22
圖 1 SSH會話視窗
1、禁用OpenSSH伺服器
工作站和膝上型電腦可以不用OpenSSH伺服器,如果你不需要提供SSH遠程登入和檔案傳輸功能,可以禁用並刪除SSHD伺服器,CentOS / RHEL / Fedora Linux使用者可以使用下面的yum命令禁用和刪除openssh-server:
# chkconfig sshd off# yum erase openssh-server
Debian / Ubuntu Linux使用者可以使用下面的apt-get命令禁用和刪除openssh-server:
# apt-get remove openssh-server
你可能需要更新你的iptables指令碼,移除ssh例外規則,在CentOS / RHEL / Fedora下,開啟etc/sysconfig/iptables和/etc/sysconfig/ip6tables檔案,刪掉與ssh相關的例外規則,然後使用下面的命令重啟iptables:
# service iptables restart# service ip6tables restart
2、只使用SSH v2
SSH協議的第一個版本(SSH v1或SSH-1)存在中間人攻擊問題和安全性漏洞,它已經被作廢,應該不惜一切代價避免使用SSH v1。開啟sshd_config設定檔,如果沒有就增加下面這一行設定:
Protocol 2
這樣啟動sshd後就只會使用SSH協議的第二個版本(SSH v2或SSH-2)了。
3、限制使用者的SSH訪問
預設情況下,所有系統使用者都可以用他們的密碼或公開金鑰通過SSH實現遠程登入,但有時你建立的UNIX/Linux使用者是用於ftp或email目的,如果不加限制,這些使用者也可以使用ssh登入到系統,並且可以使用編譯器,指令碼語言,如Perl或Python,這些工具已經足夠利害,可以開啟任意網路連接埠,執行任意操作。我的一個用戶端上有過時的PHP指令碼,攻擊者可以通過PHP指令碼在系統上建立一個新帳號,但攻擊者不能通過該帳號ssh登入,因為它沒有在允許的使用者列表範圍內(AllowUsers)。
假設我們只要root,vivek和jerry使用者能通過SSH使用系統,向sshd_config設定檔中添加:
AllowUsers root vivek jerry
另外,你還可以允許所有使用者通過SSH登入,但拒絕一部分使用者,這時就需要向sshd_config設定檔中添加:
DenyUsers saroj anjali foo
你也可以配置Linux PAM允許或拒絕通過sshd伺服器登入,你也可以指定一列使用者組有權訪問或拒絕他們訪問ssh。
4、配置空閑逾時退出時間間隔
使用者可以通過ssh登入到伺服器,你可以設定一個空閑逾時時間間隔避免出現孤兒ssh會話,開啟sshd_config設定檔,確保有如下的配置項:
ClientAliveInterval 300ClientAliveCountMax 0
上面的例子設定的空閑逾時時間間隔是300秒,即5分鐘,過了這個時間後,空閑使用者將被自動踢出出去(可以理解為退出登入/登出)。
5、禁用.rhosts檔案
不要讀取使用者的~/.rhosts和~/.shosts檔案,使用下面的設定更新sshd_config設定檔:
IgnoreRhosts yes
SSH可以類比過時的rsh命令的行為,rsh被公認為是不安全的遠端存取協議,因此必須得禁用掉
6、禁用基於主機的身分識別驗證
為了禁用基於主機的身分識別驗證,使用下面的選項更新sshd_config設定檔:
HostbasedAuthentication no
7、禁用root通過SSH登入
沒有必要使用root使用者通過SSH遠程登入,普通使用者可以通過su或sudo(推薦)獲得root層級的訪問權,這樣你可以得到完整的審計資訊,誰通過sudo在系統上執行特權命令就會一清二楚。為了禁止root使用者通過SSH登入,使用下面的選項更新sshd_config設定檔:
PermitRootLogin no
但也有人認為root使用者通過SSH登入沒什麼不妥,之所以人們一直有“不要用root使用者登入”的想法,都是不安全的Telnet協議惹的禍。
8、啟用警告橫幅
使用下面的設定更新sshd_config設定檔,設定一個警告橫幅:
Banner /etc/issue
在/etc/issue檔案中,可以和你的法律顧問商討一下,列出使用者使用ssh應該遵守的法律法規和注意事項。
8、防火牆SSH連接埠:22
你需要為ssh連接埠22更新iptables或pf防火牆配置,通常,OpenSSH伺服器應該只接受來自區域網路或受信任的遠程用戶端的串連。
Netfilter(iptables)配置
更新/etc/sysconfig/iptables(Red Hat及基於Red Hat的系統)檔案,只接受來自192.168.1.0/24和202.54.1.5/29的串連,配置如下:
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT-A RH-Firewall-1-INPUT -s 202.54.1.5/29 -m state --state NEW -p tcp --dport 22 -j ACCEPT
如果你還準備讓sshd通過IP V6,那還需要更新/etc/sysconfig/ip6tables(Red Hat或基於Red Hat的系統)檔案,配置如下:
-A RH-Firewall-1-INPUT -s ipv6network::/ipv6mask -m tcp -p tcp --dport 22 -j ACCEPT
你在實際操作時,請用真實的IP V6位址範圍替換ipv6network::/ipv6mask。
◆BSD PF防火牆配置
如果你使用的是PF防火牆,請更新/etc/pf.conf檔案:
pass in on $ext_if inet proto tcp from {192.168.1.0/24, 202.54.1.5/29} to $ssh_server_ip port
ssh flags S/SA synproxy state
預設情況下,ssh會監聽系統上所有網卡和IP地址,限制ssh連接埠綁定,改變ssh連接埠(暴力密碼破解攻擊通常是針對連接埠22的),假設要綁定到192.168.1.5和202.54.1.5這兩個IP地址,連接埠改為300,那sshd_config檔案需要做如下修改:
Port 300
ListenAddress 192.168.1.5
ListenAddress 202.54.1.5
更好的辦法是使用主動式指令碼,如後面會談到的fail2ban或denyhosts。
10、使用強SSH密碼和密語
為你的密鑰使用強使用者密碼和密語有多重要我就不說了,暴力破解攻擊之所以能夠得逞,都是因為你使用了基於字典的密碼,你可以強制使用者避免使用字典中能直接找到的詞作密碼,另外可以藉助john the ripper tool工具找出現有系統中存在的弱密碼。下面是一個隨機密碼產生器(放到你的~/.bashrc檔案中):
genpasswd() {local l=$1 [ "$l" == "" ] && l=20 tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${l} | xargs}
運行它:
genpasswd 16
輸出:
uw8CnDVMwC6vOKgW
11、使用基於公開金鑰的身分識別驗證
使用公/私金鑰組和密碼對私密金鑰實施保護,如何使用基於RSA和DSA的身分識別驗證,請參考html">http://www.cyberciti.biz/tips/ssh-public-key-based-authentication-how-to.html和http://www.cyberciti.biz/faq/ssh-password-less-login-with-dsa-publickey-authentication/,永遠不要使用無密鑰密碼登入。
12、使用基於密鑰鏈的身分識別驗證
密鑰鏈是一個經過設計的特殊的bash指令碼,它讓基於密鑰的身分識別驗證變得難以置信的方便和靈活,與無密鑰密碼相比,它的優勢太多了。關於如何安裝和使用密鑰鏈軟體,請訪問http://www.cyberciti.biz/faq/ssh-passwordless-login-with-keychain-for-scripts/。
13、Chroot SSHD(將使用者鎖定在他們自己的home目錄)
預設情況下,使用者可以瀏覽伺服器目錄,如/etc,/bin等,你可以使用基於作業系統的chroot或使用特殊的工具,如rssh,來保護ssh,在OpenSSH 4.8p1和4.9p1中,你不再需要第三方hack工具,如rssh,或是複雜的chroot配置,來將使用者限制在他們自己的home目錄中,新版本中增加了一個ChrootDirectory命令,它可以直接將使用者限制在自己的home目錄中。更多資訊請訪問http://www.debian-administration.org/articles/590。
14、使用TCP Wrapper
TCP Wrapper是一個基於主機的網路ACL系統,用於過濾到互連網的網路訪問,OpenSSH支援TCP Wrapper,只需要更新你的/etc/hosts.allow檔案,下面的例子表示僅允許來自192.168.1.2 和172.16.23.12的ssh訪問:
192.168.1.2 172.16.23.12
關於如何在Linux / Mac OS X 和UNIX類作業系統上安裝和配置TCP Wrapper,請訪問http://www.cyberciti.biz/faq/tcp-wrappers-hosts-allow-deny-tutorial/。
15、禁用空密碼
你需要明確禁止密碼為空白的使用者遠程登入,使用下