談?wù)?ssh目錄的安全性
熟悉ssh的同學(xué)應(yīng)該都知道.ssh目錄,這個(gè)目錄用來保存ssh一些客戶端一些ssh配置、公鑰,公鑰認(rèn)證的文件。~/.ssh的是一個(gè)非常重要的目錄,也是安全隱患點(diǎn),處理不好該目錄安全設(shè)置,對導(dǎo)致嚴(yán)重安全問題,讓主機(jī)被輕而易舉的被人黑掉。據(jù)蟲蟲所知,一些木馬、自動(dòng)挖礦腳本就借助該目錄信息自動(dòng)擴(kuò)散傳播。本文就給大家介紹~/.ssh/的安全性。
.ssh目錄介紹
目錄~/.ssh/是用來存儲(chǔ)SSH客戶端和服務(wù)器一些配置文件的位置,這些文件包括:
- authorized_keys,SSH服務(wù)器默認(rèn)的公鑰認(rèn)證文件,服務(wù)器通過該文件配置可以使用該用戶認(rèn)證的用戶證書。SSH證書認(rèn)證就是客戶端生成證書(私鑰和公鑰對),將公鑰復(fù)制到該文件,每行一個(gè)證書。復(fù)制公鑰時(shí)候可以使用ssh-copy-id命令或者直接手動(dòng)配置authorized_keys文件即可。
- id_*,包括id_rsa,id_dsa,id_ed25519,id_ecdsa等是保存在該用戶下的證書私鑰,用戶通過SSH證書認(rèn)證時(shí)候會(huì)自動(dòng)搜索這些私鑰進(jìn)行認(rèn)證。
- id_*.pub 上述私鑰對應(yīng)的公鑰,以.pub為后綴。
- known_hosts 保存該主機(jī)連接過的遠(yuǎn)程服務(wù)器及其對應(yīng)的主機(jī)公鑰(用來對主機(jī)認(rèn)證),再次連接到遠(yuǎn)程服務(wù)器如果公鑰相同,則直接連接認(rèn)證。如果沒有,或者遠(yuǎn)程服務(wù)器有變化,會(huì)提示:
需要輸入yes,確認(rèn)才行。
- config 文件用來配置本地ssh連接的一些項(xiàng)目,比如配置主機(jī)別名的,可以解決同一主機(jī)或者多臺(tái)主機(jī)使用多個(gè)證書,就可以用config配置,比如下面的配置:
- Host github.com
- HostName github.com
- User git
- IdentityFile ~/.ssh/git/github_id_rsa
- Host gitee.com
- HostName gitee.com
- User git
- IdentityFile ~/.ssh/git/gitee_id_rsa
- Host chongchong.com
- HostName 112.34.6.71
- Port 2222
- User chongchong
- IdentityFile ~/.ssh/id_ecdsa
- ForwardX11 yes
- Compression yes
- TCPKeepAlive yes
前兩個(gè)Host配置對github和馬云使用不同的證書,后面一個(gè)Host對一臺(tái)主機(jī)配置使用非默認(rèn)的ssh端口、非默認(rèn)當(dāng)前用戶以及一些啟用一些ssh配置項(xiàng)目。關(guān)于ssh config的配置蟲蟲之前的文章《Linux SSH實(shí)用技巧幾則》做過介紹,大家可以參考。
.ssh目錄安全性問題
主要的安全隱患,還是由于對.ssh目錄的安全性認(rèn)識(shí)不夠或者由于管理疏忽,導(dǎo)致該目錄的權(quán)限設(shè)置有問題?;蛘邔⒛夸洷┞对赪eb目錄或者git公開倉庫。比如有些Web服務(wù)器中的www用戶可以直接訪問該目錄。由于直接將用戶目錄設(shè)置成了Web根目錄,而.ssh目錄又是用戶目錄的子目錄所以可以直接訪問。
現(xiàn)在,絕大多數(shù)的管理員和開發(fā)都知道使用密碼登陸服務(wù)是不安全的,因此都會(huì)用證書登陸。如果。ssh目錄泄露意味著:
- 可以直接獲得/.ssh/id_rsa等私鑰;
- 可以直接知道authorized_keys、known_hosts和config的內(nèi)容。
證書泄露
id_*文件是最重要級(jí)別的個(gè)人文件,該文件不允許泄露給第三人,根據(jù)不同的證書類型,私鑰文件名可能為了id_dsa(DSA證書已經(jīng)不是安全,請避免使用),id_rsa(RSA證書,請保證2048位以上),id_ecdsa和id_ed25519,一般來說私鑰文件都會(huì)PRIVATE KEY的注釋行,比如:
為了避免證書泄露后也能保持安全,建議私鑰都設(shè)置證書密碼:
以下密鑰沒有密碼,ssh-keygen -y -f id_ecdsa可以直接顯示公鑰
- ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBmGXiNwudm3JaGNVERkl013/9OQVR0tfgvcmapONuecVl4EXNE4w0VyZA1ZD2s3hj02x/Y294IwfhExiaDhTyY=
如果設(shè)置密碼保護(hù),則會(huì)提示輸入密碼:
- Enter passphrase:
- ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBmGXiNwudm3JaGNVERkl013/9OQVR0tfgvcmapONuecVl4EXNE4w0VyZA1ZD2s3hj02x/Y294IwfhExiaDhTyY=
authorized_keys泄露
就算是私鑰泄露來,如果沒有其他信息,黑客也不知道私鑰能用來連接到哪里,這就是為啥要把關(guān)鍵主機(jī)、一般主機(jī)以及用于管理git的證書都分別獨(dú)立使用的,防止私鑰泄露后導(dǎo)致的問題。但是黑客可以借助.ssh目錄下的其他文件來獲取更多的信息來精準(zhǔn)的利用竊取的私鑰。其中有個(gè)文件authorized_keys,前面我提到了,是用來配置可以連接到該主機(jī)用戶下的所有的證書公鑰。文件一行一個(gè)公鑰,公鑰以ssh-rsa,ssh-dss,ssh-ed25519,ssh-ecdsa開頭,表示不同的證書類型。如果黑客獲取了這些密鑰,可以通過對比證書方式,驗(yàn)證對應(yīng)私鑰,然后可以利用私鑰最終攻陷主機(jī)。如果攻擊者成功,將會(huì)有完整SSH訪問權(quán)限,能夠運(yùn)行任何命令。
known_hosts泄露
如果〜/.ssh /known_hosts泄露,則導(dǎo)致的危險(xiǎn)性更大,因?yàn)樵撐募涗浟?,該主機(jī)私鑰可以連接的遠(yuǎn)程主機(jī)列表。
根據(jù)該文件中的主機(jī)名或IP地址,可以直接被用來私鑰來嘗試登陸。很多木馬傳播方式就是利用自動(dòng)解析該文件獲取IP或者主機(jī)自動(dòng)嘗試登陸。
上面是一個(gè)挖礦木馬自動(dòng)傳播部分腳本,從known_hosts獲取傳播目標(biāo):
- cat /root/.ssh/known_hosts|grep -v ,|awk '{print $1}' > /tmp/.h
- cat /root/.ssh/known_hosts|grep ,|awk -F, '{print $1}' >> /tmp/.h
- cat /root/.ssh/known_hosts|grep ,|awk -F, '{print $1}' >> /tmp/.h
為了避免這種攻擊,可以設(shè)置ssh配置(/etc/ssh/ssh_config)的HashKnownHosts 為yes,則會(huì)對相關(guān)信息做哈希處理。則該文件條目就會(huì)被加密,結(jié)果如下:
- |1|wlPQdgFoYgYsqG6ae20lYopRLPI=|p61txQKmb+Hn49dsD+v0CNuEKd4= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzhZmG33G/3FG3vm0eDdyX1u++i0ceakIkJNgDxVVy6MpodRrpwqXXQj8/OGT
- Iwb4YpRXGuL3236IkGugI9GUgFd00UNjMSMt3pqob4hKsEzADl7YfZeV1X7X0b617nze0otdO7TwDMlQ/5KWUwdUoxg50VfpieTzcOpUN/G4J159iKZ41iSF7o4vI+fYisX8y5rJ1BRbt1HO0Gi7w9HZ8tN0B
- 0glM6JKyoE8TjvbZAeD9PWIWp9JpG1KTY4yXTV1B1CyvtxjRqTMm8mcb+gSGGvv6mSlWCNxJnlXhp91F2GtmgzKsE3FjcMUfkn3c0+P0bKaR8L3GtbyaXJmtDX4xQ==
其中第二部分wlPQdgFoYgYsqG6ae20lYopRLPI=為hostname加密。
第三部分p61txQKmb+Hn49dsD+v0CNuEKd4=為加密的IP地址。
加密的方法是HMAC-SHA1,而且我們知道IP地址是有限的:四段,每段1-255(2^32)可以群舉,所以可以通過暴力攻擊,計(jì)算哈希,對比哈希。有興趣的同學(xué)可以嘗試下。
config泄露
SSH客戶端的配置文件通常包含hostname,別名,用戶名,ssh端口,證書位置等信息。如果該文件暴露,可為攻擊者提供更多信息,其危害類似known_hosts。
安全措施
要避免由于.ssh目錄導(dǎo)致的安全問題,首先要設(shè)置目錄和文件的權(quán)限。比如.ssh目錄要設(shè)置為700,所有私鑰文件和config文件要設(shè)置為600。
其次,避免將.ssh目錄暴露到Web目錄。
使用代理轉(zhuǎn)發(fā)或ProxyJump。
在Web服務(wù)器的配置中添加特殊規(guī)則,阻止對/.ssh/目錄的訪問。
最后,避免.ssh配置文件,證書文件暴露到git公共倉庫(github)等。