2021-05-12 14:32:11
Linux基礎教學:設定SSH免密碼登陸
在應用中我們經常會登陸其他的主機,每次都需要輸入使用者名稱和密碼。另外在Hadoop的使用中也會使用ssh命令去連線其它的主機。我們可以設定SSH免密碼登陸來實現其他主機登入該主機是不用輸入密碼。
現在我們有兩台測試的Linux的虛擬機器,我們稱之為主機1和主機2。ip分別為192.168.1.101和192.168.1.102,我們這次的目的是用主機主機1的grid使用者無密碼連線主機2的grid使用者
1. 在主機1生成金鑰
先解釋一下,三個提示資訊
- Enter file in which to save the key (/home/admin/.ssh/id_rsa)檔案儲存的位置,預設為當前"使用者身份"的主資料夾下的.ssh資料夾下的id_rsa
- Enter passphrase (empty for no passphrase) 輸入連線密碼,預設為空
- Enter same passphrase again 再次輸入密碼,預設為空
我們在主機1中建立一個金鑰,由於所有設定都是用的預設的,因此直接三個迴車
[grid@linuxidc ~]$ ssh-keygen -t rsa
我們可以檢視一下當前使用者主目錄下的.ssh資料夾
[grid@linuxidc ~]$ cd ~/.ssh
[grid@linuxidc .ssh]$ pwd
/home/grid/.ssh
[grid@linuxidc .ssh]$ ll
total 12
-rw-------. 1 grid grid 1675 Jul 22 13:38 id_rsa
-rw-r--r--. 1 grid grid 393 Jul 22 13:38 id_rsa.pub
-rw-r--r--. 1 grid grid 402 Jul 22 12:35 known_hosts
可以發現下面有兩個檔案:id_rsa
和id_rsa.pub
其中id_rsa.pub是公鑰,id_pub是私鑰
2. 將主機1公鑰分發到主機2下
我們可以直接使用ssh-copy-id 主機名
命令將公鑰拷貝到對方的主機下,例如:
[grid@linuxidc ~]$ ssh-copy-id tiny02
grid@tiny02's password:
Now try logging into the machine, with "ssh 'tiny02'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
實際上ssh-copy-id 命令就是將當前主機id_rsa.pub中的內容,追加到目標主機上的~/.ssh/authorized_keys
檔案上,如果該檔案不存在,則建立
3. 登入到主機2
我們現在就可以登入主機2了
login as: admin
admin@192.168.132.115's password:
Last login: Tue Mar 7 05:10:19 2017 from 192.168.132.59
[admin@tiny ~]$ ssh 192.168.132.114
Last login: Tue Mar 7 05:13:28 2017 from 192.168.132.115
[admin@tiny ~]$
測試成功
4.關於SSH連線中流程問題(以下內容純屬於一本正經的胡說八道)
前面說到SSH是將公鑰發給別的主機,然後別的主機用公鑰加密,然後傳送回來的嗎?所以不應該是將公鑰傳送給其他主機上,然後其他主機來連線這台主機嗎?為什麼在這裡變為了講公鑰傳送給其他主機,然後去連線其它主機,不應該是被連線嗎?其實我也不知道,看了SSH協定互動過程這篇部落格,我做出了一下猜測:
當我們沒有設定SSH免密碼的時候,我們需要輸入密碼才能進行遠端連線。所以他的連線過程可能是這樣子:
- 用戶端向伺服器發出了連線請求
- 伺服器向用戶端發出了公鑰
- 用戶端將使用者名稱、密碼、自己的公鑰等資訊通過伺服器提供的公鑰加密傳送回了伺服器
- 伺服器對認證資訊進行比對,認證正確後通過認證
- 伺服器向用戶端返回認證通過的響應,並且此後由於雙方都有對方的公鑰因此所有的通訊都進行加密傳輸。
- 用戶端將要執行的命令加密後傳給伺服器
- 伺服器解密並應執行命令
- 伺服器將執行的命令的結果返回給用戶端
而免密碼登陸的時候連線過程呢?由於此時伺服器已經有了用戶端的公鑰,可能是這樣子的
- 用戶端向伺服器發出了連線請求
- 伺服器向用戶端發出了公鑰
- 用戶端將publickey認證所需的資訊傳送給了伺服器
- 伺服器對認證資訊進行比對,認證正確後通過認證
- 伺服器向用戶端返回認證通過的響應,並且此後由於雙方都有對方的公鑰因此所有的通訊都進行加密傳輸。
- 用戶端將要執行的命令加密後傳給伺服器
- 伺服器解密並應執行命令
- 伺服器將執行的命令的結果返回給用戶端
發現其實二者是一樣的只不過就是認證方式不同,一個是password認證,一個是publickey認證,而當伺服器將用戶端的公鑰配到authorized_keys就表示已經同意了對方的免密碼連線。需要注意一個問題,password認證所用的金鑰和publickey認證所用的金鑰是不同的。password認證所用的金鑰在/etc/ssh
下,而publickey認證所用的金鑰在~/.ssh
下,因此publickey認證所用的公鑰在傳輸過程中是加密的。
而我們換一種情況考慮,就是假設是公鑰給誰就是允許誰免密碼連線的情況,會有以下幾個問題:
- 如果公鑰是誰獲得誰就可以免密碼連線。那麼由於公鑰是公開的,因此伺服器相當於誰都可以登入的。
- 那麼我們加一個認證啊,因為password認證不能用,而publickey認證也不能用,因此我們需要建立一個認證方式,例如:我們在用戶端請求免密碼的時候,設定一個隨機的字串,傳送給用戶端,然後用戶端通過這串字串當做認證條件呢。恩,可以。如果這樣子,我們都不許設定免密碼了,直接寫一個指令碼,把伺服器對應使用者名稱和密碼放進去就好了,也能實現這個效果。
其實我們只要區分免密碼和SSH加密不同就可以了:
- SSH加密本質是保持通訊過程的安全,他主要目的在通訊安全上,至於你們通訊過程,例如是否認證,伺服器是否允許用戶端的存取不是他需要關心的問題。
- 免密碼目的是免除認證,SSH加密只是他防止認證過程中認證資訊被監聽的一種手段,也不是他的目的。
因此雖然可能有許多種免密碼的方式,但是我們只要找出來一種最為安全、高效的就可以了。沒有必要糾結於為什麼不怎麼怎麼做。
需要注意的問題:
1. 關於自己主機登陸自己的主機也需要密碼?
我們可以測試一下這個問題:
[root@linuxidc ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:49:E9:9D
inet addr:192.168.132.113 Bcast:192.168.132.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe49:e99d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2648 errors:0 dropped:0 overruns:0 frame:0
TX packets:1725 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:250583 (244.7 KiB) TX bytes:187492 (183.0 KiB)
Interrupt:19 Base address:0x2024
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:10 errors:0 dropped:0 overruns:0 frame:0
TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:840 (840.0 b) TX bytes:840 (840.0 b)
[root@linuxidc ~]# ssh 192.168.132.113
The authenticity of host '192.168.132.113 (192.168.132.113)' can't be established.
RSA key fingerprint is 67:91:3a:e4:97:af:9d:01:37:5f:4a:ed:14:dc:04:46.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.132.113' (RSA) to the list of known hosts.
root@192.168.132.113's password:
Last login: Tue Mar 7 12:09:45 2017 from 192.168.132.59
所以在我們設定免密碼登陸的時候我們也需要對自己的主機進行設定
2. root使用者之間為什麼設定卻不可以
root使用者預設設定是不可以使用ssh免密碼登陸的,但是可以修改相關設定,使其能夠使用ssh免密碼登陸,但是在此不做介紹。
下面關於SSH相關的文章您也可能喜歡,不妨參考下:
Ubuntu 下設定 SSH服務全過程及問題解決 http://www.linuxidc.com/Linux/2011-09/42775.htm
Ubuntu 14.04 下安裝Samba 及SSH 伺服器端的方法 http://www.linuxidc.com/Linux/2015-01/111971.htm
叢集環境SSH免密碼登入設定 http://www.linuxidc.com/Linux/2017-03/141296.htm
提高Ubuntu的SSH登陸認證速度的辦法 http://www.linuxidc.com/Linux/2014-09/106810.htm
遠端SSH連線服務與基本排錯 http://www.linuxidc.com/Linux/2017-05/143738.htm
使用SSH公鑰金鑰自動登陸Linux伺服器 http://www.linuxidc.com/Linux/2017-02/140642.htm
開啟SSH服務讓Android手機遠端存取 Ubuntu 14.04 http://www.linuxidc.com/Linux/2014-09/106809.htm
SSH非互動式密碼授權遠端執行指令碼 http://www.linuxidc.com/Linux/2017-04/143180.htm
SSH通過金鑰登陸 http://www.linuxidc.com/Linux/2017-06/144997.htm
Linux上實現SSH免密碼登陸遠端伺服器 http://www.linuxidc.com/Linux/2017-05/144165.htm
本文永久更新連結地址:http://www.linuxidc.com/Linux/2017-07/145847.htm
相關文章