Linux 下使用 SSH 免密登陸的不一樣姿式

1、背景概述

ssh 這個命令算做是學習 Linux 時最基礎的命令之一了。以前使用 ssh 時,都是經過用戶名 + 密碼的形式進行登陸的。以前寫 TransFile-Shell 小工具[[1]](https://gitee.com/lwx19960428...,曾經經過服務端配置客戶端公鑰的方式進行免密登陸,這兩天給朋友解決問題時,接觸到 Jenkins 執行遠程腳本的功能,涉及到了 SSH-Agent 作代理請求的功能,如今把幾種方式都做爲筆記寫下來。html

2、SSH 介紹

根據百度百科介紹:SSH 是創建在應用層基礎上的安全協議。SSH 是目前較可靠,專爲遠程登陸會話和其餘網絡服務提供安全性的協議。利用 SSH 協議能夠有效防止遠程管理過程當中的信息泄露問題[[2]](https://baike.baidu.com/item/...linux

從客戶端來看,SSH 有兩種形式的安全驗證方式:git

  • 基於口令(密碼)的驗證方式
  • 基於密鑰的驗證方式

口令驗證因沒法保證正在鏈接的服務器就是真正想要的服務器,因此可能存在服務端被冒充(中間人攻擊)的方式。而密鑰驗證則是依賴客戶端服務端之間的公私鑰加解密方式,故不存在中間人攻擊(中間人沒有任何一端的私鑰),但同時整個過程須要相對較長的時間。shell

具體的 ssh 相關資料可參照後續的參考連接進行了解。segmentfault

3、實驗環境

進行下述實驗步驟前,請確認服務器已開啓 SSH 服務,且相關端口的網絡策略已經開通。安全

角色 主機名 IP 地址 系統
客戶機 A local-vmware-01 192.168.36.129 CentOS 7.4
客戶機 B local-vmware-03 192.168.36.133 CentOS 7.4
服務機 local-vmware-02 192.168.36.132 Ubuntu 18.04 LTS

4、服務端配置公鑰信任來實現免密登陸

未配置公私鑰對時,客戶機 A 經過 SSH 登錄時,登錄提示須要密碼。bash

ssh dcos@192.168.36.132

img1

爲了免密,一路回車,生成 SSH 要用的公私鑰對,此步驟在客戶機 A 執行。根據提示,生成出來的公私鑰文件位於 ~/.ssh 目錄下,其中 id_rsa 爲私鑰,id_rsa.pub 爲公鑰。服務器

ssh-keygen -t rsa

img2

將客戶機 A 的公鑰內容複製出來,粘貼至服務機的 ~/.ssh/authorized_keys 文件中。網絡

# local-vmware-01 上執行
cat ~/.ssh/id_rsa.pub

# local-vmware-02 上執行
# 若是不存在 ~/.ssh 此目錄,則須要先行手動建立,建立完注意同時賦權 700
mkdir ~/.ssh && chmod 700 ~/.ssh
# 文件不存在,則 Vim 將自動建立該文件;如已存在,注意與以前記錄間增長換行
vi ~/.ssh/authorized_keys
# 同時,此文件須要賦權 600 權限,不容許其餘用戶修改
chmod 600 ~/.ssh/authorized_keys

再次經過 SSH 登陸,再也不須要密碼便可從新登陸,使用 scp 命令等也是同樣,再也不須要輸入密碼。至此,經過添加客戶機公鑰信任來實現免密登陸已經完成。ssh

img3

5、客戶端經過私鑰身份信息實現登陸

上述方式能夠很方便的經過公私鑰的配置進行 SSH 的免密登陸,但當咱們沒法拿到客戶機的公鑰時,就須要經過 ssh-agent 進行代理登陸。

什麼都不作配置,在客戶機 B 上經過 SSH 訪問,提示須要輸入密碼。

img4

由於客戶機 A 已配置好了公鑰信任,接下來咱們將在客戶機 B 上經過 ssh-agent 的形式來進行代理登陸。

將客戶機 A 的 id_rsa 私鑰文件上傳到客戶機 B 中,同時設置其權限爲 600,以上傳到家目錄爲例。

# local-vmware-03 上執行
chmod 600 ~/id_rsa

(一)經過 ssh-agent 形式進行代理登陸

經過以下命令啓動 ssh-agent 服務、增長身份密鑰、登陸認證等步驟,可不用密碼登錄服務機。

# 啓動ssh-agent服務
ssh-agent
# 啓動ssh-agent bash服務
ssh-agent bash --login -i
# 增長私鑰文件
ssh-add ~/id_rsa
# 從新SSH進行登陸,再也不須要輸入密碼
ssh dcos@192.168.36.132

img5

(二)經過 ssh -i 形式進行代理登陸

以前的 ssh 命令登陸至關因而增長了默認的 -i ~/.ssh/id_rsa 參數,當一臺 Linux 機器生成了多個 ssh 密鑰時,就須要經過 -i 參數的形式來指定使用哪一個私鑰文件參與到 ssh 鏈接的過程。同理,這種形式則是至關於自定義了 id_rsa 文件的位置,並未有太大的亮點。

# local-vmware-03 上執行
ssh -i ~/id_rsa dcos@192.168.36.132

img6

6、踩坑記錄

在 Jenkins 中配置 ssh-agent 時,每一步都配置的沒有問題,直接在 Jenkins 服務器上用 ssh-agent 工具也能夠登陸,可是每次構建時都提示 Host key verification failed. 的報錯。

通過分析,得出結論,是因爲第一次登陸時須要輸入 yes / no 致使的認證失敗。要想解決此問題,可經過在鏈接命令上增長 -o "StrictHostKeyChecking no" 來解決此問題[[3]](https://blog.csdn.net/ITzhang...

ssh -o "StrictHostKeyChecking no" dcos@192.168.36.132

img7

7、總結

經過上述幾種免密登陸方式的配置,咱們能夠 Get 到如下幾個知識點:

  • SSH 認證與身份文件牢牢相關,不一樣的服務器使用同一份私鑰文件是能夠的。
  • 私鑰文件極其重要,必定要保管好本身的私鑰文件。
  • 遇到坑的時候,多查一些資料,以及相關的 Linux man 文檔,總會爬出來的。

8、參考資料

[1] https://gitee.com/lwx19960428...

[2] https://baike.baidu.com/item/...

[3] https://blog.csdn.net/ITzhang...

[4] https://wangchujiang.com/linu...

相關文章
相關標籤/搜索