Openssh介紹
- OpenSSH 是 SSH (Secure Shell) 協議的免費開源實現。SSH協議族可以用來進行遠端控制, 或在計算機之間傳送檔案。而實現此功能的傳統方式,如telnet(終端模擬協議)、 rcp ftp、 rlogin、rsh都是極為不安全的,並且會使用明文傳送密碼。OpenSSH提供了服務端後臺程式和客戶端工具,用來加密遠端控制元件和檔案傳輸過程中的資料,並由此來代替原來的類似服務。
SSH工作原理
- 1.伺服器建立公鑰: 每一次啟動 sshd 服務時,該服務會主動去找 /etc/ssh/ssh_host* 的檔案,若系統剛剛安裝完成時,由於沒有這些公鑰,因此 sshd 會主動去計算出這些需要的公鑰,同時也會計算出伺服器自己需要的私鑰。
- 2.客戶端主動聯機請求: 若客戶端想要聯機到 ssh 伺服器,則需要使用適當的客戶端程式來聯機,包括 ssh, putty 等客戶端程式連線。
- 3.伺服器傳送公鑰給客戶端: 接收到客戶端的要求後,伺服器便將第一個步驟取得的公鑰傳送給客戶端使用 (此時應是明碼傳送,反正公鑰本來就是給大家使用的)。
- 4.客戶端記錄並比對伺服器的公鑰資料及隨機計算自己的公私鑰: 若客戶端第一次連線到此伺服器,則會將伺服器的公鑰記錄到客戶端的使用者家目錄內的 ~/.ssh/known_hosts 。若是已經記錄過該伺服器的公鑰,則客戶端會去比對此次接收到的與之前的記錄是否有差異。若接受此公鑰, 則開始計算客戶端自己的公私鑰。
- 5.回傳客戶端的公鑰到伺服器端: 使用者將自己的公鑰傳送給伺服器。此時伺服器:具有伺服器的私鑰與客戶端的公鑰,而客戶端則是: 具有伺服器的公鑰以及客戶端自己的私鑰,你會看到,在此次聯機的伺服器與客戶端的金鑰系統 (公鑰+私鑰) 並不一樣,所以才稱為非對稱加密系統。
- 6.開始雙向加解密:
- (1)伺服器到客戶端:伺服器傳送資料時,拿使用者的公鑰加密後送出。客戶端接收後,用自己的私鑰解密。
- (2)客戶端到伺服器:客戶端傳送資料時,拿伺服器的公鑰加密後送出。伺服器接收後,用伺服器的私鑰解密,這樣就能保證通訊安全。
環境準備:
屬性 | 跳板機 | 伺服器-01 | 伺服器-02 |
節點 | wenCheng | Server-01 | Server-02 |
系統 | CentOS Linux release 7.5.1804 (Minimal) | CentOS Linux release 7.5.1804 (Minimal) | CentOS Linux release 7.5.1804 (Minimal) |
核心 | 3.10.0-862.el7.x86_64 | 3.10.0-862.el7.x86_64 | 3.10.0-862.el7.x86_64 |
SELinux | setenforce 0 | disabled | setenforce 0 | disabled | setenforce 0 | disabled |
Firewlld | systemctl stop/disabled firewalld | systemctl stop/disabled firewalld | systemctl stop/disabled firewalld |
IP地址 | 172.16.70.182 | 172.16.70.186 | 172.16.70.187 |
檢查sshd相關設定資訊,以跳板機為例。
# 是否已安裝 [root@wenCheng ~]# rpm -qa | grep ssh libssh2-1.4.3-10.el7_2.1.x86_64 openssh-clients-7.4p1-16.el7.x86_64 openssh-7.4p1-16.el7.x86_64 openssh-server-7.4p1-16.el7.x86_64 # 是否已監聽埠 [root@wenCheng ~]# netstat -untpl | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 882/sshd tcp6 0 0 :::22 :::* LISTEN 882/sshd # 檢視ssh版本 [root@wenCheng ~]# ssh -V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 # 是否開機啟動 [root@wenCheng ~]# systemctl is-enabled sshd.service enabled # 預設3對以不同方式加密的hostkey和配置檔案config [root@wenCheng ~]# ls -l /etc/ssh/ssh* -rw-r--r--. 1 root root 2276 Apr 11 2018 /etc/ssh/ssh_config -rw-------. 1 root root 3907 Apr 11 2018 /etc/ssh/sshd_config -rw-r-----. 1 root ssh_keys 227 Dec 4 2020 /etc/ssh/ssh_host_ecdsa_key -rw-r--r--. 1 root root 162 Dec 4 2020 /etc/ssh/ssh_host_ecdsa_key.pub -rw-r-----. 1 root ssh_keys 387 Dec 4 2020 /etc/ssh/ssh_host_ed25519_key -rw-r--r--. 1 root root 82 Dec 4 2020 /etc/ssh/ssh_host_ed25519_key.pub -rw-r-----. 1 root ssh_keys 1679 Dec 4 2020 /etc/ssh/ssh_host_rsa_key -rw-r--r--. 1 root root 382 Dec 4 2020 /etc/ssh/ssh_host_rsa_key.pub
預設/etc/ssh/sshd_config解析。
[root@Server-01 ~]# cat /etc/ssh/sshd_config ...... # default value. #Port 22 # 預設ssh埠;可去掉"#"自定義數字,例 Port 2211 #AddressFamily any # 預設any:IPv4,IPv6 #ListenAddress 0.0.0.0 # 預設監聽所有IP地址;可去掉"#"自定義方式,例 ListenAddress host|IPv4|IPv4_addr:port #ListenAddress :: # 私鑰儲存位置 HostKey /etc/ssh/ssh_host_rsa_key #HostKey /etc/ssh/ssh_host_dsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key # Ciphers and keying # 密碼和金鑰 #RekeyLimit default none # Logging # 日誌 #SyslogFacility AUTH # #當有人使用SSH登入系統的時候,SSH會記錄資訊 SyslogFacility AUTHPRIV #LogLevel INFO # 設定日誌等級 # Authentication: # 身份認證 #LoginGraceTime 2m # 限制登入時間不輸入密碼兩分鐘自動退出 #PermitRootLogin yes # 是否允許root直接登入;建議設定為no #StrictModes yes # 是否檢查.ssh/檔案的所有者,許可權 #MaxAuthTries 6 # 最大認證次數6;一般設為3 #MaxSessions 10 # 克隆會話最大連線 #PubkeyAuthentication yes # 是否支援公鑰驗證(一般開啟公鑰驗證關閉使用者登入) # The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2 # but this is overridden so installations will only check .ssh/authorized_keys AuthorizedKeysFile .ssh/authorized_keys # 基於公鑰認證機制時,來自客戶端的公鑰的存放位置 #AuthorizedPrincipalsFile none #AuthorizedKeysCommand none #AuthorizedKeysCommandUser nobody # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts #HostbasedAuthentication no # Change to yes if you don't trust ~/.ssh/known_hosts for # HostbasedAuthentication #IgnoreUserKnownHosts no # Don't read the user's ~/.rhosts and ~/.shosts files #IgnoreRhosts yes # To disable tunneled clear text passwords, change to no here! #PasswordAuthentication yes #PermitEmptyPasswords no # 是否允許空密碼,如果使用密碼驗證,這裡最好設定no PasswordAuthentication yes # 是否使用密碼驗證,如果使用金鑰對驗證可以改為no # Change to no to disable s/key passwords #ChallengeResponseAuthentication yes ChallengeResponseAuthentication no # 是否禁用s/key密碼 # Kerberos options # 與Kerberos 有關的引數設定,不用設定 #KerberosAuthentication no #KerberosOrLocalPasswd yes #KerberosTicketCleanup yes #KerberosGetAFSToken no #KerberosUseKuserok yes # GSSAPI options GSSAPIAuthentication yes # 是否開啟GSSAOI身份認證機制;建議設定no,加快ssh連線 GSSAPICleanupCredentials no #GSSAPIStrictAcceptorCheck yes #GSSAPIKeyExchange no #GSSAPIEnablek5users no # Set this to 'yes' to enable PAM authentication, account processing, # and session processing. If this is enabled, PAM authentication will # be allowed through the ChallengeResponseAuthentication and # PasswordAuthentication. Depending on your PAM configuration, # PAM authentication via ChallengeResponseAuthentication may bypass # the setting of "PermitRootLogin without-password". # If you just want the PAM account and session checks to run without # PAM authentication, then enable this but set PasswordAuthentication # and ChallengeResponseAuthentication to 'no'. # WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several # problems. UsePAM yes # 是否啟用PAM身份認證 #AllowAgentForwarding yes #AllowTcpForwarding yes #GatewayPorts no # 是否允許被遠端主機所設定的本地轉發埠繫結在非環回地址上 X11Forwarding yes #X11DisplayOffset 10 #X11UseLocalhost yes #PermitTTY yes #PrintMotd yes # 登入後是否顯示設定的資訊;建議設為no #PrintLastLog yes # 是否顯示上次登入的資訊 #TCPKeepAlive yes #UseLogin no # 是否接受login 這個程式的登入 #UsePrivilegeSeparation sandbox #PermitUserEnvironment no # 是否允許使用者將環境選項呈現給ssh守護程式 #Compression delayed #ClientAliveInterval 0 # 設定了ssh伺服器端向其客戶端傳送請求訊息(alive訊息)的間隔時間,以檢測客戶端是否還存在,0表示不傳送 #ClientAliveCountMax 3 # 允許客戶端在接收到服務端的alive訊息未響應的最大超時次數,如果客戶端在最大超時次數內均未響應,ssh服務會自動終止與客戶端的會話。 #ShowPatchLevel no #UseDNS yes # 是否將客戶端主機名解析為IP,以檢查此主機名是否與其IP地址真實對應;建議去到"#"設為no #PidFile /var/run/sshd.pid # sshd的PID路徑檔案 #MaxStartups 10:30:100 # 當連線數超過10會以30%的失敗率拒絕使用者登入(達到100,100%拒絕) #PermitTunnel no #ChrootDirectory none #VersionAddendum none # no default banner path #Banner none # ssh登入提示資訊,可去掉"#"自定義,指定全路徑檔案即可 # Accept locale-related environment variables AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS ## ===== 以下可自行新增到配置檔案 ===== # AllowUsers wen 允許的使用者登入(包括root)白名單 # DenyUsers cheng 拒絕的使用者登入,黑名單(優先順序高) # AllowGroups XX 允許的使用者組登入 # DenyGroups XXX 拒絕的使用者組登入 ## ================================================ # override default of no subsystems Subsystem sftp /usr/libexec/openssh/sftp-server # Example of overriding settings on a per-user basis #Match User anoncvs # X11Forwarding no # AllowTcpForwarding no # PermitTTY no # ForceCommand cvs server
預設/etc/ssh/ssh_config解析。
[root@wenCheng ~]# cat /etc/ssh/ssh_config ....... # Host * # 選項“Host”只對能夠匹配後面字串的計算機有效。“*”表示所有的計算機 # ForwardAgent no # 連線是否經過驗證代理(如果存在)轉發給遠端計算機 # ForwardX11 no # X11連線是否被自動重定向到安全的通道和顯示集 # RhostsRSAAuthentication no # 是否使用用RSA演算法的基於rhosts的安全驗證 # RSAAuthentication yes # 是否使用RSA演算法進行安全驗證 # PasswordAuthentication yes # 是否使用口令驗證 # HostbasedAuthentication no # 是否啟用基於主機的身份認證機制 # GSSAPIAuthentication no # GSSAPIDelegateCredentials no # GSSAPIKeyExchange no # GSSAPITrustDNS no # BatchMode no # 是否在這臺計算機上使用“rlogin/rsh” # CheckHostIP yes # 是否檢視連線到伺服器的主機的IP地址以防止DNS欺騙。建議設定為“yes” # AddressFamily any # ConnectTimeout 0 # StrictHostKeyChecking ask # 自動把計算機的密匙加入“$HOME/.ssh/known_hosts”檔案;ask(預設)新的主機金鑰將新增到使用者知道的主機檔案 # IdentityFile ~/.ssh/identity # 從哪個檔案讀取使用者的RSA安全驗證標識 # IdentityFile ~/.ssh/id_rsa # IdentityFile ~/.ssh/id_dsa # IdentityFile ~/.ssh/id_ecdsa # IdentityFile ~/.ssh/id_ed25519 # Port 22 # 連線到遠端主機的埠 # Protocol 2 # Cipher 3des # 加密用的演算法 # Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc # MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160 # EscapeChar ~ # 設定escape字元 # Tunnel no # TunnelDevice any:any # PermitLocalCommand no # VisualHostKey no # ProxyCommand ssh -q -W %h:%p gateway.example.com # RekeyLimit 1G 1h # # Uncomment this if you want to use .local domain # Host *.local # CheckHostIP no Host * GSSAPIAuthentication yes # If this option is set to yes then remote X11 clients will have full access # to the original X11 display. As virtually no X11 client supports the untrusted # mode correctly we set this to yes. ForwardX11Trusted yes # Send locale-related environment variables SendEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT SendEnv LC_IDENTIFICATION LC_ALL LANGUAGE SendEnv XMODIFIERS
SSH認證過程分兩種:
1.基於口令認證。
- SSH命令基本用法。
openssh套件中的客戶端連線工具 ssh [options] [user@]hostname [command] -1:強制使用ssh協議版本1; -2:強制使用ssh協議版本2; -4:強制使用IPv4地址; -6:強制使用IPv6地址; -A:開啟認證代理連線轉發功能; -a:關閉認證代理連線轉發功能; -b:使用本機指定地址作為對應連線的源ip地址; -C:請求壓縮所有資料; -F:指定ssh指令的配置檔案; -f:後臺執行ssh指令; -g:允許遠端主機連線主機的轉發埠; -i:指定身份檔案; -l:指定連線遠端伺服器登入使用者名稱; -N:不執行遠端指令; -o:指定配置選項; -p:指定遠端伺服器上的埠; -q:靜默模式; -v:詳細模式,將輸出debug訊息,可用於除錯。"-vvv"可更詳細。 -V:顯示版本號並退出。 -o:指定額外選項,選項非常多。 user@hostname :指定ssh以遠端主機hostname上的使用者user連線到的遠端主機上,若省略user部分,則表示使用本地當前使用者。 :如果在hostname上不存在user使用者,則連線將失敗(將不斷進行身份驗證)。 command :要在遠端主機上執行的命令。指定該引數時,ssh的行為將不再是登入,而是執行命令,命令執行完畢時ssh連線就關閉。 例:遠端主機IP:172.16.70.186 使用者:Wen 埠:2221 shell> ssh -l Wen 172.16.70.186 -p2221 shell> ssh Wen@172.16.70.186 -p2221 shell> ssh Wen@172.16.70.186 -p2221 'hostname'
- # 跳板機首次遠端連線伺服器-01過程
[root@wenCheng ~]# ssh root@172.16.70.186 The authenticity of host '172.16.70.186 (172.16.70.186)' can't be established. ECDSA key fingerprint is SHA256:ZGZdN+a+izupZH7iY2/2VLQhB60QNKvIBLiAJHmf4o4. ECDSA key fingerprint is MD5:e4:2b:df:ac:73:b7:0b:95:a4:7e:4c:97:ba:6e:30:1a. Are you sure you want to continue connecting (yes/no)? yes ## 主機驗證 # 這段話的意思是,無法確認host主機的真實性,只知道它的公鑰指紋,問你還想繼續連線嗎? # 所謂"公鑰指紋",是指公鑰長度較長很難比對,所以對其進行MD5計算,將它變成一個128位的指紋。上例中是e4:2b:df:ac:73:b7:0b:95:a4:7e:4c:97:ba:6e:30:1a,再進行比較,就容易多了。 # 那麼使用者怎麼知道遠端主機的公鑰指紋應該是多少?回答是沒有好辦法,遠端主機必須在自己的網站上貼出公鑰指紋,以便使用者自行核對。 Warning: Permanently added '172.16.70.186' (ECDSA) to the list of known hosts. root@172.16.70.186's password: ## 使用者驗證 Last login: Fri Jun 18 08:19:10 2021 from 172.16.70.182 # 當遠端主機的公鑰被接受以後,它就會被儲存在檔案$HOME/.ssh/known_hosts之中。下次再連線這臺主機,系統就會認出它的公鑰已經儲存在本地了,從而跳過警告部分,直接提示輸入密碼。 [root@Server-01 ~]# ls -l /etc/ssh/ssh_host* -rw-r-----. 1 root ssh_keys 227 Jun 17 15:59 /etc/ssh/ssh_host_ecdsa_key -rw-r--r--. 1 root root 162 Jun 17 15:59 /etc/ssh/ssh_host_ecdsa_key.pub -rw-r-----. 1 root ssh_keys 387 Jun 17 15:59 /etc/ssh/ssh_host_ed25519_key -rw-r--r--. 1 root root 82 Jun 17 15:59 /etc/ssh/ssh_host_ed25519_key.pub -rw-r-----. 1 root ssh_keys 1679 Jun 17 15:59 /etc/ssh/ssh_host_rsa_key -rw-r--r--. 1 root root 382 Jun 17 15:59 /etc/ssh/ssh_host_rsa_key.pub # 檢視伺服器-01上的ecdsa_key.pub [root@Server-01 ~]# cat /etc/ssh/ssh_host_ecdsa_key.pub ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDiaBpVrOEa+c82sjAXHl7TiQ9RJaPh9U4YLCinNAh3LH2ZX5ykkgEr7gA4Rq1Syd1S6/P3cUHQ5AbgkKiTOpcw= [root@Server-01 ~]# [root@Server-01 ~]# ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key 256 SHA256:ZGZdN+a+izupZH7iY2/2VLQhB60QNKvIBLiAJHmf4o4 /etc/ssh/ssh_host_ecdsa_key.pub (ECDSA) [root@Server-01 ~]# logout # Ctrl + d 退出;返回到跳板機 Connection to 172.16.70.186 closed. # 檢視跳板機上的known_hosts,對應伺服器-01的ecdsa_key.pub [root@wenCheng ~]# cat .ssh/known_hosts 172.16.70.186 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDiaBpVrOEa+c82sjAXHl7TiQ9RJaPh9U4YLCinNAh3LH2ZX5ykkgEr7gA4Rq1Syd1S6/P3cUHQ5AbgkKiTOpcw= [root@wenCheng ~]# [root@wenCheng ~]# ssh-keygen -l -f .ssh/known_hosts 256 SHA256:ZGZdN+a+izupZH7iY2/2VLQhB60QNKvIBLiAJHmf4o4 172.16.70.186 (ECDSA)
2.基於公鑰認證。
- 使用口令認證,每次都必須輸入密碼,非常麻煩。好在SSH還提供了公鑰登入,可以省去輸入密碼的步驟。
- 所謂"公鑰認證",原理很簡單,就是使用者將自己的公鑰儲存在遠端主機上。登入的時候,遠端主機會向使用者傳送一段隨機字串,使用者用自己的私鑰加密後,再發回來。遠端主機用事先儲存的公鑰進行解密,如果成功,就證明使用者是可信的,直接允許登入shell,不再要求密碼。
- ssh-keygen命令基本用法。
為ssh生成、管理和轉換認證金鑰 ssh-keygen [options] [command] -b:指定金鑰長度;對於RSA金鑰,最小要求768位,預設是2048位。DSA金鑰必須恰好是1024位 -e:讀取openssh的私鑰或者公鑰檔案; -c:修改私鑰和公鑰檔案中的註釋。 -C:新增註釋; -f:指定用來儲存金鑰的檔名; -i:讀取未加密的ssh-v2相容的私鑰/公鑰檔案,然後在標準輸出裝置上顯示openssh相容的私鑰/公鑰; -l:顯示公鑰檔案的指紋資料; -N:提供一個新密語; -P:提供(舊)密語; -q:靜默模式; -t:指定要建立的金鑰型別,dsa | ecdsa | ed25519 | rsa | rsa1。 -v:詳細模式。ssh-keygen 將會輸出處理過程的詳細除錯資訊。常用於除錯模數的產生過程。 例:在伺服器上生成rsa,4096位,使用者為Wen的金鑰對。 shell> ssh-keygen -t rsa -b 4096 -C Wen
- ssh-copy-id命令基本用法。
可以把本地主機的公鑰複製到遠端主機的authorized_keys檔案上 ssh-copy-id [option] [user@]hostname -i 指定認證檔案(公鑰) -f 強制模式 -n 測試,不實際替換 -p port 指定埠 -o option 指定其他 ssh 引數 例:將跳板機的/root/.ssh/id_rsa.pub公鑰傳送到遠端伺服器172.16.0.1的Wen使用者上。 shell> ssh-copy-id -i /root/.ssh/id_rsa.pub Wen@172.16.0.1
- # 跳板機首次遠端連線伺服器-02過程
# 在跳板機wenCheng操作 例1:互動式生成金鑰對 [root@wenCheng ~]# ssh-keygen # 可自定義引數 -t rsa -b 4096 -C WenCheng Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): # 回車,預設key儲存路徑/root/.ssh/id_rsa;可自定義,如/root/.ssh/WenCheng_rsa Enter passphrase (empty for no passphrase): # 回車,預設key不設定密碼;建議設定密碼 Enter same passphrase again: 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: SHA256:zyMrRak1AcDZf9SzJKKXLGwJwNjJfsdztHzF08t+URI root@wenCheng The key's randomart image is: +---[RSA 2048]----+ | =.+.+.. o .E. | |. = + . + o B o .| | . + B B + = o.| | . . X & o . o. | | . o OS+ . .| | . .o . .| | .. + . | | . o . | | .. | +----[SHA256]-----+ [root@wenCheng ~]# ssh-keygen -l -f .ssh/id_rsa.pub # 檢視生成公鑰指紋 2048 SHA256:zyMrRak1AcDZf9SzJKKXLGwJwNjJfsdztHzF08t+URI root@wenCheng (RSA) [root@wenCheng ~]# ls -l .ssh/ -rw-------. 1 root root 1679 Jun 18 17:23 id_rsa -rw-r--r--. 1 root root 395 Jun 18 17:23 id_rsa.pub [root@wenCheng ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.16.70.187 # 將生成的公鑰儲存至172.16.70.187的root使用者的/root/.ssh/authorized_keys /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub" The authenticity of host '172.16.70.187 (172.16.70.187)' can't be established. ECDSA key fingerprint is SHA256:c/5+RMbf79VeNEzwtdtk9cvRoWIDDRg890ew82Hfj+g. ECDSA key fingerprint is MD5:41:ce:da:7c:7d:ce:93:ed:6f:c3:1d:81:6d:02:18:3b. Are you sure you want to continue connecting (yes/no)? 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@172.16.70.187's password: # root@172.16.70.187登入密碼 Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@172.16.70.187'" and check to make sure that only the key(s) you wanted were added. # 在Server-02操作 [root@Server-02 ~]# ssh-keygen -l -f .ssh/authorized_keys 2048 SHA256:zyMrRak1AcDZf9SzJKKXLGwJwNjJfsdztHzF08t+URI root@wenCheng (RSA) =================================================================================== 例2:非互動式生成金鑰對 [root@wenCheng ~]# ssh-keygen -f .ssh/id_rsa -N '' Generating public/private rsa key pair. Your identification has been saved in .ssh/id_rsa. Your public key has been saved in .ssh/id_rsa.pub. The key fingerprint is: SHA256:/fbMSIjWa4wzqiuBs8y7bbvTk4DK4Qc3BB37rf4JGn0 root@wenCheng The key's randomart image is: +---[RSA 2048]----+ | ... | | . .. | | .. | | .. . . | | .o . .S . | |o+.+. . o o | |*o+o++.Eooo + | |o=o+++o.= o+ = | | o=**+++ +. . + | +----[SHA256]-----+ [root@wenCheng ~]# ls -l .ssh/ -rw-------. 1 root root 1679 Jun 18 17:47 id_rsa -rw-r--r--. 1 root root 395 Jun 18 17:47 id_rsa.pub [root@wenCheng ~]# ssh-keygen -l -f .ssh/id_rsa.pub 2048 SHA256:/fbMSIjWa4wzqiuBs8y7bbvTk4DK4Qc3BB37rf4JGn0 root@wenCheng (RSA) [root@Server-02 ~]# ls -l .ssh/ -rw-------. 1 root root 395 Jun 18 17:49 authorized_keys [root@Server-02 ~]# [root@Server-02 ~]# ssh-keygen -l -f .ssh/authorized_keys 2048 SHA256:/fbMSIjWa4wzqiuBs8y7bbvTk4DK4Qc3BB37rf4JGn0 root@wenCheng (RSA)
- 跳板機批量實現非互動式雙機互信。
#跳板機root@172.16.70.182需要和root@172.16.70.186~root@172.16.70.190配置雙機互信 [root@wenCheng ~]# cat ~/sshKey.sh #!/bin/bash # 建立金鑰對 ssh-keygen -t rsa -b 4096 -C WenCheng -f ~/.ssh/wencheng_rsa -P "123456" &>/dev/null # 是否安裝sshpass rpm -q sshpass &>/dev/null || yum -y install sshpass &>/dev/null #批量分發公鑰 for ip in `grep Server all_hosts | awk '{print $2}'` do echo "==== hsot $ip ====" # ssh-keyscan $ip >> ~/.ssh/known_hosts 2 > /dev/null sshpass -p 'centos' ssh-copy-id -i /root/.ssh/wencheng_rsa.pub -o StrictHostKeyChecking=no root@$ip &>/dev/null REVAL=$? if [ $REVAL -eq 0 ] then echo -e "\033[32m Send publickey to host $ip success!!!\033[0m" echo else echo -e "\033[41;37m Send publickey to host $ip fail!!! \033[0m" echo fi done [root@wenCheng ~]# cat ~/all_hosts hostname ip Server-01 172.16.70.186 Server-02 172.16.70.187 Server-03 172.16.70.188 Server-04 172.16.70.189 Server-05 172.16.70.190 [root@wenCheng ~]# ls .ssh/ id_rsa id_rsa.pub known_hosts wencheng_rsa wencheng_rsa.pub [root@wenCheng ~]# ssh -i .ssh/wencheng_rsa 172.16.70.186 Enter passphrase for key '.ssh/wencheng_rsa': # 私鑰密碼 123456 Last login: Mon Jun 21 15:58:06 2021 from 172.16.70.182 [root@Server-01 ~]# hostname -I 172.16.70.186
雖然上面指令碼實現了批量互信,但每次指定私鑰的時候還得輸入這個passphrase密碼,此時該如何解決?
- ssh-agent可以通過ssh-add命令向ssh-agent註冊本機的私鑰,ssh-agent會自動推匯出這個私鑰的指紋(實際上是ssh-add計算的)儲存在自己的小本本里(記憶體),以後只要ssh連線某主機(某使用者),將自動轉發給ssh-agent,ssh-agent將自動從它的小本本里查詢私鑰的指紋並將其傳送給服務端(sshd端)。如此一來,ssh客戶端就無需再指定使用哪個私鑰檔案去連線。
- 總的看上去,ssh-agent的角色就是幫忙儲存、查詢併傳送對應的指紋而已,也就是說它是一個連線的轉發人,扮演的是一個代理的角色。
- ssh-agent命令基本用法。
ssh-agent就是一個金鑰管理器,執行ssh-agent以後,使用ssh-add將私鑰交給ssh-agent保管,其他程式需要身份驗證的時候可以將驗證申請交給ssh-agent來完成整個認證過程。 ssh-agent [options] [command [arg ...] -a bind_address:bind the agent to the UNIX-domain socket bind_address. -c:生成C-shell風格的命令輸出。 -d:除錯模式。 -k:把ssh-agent程式殺掉。 -s:生成Bourne shell 風格的命令輸出。 -t life:設定預設值新增到代理人的身份最大壽命。 例:執行ssh-agent shell> eval `ssh-agent` shell> eval "$(ssh-agent)"
- ssh-add命令基本用法。
把專用金鑰新增到ssh-agent的快取記憶體中 ssh-add [options] [file ...] -D:刪除ssh-agent中的所有金鑰. -d:從ssh-agent中的刪除金鑰 -e pkcs11:刪除PKCS#11共享庫pkcs1提供的鑰匙。 -s pkcs11:新增PKCS#11共享庫pkcs1提供的鑰匙。 -L:顯示ssh-agent中的公鑰 -l:顯示ssh-agent中的金鑰 -t life:對載入的金鑰設定超時時間,超時ssh-agent將自動解除安裝金鑰 -X:對ssh-agent進行解鎖 -x:對ssh-agent進行加鎖
使用ssh-agent和ssh-add命令完美解決。
# 跳板機使用指定公鑰遠端連線伺服器 [root@wenCheng ~]# ls .ssh/ id_rsa id_rsa.pub known_hosts wencheng_rsa wencheng_rsa.pub [root@wenCheng ~]# eval `ssh-agent` Agent pid 16800 [root@wenCheng ~]# ssh-add .ssh/wencheng_rsa Enter passphrase for .ssh/wencheng_rsa: # 只在這裡輸入私鑰一次密碼 Identity added: .ssh/wencheng_rsa (.ssh/wencheng_rsa) [root@wenCheng ~]# ssh-add -l 4096 SHA256:m9Og2cC65AIfkT6/jXa/L09BUzBsyOV4V9t0XEmNK/0 .ssh/wencheng_rsa (RSA) [root@wenCheng ~]# ssh 172.16.70.186 # 無需再輸私鑰密碼 Last failed login: Mon Jun 21 16:11:53 CST 2021 from 172.16.70.182 on ssh:notty There were 2 failed login attempts since the last successful login. Last login: Mon Jun 21 15:59:50 2021 from 172.16.70.182 [root@Server-01 ~]# hostname -I 172.16.70.186 [root@Server-01 ~]# logout Connection to 172.16.70.186 closed. [root@wenCheng ~]# ssh 172.16.70.187 # 無需再輸私鑰密碼 Last login: Mon Jun 21 15:58:10 2021 from 172.16.70.182 [root@Server-02 ~]# hostname -I 172.16.70.187
- 查詢ssh-agent PID 並結束程式
[root@wenCheng ~]# pgrep -l -f ssh-agent 16797 ssh-agent 16800 ssh-agent [root@wenCheng ~]# ps -ef | grep ssh-agent root 16797 1 0 16:13 ? 00:00:00 ssh-agent root 16800 1 0 16:13 ? 00:00:00 ssh-agent [root@wenCheng ~]# ssh-agent -k [root@wenCheng ~]# pkill ssh-agent
- SSH 別名設定,此方法配合ssh 免密碼登入 金鑰登入可以快速登入伺服器。
[root@wenCheng ~]# cat .ssh/config Host Server-01 HostName 172.16.70.186 User root Port 22 IdentityFile ~/.ssh/wencheng_rsa Host Server-02 Hostname 172.16.70.187 User root Port 22 IdentityFile ~/.ssh/wencheng_rsa 解析: Host:別名 HostName:指定登入的主機名或IP地址 Port:指定登入的埠號 User:登入使用者名稱 IdentityFile:登入的私鑰檔案 [root@wenCheng ~]# eval `ssh-agent` Agent pid 18137 [root@wenCheng ~]# ssh-add .ssh/wencheng_rsa Enter passphrase for .ssh/wencheng_rsa: # 前面已設定的密碼 123456 Identity added: .ssh/wencheng_rsa (.ssh/wencheng_rsa) [root@wenCheng ~]# ssh-add -l 4096 SHA256:m9Og2cC65AIfkT6/jXa/L09BUzBsyOV4V9t0XEmNK/0 .ssh/wencheng_rsa (RSA) # 使用別名遠端登入172.16.70.186,172.16.70.187 也已無需反覆輸入key密碼 [root@wenCheng ~]# ssh Server-01 Last login: Tue Jun 22 16:14:04 2021 from 172.16.70.182 [root@Server-01 ~]# hostname -I 172.16.70.186 [root@Server-01 ~]# logout Connection to 172.16.70.186 closed. [root@wenCheng ~]# ssh Server-02 Last login: Tue Jun 22 16:13:51 2021 from 172.16.70.182 [root@Server-02 ~]# hostname -I 172.16.70.187
附:ssh排查問題
1.判斷物理鏈路是否通ping 本身是icmp協議 2.判斷服務是否正常 telnet 172.16.70.186 3.Linux防火牆 systemctl status firewalld 4.開啟ssh的調測進行觀察 ssh -vvv Wen@172.16.70.186