ssh和ssh-copy-id以及批量多機無密碼登錄詳解

 

  本文主要圍繞着ssh服務以及如何經過ssh-copy-id實現無密碼登錄。html

  1. sshd 服務以及配置   2.ssh-copy-id命令的使用以及原理。3.批量多機互相信任。
git

1. sshd 服務github

  SSH(Secure Shell)是一種可以以安全的方式提供遠程登陸的協議,也是目前遠程管理Linux系統的首選方式。在此以前,通常使用FTP或Telnet來進行遠程登陸。可是由於它們以明文的形式在網絡中傳輸帳戶密碼和數據信息,所以很不安全,很容易受到黑客發起的中間人攻擊,這輕則篡改傳輸的數據信息,重則直接抓取服務器的帳戶密碼。安全

  想要使用SSH協議來遠程管理Linux系統,則須要部署配置sshd服務程序。sshd是基於SSH協議開發的一款遠程管理服務程序,不只使用起來方便快捷,並且可以提供兩種安全驗證的方法:bash

     基於口令的驗證—用帳戶和密碼來驗證登陸;服務器

     基於密鑰的驗證—須要在本地生成密鑰對,而後把密鑰對中的公鑰上傳至服務器,並與服務器中的公鑰進行比較;該方式相較來講更安全。網絡

  sshd服務的配置信息保存在/etc/ssh/sshd_config文件中,如下是對於一些經常使用的配置進行記錄。dom

 port 22 默認的sshd服務端口
ListenAddress 0.0.0.0 設定sshd服務器監聽的IP地址
HostKey /etc/ssh/ssh_host_rsa_key RSA私鑰存放的位置
HostKey /etc/ssh/ssh_host_ecdsa_key ECDSA私鑰存放的位置
HostKey /etc/ssh/ssh_host_ed25519_key ed25519私鑰存放的位置
PermitRootLogin yes 設定是否容許root管理員直接登陸
StrictModes yes 當遠程用戶的私鑰改變時直接拒絕鏈接
MaxAuthTries 6 最大密碼嘗試次數
MaxSessions 10 最大終端數
PasswordAuthentication yes 是否容許密碼驗證
PermitEmptyPasswords no 是否容許空密碼登陸(很不安全)

 

  ssh命令ssh

     經常使用選項ide

      -p     指定遠程主機端口

      -i      指定認證文件

      -o    ConnectionAttempts=NUM  鏈接失敗後重試次數

      -o    ConnectTimeout=SEC        鏈接超時時間

      -o    StrictHostKeyChecking=no            自動去拉取主機key文件

      -o   PasswordAuthentication=no          禁止密碼認證

  示例:  

ssh  root@ip  -p端口號

2. ssh-copy-id命令的使用以及原理、

  2.1 生成「密鑰對」。

    ssh-keygen 

      經常使用參數 [-t dsa | ecdsa | ed25519 | rsa | rsa1],指定加密方式。

    示例: 

[root@localhost .ssh]# ssh-keygen  -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key (/root/.ssh/id_ecdsa): 按回車鍵或設置密鑰的存儲路徑
Enter passphrase (empty for no passphrase): 直接按回車鍵或設置密鑰的密碼
Enter same passphrase again: 再次按回車鍵或設置密鑰的密碼
Your identification has been saved in /root/.ssh/id_ecdsa.
Your public key has been saved in /root/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:yMZjxaP0yC2OQrRPEexfsbMweSPVVEvK88cvqUGA root@localhost.localdomain
The key's randomart image is:
+---[ECDSA 256]---+
|   ..   ..oo.o   |
|    .. .o+oo+    |
|  ... .oEo=o     |
| . ..*=O*o +     |
|  o ..%*S+o .    |
| . o =.o.. . .   |
|  . o . .   o    |
|   .     . .     |
|         .o      |
+----[SHA256]-----+
[root@localhost .ssh]# ll
total 8
-rw------- 1 root root 227 Jun 10 23:55 id_ecdsa #私鑰
-rw-r--r-- 1 root root 188 Jun 10 23:55 id_ecdsa.pub   #公鑰

  2.2 ssh-copy-id將公鑰上傳到遠程主機

    基於密鑰驗證,當咱們講公鑰上傳到咱們須要遠程登錄的主機的authorized_keys文件後咱們就能夠直接遠程到主機了。

    ssh-copy-id 經常使用選項:

      -i  指定公鑰文件

    示例:

[root@localhost yum.repos.d]# ssh-copy-id  -i /root/.ssh/id_ecdsa.pub  root@192.168.123.218
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_ecdsa.pub"
The authenticity of host '192.168.123.218 (192.168.123.218)' can't be established.
ECDSA key fingerprint is SHA256:Qh+4R5mpwlU6kK3bf0k53ngm+WpKKnfvL1ZJo+YM3ic.
ECDSA key fingerprint is MD5:d2:76:6d:33:45:e1:23:83:13:aa:10:ce:f7:1f:9f:32.
Are you sure you want to continue connecting (yes/no)? yes   #輸入yes
/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@192.168.123.218's password:   #填入密碼

Number of key(s) added: 1

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

    將公鑰添加到遠程主機後咱們能夠直接經過密鑰登錄了。

咱們這裏要着重講下ssh-copy-id的這個命令作了什麼事。

  1.第一它將本地的主機的公鑰添加到遠程主機的authorized_keys文件裏。

  2.第二它將在本地的用戶的家目錄的 .ssh/目錄下新建了一個known_hosts文件。

下面咱們來作個實驗,假如咱們須要將本地主機到遠程主機的信任解除掉,那麼咱們須要將遠程主機的authorized_keys裏的本地主機的密鑰清除掉。

  清除authorized_keys裏的指定內容後,咱們再用ssh ip直接登錄遠程主機,會發現咱們再次登錄須要輸入密碼,可是咱們不須要像第一次遠程登錄那樣先要輸入yes再輸入密碼。這個是因爲本地的known_hosts文件致使的,本地known_hosts文件已經將遠程主機

的鏈接信息儲蓄在這裏了,當咱們清除了裏面的遠程主機的鏈接信息的時候,咱們再進行登錄的時候就要yes後再輸入密碼。    

  若是咱們想之後無論遠程登錄任何主機均可以直接輸入密碼不須要那個驗證,那麼咱們能夠修改配置文件達到這個效果。

打開/etc/ssh/ssh_config文件:
找到:
# StrictHostKeyChecking ask
修改成
StrictHostKeyChecking no

3.批量多機互相信任。

  我在網上看到一種方法是將全部的主機設置成同樣的公鑰和私鑰,也就是在一臺電腦上面生成密鑰文件後,而後分發到全部的主機中。這種方法有好處也有壞處,咱們這裏用另一種方法。

 

思路:第一步在每一個主機上生成密鑰後,並把全部主機的公鑰都傳輸到一臺主機的authorized_keys文件裏,而後將authorized_keys文件再分發到全部主機,這樣就能夠實現互相信任了,可是仍是會有一個問題就如何將全部的主機的公鑰文件添加到一臺主機的authorized_keys文件裏(複製下來而後添加進)。

  主要文件 believe.sh  ,sshcopy.exp ,sshkeygen.exp,hosts文件。

  github 位置:https://github.com/tobewithyou1996/ssh-batch-believe.git(直接在博客這裏複製容易有編碼問題,因此在這裏放上github位置)

  believe.sh文件

#!/bin/bash
#檢查本地是否有密鑰文件,沒有則添加。
./sshkeygen.exp
#循環取出ip和密碼
for i in $(cat ./hosts )
do
    #取出ip和密碼
    IP=$(echo "${i}" |awk -F":" '{print $1}')
    PW=$(echo "${i}" |awk -F":" '{print $2}')
    #將本地的公鑰複製到遠程主機
    ./sshcopy.exp $IP  $PW
    #將腳本sshkeygen.exp複製到遠程主機
    scp -p ./sshkeygen.exp   $IP:/root/
    #遠程主機安裝expect
    ssh root@$IP "yum install expect -y "
    #遠程主機建立密鑰文件
    ssh root@$IP "/root/sshkeygen.exp&"
    #將遠程主機的公鑰添加到本地authorized_keys文件
    ssh root@$IP "cat ~/.ssh/*.pub" >>./authorized_keys
done
#將本地的公鑰複製到遠程主機
for i in $(cat ./hosts)
do
     IP=$(echo "${i}" |awk -F":" '{print $1}')
   #將本地主機的公鑰文件添加到authorized_keys文件
     cat ~/.ssh/*.pub >>./authorized_keys
scp ./authorized_keys $IP:~/.ssh/authorized_keys done

  sshcopy.exp(腳本的功能是:將本地的公鑰文件上傳到遠程主機)該文件本地權限要是可執行權限.

#!/usr/bin/expect -d  
set ip [lindex $argv 0]
set pw [lindex $argv 1]
set timeout 60
spawn ssh-copy-id $ip
expect {
#"*yes/no" {send "yes\r"; exp_continue}
#若是上面這行註釋了,咱們須要在/etc/ssh/ssh_config 將# StrictHostKeyChecking ask 修改成 StrictHostKeyChecking no。 "password:" {send "$pw\r"} } expect eof

  sshkeygen.exp(腳本功能是:判斷是否有密鑰文件,有則退出,沒有則建立)該文件本地權限要是755.

#!/usr/bin/expect -d
set timeout 90
spawn ssh-keygen
expect {
".ssh/id_rsa" {send "\r";exp_continue}
"Overwrite (y/n)?" exit
"Enter passphrase" {send "\r";exp_continue}
"Enter same passphrase again:" {send "\r"}
}
expect eof

  hosts文件(包含ip和密碼,ip和密碼之間以":"間隔)

149.28.244.75:*p8V1xG{7)%sQV!
149.28.245.101:K(1q@jsvM@UVZtk

以上就能夠批量實現主機直接互信(能夠直接遠程登錄)

將全部主機的密鑰文件設置一致的腳本連接是:http://www.cnblogs.com/kevingrace/p/9063745.html

相關文章
相關標籤/搜索