基於key驗證的ssh連接

簡介
在實際生產環境中,我們每日工作可能面對着許多的服務器需要管理,記住每臺機器的賬戶密碼顯然不現實,所以我們通常需要採取ssh的key驗證登錄(公鑰登陸),來協助我們實現多主機的遠程管理操作
所謂”公鑰登錄”,原理很簡單,就是用戶將自己的公鑰儲存在遠程主機上。登錄的時候,遠程主機會向用戶發送一段隨機字符串,用戶用自己的私鑰加密後,再發回來。遠程主機用事先儲存的公鑰進行解密,如果成功,就證明用戶是可信的,直接允許登錄shell,不再要求密碼。

準備

ssh連接自身來自於openssh包,分爲openssh,openssh-clients,openssh-server三個包,會生成不同的配置文件。
我們需要保證連接雙方的主機均安裝了軟件包,並且保證之間的網絡處於連通狀態。

實現

基於密鑰的安全驗證必須爲用戶自己創建一對密鑰,並把共有的密鑰放在需要訪問的服務器上。當需要連接到SSH服務器上時,客戶端軟件就會向服務器發出請求,請求使用客戶端的密鑰進行安全驗證。服務器收到請求之後,先在該用戶的根目錄下尋找共有密鑰,然後把它和發送過來的公有密鑰進行比較。如果兩個密鑰一致,服務器就用公有的密鑰加密“質詢”,並把它發送給客戶端軟件(putty,xshell等)。客戶端收到質詢之後,就可以用本地的私人密鑰解密再把它發送給服務器,這種方式是相當安全的。
步驟:
1、在客戶端生成一對密鑰
2、將公鑰傳輸至服務器端某用戶的家目錄下的 .ssh/authorized_keys 文件中(多個公鑰需要進行追加)
3、測試登錄
首先,我們需要生成一對密鑰

[root@localhost ~]$ ssh-keygen -t rsa -P '' -f "/root/.ssh/id_rsa"
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
f3:80:b8:7e:39:66:e5:6b:6f:f7:b6:5a:c5:50:6d:78 [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
|               .o|
|              ..E|
|              .o |
|     . .       o |
|    . . S       o|
|     .  .+     . |
|    .  +  .   .  |
|   .  * o . ...  |
|    .+ o.+...+o. |
+-----------------+

-t 指定算用算法
-p 指定私鑰口令
-f 指定生成密鑰目錄

[root@localhost ~]$ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.18.46.106
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@172.18.46.106's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

之後我們使用命令將本機生成公鑰文件拷貝到服務器
-i 指定目標公鑰文件(注:如果所填爲私鑰文件,也會默認發送對應公鑰,避免錯誤操作)

[root@localhost ~]$ssh 172.18.46.106
Last login: Sun Sep 10 19:23:02 2017 from 172.18.251.187
[root@CentOS6 ~]$ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:30:33:7d brd ff:ff:ff:ff:ff:ff
    inet 172.18.46.106/16 brd 172.18.255.255 scope global eth1
    inet6 fe80::250:56ff:fe30:337d/64 scope link 
       valid_lft forever preferred_lft forever

我們通過ssh連接命令嘗試連接到ip106主機,發現連接成功,這一有一點需要注意,我們連接時本機所登錄的賬號爲root賬號,如果我們在連接ip前未標識username@ip格式,ssh連接就會默認以當前的用戶進行登錄,如果目標主機上並沒有該用戶,會提示連接出錯,又或者我們拷貝的公鑰pub文件未放在目標主機同名賬戶家目錄中,會導致不能實現key驗證,仍然提示輸入密碼。

補充一

我們可以注意到,我在生成密鑰時並沒有對私鑰進行加密,如果考慮安全問題,我們可以對私鑰進行加密操作,創建時沒有設置,我們可以之後運用命令進行重新設置

[root@localhost ~]$ssh-keygen –p

但是需要注意的是,添加完私鑰口令後,我們仍需在登錄時輸入密碼,就與我們的初衷不符,那麼我們可以使用代理進行解決
ssh-agent是一個密鑰管理器,運行ssh-agent以後,使用ssh-add將私鑰交給ssh-agent保管,其他程序需要身份驗證的時候可以將驗證申請交給ssh-agent來完成整個認證過程。
ssh包含的內建支持允許它同ssh-agent通信,允許ssh不必每次新連接時都提示要密碼才能獲取解密的專用密鑰。對於ssh-agent,你只要使用ssh-add把專用密鑰添加到ssh-agent的高速緩存中。這是個一次性過程;用過ssh-add之後,ssh將從ssh-agent獲取你的專用密鑰,而不會提示要密碼短語。

ssh-agent bash
ssh-add

開啓代理
並將密碼添加給代理,那麼我們既保證了私鑰的安全,又解決了輸入主機密碼的麻煩。

補充二

我們實現了多主機的key驗證登錄,爲了方便管理小的集羣環境,我在這裏補充一個pssh軟件供參考。
pssh是一個python編寫可以在多臺服務器上執行命令的工具,也可實現文件複製
選項如下:
–version:查看版本
-h:主機文件列表,內容格式” [user@]host[:port]”
-H:主機字符串,內容格式” [user@]host[:port]”
-l:登錄使用的用戶名
-p:併發的線程數【可選】
-o:輸出的文件目錄【可選】
-e:錯誤輸入文件【可選】
-t: TIMEOUT 超時時間設置, 0無限制【可選】
-O: SSH的選項
-v:詳細模式
-A:手動輸入密碼模式
-x:額外的命令行參數使用空白符號,引號,反斜線處理
-X:額外的命令行參數,單個參數模式,同-x
-i:每個服務器內部處理信息輸出
-P:打印出服務器返回信息

下面給出幾個實例

[root@CentOS6 ~]$pssh -H 192.168.0.1 -i hostname
==>在指定IP主機執行命令
[root@CentOS6 ~]$pssh -H "192.168.0.1  192.168.0.2" -i hostname
==>在指定多個IP主機執行命令
[root@CentOS6 ~]$pssh -h ip.txt -i setenforce 0
==>在指定文件中保存的IP主機執行命令
[root@CentOS6 ~]pssh -h ip.txt -i -o /app/ hostname
==>在指定文件中保存的IP主機執行命令,並把返回結果存入本機/app下,結果存入以主機ip爲文件名的文件
[root@CentOS6 ~]pscp.pssh -h ip.txt /app/f1.sh /app
將/app/f1.sh推送到目標ip主機
[root@CentOS6 ~]pslurp -h ip.txt -L /app /etc/passwd
從目標ip主機拷貝文件,並保存到以IP爲目錄名的目錄下

總結:基於key驗證的ssh是自動化運維的第一步,需要牢固掌握,熟練運用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章