在Ubuntu 22.04上執行SSH伺服器

Ubuntu 22.04 SSH Server Build

前言

SSH(Secure Shell)是現代 Linux 系統管理中不可或缺的遠端連線工具。它提供了加密的通訊通道,讓系統管理員能夠安全地遠端存取和管理伺服器。相較於傳統的 Telnet 等明文傳輸協定,SSH 具備以下優勢:

  • 加密傳輸:所有通訊內容都經過加密,防止中間人攻擊和竊聽
  • 身份驗證:支援密碼驗證和更安全的公鑰驗證機制
  • 完整性校驗:確保傳輸的資料未被篡改
  • 通道轉發:支援 Port Forwarding 和 X11 轉發等進階功能

在 Ubuntu 22.04 LTS 上建置 SSH 伺服器是許多管理任務的第一步。本文將詳細介紹從安裝到安全強化的完整流程。

安裝 OpenSSH Server

OpenSSH 是最廣泛使用的 SSH 實作,Ubuntu 官方套件庫提供了穩定且持續更新的版本。

步驟說明

  1. 更新套件清單並安裝 OpenSSH Server:

    1
    2
    
    sudo apt update
    sudo apt install openssh-server -y
    
  2. 設定 SSH 服務開機自動啟動:

    1
    
    sudo systemctl enable ssh
    
  3. 啟動 SSH 服務:

    1
    
    sudo systemctl start ssh
    
  4. 確認服務狀態:

    1
    
    sudo systemctl status ssh
    

    如果看到 Active: active (running) 表示服務已正常運作。

  5. 確認 SSH 正在監聽的連接埠:

    1
    
    sudo ss -tlnp | grep ssh
    

    預設應該會看到監聽在 0.0.0.0:22[::]:22

允許防火牆

Ubuntu 22.04 預設使用 UFW(Uncomplicated Firewall)作為防火牆管理工具。必須開放 SSH 連接埠才能讓外部連線進入。

  1. 允許 SSH 連線通過防火牆:

    1
    
    sudo ufw allow ssh
    

    這會開放 TCP 22 連接埠。如果您使用自訂連接埠(例如 2222),請改用:

    1
    
    sudo ufw allow 2222/tcp
    
  2. 啟用防火牆:

    1
    
    sudo ufw enable
    
  3. 確認防火牆規則:

    1
    
    sudo ufw status verbose
    

此時已能使用密碼登入

SSH 設定檔重要參數說明

SSH 伺服器的主要設定檔位於 /etc/ssh/sshd_config。以下是一些重要參數的說明:

1
sudo nano /etc/ssh/sshd_config

常用參數

參數預設值說明
Port22SSH 服務監聽的連接埠
PermitRootLoginprohibit-password是否允許 root 登入
PasswordAuthenticationyes是否允許密碼驗證
PubkeyAuthenticationyes是否允許公鑰驗證
MaxAuthTries6最大驗證嘗試次數
MaxSessions10每個連線允許的最大 session 數
ClientAliveInterval0客戶端存活檢查間隔(秒)
ClientAliveCountMax3客戶端存活檢查最大次數
LoginGraceTime120登入寬限時間(秒)
AllowUsers允許登入的使用者清單
DenyUsers禁止登入的使用者清單

設定範例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 變更連接埠(建議使用 1024-65535 之間的高位埠)
Port 2222

# 禁止 root 登入
PermitRootLogin no

# 停用密碼驗證(僅允許金鑰驗證)
PasswordAuthentication no

# 限制特定使用者可以登入
AllowUsers ubuntu admin

# 設定閒置超時(5 分鐘無活動則斷線)
ClientAliveInterval 300
ClientAliveCountMax 0

修改設定後,務必重新載入設定:

1
sudo systemctl reload ssh

RSA 金鑰認證

使用金鑰認證比密碼驗證更安全,因為金鑰難以被暴力破解。

Client 端

  1. 建立存放金鑰的目錄:

    1
    2
    
    mkdir -p $HOME/.ssh
    chmod 0700 $HOME/.ssh
    
  2. 產生 RSA 金鑰對:

    1
    
    ssh-keygen -t rsa -b 4096 -C "my key for ubuntu server"
    
    • -t rsa:指定金鑰類型為 RSA
    • -b 4096:指定金鑰長度為 4096 位元
    • -C:添加註解,方便識別金鑰用途
  3. Enter 使用預設路徑,或輸入自訂路徑

  4. 設定金鑰密碼(passphrase),可留空但建議設定

  5. 將公鑰傳送到 SSH Server:

    1
    
    ssh-copy-id -i ~/.ssh/id_rsa.pub <username>@<server-ip>
    

Server 端

  1. 編輯 SSH 設定檔:

    1
    
    sudo nano /etc/ssh/sshd_config
    
  2. 找到並修改以下參數:

    1
    2
    
    PubkeyAuthentication yes
    PasswordAuthentication no
    
  3. 重新啟動 SSH 服務:

    1
    
    sudo systemctl restart ssh
    

Ed25519 金鑰(推薦)

Ed25519 是一種基於橢圓曲線的現代加密演算法,相較於 RSA 具有以下優勢:

  • 更短的金鑰長度:Ed25519 金鑰只有 256 位元,但安全性等同於 RSA 3072 位元
  • 更快的運算速度:簽章和驗證速度都比 RSA 快
  • 更安全:設計上避免了許多已知的密碼學弱點
  • 抗側信道攻擊:對時序攻擊等側信道攻擊有更好的抵抗力

產生 Ed25519 金鑰

1
ssh-keygen -t ed25519 -C "my ed25519 key for ubuntu server"

產生的金鑰會存放在:

  • 私鑰:~/.ssh/id_ed25519
  • 公鑰:~/.ssh/id_ed25519.pub

傳送公鑰到伺服器

1
ssh-copy-id -i ~/.ssh/id_ed25519.pub <username>@<server-ip>

使用 Ed25519 金鑰連線

1
ssh -i ~/.ssh/id_ed25519 <username>@<server-ip>

建議:對於新的部署,優先選擇 Ed25519 金鑰。除非需要與舊系統相容,否則不建議使用 RSA。

SSH 安全強化建議

為了保護您的伺服器免受未授權存取,以下是一些重要的安全強化措施:

1. 禁用 root 直接登入

1
sudo nano /etc/ssh/sshd_config
1
PermitRootLogin no

2. 限制可登入的使用者

只允許特定使用者透過 SSH 登入:

1
AllowUsers ubuntu admin deploy

或使用群組限制:

1
AllowGroups ssh-users

3. 變更預設連接埠

將 SSH 連接埠改為非標準埠可以減少自動化攻擊:

1
Port 2222

記得更新防火牆規則:

1
2
sudo ufw allow 2222/tcp
sudo ufw delete allow ssh

4. 限制登入嘗試次數

1
MaxAuthTries 3

5. 設定閒置超時

1
2
ClientAliveInterval 300
ClientAliveCountMax 2

6. 停用空密碼登入

1
PermitEmptyPasswords no

7. 停用 X11 轉發(如不需要)

1
X11Forwarding no

8. 使用強加密演算法

/etc/ssh/sshd_config 中指定允許的演算法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 金鑰交換演算法
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256

# 主機金鑰演算法
HostKeyAlgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256

# 加密演算法
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr

# MAC 演算法
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com

完整安全設定範例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Port 2222
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
MaxAuthTries 3
MaxSessions 5
ClientAliveInterval 300
ClientAliveCountMax 2
X11Forwarding no
AllowUsers ubuntu admin
LoginGraceTime 60

套用設定:

1
2
sudo sshd -t  # 測試設定檔語法
sudo systemctl restart ssh

使用 fail2ban 防護

fail2ban 是一個入侵防護工具,可以自動封鎖多次登入失敗的 IP 位址。

安裝 fail2ban

1
sudo apt install fail2ban -y

建立本地設定檔

1
2
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

設定 SSH 保護

jail.local 中找到 [sshd] 區段並修改:

1
2
3
4
5
6
7
8
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 3600

參數說明:

  • maxretry:允許的最大失敗次數
  • findtime:在此時間內(秒)超過 maxretry 次失敗則封鎖
  • bantime:封鎖時間(秒),設為 -1 為永久封鎖

啟動 fail2ban

1
2
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

查看封鎖狀態

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 查看 fail2ban 狀態
sudo fail2ban-client status

# 查看 SSH jail 狀態
sudo fail2ban-client status sshd

# 查看被封鎖的 IP
sudo fail2ban-client get sshd banned

# 手動解除封鎖
sudo fail2ban-client set sshd unbanip <IP-ADDRESS>

SSH 連線除錯技巧

當 SSH 連線出現問題時,以下技巧可以幫助您診斷問題:

1. 啟用詳細輸出模式

在客戶端使用 -v 參數查看詳細連線過程:

1
2
3
4
5
6
7
8
# 基本詳細模式
ssh -v user@server

# 更詳細的輸出
ssh -vv user@server

# 最詳細的輸出
ssh -vvv user@server

2. 檢查伺服器日誌

1
2
3
4
5
# 即時查看認證日誌
sudo tail -f /var/log/auth.log

# 搜尋 SSH 相關日誌
sudo grep sshd /var/log/auth.log

3. 測試 SSH 設定檔語法

1
sudo sshd -t

如果有語法錯誤會顯示錯誤訊息。

4. 檢查 SSH 服務狀態

1
2
sudo systemctl status ssh
sudo journalctl -u ssh -n 50

5. 確認連接埠開放

1
2
3
4
5
6
7
8
# 本地檢查
sudo ss -tlnp | grep ssh

# 遠端檢查(需安裝 nmap)
nmap -p 22 <server-ip>

# 使用 nc 測試連線
nc -zv <server-ip> 22

6. 檢查防火牆規則

1
2
sudo ufw status verbose
sudo iptables -L -n | grep 22

7. 權限問題檢查

SSH 對檔案權限有嚴格要求:

1
2
3
4
5
6
7
8
9
# 伺服器端
ls -la ~/.ssh/
# authorized_keys 應該是 600 或 644
# .ssh 目錄應該是 700

# 客戶端
ls -la ~/.ssh/
# 私鑰應該是 600
# .ssh 目錄應該是 700

修正權限:

1
2
3
4
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys  # 伺服器端

8. 常見錯誤及解決方案

錯誤訊息可能原因解決方案
Connection refusedSSH 服務未運行或防火牆阻擋檢查服務狀態和防火牆規則
Permission denied (publickey)金鑰驗證失敗檢查金鑰權限和 authorized_keys
Host key verification failed伺服器金鑰變更移除 known_hosts 中的舊記錄
Connection timed out網路問題或防火牆阻擋檢查網路連線和防火牆
Too many authentication failures嘗試過多金鑰使用 -i 指定正確金鑰

後記:轉移金鑰

當您需要在不同機器間轉移 SSH 金鑰時:

  1. 複製私鑰檔案 ~/.ssh/id_rsa(或 id_ed25519

  2. 重要:確保檔案結尾有換行符號

    • 用文字編輯器開啟檔案
    • 確認最後一行有按 Enter(換行符號)
    • 儲存檔案
    • 如果缺少換行符號,可能會出現 invalid format 錯誤
  3. 設定正確的權限:

    1
    
    chmod 600 ~/.ssh/id_rsa
    
  4. 使用金鑰連線:

    1
    
    ssh -i ~/.ssh/id_rsa ubuntu@192.168.1.102
    

結語

建置安全的 SSH 伺服器需要注意多個層面,從基本的安裝設定到進階的安全強化。本文涵蓋了:

  1. OpenSSH Server 的安裝與設定
  2. 防火牆規則設定
  3. RSA 和 Ed25519 金鑰認證
  4. 重要的安全強化措施
  5. fail2ban 入侵防護
  6. 連線問題除錯技巧

建議您根據實際需求調整設定,並定期檢查日誌以確保系統安全。記住,安全是一個持續的過程,需要定期更新系統並關注最新的安全建議。

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy