在兩台linux主機上由於環境的需要,經常要配置兩台主機之間免密碼登入,這就要用到key認證,也就是所謂的公私密金鑰認證。便於理解,我這裡指定兩台主機為 A 和 B 。如果A主機想免密碼登入到B主機上,則A主機上存放私密金鑰,B 主機上存放公開金鑰。通過ssh-keygen 命令產生的兩個檔案為:公開金鑰檔案 ~/.ssh/id_rsa.pub; 私密金鑰檔案 ~/.ssh/id_rsa 。而B主機上存放公開金鑰時,需要將id_rsa.pub的內容存放到~/.ssh/authorized_keys 檔案內,並且保證許可權為600 。
SSH 主要由三部分組成:
傳輸層協議 [SSH-TRANS]
提供了伺服器認證,保密性及完整性。此外它有時還提供壓縮功能。 SSH-TRANS 通常運行在TCP/IP串連上,也可能用於其它可靠資料流上。 SSH-TRANS 提供了強力的加密技術、密碼主機認證及完整性保護。該協議中的認證基於主機,並且該協議不執行使用者認證。更高層的使用者認證協議可以設計為在此協議之上。
使用者認證協議 [SSH-USERAUTH]
用於向伺服器提供用戶端使用者鑒別功能。它運行在傳輸層協議 SSH-TRANS 上面。當SSH-USERAUTH 開始後,它從低層協議那裡接收工作階段識別項(從第一次金鑰交換中的交換雜湊H )。工作階段識別項唯一標識此會話並且適用於標記以證明私密金鑰的所有權。 SSH-USERAUTH 也需要知道低層協議是否提供保密性保護。
連線協定 [SSH-CONNECT]
將多個加密隧道分成邏輯通道。它運行在使用者認證協議上。它提供了互動式登入話路、遠程命令執行、轉寄 TCP/IP 串連和轉寄 X11 串連。
一、產生和匯入KEY
A主機上產生key
$ ssh-keygen -t rsa
$ ls
id_rsa id_rsa.pub
將key匯入到遠端B主機上,並修改許可權
A主機上操作
$ cat /root/.ssh/id_rsa.pub | ssh root@遠程伺服器ip 'cat - >> ~/.ssh/authorized_keys'
B主機上操作
$ chmod 600 ~/.ssh/authorized_keys
不過還有更簡單的方法,不需要在B主機上再修改許可權 ,而直接將公開金鑰內容匯入到遠程主機上,使用ssh-copy-id命令,如下:
$ ssh-copy-id -i /root/.ssh/id_rsa root@xxx,xxx,xxx,xxx
二、配置sshd_config
配置完key後,需要在sshd_config檔案中開啟key認證
$ vim /etc/ssh/sshd_config
PubkeyAuthentication yes //將該項改為yes
修改完成後,通過/etc/init.d/sshd restart 重啟ssh服務重新載入配置。如果想要禁用密碼認證,更改如下項:
$ vim /etc/ssh/sshd_config
UsePAM yes
為
UserPAM no
更多配置參數及其意義,可以通過man sshd_config 查看。
三、ssh_config及多私密金鑰配置
sshd_config是一個全域服務端的設定檔(即本機開啟sshd服務的相關配置),而ssh_config則是一個全域用戶端的設定檔。例如,ssh_config中其中兩行就定義了每個使用者下預設私密金鑰key的路徑:
# IdentityFile ~/.ssh/id_rsa
# IdentityFile ~/.ssh/id_dsa
如果出現多台server 多個私密金鑰檔案,在client主機上怎麼配置呢?全部追加到 ~/.ssh/id_rsa(或id_dsa)中?經測試,這是行不通的,只有第一個私密金鑰可以用,後面的都不行。
在多台server時,可以有兩種解決方案。
1、在不同的主機上,使用相同的公開金鑰,則這些機器的私密金鑰也相同。用戶端上只需要配置這一個私密金鑰就可以登入所有的主機。
2、不同的主機上使用不同的公開金鑰時, 這時會有多個不同的私密金鑰。這就需要為不同的主機指定不同的私密金鑰檔案,這個配置可以在ssh_config中配置(具體可以參看該檔案的配置範例)。當然更多情況下,我們只會在要使用的使用者做個情化的配置,設定檔為~/.ssh/config(該檔案不存在時,請建立之),格式如下:
Host xxxx
IdentityFile 私密金鑰檔案名稱
Port 連接埠號碼
User 你登陸xxxx伺服器用的帳號
註:這裡的設定檔同樣可以參看ssh_config裡的配置,也可以通過man ssh_config擷取更多有用資訊。
Host *
User www
Port 22
CheckHostIP no
Compression yes
ForwardAgent yes
Host 10.1.100.*
User dev
Port 22
IdentityFile ~/.ssh/dev.key
如上面的配置,預設我們串連所有的主機(除後面給出的10.1.100.*之外的所有主機)時,預設使使用者名稱為www ,即 ssh 172.20.1.100 = ssh www@172.20.1.100 -p 22 。當我們串連10.1.100.* 下的所有主機時,預設會使用dev使用者,預設的私密金鑰會用 ~/.ssh/dev.key 檔案。同理,可以增加更多配置。
註:出於安全等考慮,一定要將 ~/.ssh/config檔案和 ~/.ssh/key檔案的許可權設為600 。