伺服器管理必學 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 yessudo 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]重啟並檢視被封鎖的 IP 清單:
enabled = true
port = 22222
maxretry = 3
findtime = 600
bantime = 86400sudo 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-db或scp 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編輯 /etc/pam.d/sshd,加入:
# 執行互動式設定,用手機 Authenticator App 掃描出現的 QR Code google-authenticatorauth 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 次無回應則中斷連線若要在終端機完全無操作時自動登出,可在 /etc/profile.d/autologout.sh 加入:
ClientAliveInterval 60
ClientAliveCountMax 3# 閒置 900 秒(15 分鐘)自動中斷 Shell 連線
export TMOUT=900
readonly TMOUT - 注意提醒:
ClientAlive是防止連線假死,TMOUT則是防止終端機實體離開座位時被盜用。
技巧 010:審查與吊銷金鑰(嚴防離職員工與廢棄金鑰殘留)
- 痛點場景:
專案開發久了,~/.ssh/authorized_keys裡面塞滿不知道屬於誰的金鑰,無人敢動。 - 解決方案:
規範金鑰必須附帶詳細註解,定期查核指紋(Fingerprint):# 列出目標帳號所有授權金鑰的演算法與指紋清單若需吊銷指定金鑰,只需在 authorized_keys 中註解或刪除該行;大型團隊可於 /etc/ssh/sshd_config 指定全域廢止清單:
ssh-keygen -lf ~/.ssh/authorized_keysRevokedKeys /etc/ssh/revoked_keys - 注意提醒:
建立標準 SOP:金鑰末尾必須清楚標註email_日期_用途,例如id_ed25519 alice@company.com 20260901,維運查核時才有一翻兩瞪眼的依據。