在應用中我們經常會登陸其他的主機,每次都需要輸入用戶名和密碼。另外在hadoop的使用中也會使用ssh命令去連接其它的主機。我們可以設置SSH免密碼登陸來實現其他主機登錄該主機是不用輸入密碼。 現在我們有兩台測試的linux的虛擬機,我們稱之為主機1和主機2。ip分別為192.168.1.101和1 ...
在應用中我們經常會登陸其他的主機,每次都需要輸入用戶名和密碼。另外在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@tiny01 ~]$ ssh-keygen -t rsa
我們可以查看一下當前用戶主目錄下的.ssh文件夾
[grid@tiny01 ~]$ cd ~/.ssh
[grid@tiny01 .ssh]$ pwd
/home/grid/.ssh
[grid@tiny01 .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@tiny01 ~]$ 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
[email protected]'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加密只是他防止認證過程中認證信息被監聽的一種手段,也不是他的目的。
因此雖然可能有許多種免密碼的方式,但是我們只要找出來一種最為安全、高效的就可以了。沒有必要糾結於為什麼不怎麼怎麼做。
5.參考資料
SSH協議交互過程
需要註意的問題:
1. 關於自己主機登陸自己的主機也需要密碼?
我們可以測試一下這個問題:
[root@tiny1 ~]# 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@tiny1 ~]# 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.
[email protected]'s password:
Last login: Tue Mar 7 12:09:45 2017 from 192.168.132.59
所以在我們設置免密碼登陸的時候我們也需要對自己的主機進行設置
2. root用戶之間為什麼設置卻不可以
root用戶預設設置是不可以使用ssh免密碼登陸的,但是可以修改相關配置,使其能夠使用ssh免密碼登陸,但是在此不做介紹