SSH

部分內容由 LLM 生成,尚未經過人工驗證。

SSH(Secure Shell)是遠端連線的加密協定,預設使用 Port 22

完整連線流程

  sequenceDiagram
    participant C as Client
    participant S as Server

    Note over C,S: 事前設定(一次性)

    Note over C: ssh-keygen 產生金鑰對<br/>id_ed25519(私鑰,留本機)<br/>id_ed25519.pub(公鑰)

    C->>S: ssh-copy-id / 手動複製 id_ed25519.pub
    Note over S: 將公鑰附加至<br/>~/.ssh/authorized_keys

    Note over C,S: TCP 連線建立

    C->>S: TCP SYN (Port 22)
    S->>C: TCP SYN-ACK + SSH banner(版本號)

    Note over C,S: Host Key 驗證(防中間人攻擊)

    S->>C: 伺服器 Host Public Key 指紋
    alt 第一次連線
        Note over C: 詢問使用者是否信任此指紋<br/>(yes → 存入 known_hosts)
    else 已知伺服器
        Note over C: 比對 ~/.ssh/known_hosts<br/>吻合則繼續,不符則警告中斷
    end

    Note over C,S: 金鑰交換(KEX)

    C->>S: 支援的 KEX 演算法清單(ECDH / DH)
    S->>C: 選定演算法 + 伺服器公鑰
    Note over C,S: ECDH 交換,雙方各自計算<br/>相同的 Session Key(AES-256 等對稱加密)
    Note over C,S: 之後所有通訊皆以 Session Key 加密

    Note over C,S: 使用者身份驗證

    C->>S: 請求以公私鑰驗證(傳送公鑰 fingerprint)
    S->>C: 查詢 authorized_keys,公鑰存在則發送 Challenge(隨機 nonce)
    Note over C: 以私鑰對 Challenge 簽名
    C->>S: 簽名結果
    Note over S: 以已存公鑰驗證簽名
    S->>C: 驗證成功,開放 Shell

金鑰生成

# 生成 ed25519 金鑰對(推薦)
ssh-keygen -t ed25519 -C "your@email.com"

# 指定輸出路徑(多組金鑰時用)
ssh-keygen -t ed25519 -f ~/.ssh/my_server_key -C "my-server"

# RSA(相容舊系統)
ssh-keygen -t rsa -b 4096 -C "your@email.com"
選項說明
-t演算法類型(ed25519 / rsa)
-b金鑰位元數(RSA 用,建議 4096)
-C註解,嵌入 .pub 中,方便識別金鑰用途
-f指定輸出檔名

產生後的檔案:

檔案說明
~/.ssh/id_ed25519私鑰,絕不外流,chmod 600
~/.ssh/id_ed25519.pub公鑰,複製至伺服器

Passphrase:生成時可設定,為私鑰加上額外加密層。即使私鑰檔遭竊,無 passphrase 仍無法使用。

演算法比較

ed25519RSA 4096
安全性高(橢圓曲線)
金鑰長度短(256 bit)長(4096 bit)
速度較慢
相容性需較新 OpenSSH廣泛相容
建議優先使用相容舊系統時用

部署公鑰至伺服器

方法一:ssh-copy-id(推薦)

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@host

自動將公鑰附加至伺服器 ~/.ssh/authorized_keys,並設定正確權限。

方法二:手動

# 一行指令複製
cat ~/.ssh/id_ed25519.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

或手動將 .pub 內容貼入伺服器的 ~/.ssh/authorized_keys

伺服器端權限(必須正確,否則 SSH 拒絕讀取):

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

金鑰驗證相關檔案

檔案位置說明
私鑰~/.ssh/id_ed25519留在本機,chmod 600,絕不外流
公鑰~/.ssh/id_ed25519.pub複製到目標伺服器
authorized_keys伺服器 ~/.ssh/存放允許登入的公鑰(一行一個)
known_hosts本機 ~/.ssh/記錄已信任的伺服器指紋,防中間人攻擊
config本機 ~/.ssh/config多組金鑰或主機別名設定

~/.ssh/config 範例(管理多組金鑰):

Host my-server
    HostName 192.168.1.100
    User ubuntu
    IdentityFile ~/.ssh/my_server_key

Host github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_github

常用指令

# 連線
ssh user@host

# 指定私鑰
ssh -i ~/.ssh/my_key user@host

# 使用 config 別名
ssh my-server

# 複製公鑰到伺服器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@host

# 測試連線(verbose,除錯用)
ssh -v user@host

# Local Port Forwarding(本地 8080 → 遠端 80)
ssh -L 8080:localhost:80 user@host

# 背景執行 + 不開 shell(搭配 port forwarding)
ssh -fN -L 8080:localhost:80 user@host