配置各臺虛擬機之間免秘鑰登錄

在不改變文章大意的情況下進行偽原創,并保持圖片的位置和原始格式,原文的語言不變。以下是經過偽原創處理后的文章:


如何在虛擬機集群中配置免秘鑰登錄

環境準備:我使用的是一個由5臺虛擬機組成的服務器集群,分別命名為repo、node001、node002、node003和node004。有關如何構建虛擬機集群的詳細步驟,請參考:在windows中安裝一臺linux虛擬機,并通過現有的虛擬機克隆出四臺新虛擬機。

  1. 方法一

    (1) 在repo虛擬機的/root/.ssh目錄下生成repo的公鑰。如果/root/.ssh目錄不存在,使用ssh命令登錄自身即可自動創建該目錄。

    [root@repo ~]# ssh repo # 輸入密碼進行登錄 [root@repo ~]# exit [root@repo ~]# 

    也可以手動創建該目錄。然后生成repo的公鑰:

    [root@repo ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa [root@repo ~]# ll -a drwx------   2 root root  4096 7月   4 12:53 .ssh [root@repo ~]# cd .ssh # repo 的 .ssh 目錄下沒有 known_hosts 文件 [root@repo .ssh]# ll -rw------- 1 root root 668 Sep 16 19:07 id_dsa # 私鑰 -rw-r--r-- 1 root root 599 Sep 16 19:07 id_dsa.pub # 公鑰

    (2) 使用ssh命令登錄node001到node004的自身虛擬機,以生成.ssh目錄和其中的known_hosts文件。

    [root@node001 ~]# ssh node001 [root@node001 ~]# exit [root@node001 ~]# cd .ssh [root@node001 .ssh]# ll # 沒有公鑰和私鑰,只有known_hosts文件 -rw-r--r-- 1 root root 403 Sep 16 19:14 known_hosts [root@node002 ~]# ssh node002 [root@node002 ~]# exit [root@node003 ~]# ssh node003 [root@node003 ~]# exit [root@node004 ~]# ssh node004 [root@node004 ~]# exit

    (3) 在node001到node004的/root目錄下創建一個文件夾,用于存放repo的公鑰。

    [root@node001 ~]# mkdir pub [root@node002 ~]# mkdir pub [root@node003 ~]# mkdir pub [root@node004 ~]# mkdir pub

    (4) 將repo的公鑰復制到其他節點。

    [root@repo .ssh]# scp ./id_dsa.pub node001:/root/pub/repo.pub [root@repo .ssh]# scp ./id_dsa.pub node002:/root/pub/repo.pub [root@repo .ssh]# scp ./id_dsa.pub node003:/root/pub/repo.pub [root@repo .ssh]# scp ./id_dsa.pub node004:/root/pub/repo.pub

    (5) 將repo的公鑰內容追加到node001到node004的authorized_keys文件中。

    [root@node001 ~]# cat ~/pub/repo.pub >> ~/.ssh/authorized_keys [root@node002 ~]# cat ~/pub/repo.pub >> ~/.ssh/authorized_keys [root@node003 ~]# cat ~/pub/repo.pub >> ~/.ssh/authorized_keys [root@node004 ~]# cat ~/pub/repo.pub >> ~/.ssh/authorized_keys

    (6) 配置repo自身的免秘鑰登錄。

    [root@repo .ssh]# cat ./id_dsa.pub >> ./authorized_keys

    完成上述配置后,repo可以使用ssh免秘鑰登錄自身和node001到node004。然而,node001到node004仍然無法免秘鑰登錄其他虛擬機。為了實現這一點,需要為每個節點生成公鑰,并將其內容追加到其他虛擬機的authorized_keys文件中。

    當虛擬機數量較多時,這種方法會變得繁瑣且容易出錯。

  2. 方法二

    (1) 在repo的.ssh目錄下生成公鑰,參考方法一的步驟(1)。

    (2) 使用ssh-copy-id命令配置repo到node001的免秘鑰登錄。

    [root@repo .ssh]# ssh-copy-id node001

    (3) 同樣,配置repo到其他節點的免秘鑰登錄。

    [root@repo .ssh]# ssh-copy-id node002 [root@repo .ssh]# ssh-copy-id node003 [root@repo .ssh]# ssh-copy-id node004

    (4) 如果需要配置node001到其他節點的免秘鑰登錄,重復(1)(2)(3)步驟。

    [root@node001 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa [root@node001 .ssh]# ssh-copy-id repo [root@node001 .ssh]# ssh-copy-id node002 [root@node001 .ssh]# ssh-copy-id node003 [root@node001 .ssh]# ssh-copy-id node004

    (5) 如果需要配置所有機器之間的免秘鑰登錄,給每個機器執行(1)(2)(3)步驟。這種方法比第一種方法簡單,但當虛擬機數量較多時,仍然較為繁瑣。

  3. 方法三

    (1) 在repo的.ssh目錄下生成公鑰,參考方法一的步驟(1)。

    (2) 將repo的公鑰內容寫入authorized_keys文件,使其可以免秘鑰登錄自身,參考方法一的步驟(6)。

    (3) 在repo中,查看authorized_keys文件,復制文件中的內容,并在末尾粘貼4份,僅修改最后的節點名稱為node001、node002、node003和node004。

    [root@repo .ssh]# vi authorized_keys

    配置各臺虛擬機之間免秘鑰登錄

    (4) 將.ssh文件夾分發給node001到node004。

    [root@repo .ssh]# scp ./* node001:`pwd` [root@repo .ssh]# scp ./* node002:`pwd` [root@repo .ssh]# scp ./* node003:`pwd` [root@repo .ssh]# scp ./* node004:`pwd`

    完成上述配置后,所有的虛擬機都可以實現兩兩之間以及自身的ssh免秘鑰登錄。然而,這種方法簡單但不安全,不建議在生產環境中使用。

  4. 方法四:使用shell腳本自動執行

    (1) 編寫一個腳本autoSSH.sh,該腳本可以在集群的任意節點上運行,實現當前服務器到任意其他節點的SSH免秘鑰登錄配置。

    該腳本的主要功能包括:

    • 自動為當前運行的節點生成公鑰私鑰對。
    • 自動將自己的公鑰文件內容追加到其他服務器的authorized_keys文件中。

    腳本內容:

    #!/bin/bash <h1>腳本接收的參數,也就是要互相配置 SSH 免密登錄的服務器列表參數</h1><p>BASE_HOST_LIST=$*</p><h1>密碼,默認用戶是當前運行腳本的用戶,比如 root 用戶</h1><h1>這里改成你的用戶對應的密碼</h1><p>BASE_PASSWORD="root"</p><h1>shell 函數:模擬 SSH 公鑰私鑰文件生成的人機交互過程</h1><p>sshkeygen(){ expect -c " spawn ssh-keygen expect { "ssh/id_rsa):" {send "r";exp_continue} "passphrase):" {send "r";exp_continue} "again:" {send "r";exp_continue} } " }</p><h1>shell 函數:模擬配置 SSH 免密登錄過程的人機交互過程</h1><p>sshcopyid(){ expect -c " spawn ssh-copy-id $1 expect { "(yes/no)?" {send "yesr";exp_continue} "password:" {send "$2r";exp_continue} } " }</p><h1>本機生成密鑰對</h1><p>sshkeygen</p><h1>然后本機跟其他服務器建立 SSH 免密登錄(包括自己)</h1><p>for SSH_HOST in ${BASE_HOST_LIST} do sshcopyid ${SSH_HOST} ${BASE_PASSWORD} done

    (2) 編寫一個啟動腳本startAutoSSH.sh,該腳本在基準服務器repo上運行,是整個自動批量配置SSH免秘鑰登錄程序的啟動程序。

    該腳本的主要功能包括:

    • 發送autoSSH.sh到集群各節點。
    • 發送命令讓各節點自動執行該配置腳本:autoSSH.sh。

    腳本內容:

    #!/bin/bash</p><h1>配置 SSH 免密登錄的服務器列表,可寫死,也可通過傳參或者讀配置文件的方式讀取</h1><h1>BASE_HOST_LIST="node001 node002 node003"</h1><p>BASE_HOST_LIST=$*</p><h1>腳本的放置目錄(傳送之前,和傳送之后都是這個目錄)</h1><p>SCRIPT_PATH="/root/autoSSH.sh"</p><h1>第一步:先讓自己先跑 autoSSH.sh 腳本,為了能順利發送腳本到集群各節點</h1><p>sh ${SCRIPT_PATH} ${BASE_HOST_LIST}</p><h1>第二步:把腳本發送給其他服務器,讓其他服務器也執行該腳本</h1><p>for SSH_HOST in $BASE_HOST_LIST do</p><h2>first : send install script</h2><pre class="brush:php;toolbar:false">## 注意這行,用戶名寫死為root,如果是其他用戶,記得在這里修改 scp -r $SCRIPT_PATH root@${SSH_HOST}:$SCRIPT_PATH ## send command and generate ssh and auto ssh ssh ${SSH_HOST} sh ${SCRIPT_PATH} ${BASE_HOST_LIST}

    done

    (3) 在配置SSH免秘鑰登錄之前,進行遠程拷貝scp時會有人機交互過程,我們使用expect來模擬這一過程。然而,不同的服務器版本可能尚未安裝expect,最佳解決方案是自動安裝。在此,我們假設各臺服務器都已安裝并能正常使用expect。

    如果需要安裝expect,請使用以下命令:

    yum -y install expect

    (4) 在基準服務器repo上執行以下命令:

    [root@repo ~]# sh startAutoSSH.sh node001 node002 node003 node004

    該命令表示:在repo服務器上,用戶root執行腳本startAutoSSH.sh,讓集群四個節點node001、node002、node003和node004進行互相SSH免秘鑰登錄配置。

    腳本執行完成后,四臺服務器的root用戶主目錄/root/.ssh目錄下將生成一個authorized_keys文件,其內容如下:

    配置各臺虛擬機之間免秘鑰登錄

    選擇node001進行驗證:

    [root@node001 ~]# ssh node001 Last login: Thu Dec 21 04:06:52 2017 from 192.168.21.1 [root@node001 ~]# exit logout Connection to node001 closed. [root@node001 ~]# ssh node002 Last login: Thu Dec 21 04:06:31 2017 from node001 [root@node002 ~]# exit logout Connection to node002 closed. [root@node001 ~]# ssh node003 Last login: Thu Dec 21 04:06:36 2017 from node001 [root@node003 ~]# exit logout Connection to node003 closed. [root@node001 ~]# ssh node004 Last login: Thu Dec 21 04:06:06 2017 from node003 [root@node004 ~]# exit logout Connection to node004 closed. [root@node001 ~]# 
  5. 其他說明

    注意:配置完成后,第一次從當前虛擬機遠程連接其他虛擬機時,可能會出現確認是否連接的信息或要求輸入密碼。登錄一次后,以后即可直接進行免秘鑰登錄。

    以上介紹的4種方法,推薦使用第四種方式:使用Shell腳本自動實現ssh免秘鑰登錄。

  6. 補充記錄

    2018-03-14:如果配置的是非root用戶的免秘鑰登錄,authorized_keys文件的權限需要修改為600,否則無法實現免秘鑰登錄。

    2018-08-16:如果配置后無法實現免秘鑰登錄,請嘗試重啟ssh服務:

    sudo service sshd restart

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享