ssh代理是一個程序,它可以幫助我們管理私鑰,ssh-agent即為ssh代理程序。
那么什么時候需要ssh代理幫助我們管理私鑰呢?當遇到如下情況時,我們會需要ssh代理。
1、使用不同的密鑰連接到不同的主機時,需要手動指定對應的密鑰,ssh代理可以幫助我們選擇對應的密鑰進行認證,不用手動指定密鑰即可進行連接。
2、當私鑰設置了密碼,我們又需要頻繁的使用私鑰進行認證時,ssh代理可以幫助我們免去重復的輸入密碼的操作。
上述兩種情況我們會一一道來,不過在描述它們之前,我們先來了解一下怎樣使用ssh代理。
啟動ssh代理并添加密鑰
首先,如果想要使用ssh代理,我們則需要先啟動ssh代理,也就是啟動ssh-agent程序,如下兩條命令都可以啟動代理,但是略有不同。
ssh-agent $SHELL
eval `ssh-agent`
如果你最小化安裝了centos,那么你執(zhí)行上述命令時,可能會提示找不到ssh-agent命令,此時你需要安裝openssh-clients,安裝后即可使用上述命令。
當我們使用”ssh-agent $SHELL”命令時,會在當前shell中啟動一個默認shell,作為當前shell的子shell,ssh-agent程序會在子shell中運行,當執(zhí)行”ssh-agent $SHELL”命令后,我們也會自動進入到新創(chuàng)建的子shell中,centos中,默認shell通常為bash,所以,在centos中上述命令通??梢灾苯訉憺閟sh-agent bash,當然,如果你的默認shell已經(jīng)指定為其他shell,比如csh,那么你也可以直接使用ssh-agent csh,效果都是相同的,我們來實驗一下。
當前使用的centos系統(tǒng)的默認shell為bash,在未啟動ssh-agent程序時,我們在當前bash中執(zhí)行pstree命令,查看sshd的進程樹,如下

然后,執(zhí)行”ssh-agent $SHELL”命令(注意:SHELL為大寫),啟動ssh代理,執(zhí)行此命令后,再次使用pstree命令,查看sshd的進程樹

啟動ssh代理后,查看sshd進程樹,如下所示

在原來的bash中新生成了一個子bash,ssh-agnet運行在子bash中,我們的命令也同樣在子bash中執(zhí)行。
此時,在當前會話中,我們已經(jīng)可以使用ssh-agent了,ssh-agent會隨著當前ssh會話的消失而消失,這也是一種安全機制,比如,退出當前子shell,再次查看進程樹。

找到sshd的進程樹,如下,如果你操作的非常快,可能會在與sshd進程平級的區(qū)域看到一個還沒有來得及關閉的ssh-agent進程,但是最終sshd的進程樹如下圖所示。

可以看到ssh-agent已經(jīng)不再存在了,如果你的服務器中開啟了圖形化環(huán)境,使用”ps -ef | grep ssh-agent”命令查找ssh-agent進程,仍然能夠看到一個ssh-agent進程,這個ssh-agent進程是跟隨圖形化界面開機啟動的,但是通常,服務器中很少會開啟圖形化界面,所以我們不用在意它。
雖然我們已經(jīng)知道了怎樣啟動ssh-agent,但是,如果想讓ssh代理幫助我們管理密鑰,還需要將密鑰添加到ssh代理中,這個話題一會兒再聊。
剛才執(zhí)行了ssh-agent $SHELL命令,現(xiàn)在試試 eval `ssh-agent` 命令。
eval `ssh-agent`命令并不會啟動一個子shell,而是會直接啟動一個ssh-agent進程,示例如下

找到進程樹的如下部分

可以看到,ssh-agent進程已經(jīng)啟動了,此刻,如果我們推出當前bash,此ssh-agnet進程并不會自動關閉,所以,我們應該在退出當前bash之前,手動的關閉這個進程,在當前bash中,使用ssh-agent -k命令可以關閉對應的ssh-agent進程,但是,如果在退出了當前bash以后再使用’ssh-agent -k’命令,是無法關閉對應的ssh-agent進程的,除非使用kill命令,當然,其實在使用 ssh-agent $SHELL 命令時,也可以使用’ssh-agent -k’命令關閉ssh代理。
好了,我們已經(jīng)了解了怎樣啟動ssh代理,以及怎樣關閉ssh代理,但是,我們還沒有真正的使用過代理,如果想要真正的使用ssh代理幫助我們管理密鑰,還需要將密鑰添加到代理中,添加密鑰需要使用到ssh-add命令
ssh-add命令的使用方法非常簡單,示例如下
ssh-add ~/.ssh/id_rsa_custom
上述命令表示將私鑰id_rsa_custom加入到ssh代理中,如果你沒有正確的啟動ssh-agent,那么你在執(zhí)行ssh-add命令時,可能會出現(xiàn)如下錯誤提示。
Could not open a connection to your authentication agent.
完成上述步驟后,ssh代理即可幫助我們管理id_rsa_custom密鑰了,那么有哪些具體的使用場景呢,我們繼續(xù)聊。
ssh代理幫助我們選擇對應的私鑰進行認證
前一篇文章中,我們總結(jié)了基于密鑰進行認證的方法,比如,我們在生成密鑰對時,可以手動指定密鑰的名稱,而不是使用默認的密鑰名稱,示例如下:

如上圖所示,我們沒有使用默認名稱id_rsa作為密鑰名稱,而是使用id_rsa_test1作為密鑰的名稱,生成了對應的密鑰對。
此時,我們想要使用新生成的密鑰對免密碼連接到10.1.0.3這臺服務器,于是,我們需要完成如下操作(具體操作可參考上一篇文章):

如上圖所示,我們將公鑰id_rsa_test1.pub發(fā)送給了10.1.0.3的root用戶,然后在A機器(10.1.0.1)上連接到C機器(10.1.0.3)時,仍然提示我們輸入root@10.1.0.3的密碼,這是因為ssh基于密鑰進行認證時,默認會使用~/.ssh/id_rsa進行認證,當你使用非默認名稱的私鑰進行認證時,需要手動指明對應的私鑰,如果不指明對應的私鑰,ssh仍然會默認使用~/.ssh/id_rsa進行認證,上例就是這種情況,由于我們沒有使用~/.ssh/id_rsa進行認證,同時沒有指明對應的私鑰,ssh會使用id_rsa與id_rsa_test1.pub進行匹配,它們本來就不是一對密鑰,自然無法認證成功,所以ssh仍然提示我們輸入密碼,我們可以使用 -i 選項指定對應的私鑰文件進行認證,示例如下

如上圖所示,指明對應的私鑰后,即可正常的使用密鑰進行認證,從而免去輸入用戶的密碼。
如果我們手中有很多密鑰對,它們對應的公鑰被不同的服務器所持有,那么,我們連接不同的服務器時,就需要手動指定對應的不同的私鑰,而ssh代理可以幫助我們管理這些私鑰,從而避免手動的指定私鑰。
示例如下

如上圖所示,我們啟動了ssh-agent進程,然后將私鑰id_rsa_test1加入到了ssh代理中,再次使用非默認名稱的私鑰進行認證時,并不用指明密鑰,ssh-agent會幫助我們選擇對應的私鑰,進行正確的認證,當本機有多個密鑰對,并且它們的公鑰分布于很多不同的機器時,會非常有用。
ssh代理能夠免去重復輸入私鑰密碼的操作
當我們?yōu)樗借€設置了密碼,ssh基于密鑰進行認證時,會提示輸入私鑰的密碼,輸入正確的私鑰密碼,才能夠使用對應私鑰進行認證,示例如下
生成密鑰對,同時指定私鑰的密碼
ssh-keygen -f ~/.ssh/id_rsa_test2 -P’123456′
將公鑰添加到遠程用戶的公鑰認證文件中,提示輸入遠程用戶的密碼。
ssh-copy-id -i ~/.ssh/id_rsa_test2.pub root@10.1.0.3
root@10.1.0.3’s password:
指定對應私鑰連接遠程用戶,提示輸入對應私鑰的密碼,正確的輸入私鑰的密碼,即可連接到遠程用戶
ssh -i ~/.ssh/id_rsa_test2 root@10.1.0.3
Enter passphrase for key ‘/root/.ssh/id_rsa_test2’:
但是,如果為私鑰設置了密碼,每次使用私鑰進行認證連接是,都會要求輸入私鑰密碼,如果你在當前ssh會話中需要反復的連接到遠程用戶,那么反復的輸入復雜的私鑰密碼,的確會比較麻煩,ssh-agent可以幫助我們,在一個ssh會話中,只要輸入一次私鑰密碼,在同一ssh會話中之后再次使用到相同的私鑰時,即可不用再次輸入對應密碼,示例如下。

如上圖所示
第1步:啟動ssh代理
第2步:將對應私鑰添加到ssh代理中,在添加私鑰時,會提示輸入私鑰的密碼,此時,正確的輸入私鑰密碼即可將私鑰添加到ssh代理中。
第3步:連接到遠程用戶,并使用對應私鑰進行認證,已經(jīng)不用輸入私鑰密碼,即可連接到遠程用戶,從遠程用戶的會話中退出,回到當前ssh會話中。
第4步:在當前會話中,再次連接到遠程用戶,同樣沒有提示輸入密碼。
從上述示例可以看出,在同一個ssh會話中,ssh-agent可以幫助我們免去重復輸入私鑰密碼的操作。
管理ssh代理中的密鑰
如果我們想要查看ssh代理中已經(jīng)添加了哪些私鑰,該怎樣查看呢?使用’ssh-add -l’即可查看,示例如下

如上圖所示,id_rsa_test1與id_rsa_test2這兩個RSA類型的私鑰已經(jīng)被添加到了ssh代理中。
我們還可以列出代理中所有私鑰對應的公鑰內(nèi)容,示例如下

如果我們想要從代理中移除某個已經(jīng)添加的私鑰,可以使用’ssh-add -d’命令指定要移除的私鑰,示例如下

我們也可以一次性清空代理中的所有私鑰,使用’ssh-add -D’命令即可。
如果我們想要臨時鎖定ssh代理,則可以對ssh代理添加密碼,并進行鎖定,鎖定后的ssh代理無法繼續(xù)幫助我們管理私鑰,除非解鎖以后,才能正常的幫助我們管理私鑰,示例如下,在正常情況下,ssh代理可以幫助我們管理私鑰,我們可以使用’ssh-add -x’命令對代理加鎖,加鎖時會提示輸入密碼,這個密碼在解鎖時需要用到,加鎖后,再次連接遠程用戶時,ssh代理已經(jīng)失效,除非我們對代理進行解鎖,使用’ssh-add -X’命令(大寫X)對代理解鎖,解鎖時需要輸入加鎖時設定的密碼,解鎖后,ssh代理恢復正常。

總結(jié)
啟動ssh-agent
如下兩種方式均可啟動ssh-gent
方式一:創(chuàng)建子shell,在子shell中運行ssh-agent進程,退出子shell自動結(jié)束代理。
ssh-agent $SHELL
方式二:單獨啟動一個代理進程,退出當前shell時最好使用ssh-agent -k關閉對應代理
eval `ssh-agent`
關閉ssh-agent
ssh-agent -k
將私鑰添加到ssh代理
ssh-add ~/.ssh/key_name
查看代理中的私鑰
ssh-add -l
查看代理中的私鑰對應的公鑰
ssh-add -L
移除指定的私鑰
ssh-add -d /path/of/key/key_name
移除代理中的所有私鑰
ssh-add -D
鎖定ssh代理
鎖定時需要指定鎖定密碼,鎖定后的ssh代理暫時不能幫助我們管理私鑰
ssh-add -x
解鎖ssh代理
解鎖時需要輸入創(chuàng)建鎖時設定的密碼,解鎖后ssh代理可正常工作
ssh-add -X
好了,這篇文章就總結(jié)到這里,希望能夠?qū)δ阌兴鶐椭?/span>
好了,這篇文章的內(nèi)容發(fā)貨聯(lián)盟就和大家分享到這里,如果大家網(wǎng)絡推廣引流創(chuàng)業(yè)感興趣,可以添加微信:80709525 備注:發(fā)貨聯(lián)盟引流學習; 我拉你進直播課程學習群,每周135晚上都是有實戰(zhàn)干貨的推廣引流技術課程免費分享!