SSH免密登錄原理及實現

1、SSH簡介

產生場景

對於須要遠程管理其它機器,通常使用遠程桌面或者telnet。linux通常只能是telnet。可是telnet的缺點是通訊不加密,存在不安全因素,只適合內網訪問。爲解決這個問題,推出了通訊加密通訊協議,即SSH(Secure Shell)。使用非對稱加密方式,傳輸內容使用rsa或者dsa加密,能夠避免網絡竊聽。linux

算法分類

SSH(Secure Shell)是一種通訊加密協議,加密算法包括:RSA、DSA等。算法

  • RSA:非對稱加密算法,其安全性基於極其困難的大整數的分解(兩個素數的乘積);
  • DSA:也是非對稱加密算法,其安全性基於整數有限域離散對數難題;

原理與安全性

RSA 與 DSA 都是非對稱加密算法。其中RSA的安全性是基於極其困難的大整數的分解(兩個素數的乘積);DSA 的安全性是基於整數有限域離散對數難題。基本上能夠認爲相同密鑰長度的 RSA 算法與 DSA 算法安全性至關。

有點要注意,RSA 的安全性依賴於大數分解,可是否等同於大數分解一直未能獲得理論上的證實,由於沒有證實破解 RSA 就必定須要做大數分解。不過也沒必要太過擔憂,RSA 從誕生以來,經歷了各類攻擊,至今未被徹底攻破(依靠暴力破解,小於1024位密鑰長度的 RSA 有被攻破的記錄,但未從算法上被攻破)

用途:

DSA 只能用於數字簽名,而沒法用於加密(某些擴展能夠支持加密);RSA 便可做爲數字簽名,也能夠做爲加密算法。不過做爲加密使用的 RSA 有着隨密鑰長度增長,性能急劇降低的問題。

性能:

相同密鑰長度下,DSA 作簽名時速度更快,但作簽名驗證時速度較慢,通常狀況驗證簽名的次數多於簽名的次數。

相同密鑰長度下,DSA (在擴展支持下)解密密文更快,而加密更慢;RSA 正好反過來,通常來講解密次數多於加密次數。不過因爲非對稱加密算法的先天性能問題,二者都不是加密的好選擇。

2、SSH免密登錄原理

圖解,server A免登陸到server B: 1.在A上生成公鑰私鑰。安全

2.將公鑰拷貝給server B,要重命名成authorized_keys(從英文名就知道含義了)服務器

3.Server A向Server B發送一個鏈接請求。網絡

4.Server B獲得Server A的信息後,在authorized_key中查找,若是有相應的用戶名和IP,則隨機生成一個字符串,並用Server A的公鑰加密,發送給Server A。less

5.Server A獲得Server B發來的消息後,使用私鑰進行解密,而後將解密後的字符串發送給Server B。Server B進行和生成的對比,若是一致,則容許免登陸。ssh

總之:A要免密碼登陸到B,B首先要擁有A的公鑰,而後B要作一次加密驗證。對於非對稱加密,公鑰加密的密文不能公鑰解開,只能私鑰解開。oop

3、主機間創建信任關係,免密碼登陸

配置ssh免密碼登陸(三個節點master、slave一、slave2)性能

1. 主節點配置:

生成密鑰測試

master機器的宿主目錄下執行命令生成密鑰

ssh-keygen -t rsa

或

ssh-keygen -t rsa -P ''

-P表示密碼,-P '' 就表示空密碼,也能夠不用-P參數,這樣就要三車回車,用-P就一次回車

(使用rsa加密方式生成密鑰)回車後,會提示三次輸入信息,咱們直接回車便可。

將會在家目錄下的隱藏目錄/.ssh下生成文件:

id_rsa.pub         //公鑰
id_rsa             //密鑰

追加公鑰

在master機器上,將id_rsa.pub的內容寫入authorized_keys文件中

cat id_rsa.pub >> authorized_keys

2. 從節點配置:

生成密鑰

以 master 一樣的方式, slave1, slav2 生產密鑰。

3. 將次節點的公鑰發送到主節點

在slave1機器上,將id_rsa.pub複製到master機器的/.ssh目錄下,並從新命名位 id_rsa.pub.slave1:

scp id_rsa.pub hadoop@master:/home/hadoop/.ssh/id_rsa.pub.slave1

複製文件的時候,因爲尚未免密碼登陸的,因此要輸入密碼

在slave2機器上,將id_rsa.pub複製到master機器的/.ssh目錄下,並從新命名位id_rsa.pub.slave2 :

scp id_rsa.pub hadoop@master:/home/hadoop/.ssh/id_rsa.pub.slave2

複製文件的時候,因爲尚未免密碼登陸的,因此要輸入密碼

四、追加次節點服務器的公鑰至 authorized_keys 文件中

在master機器上,在/.ssh目錄下將看到從slave一、slave2發送過來的文件:

id_rsa.pub.slave1
id_rsa.pub.slave2

將這兩個公鑰內容追加寫入到master機器/.ssh目錄下的authorized_keys中:

五、確認公鑰內容

在master機器上,查看authorized_keys文件內容,確認包含slave一、slave2機器的兩個公鑰內容:

cat authorized_keys

六、發送authorized_keys

master機器上,將authorized_keys發送到slave一、slave2機器的/.ssh目錄下:

scp authorized_keys hadoop@slave1:/home/hadoop/.ssh/
scp authorized_keys hadoop@slave2:/home/hadoop/.ssh/

複製文件的時候,因爲尚未免密碼登陸的,因此要輸入密碼

七、修改authorized_keys文件權限

分別在master、slave一、slave2機器上執行,對auhorized_keys進行權限修改,不然將沒法實現免密碼登陸:

chmod 600 authorized_keys

authorized_keys的權限要是600。文件和目錄的權限千萬別設置成chmod 777.這個權限太大了,不安全,數字簽名也不支持。

八、SSH登錄測試

在master機器上,從master機器經過ssh登陸到slave1,第一次須要密碼,退出後之後登陸就不須要密碼了,其餘機器相似操做:

//登錄slave1
ssh slave1

//登錄後退出
exit

//從新登錄
ssh slave1 便可直接登陸

9.失敗緣由,有多是如下緣由:

一、權限問題

.ssh目錄,以及/home/當前用戶 須要700權限,參考如下操做調整
sudo chmod 700 ~/.ssh
sudo chmod 700 /home/當前用戶
.ssh目錄下的authorized_keys文件須要600或644權限,參考如下操做調整
sudo chmod 600 ~/.ssh/authorized_keys

二、StrictModes問題

編輯
sudo vi /etc/ssh/sshd_config
找到
#StrictModes yes
改爲
StrictModes no 
若是還不行,能夠用ssh -vvv 目標機器ip 查看詳情,根據輸出內容具體問題具體分析了

ssh -v debug

總結:

  • authorized_keys:存放遠程免密登陸的公鑰,主要經過這個文件記錄多臺機器的公鑰
  • id_rsa : 生成的私鑰文件
  • id_rsa.pub : 生成的公鑰文件
  • know_hosts : 已知的主機公鑰清單

若是但願ssh公鑰生效需知足至少下面兩個條件:

  • .ssh目錄的權限必須是700
  • .ssh/authorized_keys文件權限必須是600

查看ssh的登陸日誌

less /var/log/secure
相關文章
相關標籤/搜索