ssh 免登入配置
阿新 • • 發佈:2021-03-25
## 引子
近日海淘了一個 mini-PC:Gigabyte [GB-BSRE-1605](https://www.gigabyte.com/us/Mini-PcBarebone/GB-BSRE-1605-rev-10),此裝置雖採用 amd 嵌入式低功耗處理器,效能相比現在自己所用的裝置卻有不小提升,加上先前升級電腦多餘一些 ssd 和 ram,於是組了一個個人伺服器,裝上最新的 ubuntu 20.04 server 後,打算以後作為遠端開發的基礎主機。現記錄一些開發環境配置過程,供參考。
裝置無需連線顯示器及鍵盤滑鼠等輸入裝置,第一步,開啟遠端 ssh 登入。
## 原理
從客戶端來看,ssh 提供兩種級別的安全驗證:
1. 基於口令的驗證:只要知道帳號和口令,就可以登入到遠端主機。所有傳輸的資料都會被加密,但缺點是:不能保證你正在連線的伺服器就是你想連線的伺服器。以下是登入驗證流程:
![](https://img2020.cnblogs.com/blog/1989435/202103/1989435-20210325170851411-1665592607.png)
當第一次連結遠端主機時,會提示你當前主機的”公鑰指紋”,詢問你是否繼續,如果選擇繼續後就可以輸入密碼進行登入了,當遠端的主機接受以後,該臺伺服器的公鑰就會儲存到~/.ssh/known_hosts檔案中。
2. 基於金鑰的驗證:這種驗證的前提是客戶端需要生成一對金鑰,將公鑰放到需訪問的遠端伺服器。這種驗證比上一種的好處是,不能仿冒真正的伺服器,因為要仿冒必須拿到客戶端生成的公鑰。缺點就是驗證等待過程稍長些。
![](https://img2020.cnblogs.com/blog/1989435/202103/1989435-20210325170751927-2076994131.png)
## 條件
ssh 免登入實現的原理為 ssh 的公鑰與私鑰配對,此時無需輸入登入密碼進行認證。假設要從電腦 a 通過 ssh 免密碼登入伺服器 b,前提條件為:
1. 伺服器 b 需要執行 ssh 服務端程式,並且最好是作為開機自啟動服務
![](https://img2020.cnblogs.com/blog/1989435/202103/1989435-20210325160451277-667271564.png)
2. 電腦 a 可以執行 ssh 客戶端程式,電腦 a 生成了 ssh 的公鑰和私鑰
![](https://img2020.cnblogs.com/blog/1989435/202103/1989435-20210325161151172-1767340258.png)
3. 伺服器 b 欲登入使用者儲存了電腦 a 的公鑰
![](https://img2020.cnblogs.com/blog/1989435/202103/1989435-20210325160908824-177695990.png)
## 步驟
下面分別說明如何實現上面的條件,以及一些注意事項。
1. 如果伺服器為 linux 或者 mac,一般都會自帶 ssh 服務端,以 ubuntu 20.04 server 系統為例:
![](https://img2020.cnblogs.com/blog/1989435/202103/1989435-20210325161759168-30198006.png)
![](https://img2020.cnblogs.com/blog/1989435/202103/1989435-20210325161822265-485119441.png)
並且預設開機啟動
![](https://img2020.cnblogs.com/blog/1989435/202103/1989435-20210325164343838-1427687236.png)
如果電腦沒有安裝 ssh 服務端程式,則需要自行手動安裝,以 ubuntu 系統為例,通過命令 sudo apt install ssh 即可安裝 ssh 服務端,客戶端及相關工具。
![](https://img2020.cnblogs.com/blog/1989435/202103/1989435-20210325184149141-1682577635.png)
2. 電腦如果為 linux 或者 Mac,一般也會自帶 ssh 客戶端,如果是 windows,可能要單獨安裝。ssh 公鑰和私鑰需要通過 ssh-keygen 工具生成,生成 ssh 公私鑰的命令一般為 ssh-keygen -t rsa,也可以從其他地方拷貝後放到對應的目錄,一般為 ~/.ssh 目錄下。
3. 通過 ssh-copy-id 工具將電腦 a 生成的 ssh 公鑰傳輸到伺服器 b,命令格式一般為 ssh-copy-id -i ~/.ssh/id_rsa.pub UserName@RemoteServer,其中 UserName 為伺服器 b 的使用者名稱,RemoteServer 為伺服器 b 的 ip 或者域名。操作成功後,會將電腦 a 的 ssh 公鑰追加到伺服器 b 的使用者 UserName 使用者目錄的 .ssh/authorized_keys 檔案中
4. 完成以上操作後,就可以在電腦 a 上通過 ssh 命令免密碼登入伺服器 b 了,命令格式一般為 ssh UserName@RemoteServer,也可以直接簡寫為 ssh RemoteServer
![](https://img2020.cnblogs.com/blog/1989435/202103/1989435-20210325171209678-1559234087.png)
## 其他說明
ssh 免密登陸除了極少數情況下需要自己安裝 sshd 服務端程式並配置 [ssh_config](https://www.ssh.com/ssh/sshd_config/) 以外,經常遇到的問題其實是許可權問題。
許可權問題:
1. 傳輸 ssh 公鑰如果遇到一些許可權報錯,需要將個人主目錄下 .ssh 目錄及其目錄下的檔案設定為相應的許可權:遠端機器的 .ssh 目錄需要 700 許可權,authorized_keys 檔案需要 600 許可權
![](https://img2020.cnblogs.com/blog/1989435/202103/1989435-20210325172054761-201494497.png)
2. 要正常進行 ssh 免密碼登入,客戶端機器下 .ssh 目錄及其目錄下的檔案許可權為:.ssh 目錄需要 700 許可權,id_rsa 檔案需要 600 許可權,其他檔案為 644 許可權
![](https://img2020.cnblogs.com/blog/1989435/202103/1989435-20210325172202319-443241417.png)
最後,ssh 免密登入如果需要管理的 ssh 目標主機太多,並且 ip 不是很好記憶,或者有多套 ssh 公私鑰,可以通過 ssh [config](https://www.ssh.com/ssh/config/) 實現通過別名快速登陸,通過 config 還可以實現流量轉發等高階功能,實現遠端服務本地呼叫,後面再詳述。
參考資料:
1. https://superuser.com/questions/215504/permissions-on-private-key-in-ssh-folder
2. https://gist.github.com/grenade/6318301
3. https://www.shellhacks.com/ssh-login-without-password/
4. https://www.linux.com/training-tutorials/ssh-scp-without-password-remote-host-look-ma-no-password/
5. https://www.jianshu.com/p/0f9b72d691c2
6. https://deepzz.com/post/how-to-setup-ssh-con