1.
概述與前提條件
先確認伺服器 OS(例如 Ubuntu 20.04 / CentOS 7/8)與 OpenSSH 版本(ssh -V)。假設你有多個 IP(eth0: 10.0.0.10, eth0:0 10.0.0.11),並且有 root 或可 sudo 的管理帳號。本篇以實務操作為主,不探討不切實際的理論。
2.
網路與多 IP 綁定檢查
使用 ip addr show 檢查是否已綁定多 IP。若未綁定,可用 ip addr add 10.0.0.11/24 dev eth0 或編輯 /etc/netplan/*.yaml(Ubuntu)或 /etc/sysconfig/network-scripts/ifcfg-eth0:0(CentOS)做永久設定,完成後 systemctl restart networking 或 network restart。
3.
啟用並限制 SSH 的監聽地址
編輯 /etc/ssh/sshd_config,加入 ListenAddress 針對每個 IP:例如 ListenAddress 10.0.0.10 和 ListenAddress 10.0.0.11。這樣可以讓 sshd 在多個 IP 上監聽,接著 systemctl reload sshd 使設定生效。
4.
針對不同 IP 設定不同安全策略(Match Address)
在 sshd_config 底部使用 Match Address,例如:Match Address 10.0.0.11 PasswordAuthentication no, PermitRootLogin no, AllowUsers deploy@10.0.0.11。注意 Match 的縮排與語法,要用 systemctl restart sshd 測試不會鎖死自己。
5.
建立與部署 SSH 公私鑰(金鑰認證)
本機產生:ssh-keygen -t ed25519 -C "user@workstation",不要加密 passphrase(或使用 agent 管理)。將公鑰上傳:ssh-copy-id -i ~/.ssh/id_ed25519.pub user@10.0.0.10。若要對多台 IP 批次上傳,可使用 for ip in 10.0.0.10 10.0.0.11; do ssh-copy-id -i ~/.ssh/id_ed25519.pub user@$ip; done。
6.
配置本地 SSH 客戶端管理多 IP 的連線
在 ~/.ssh/config 建立 Host 條目:Host srv-prod-10 HostName 10.0.0.10 User deploy IdentityFile ~/.ssh/id_ed25519 Port 22;Host srv-prod-11 HostName 10.0.0.11 ...。這樣可以用 ssh srv-prod-11 一鍵連線,便於站群操作。
7.
禁用密碼登入與強制金鑰(在安全測試完成後)
在 sshd_config 設定 PasswordAuthentication no、ChallengeResponseAuthentication no、UsePAM yes。先確保至少一個可用金鑰登入通道,再重啟 sshd,避免把自己鎖死。
8.
使用 SSH CA 統一簽發與撤銷金鑰(建議站群使用)
建立 CA:ssh-keygen -t ed25519 -f /root/ssh_ca,使用 ssh-keygen -s /root/ssh_ca -I id -n username -V +52w user.pub 來簽名。將 /root/ssh_ca.pub 放到伺服器 /etc/ssh/trusted_user_ca_keys,sshd_config 加入 TrustedUserCAKeys /etc/ssh/trusted_user_ca_keys。這樣可以統一發放到期的簽章與撤銷策略。
9.
檔案權限與 ACL 實作細則
使用 chmod 與 chown 管理基礎權限;對更細緻的需求 install acl(apt install acl 或 yum install libacl)。啟用檔案系統 ACL 後用 setfacl -m u:username:rwx /var/www/site 指派複雜權限,使用 getfacl 檢視。針對站群不同站點建立群組並給予群組權限。
10.
sudo 與最小權限原則(分工管理)
建立專用管理群組(sudo group):groupadd deploys && usermod -aG deploys deploy。使用 visudo 新增條目:%deploys ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/git pull。限定命令可以減少權限濫用。
11.
日誌、稽核與告警設定
在 sshd_config 設 LogLevel VERBOSE,並啟用 rsyslog 或 journald 集中蒐集 /var/log/auth.log。安裝 auditd 並設定 auditctl -w /etc/ssh/sshd_config -p wa -k sshcfg 來稽核設定變更,配合 Fail2Ban 阻擋暴力登入。
12.
大規模自動化:使用 Ansible 管理多 IP 站群
建立 inventory 檔案以 IP 列表分組,[web] 10.0.0.10 10.0.0.11。寫 playbook 做金鑰下發、sshd_config 修改、ACL 設定範例:ansible-playbook -i inventory.yml deploy-ssh.yml。測試時先在 --limit 指定單台驗證。
13.
金鑰輪替與撤銷流程(實務作法)
建立 key-rotation SOP:每 12 個月或離職時撤銷。若使用 SSH CA,撤銷只需不再簽發;若直接使用 authorized_keys,撰寫腳本比對白名單並批次移除舊公鑰。並在變更後通知運維與業務團隊。
14.
備援與備份設定檔(避免單點失敗)
定期備份 /etc/ssh/sshd_config、/etc/ssh/trusted_user_ca_keys、/home/*/.ssh/authorized_keys。可使用 rsync 同步至內網管理節點或用 Git(私有 repo,加密)管理設定檔,並建立 restore.sh 快速回復流程。
15.
問:如何在同一台伺服器對不同 IP 設定不同的 SSH 策略?
問:在同一台伺服器對不同 IP 設定不同 SSH 策略要怎麼做? 答:在 /etc/ssh/sshd_config 使用多個 ListenAddress 並搭配 Match Address 區塊,例如 Match Address 10.0.0.11 PasswordAuthentication no 並設定 AllowUsers,修改後 restart sshd 測試連線,避免把管理通道鎖死。
16.
問:站群如何統一管理大量主機的公鑰與撤銷?
問:站群大量主機的公鑰該如何統一管理與撤銷? 答:建議使用 OpenSSH CA:用 CA 簽發短期憑證,伺服器信任 CA 公鑰(TrustedUserCAKeys),透過簽章有效期控制存取,撤銷則停止簽發或縮短有效期。若不用 CA,則用自動化工具(Ansible)批次更新 authorized_keys 並保留變更紀錄。
17.
问:在台灣營運時需注意的合規或實務風險?
問:在台灣營運多 IP 站群與 SSH 管理,有哪些合規或實務注意事項? 答:注意個資與資料保存法規(若處理個資需控管存取紀錄)、遵循公司資安政策(MFA、金鑰輪替、存取最小權限),並確保跨地域備援與可用性,定期稽核日誌並保留必要的存取紀錄以備調查。
来源:SSH 与权限管理在台湾多IP站群服务器环境中的最佳实践