然后,我們需要將公鑰拷貝并安裝到服務器 1 和 2 上。不要使用 ftp。更合理的是,使用安全拷貝程序來將公鑰傳送到每一臺遠程機器上。
[offsite]$ scp .ssh/id_dsa.pub accountname@server1.com:offsite.pub accountname@server1.com's password: (enter password, not new passphrase!)
id_dsa.pub 100% |*****************************| 614 00:00
[offsite]$ scp .ssh/id_dsa.pub accountname@server2.com:offsite.pub accountname@server2.com's password: (enter password, not new passphrase!)
id_dsa.pub 100% |*****************************| 614 00:00
清單 4. 將公鑰安裝到遠程服務器上在安裝完新的公鑰后,我們就可以使用創建私鑰和公鑰時指定的口令來登錄到每一臺機器。現在,登錄到每臺機器,并將 offsite.pub 文件的內容附加到一個名為 authorized_keys 的文件中,這個文件存儲在每臺遠程機器的 .ssh 目錄下。我們可以使用一個文本編輯器或者簡單地使用 cat 命令來將 offsite.pub 文件的內容附加到 authorized_keys 文件:
[offsite]$ ssh accountname@server1.com
accountname@server1.com's password: (enter password, not new passphrase!)
[server1]$ cat offsite.pub >> ./ssh/authorized_keys
清單 5. 將 offsite.pub 添加到已授權密鑰列表接下來的步驟是考慮一些額外的安全性。首先,我們修改 .ssh 的訪問權限,以使得只有所有者有讀、寫和執行的權限。然后,我們確保 authorized_keys 文件只能由所有者來訪問。最后,將先前上傳的 offsite.pub 密鑰文件刪除,因為再也不需要它了。確保設置適當的訪問權限很重要,因為 OpenSSH 服務器可能會拒絕使用具有不安全訪問權限的密鑰。
[server1]$ chmod 700 .ssh
[server1]$ chmod 600 ./ssh/authorized_keys
[server1]$ rm offsite.pub
[server1]$ exit
清單 6. 使用 chmod 修改權限在服務器 2 上完成同樣的步驟后,我們就可以返回到離線存儲機器上來測試新的口令類型的訪問。在離線服務器上您可以輸入下面的內容:
[offsite]$ ssh -v accountname@server1.com 在檢驗您的帳號現在可以使用新的口令而不是原來的密碼來訪問遠程的服務器時,使用 -v 或 verbose 標記選項來顯示調試信息。調試輸出除了能讓您在一個高的層面上觀察到認證過程是如何工作的之外,還可以顯示出您可以以其他方式無法得到的重要信息。在以后的連接中您可能并不需要指定 -v 標記;但是在測試連接時它相當有用。
使用 ssh-agent 自動化機器訪問
ssh-agent 程序如同一個看門人,它根據需要安全地提供對安全密鑰的訪問。ssh-agent 啟動后,它就會在后臺運行,并且可以由 ssh 和 scp 程序等其他 OpenSSH 應用程序所使用。這就使得 ssh 程序可以請求一個已經解密了的密鑰,而不是在每次需要時向您詢問私鑰的安全口令。
讓我們來仔細研究一下 ssh -agent。ssh-agent 運行時它會輸出 shell 命令:
[offsite]$ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-XX1O24LS/agent.14179; export SSH_AUTH_SOCK; SSH_AGENT_PID=14180; export SSH_AGENT_PID; echo Agent pid 14180;
清單 7. ssh-agent 應用我們可以使用 shell 的 eval 命令來讓 shell 執行 ssh-agent 顯示的輸出命令:
[offsite]$ eval `ssh-agent` Agent pid 14198
eval 命令告訴 shell 去評價(執行)ssh-agent 程序生成的命令。確保您指定的是反引號(`)而不是單引號!執行后,eval `ssh-agent` 語句將返回代理的進程標識符。在幕后,SSH_AUTH_SOCK 和 SSH_AGENT_PID shell 變量已經被導出而可以使用。您可以將它們顯示在 shell 控制臺中來查看它們的值:
[offsite]$ echo $SSH_AUTH_SOCK /tmp/ssh-XX7bhIwq/agent.14197
$SSH_AUTH_SOCK (SSH Authentication Socket 的縮寫)是一個本地套接字的位置,應用程序可以通過它來與 ssh-agent 通信。將 eval `ssh-agent` 語句加入到您的 ~/.bash_profile 文件以確保 SSH_AUTH_SOCK 和 SSH_AGENT_PID 始終被注冊。
ssh-agent 現在就已經成為一個后臺進程,可以用 top 和 ps 命令查看得到。
現在我們就已經可以使用 ssh-agent 共享我們的口令。為此,我們必須使用一個名為 ssh-add 的程序,這個程序將我們的口令添加(發送)到運行著的 ssh-agent 程序。
[offsite]$ ssh-add Enter passphrase for /home/accountname/.ssh/id_dsa: (enter passphrase) Identity added: /home/accountname/.ssh/id_dsa (/home/accountname/.ssh/id_dsa)
清單 8. 用于免口令登錄的 ssh-add 現在,當我們訪問 server1 時,不會再被提示輸入口令:
[offsite]$ ssh accountname@server1.com [server1]$ exit
如果您還不相信,那么嘗試去掉(kill -9)ssh-agent 進程,然后重新連接 server1。這一次,您將注意到,server1 將會詢問存儲在 .ssh 目錄下 id_dsa 中的私鑰的口令:
[offsite]$ kill -9 $SSH_AGENT_PID [offsite]$ ssh accountname@server1.com Enter passphrase for key '/home/accountname/.ssh/id_dsa': 使用 keychain 簡化密鑰訪問
到現在為止,我們已經了解了幾個 OpenSSH 程序(ssh、scp、ssh-agent 和 ssh-add),而且我們已經創建并安裝了私鑰和公鑰來啟用一個安全而且自動的登錄過程。您可能已經意識到,大部分設置工作只需要進行一次。例如,創建密鑰、安裝密鑰、通過 .bash_profile 執行 ssh-agent 的過程在每臺機器只需要進行一次。那真是好消息。
不太理想的消息是,我們每次登錄到離線的機器上時,都必須調用 ssh-add,而且,ssh-agent 與我們將要用來自動化備份工作的 cron 調度進程并不直接兼容。cron 進程不能與 ssh-agent 通信的原因是,cron 作業是作為 cron 的子進程來執行,這樣它們就不會繼承 $SSH_AUTH_SOCK shell 變量。