- Published on
設定 SSH Login 不用輸入密碼
- Authors
- Name
- ChienYu
Table of Contents
Ref
- Host 檔: https://zh.wikipedia.org/zh-tw/Hosts%E6%96%87%E4%BB%B6
- SSH: https://zh.wikipedia.org/zh-tw/Secure_Shell
- Github SSH Key Generate: https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
- SSH 加密演算介紹: https://medium.com/@honglong/%E9%81%B8%E6%93%87-ssh-key-%E7%9A%84%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95-70ca45c94d8e
Overview
在開始之前, 可以先簡單了解一下 SSH 與 Host 檔, 這是開始 SSH 通訊的第一步.
SSH
SSH 是 Secure Shell Protocol 的簡稱, 是一種安全的通訊協定, 以 非對稱加密 實現身分驗證. 故需要有 東西 來作加密, 而這東西中文通常是翻譯為金鑰 (Key), 以下我會用 Key 來統稱.
Key 會有兩把, PUBLIC (公鑰) 與 PRIVATE (私鑰) Keys. 兩把都能用來作加解密. 加密的概念簡單來說就是用這兩把 Key 把 SSH 通訊內容東西編碼過. 編碼方式就是透過一系列的數學理論與模型讓內容不是以 明碼 的方式暴露在通訊過程中.
Host 檔
Hosts 檔案是大多數系統都存在的一個小型主機表. Hosts 檔案中包含了本地網路重要的主機名和位址資訊, 查詢 Hosts 檔案得到的結果比通過查詢 DNS 得到的結果優先級更高.
-- Wikipedia
SSH Agent 工具
理論上現在系統內都應該有 ssh-agent 這個程序. 這個程序主要是用來產生與管理 SSH Key. 用下列指令簡單驗證程序有正常服務.
ssh-agent
STDOUT 有輸出, 看起來應是正常的.
SSH_AUTH_SOCK=/var/.../agent.85033; export SSH_AUTH_SOCK;
SSH_AGENT_PID=85034; export SSH_AGENT_PID;
echo Agent pid 85034;
開始設定
這邊紀錄主要是為了自己在公司內網做一些服務設定與操作而寫的, 平時就需要在不同的機器間跳來跳去. 相關設定簡單記錄如下.
編寫 Host 檔
假設你需要跳到某台主機內, 首先你會知道主機 IP, 內網的話通常是 192.168.x.x 開頭, 然後會知道這台機器大概要做什麼, 我會簡單給個 alias, 編寫 host 如下.
# jenkins 服務器
192.168.10.10 jenkins
# wordpress 服務器
192.168.10.20 wordpress
產生金鑰
產生 SSH Keys 的方式有很多種, Key 的類型也有很多種, 這邊就簡單用 Github 的產生方式做說明.
ssh-keygen -t ed25519 -C "your_email@example.com"
-t用於指定一個 identity, 而這個 identity 是採用 ed25519 這種加密演算, ed25519 是橢圓曲線算法的名字, 如果沒有什麼舊系統的包袱, 建議採用這種算法, 在效能與安全上有一定程度, 或是考慮 RSA. 算法安全與效能就不多做介紹了.
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
-C用於註解這(組) Keys 的用途, 而 Github 則是建議用 email 來註解, 可能是能代表你的身份吧.
接下來會有一連串的引導
# 產生 public/private ed25519 SSH Key
Generating public/private ed25519 key pair.
# Key 的存放位置, 如果沒特殊需求用預設就好
Enter file in which to save the key (/Users/USER_NAME/.ssh/id_ed25519):
# 密碼設定, 如果設定了, 每次使用這 Keys 都要輸入密碼
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
# 產生 Key 了
Your identification has been saved in /Users/USER_NAME/.ssh/id_ed25519
# 這是公鑰, 可以上傳到 Github 或是其他 Server 上
Your public key has been saved in /Users/USER_NAME/.ssh/id_ed25519.pub
上傳 SSH Public Key
最後的步驟就是把公鑰上傳到要 SSH 登入的主機上.
ssh-copy-id username@jenkins
因為上面設定了 Host 檔, 所以你的電腦自然就認識 Jenkins 代表 192.168.10.10 了. 它就會把 public key 上傳上去.
如果有改了預設的 SSH Key 路徑, 可以多加參數 -i 來指定路徑.
ssh-copy-id -i your_key_path username@jenkins