伺服器管理必學 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/tcpsudo 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 = trueport = 22222maxretry = 3findtime = 600bantime = 86400
重啟並檢視被封鎖的 IP 清單:sudo systemctl restart fail2bansudo 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# 執行互動式設定,用手機 Authenticator App 掃描出現的 QR Code google-authenticator
編輯/etc/pam.d/sshd,加入:auth required pam_google_authenticator.so nullok
修改/etc/ssh/sshd_config:KbdInteractiveAuthentication yesAuthenticationMethods publickey,keyboard-interactive - 注意提醒:必須同時提供「金鑰」+「6 位數驗證碼」才能登入,適合用於正式生產環境(Production)的核心節點。
技巧 009:防止閒置掛起!配置自動斷線與 KeepAlive 防死連線
- 痛點場景:工程師常常登入後忘記登出,殘留的遠端 Session 容易成為資安破口;或是連線閒置幾分鐘就容易卡住無法退出。
- 解決方案:
在/etc/ssh/sshd_config中設定心跳偵測與逾時強制登出:# 每 60 秒發送心跳包,若連續 3 次無回應則中斷連線ClientAliveInterval 60ClientAliveCountMax 3
若要在終端機完全無操作時自動登出,可在/etc/profile.d/autologout.sh加入:# 閒置 900 秒(15 分鐘)自動中斷 Shell 連線export TMOUT=900readonly 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,維運查核時才有一翻兩瞪眼的依據。