Published on

設定 SSH Login 不用輸入密碼

Authors
  • avatar
    Name
    ChienYu
    Twitter
Table of Contents

Ref

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