SSH免密登入詳解

一紙微言發表於2020-06-21

SSH免密登入詳解

SSH(Security Shell)安全外殼協議,是較為可靠的,專為遠端登入會話和其他網路服務提供安全保證的協議。

​ 對於傳統的網路服務程式(例如,FTP,Telnet等)來說,其本質上並不是安全的,主要原因在於,這些網路應用程式在網路上都是直接使用明文傳輸口令和資料的,對於別有用心的人來說,這些口令和資料是很容易被截獲的。另外,這些網路服務程式的安全驗證方式也是存在弱點的,非常容易受到中間人(Man-In-The-Middle)這種方式的攻擊,簡而言之,就是中間人冒充真正的伺服器接收你傳輸的資料,然後,再將資料轉發給真正的伺服器,通過這種方式中間人就可以神不知鬼不覺地拿到你所有資料。

​ 通過使用SSH,則可以將所有傳輸的資料及口令進行加密,從而防止中間人攻擊,還可以防止DNS和IP欺騙,另外,使用SSH還有加快傳輸速度的好處,原因在於,SSH是可以對資料進行壓縮的。

SSH安裝詳解

SSH是安全外殼協議,而open-ssh則是SSH的開源實現,CentOS通常是預設安裝了open-ssh的。

整個SSH服務是包含SSH服務端(openssh-server)和SSH客戶端(openssh-clients)的,常用的ssh命令就是客戶端一部分。

SSH服務端與SSH客戶端之間的關係:節點A想要控制節點B,則節點A上需要安裝SSH客戶端,而節點B上需要安裝相應的SSH服務端,這樣,節點A才能向節點B傳送控制命令和資料。

# 安裝openssh-server
[root@cos1 ~]# yum install -y openssh-server
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.ustc.edu.cn
 * extras: mirrors.ustc.edu.cn
 * updates: mirrors.ustc.edu.cn
Package openssh-server-7.4p1-21.el7.x86_64 already installed and latest version
# 啟動openssh-server
[root@cos1 ~]# systemctl start sshd.service
# 安裝openssh-clients
[root@cos1 ~]# yum install -y openssh-clients
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.ustc.edu.cn
 * extras: mirrors.ustc.edu.cn
 * updates: mirrors.ustc.edu.cn
Package openssh-clients-7.4p1-21.el7.x86_64 already installed and latest version

openssh服務的主配置檔案路徑:/etc/ssh/sshd_config

# SSH-Server常見的配置項
# 如果SSH連線提示埠不可用,可以在改檔案中檢視SSH埠,埠沒問題,就要考慮SSH服務是否正常啟動了
# SSH客戶端與服務端連線的預設埠號
Port 22

預設情況下,SSH服務提供了以下兩個非常有用的功能:

1、類似Telnet遠端連線伺服器功能,即SSH服務(安全可靠的遠端登入會話服務)

# 遠端連線服務
ssh user@hostname/ip

2、類似FTP的sftp-server服務,藉助SSH協議來傳輸資料,提供更安全的SFTP服務(vsftp, proftp).

# 檔案拷貝服務
scp files user@hostname:/path/

SSH免密登入配置

​ 對於分散式環境元件(例如,Hadoop,HBase等)來說,元件的主/從節點通常需要遠端登入到叢集中其他節點並執行Shell命令,如果不使用SSH,則叢集安全就無法保證,使用SSH服務的話,又需要使用者輸入目標伺服器的免密,而主/從節點何時訪問其他節點是不可控的,而且,頻繁的需要使用者輸入密碼也是不可行的,這時候,免密登入就非常重要的。

主機A通過SSH實現免密登入主機B所需的配置過程大致可以分為以下兩步:

1、主機A在本地通過加密演算法生成公鑰和私鑰

通過rsa演算法生成公鑰和私鑰key對,預設情況下,身份驗證資訊(也就是私鑰)儲存在/user/.ssh/id_rsa檔案下,而公鑰資訊則儲存在/user/.ssh/id_rsa.pub檔案中。

[root@cos1 .ssh]# pwd
/root/.ssh
[root@cos1 .ssh]# ll
total 8
-rw-------. 1 root root 1679 Jun 22 00:04 id_rsa
-rw-r--r--. 1 root root  391 Jun 22 00:04 id_rsa.pub

2、將主機A的公鑰拷貝到主機B的授權檔案(authorized_keys)中

# 通過ssh-copy-id命令將本地伺服器公鑰上傳到指定伺服器
[root@cos1 ~]# ssh-copy-id root@cos
... ... ... ... ... ... 
Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@cos'"
and check to make sure that only the key(s) you wanted were added.
# 現在,可以通過ssh root@cos訪問主機cos了
[root@cos1 ~]# ssh root@cos
Last login: Thu Jun 18 06:38:25 2020 from 192.168.58.1
[root@cos ~]# 

為了安全起見,通常將儲存具體哪些主機可以免密訪問當前主機的授權檔案authorized_keys檔案設定為及root具有檢視和修改的許可權,使用者組及其他人無權訪問。

通過ssh-copy-id將主機A的公鑰拷貝到主機B之後,本質上,是在主機B的授權檔案中新增了主機A的公鑰。

[root@cos .ssh]# ll
total 8
-rw-------. 1 root root 781 Jun 22 00:16 authorized_keys
-rw-r--r--. 1 root root 176 Jun 18 07:34 known_hosts

注意:

1、免密登入,是使用者對使用者的,切換為其他使用者時,仍需要輸入密碼

2、免密登入是單向的,也就是說,主機A將公鑰拷貝到主機B後,主機A可以免密登入主機A,而主機B登入主機A時仍然需要輸入密碼

圖解SSH免密登入原理

通過上面一頓操作,主機A就可以免密登入到主機A了,感覺有點神奇,那麼,免密登入到底是怎麼實現的呢?也就是說,SSH協議又到底是什麼樣子呢?且看下圖分解~

上圖便是整個SSH免密登入的配置及原理圖:

1、ServerA生成公鑰並上傳到ServerB上

2、Step 1: ServerA傳送連結請求到ServerB

3、Step 2: ServerB在authorized_key中檢索ServerA的公鑰,隨機生成字串,隨後利用公鑰對字串進行加密,併傳送給ServerA

4、Step 3: ServerA接收到密文後,利用私鑰進行解密,並將內容以明文的形式傳送給ServerB

相關文章