熱門分類
載入中…
目錄0%

🐧 Linux SSH 安全強化指南:金鑰登入、Port 轉移與 Fail2Ban 整合

    🐧 Linux SSH 安全強化指南:金鑰登入、Port 轉移與 Fail2Ban 整合

    只要一台 Linux 伺服器對外開放 SSH,幾乎可以保證: 不到幾分鐘,log 裡就會開始出現來自世界各地的暴力破解嘗試。 攻擊者不一定鎖定你,但「掃描 22 port、亂試帳號密碼」早已是背景噪音。

    本篇以實務角度,整理一套 可複製的 SSH 安全基準(Baseline), 主要目標包括:

    • 改用 SSH 金鑰登入,降低密碼被猜中的風險。
    • 調整 Port、允許帳號、來源 IP,減少被掃描與誤用。
    • 透過 Fail2Ban 自動封鎖暴力破解 IP
    • 搭配 sshd_config 的各種細節,形塑一套可重複套用的安全配置。

    一、基本觀念:SSH、sshd 與設定檔位置

    先釐清幾個名詞:

    • SSH Client(ssh):你用來連線到伺服器的程式。
    • SSH Server(sshd):伺服器端守護程式,負責接受連線。
    • OpenSSH:最常見的 SSH 實作,大部分 Linux 發行版預設採用。

    常見設定檔位置:

    • /etc/ssh/sshd_config:伺服器端(sshd)的主設定檔。
    • ~/.ssh/:各使用者本機的 SSH 設定與金鑰。
    • ~/.ssh/authorized_keys:伺服器端記錄「允許登入的公鑰」。

    修改 sshd_config 後,記得:

    sudo sshd -t          # 檢查設定檔語法
    sudo systemctl reload sshd   # 或 ssh,依發行版服務名稱

    在遠端改設定時,務必保留舊連線視窗不要關閉,先開第二個 SSH 測試新設定,確認可用再退出舊連線。


    二、SSH 金鑰登入:從密碼到公鑰驗證

    SSH 金鑰登入利用「非對稱加密」:

    • 本機保存私鑰(id_ed25519id_rsa)。
    • 伺服器保存公鑰(authorized_keys)。
    • 登入時伺服器用公鑰驗證你是否擁有對應的私鑰,而不傳輸密碼。

    1. 在本機產生 SSH 金鑰

    建議使用 ed25519 演算法(較新且金鑰短)。

    # 在本機(不是伺服器)執行:
    ssh-keygen -t ed25519 -C "你的註解(例如 email)"

    若系統不支援 ed25519,也可以使用 rsa:

    ssh-keygen -t rsa -b 4096 -C "你的註解"

    指令執行後會問你:

    • 要將金鑰存在哪裡(預設 ~/.ssh/id_ed25519)。
    • 是否設定 passphrase(建議設定,等於給私鑰再上一層鎖)。

    完成後,本機會得到:

    • ~/.ssh/id_ed25519:私鑰(請妥善保護,絕不外流)。
    • ~/.ssh/id_ed25519.pub:公鑰(可放心放到伺服器)。

    三、將公鑰部署到伺服器:ssh-copy-id 或手動設定

    1. 使用 ssh-copy-id(最方便)

    若目前伺服器仍允許密碼登入,可以在本機直接執行:

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

    這會:

    • 以目前的密碼登入伺服器。
    • 自動把公鑰附加到 ~user/.ssh/authorized_keys
    • 調整正確的檔案權限。

    2. 手動設定 authorized_keys

    若沒有 ssh-copy-id,可改用手動方式:

    1. 在本機檢視公鑰內容:
    cat ~/.ssh/id_ed25519.pub
    1. 登入伺服器,假設帳號為 user
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    
    # 在 authorized_keys 中貼上剛剛的公鑰一整行
    nano ~/.ssh/authorized_keys   # 或 vi / vim
    
    chmod 600 ~/.ssh/authorized_keys

    權限非常重要,錯誤權限會導致 SSH 拒絕使用金鑰登入。


    四、調整 sshd_config:啟用金鑰登入、準備關閉密碼登入

    編輯伺服器上的 /etc/ssh/sshd_config

    sudo nano /etc/ssh/sshd_config

    確認或加入以下設定(將註解 # 拿掉):

    # 啟用公鑰驗證
    PubkeyAuthentication yes
    
    # 確認有讀取 authorized_keys
    AuthorizedKeysFile .ssh/authorized_keys
    
    # 暫時保留密碼登入,等測試金鑰沒問題再關
    PasswordAuthentication yes
    ChallengeResponseAuthentication no
    
    # 僅允許 protocol 2(新版本預設即為 2)
    Protocol 2

    重新載入設定:

    sudo sshd -t
    sudo systemctl reload sshd

    接著在本機試著用金鑰登入:

    ssh -i ~/.ssh/id_ed25519 user@server-ip

    若不再要求輸入帳號密碼,而是直接連上(或只問你私鑰的 passphrase),就代表金鑰登入已成功。

    確認無問題後關閉密碼登入

    再次編輯 sshd_config

    PasswordAuthentication no
    KbdInteractiveAuthentication no
    ChallengeResponseAuthentication no

    然後重新載入 sshd,並用新的終端機視窗測試連線。如果一切正常,之後就只能透過金鑰登入,大幅降低暴力破解成功的機會。


    五、Port 轉移與帳號限制:降低被掃描與誤用風險

    改 Port 並不是「真正的防禦」,但能有效降低掃描噪音; 搭配「只允許特定帳號 / 群組登入」,會是實務上很常見的一層防護。

    1. 調整 SSH Port

    sshd_config 中:

    # 預設是 22,可改為 2222 之類的非知名 Port
    Port 2222

    記得同步更新防火牆設定,例如使用 firewalld:

    # 加入新 port
    sudo firewall-cmd --permanent --add-port=2222/tcp
    
    # 若已確認不再使用 22 也可關閉
    sudo firewall-cmd --permanent --remove-service=ssh
    
    sudo firewall-cmd --reload

    重新載入 sshd 前,務必先確認防火牆已放行新 port,避免把自己關在門外。

    2. 限制可登入帳號與群組

    sshd_config 中加入:

    # 僅允許特定帳號登入
    AllowUsers wwfandy devuser
    
    # 或是允許特定群組
    AllowGroups sshusers

    搭配群組管理,可以將「有 SSH 登入權的使用者」集中到一個群組中,方便控管與稽核。

    3. 禁止 root 直接登入

    PermitRootLogin no

    建議做法:

    • 建立一個一般帳號(例如 admin 或你的名字),授予 sudo 權限。
    • 平時以一般帳號登入,必要時用 sudo 執行管理操作。

    六、整合 Fail2Ban:自動封鎖暴力破解 IP

    即使關掉密碼登入,仍然會有程式不斷嘗試連線、耗費資源或塞滿 log。 Fail2Ban 可以監控 log 中的異常登入行為,達到一定次數就自動用防火牆封鎖該 IP。

    1. 安裝 Fail2Ban

    Debian / Ubuntu:

    sudo apt update
    sudo apt install -y fail2ban

    RHEL / CentOS / Rocky / AlmaLinux:

    sudo dnf install -y fail2ban

    啟動 Fail2Ban:

    sudo systemctl enable --now fail2ban
    sudo systemctl status fail2ban

    七、設定 Fail2Ban 監控 SSH

    官方預設設定放在 /etc/fail2ban/jail.conf, 建議不要直接修改,而是在 /etc/fail2ban/jail.local 中覆蓋或新增設定。

    1. 建立 jail.local 並啟用 sshd jail

    sudo nano /etc/fail2ban/jail.local

    加入以下範例:

    [DEFAULT]
    # 信任的 IP(永不封鎖),可加入自己公司或管理端 IP
    ignoreip = 127.0.0.1/8 ::1
    
    # 封鎖時間(秒),例如 30 分鐘
    bantime  = 1800
    
    # 在 findtime 秒內失敗達 maxretry 次就封鎖
    findtime = 600
    maxretry = 5
    
    [sshd]
    enabled  = true
    port     = 2222        # 若你改過 SSH Port,記得同步修改
    logpath  = /var/log/auth.log  ; Debian/Ubuntu
    # logpath = /var/log/secure   ; RHEL/CentOS
    backend  = systemd

    儲存後重新啟動 Fail2Ban:

    sudo systemctl restart fail2ban

    2. 查詢 Fail2Ban 狀態與封鎖 IP

    # 查看所有 jail
    sudo fail2ban-client status
    
    # 查看 sshd jail 詳細狀態
    sudo fail2ban-client status sshd

    輸出中可以看到目前被封鎖的 IP 清單。

    3. 手動解除封鎖某 IP

    sudo fail2ban-client set sshd unbanip 1.2.3.4

    如果誤封到合法管理端 IP,可以用這個方式解除。


    八、更多 sshd_config 安全相關參數建議

    除了 Port 與登入方式,還有一些細節可以進一步強化安全性:

    1. 降低暴力破解效率

    # 使用者有多少時間可以輸入密碼(關閉密碼登入後仍影響金鑰失敗)
    LoginGraceTime 30
    
    # 單一連線允許的認證嘗試數
    MaxAuthTries 3
    
    # 每個連線的最大同時 session 數
    MaxSessions 3

    2. 控制閒置連線

    # 每 60 秒對 client 發送 keepalive 檢查
    ClientAliveInterval 60
    
    # 若連續 5 次沒有收到回應就斷線
    ClientAliveCountMax 5

    可以避免「掛著不動」多小時卻忘記關閉的連線。

    3. 關閉不需要的轉發功能

    # 若不需要 X11 轉發,建議關閉
    X11Forwarding no
    
    # 若不需要 TCP Forwarding,可視情況關閉或改用 more strict 設定
    AllowTcpForwarding no
    
    # 若不提供 SFTP,亦可關閉相關子系統(依實際需求調整)
    # Subsystem sftp /usr/lib/openssh/sftp-server

    原則是:沒在用的功能,就不要開著


    九、Log 與稽核:掌握 SSH 活動紀錄

    SSH 相關的 log 位置通常在:

    • Debian / Ubuntu:/var/log/auth.log
    • RHEL / CentOS:/var/log/secure

    常用檢查方式:

    # 看最近登入失敗紀錄
    sudo grep "Failed password" /var/log/auth.log | tail -n 20
    
    # 看登入成功紀錄
    sudo grep "Accepted" /var/log/auth.log | tail -n 20
    
    # 持續即時監控(搭配 sshd 關鍵字)
    sudo tail -f /var/log/auth.log | grep sshd

    若有導入集中式日誌系統(例如 Loki + Grafana、ELK Stack),可以把 SSH log 納入統一監控, 更容易發現「奇怪時間點、奇怪來源」的登入行為。


    十、整理:一套可重複套用的 SSH 安全基準

    把本文內容整理成一套「上線新主機時必做清單」:

    1. 在管理端本機產生 SSH 金鑰(ed25519 或 RSA 4096)。
    2. 將公鑰部署至伺服器的 authorized_keys,並確認金鑰登入正常。
    3. sshd_config 啟用 PubkeyAuthentication,準備關閉密碼登入。
    4. 在確認金鑰登入穩定之後,將 PasswordAuthentication 改為 no。
    5. 修改 SSH Port(例如 2222),並同步更新防火牆規則。
    6. 設定 PermitRootLogin no,建立一般管理帳號 + sudo 權限。
    7. 使用 AllowUsers / AllowGroups 限定可登入帳號或群組。
    8. 安裝並設定 Fail2Ban,啟用 sshd jail,自動封鎖暴力破解來源。
    9. 調整 LoginGraceTime、MaxAuthTries、ClientAliveInterval 等細節。
    10. 建立固定的 log 檢視與稽核流程(搭配集中式日誌更佳)。

    ✅ 當這套 SSH 安全基準成為你或團隊的「標準流程」,每一台新上線的 Linux 伺服器就能在 一致的安全水準 下運作。之後若再搭配防火牆規則、IDS/IPS、VPN 與跳板機, 就能逐步建構出更完整的伺服器安全架構。

    🔗 分享這篇 LINE Facebook X

    沒有留言:

    字級