Blog Details

Linux 作業系統 cutexyz > Blog > Linux 系統操作 > 伺服器管理必學 100 招|Part 1:連線安全與存取控制

伺服器管理必學 100 招|Part 1:連線安全與存取控制

前言
一台連上公網的伺服器,通常在開機數分鐘內就會開始承受全網 Port 掃描與密碼爆破。本篇精選 10 個核心連線安全與存取控制技巧,從 SSH 防護、最小權限隔離到雙因素驗證,協助你在第一天就建構起無法被輕易撼動的系統防線。

技巧 001:停用脆弱的 RSA,全面採用 Ed25519 金鑰對

  • 痛點場景:傳統預設的 2048-bit RSA 金鑰運算較慢且安全性漸顯不足,容易在不同主機間沿用舊版無防護的金鑰。
  • 解決方案: 在本地開發機生成現代標準的 Ed25519 金鑰對,並派送至伺服器:
# 本地生成 Ed25519 金鑰(演算法高效且抗量子攻擊能力更佳) 
ssh-keygen -t ed25519 -C "admin@yourdomain.com" 

# 一鍵將公鑰推送到目標主機 
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@<SERVER_IP>
  • 注意提醒:若目標系統極舊不支援 Ed25519,次選才是 ssh-keygen -t rsa -b 4096

技巧 002:一刀切!全面封殺 root 遠端登入與密碼驗證

  • 痛點場景:全世界的殭屍網路每天都在對預設的 root 帳號進行字典暴力破解,只要任何一個使用者設了弱密碼,主機就會失守。
  • 解決方案: 修改 /etc/ssh/sshd_config(或建立 /etc/ssh/sshd_config.d/security.conf):
    PermitRootLogin no
    PasswordAuthentication no
    PubkeyAuthentication yes

    測試設定檔語法並重啟服務:
    sudo sshd -t && sudo systemctl reload sshd
  • 注意提醒:在重啟 SSH 服務前,務必保留一個當前已連線的 Session,並另開一個終端視窗驗證金鑰能否順利登入,以免自己被鎖在門外。

技巧 003:修改預設 Port 22,瞬間過濾 99% 的全網盲掃

  • 痛點場景:雖然變更連接埠屬於「隱晦式安全(Security through Obscurity)」,但能有效讓 auth.log 保持乾淨,避免每日數萬次的低階自動掃描耗盡系統日誌與 CPU 資源。
  • 解決方案: 編輯 /etc/ssh/sshd_config,指定一個非標準高位埠(例如 22222):
    Port 22222
    注意:若系統啟用防火牆或 SELinux,必須先放行新埠號再重啟服務!
    # UFW 放行新埠
    sudo ufw allow 22222/tcp
    sudo sshd -t && sudo systemctl reload sshd
  • 注意提醒:本地端可設定 ~/.ssh/config,之後連線只需輸入 ssh my-server,不需每次手打 -p 22222

技巧 004:配置 Sudo 最小特權與免密碼白名單

  • 痛點場景:自動化腳本或部署專用帳號(如 deployer)需要執行特定重啟指令,但給予完整的 ALL=(ALL) ALL 權限風險過高。
  • 解決方案: 使用安全工具 visudo 建立獨立規則 /etc/sudoers.d/deployer
    # 僅允許 deployer 帳號免密碼執行特定服務重啟,其餘指令皆需密碼或拒絕
    deployer ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx, /bin/systemctl reload myapp
  • 注意提醒:切勿直接用 vim 編輯 /etc/sudoers,使用 sudo visudo -f /etc/sudoers.d/your-file 可以在存檔時自動做語法檢查,防止語法錯誤直接搞掛提權機制。

技巧 005:掛載 Fail2ban,惡意嘗試三次直接進黑名單

  • 痛點場景:即便關閉了密碼登入,非法探測仍可能造成連線頻寬占用或日誌污染。
  • 解決方案: 安裝 Fail2ban 並配置防護監控:
    sudo apt update && sudo apt install fail2ban -y
    建立自訂規則 /etc/fail2ban/jail.local
    [sshd]
    enabled = true
    port = 22222
    maxretry = 3
    findtime = 600
    bantime = 86400
    重啟並檢視被封鎖的 IP 清單:
    sudo systemctl restart fail2ban
    sudo fail2ban-client status sshd
  • 注意提醒:記得在 ignoreip 加入辦公室或家裡的固定 IP,避免自己輸入錯誤時被伺服器 ban 掉 24 小時。

技巧 006:利用 SSH Config 配置跳板機(Bastion / Jump Host)

  • 痛點場景:內網資料庫伺服器不能有對外 Public IP,每次連線都要先登入跳板機再跳轉,檔案傳輸(SCP/SFTP)極度麻煩。
  • 解決方案: 在本地開發機的 ~/.ssh/config 配置 ProxyJump
    # 跳板機
    Host bastion
    HostName 203.0.113.10
    User ops
    Port 22222
    IdentityFile ~/.ssh/id_ed25519
    # 內網主機(自動透過跳板穿透)
    Host internal-db
    HostName 10.0.1.50
    User dbadmin
    IdentityFile ~/.ssh/id_ed25519
    ProxyJump bastion
  • 注意提醒:設定完成後,直接輸入 ssh internal-dbscp file.sql internal-db:/tmp 即可透明穿透,無需在跳板機上存放內部主機的金鑰。

技巧 007:善用 AllowUsers 白名單鎖定帳號來源

  • 痛點場景:多名成員使用同台伺服器,如何限定只有特定身分、且只能從特定網段連線?
  • 解決方案: 在 /etc/ssh/sshd_config 末端加入來源限制:
    # 僅允許 alice 從任意處連線,但 bob 只能從公司固定網段連入
    AllowUsers alice@* bob@192.168.1.0/24 admin@203.0.113.50
    更新後重新載入:
    sudo sshd -t && sudo systemctl reload sshd
  • 專家提醒:一旦宣告了 AllowUsers,任何未列在名單上的使用者將被一律禁止 SSH 登入,具備極高的收斂效果。

技巧 008:給 SSH 加上 Google Authenticator 雙因素驗證(2FA)

  • 痛點場景:即使私鑰遭竊或被惡意軟體複製,攻擊者依然缺少手機端的動態驗證碼(TOTP)。
  • 解決方案: 安裝 PAM TOTP 模組:
    sudo apt install libpam-google-authenticator -y
    # 執行互動式設定,用手機 Authenticator App 掃描出現的 QR Code google-authenticator
    編輯 /etc/pam.d/sshd,加入:
    auth required pam_google_authenticator.so nullok
    修改 /etc/ssh/sshd_config
    KbdInteractiveAuthentication yes
    AuthenticationMethods publickey,keyboard-interactive
  • 注意提醒:必須同時提供「金鑰」+「6 位數驗證碼」才能登入,適合用於正式生產環境(Production)的核心節點。

技巧 009:防止閒置掛起!配置自動斷線與 KeepAlive 防死連線

  • 痛點場景:工程師常常登入後忘記登出,殘留的遠端 Session 容易成為資安破口;或是連線閒置幾分鐘就容易卡住無法退出。
  • 解決方案
    /etc/ssh/sshd_config 中設定心跳偵測與逾時強制登出:
    # 每 60 秒發送心跳包,若連續 3 次無回應則中斷連線
    ClientAliveInterval 60
    ClientAliveCountMax 3
    若要在終端機完全無操作時自動登出,可在 /etc/profile.d/autologout.sh 加入:
    # 閒置 900 秒(15 分鐘)自動中斷 Shell 連線
    export TMOUT=900
    readonly TMOUT
  • 注意提醒ClientAlive 是防止連線假死,TMOUT 則是防止終端機實體離開座位時被盜用。

技巧 010:審查與吊銷金鑰(嚴防離職員工與廢棄金鑰殘留)

  • 痛點場景:專案開發久了,~/.ssh/authorized_keys 裡面塞滿不知道屬於誰的金鑰,無人敢動。
  • 解決方案: 規範金鑰必須附帶詳細註解,定期查核指紋(Fingerprint):
    # 列出目標帳號所有授權金鑰的演算法與指紋清單
    ssh-keygen -lf ~/.ssh/authorized_keys
    若需吊銷指定金鑰,只需在 authorized_keys 中註解或刪除該行;大型團隊可於 /etc/ssh/sshd_config 指定全域廢止清單:
    RevokedKeys /etc/ssh/revoked_keys
  • 注意提醒:建立標準 SOP:金鑰末尾必須清楚標註 email_日期_用途,例如 id_ed25519 alice@company.com 20260901,維運查核時才有一翻兩瞪眼的依據。

Leave A Comment

All fields marked with an asterisk (*) are required