本文主要圍繞着ssh服務以及如何通過ssh-copy-id實現無密碼登陸。
1. sshd 服務以及配置 2.ssh-copy-id命令的使用以及原理。3.批量多機互相信任。
1. sshd 服務
SSH(Secure Shell)是一種能夠以安全的方式提供遠程登錄的協議,也是目前遠程管理Linux系統的首選方式。在此之前,一般使用FTP或Telnet來進行遠程登錄。但是因為它們以明文的形式在網絡中傳輸賬戶密碼和數據信息,因此很不安全,很容易受到黑客發起的中間人攻擊,這輕則篡改傳輸的數據信息,重則直接抓取服務器的賬戶密碼。
想要使用SSH協議來遠程管理Linux系統,則需要部署配置sshd服務程序。sshd是基於SSH協議開發的一款遠程管理服務程序,不僅使用起來方便快捷,而且能夠提供兩種安全驗證的方法:
基於口令的驗證—用賬戶和密碼來驗證登錄;
基於密鑰的驗證—需要在本地生成密鑰對,然后把密鑰對中的公鑰上傳至服務器,並與服務器中的公鑰進行比較;該方式相較來說更安全。
sshd服務的配置信息保存在/etc/ssh/sshd_config文件中,以下是對於一些常用的配置進行記錄。
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命令
常用選項
-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