SSH Server 保安實戰 10 招 – 由基本到進階,逐個 step 同你拆解

前言:SSH 畀人爆咗你都唔知?

今日同大家吹下水。做 IT 嘅你,應該日日都要 SSH 入 Server 㗎啦?但你知唔知,全球每秒鐘都有 botnet 不停咁掃 port 22,用字典攻擊撞你個 root 密碼。你話「我有 firewall 喎」——咁你 firewall rules 真係 set 得啱?你話「我用強密碼」——但你有冇諗過,暴力破解唔係靠運氣,而係靠時...

前言:SSH 畀人爆咗你都唔知?

今日同大家吹下水。做 IT 嘅你,應該日日都要 SSH 入 Server 㗎啦?但你知唔知,全球每秒鐘都有 botnet 不停咁掃 port 22,用字典攻擊撞你個 root 密碼。你話「我有 firewall 喎」——咁你 firewall rules 真係 set 得啱?你話「我用強密碼」——但你有冇諗過,暴力破解唔係靠運氣,而係靠時間同數量?

今日就同大家由淺入深,分享 10 招 SSH 安全加固嘅實戰技巧,全部都係即刻用得嘅 CLI 設定,唔使買咩貴價 appliance,跟住做就得。


第 1 招:換走 port 22,減少噪音

呢個係最簡單但好多人忽略嘅一招。將 SSH 由 default port 22 改去一個高位 port(例如 2222 或者 54321),可以過濾走 90% 以上嘅自動化掃描。

# 編輯 sshd_config
sudo vi /etc/ssh/sshd_config

# 搵到 Port 22,改成:
Port 54321

# 然後 restart service
sudo systemctl restart sshd

⚠️ 注意:改完要記得喺 firewall 度開返個新 port,唔係你自己都入唔到!同埋唔好用 2222——呢個太常見,botnet 已經識掃。


第 2 招:禁用 root 直接登入

呢個係保安 101。Root 係最明顯嘅攻擊目標,直接用 root login 等於送俾人撞。建立一個普通 user account,用 sudo 提權。

# /etc/ssh/sshd_config
PermitRootLogin no

# 建立管理員 account
sudo useradd -m -s /bin/bash sysadmin
sudo usermod -aG sudo sysadmin
sudo passwd sysadmin

之後所有操作先用 sysadmin login,需要 root 權限時先 sudo。咁樣就算 attacker 撞到你個 sysadmin 密碼,都仲要過 sudo 嗰關。


第 3 招:只允許金鑰認證,禁用密碼登入

呢個係最重要嘅一招。密碼登入本身就係一個漏洞——人可以揀弱密碼、可以俾人 phishing、可以被暴力破解。SSH key pair 係數學上近乎不可能被破解嘅。

# /etc/ssh/sshd_config
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no

# 如果你想保留某啲 user 可以用密碼(強烈不建議):
# Match User legacy_user
#     PasswordAuthentication yes

喺你呢邊 generate key pair:

ssh-keygen -t ed25519 -C "your_email@example.com"
ssh-copy-id -p 54321 sysadmin@your-server.com

💡 小T貼士:用 ed25519 而唔係 RSA——佢更快、更短、更安全,現代 OpenSSH 全部支援。


第 4 招:限制可以登入嘅 User

唔好俾所有人都可以 SSH 入嚟。白名單模式永遠好過黑名單。

# /etc/ssh/sshd_config
AllowUsers sysadmin deployer
# 或者用 group
AllowGroups sshusers

咁樣就算有人 create 咗個奇怪嘅 account,佢都 SSH 唔到入去。


第 5 招:Fail2Ban 自動封鎖可疑 IP

就算你改咗 port、disable 咗密碼,都仲係會有人試。Fail2Ban 會 monitor log,自動 ban 走多次失敗嘅 IP。

# Debian/Ubuntu
sudo apt install fail2ban -y

# 建立 local config
sudo tee /etc/fail2ban/jail.local <<EOF
[sshd]
enabled = true
port = 54321
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
findtime = 600
EOF

sudo systemctl enable fail2ban --now

上面 config 意思:10 分鐘內失敗 3 次就 ban 24 小時。你可以根據需要調整。


第 6 招:用 TCP Wrappers 做最後防線

雖然 TCP Wrappers 比較 old school,但喺關鍵 server 度加多一層冇壞。

# /etc/hosts.allow
sshd: 192.168.1.0/24, 10.0.0.0/8

# /etc/hosts.deny
sshd: ALL

只允許 internal network 或者你 office 嘅 IP range。


第 7 招:閒置 Timeout,自動斷線

有冇試過 SSH 入 server 之後行開咗食飯,返嚟個 session 仲通?呢個係安全風險——如果有人行過你部機…

# /etc/ssh/sshd_config
ClientAliveInterval 300
ClientAliveCountMax 2

300 秒(5 分鐘)冇反應就斷。如果你需要長時間 run script,用 tmuxscreen 啦。


第 8 招:限制 SSH 嘅 Cipher 同 Algorithm

唔好俾 server 用啲過時、脆弱嘅 encryption。只保留現代 cipher:

# /etc/ssh/sshd_config
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512

第 9 招:Audit Logging——知邊個做過咩

安全唔單止係防禦,仲要係事後追溯。將 SSH log 級別提高:

# /etc/ssh/sshd_config
LogLevel VERBOSE

咁樣每次 login、logout、command execution attempt 都會記錄。配合 auditd 更好:

sudo apt install auditd -y
sudo auditctl -w /etc/ssh/sshd_config -p wa -k sshd_config_change

第 10 招:定期 Scan 自己

最後,定期用工具 scan 下自己嘅 SSH config,確保冇遺漏:

# 用 ssh-audit 檢查
pip install ssh-audit
ssh-audit -p 54321 your-server.com

# Lynis 全面安全審計
sudo apt install lynis -y
sudo lynis audit system --tests-from-group ssh

ssh-audit 會列出你 server 支援咩 algorithm、有咩潛在弱點,非常實用。


總結:懶人 Checklist

一口氣做齊佢:

  1. ✅ 改 SSH port(唔係 22,唔係 2222)
  2. ✅ 禁用 root login
  3. ✅ 只用 SSH key,禁用密碼
  4. ✅ AllowUsers / AllowGroups 白名單
  5. ✅ Fail2Ban 自動封鎖
  6. ✅ TCP Wrappers 限制來源 IP
  7. ✅ ClientAliveInterval timeout
  8. ✅ 限制 cipher 只用 modern algorithm
  9. ✅ VERBOSE logging + auditd
  10. ✅ 定期 ssh-audit / Lynis 自檢

做齊以上 10 招,你部 server 嘅 SSH 安全性已經超越市面上 95% 嘅 server。當然,保安係一個持續嘅過程,冇「做完就永世安全」呢回事。記住定期 review,定期更新。

下次再同大家探討其他實用 topic,例如 Docker security hardening 定係 Kubernetes RBAC 設定。有咩想睇嘅就留個言話我知啦!😎