# 1. 備份原配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# 2. 修改配置
vim /etc/ssh/sshd_config
# 找到 PermitRootLogin 行,改為:
PermitRootLogin no
# 若原行被註釋,直接新增一行
# 3. 重啟 SSH 服務
service sshd restart
# 或 systemctl restart sshd
驗證: 嘗試以 root 登入,應提示 Access denied 或 Permission denied。
vim /etc/ssh/sshd_config
# 保留原 22,新增新埠(例 7000)
Port 22
Port 7000
# 重啟
service sshd restart
Port 22 並重啟。# iptables 範例
iptables -A INPUT -p tcp --dport 7000 -j ACCEPT
service iptables save
# firewalld 範例
firewall-cmd --permanent --add-port=7000/tcp
firewall-cmd --reload
semanage port -a -t ssh_port_t -p tcp 7000
# 若提示 semanage 不存在:yum install policycoreutils-python
| 參數 | 建議值 | 說明 |
|---|---|---|
PermitRootLogin | no | 禁止 root 登入 |
Port | 22 + 非常用埠(如 7000) | 減少自動掃描噪音 |
Protocol | 2 | 僅允許 SSH v2 |
PermitEmptyPasswords | no | 禁止空密碼 |
PasswordAuthentication | no | 強制金鑰認證(需先部署金鑰) |
PubkeyAuthentication | yes | 啟用公鑰認證 |
MaxAuthTries | 3 | 限制嘗試次數 |
ClientAliveInterval | 300 | 保持連線心跳 |
ClientAliveCountMax | 2 | 心跳失敗次數 |
LoginGraceTime | 60 | 登入寬限秒數 |
AllowUsers | user1 user2@192.168.1.* | 白名單限制登入用戶/來源 |
DenyUsers | root daemon | 黑名單 |
# 客戶端生成金鑰對
ssh-keygen -t ed25519 -C "admin@company.com"
# 部署公鑰到目標主機
ssh-copy-id -p 7000 user@host
# 或手動
cat ~/.ssh/id_ed25519.pub | ssh -p 7000 user@host "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
# 測試免密登入
ssh -p 7000 user@host
| 場景 | 自救方法 |
|---|---|
| 改埠未開防火牆 | VNC/控制台/單用戶模式進入,開放埠、重啟 sshd |
| 改 PermitRootLogin no 但無普通用戶 | 單用戶模式建立普通用戶、加入 wheel、設定密碼/金鑰 |
| SELinux 阻擋新埠 | 單用戶模式執行 semanage port -a -t ssh_port_t -p tcp <新埠> |
| 配置語法錯誤導致 sshd 起不來 | sshd -t 測試配置;單用戶模式修正 |
雙埠過渡 + 防火牆/SELinux 同步 + 金鑰認證 + 白名單 是 SSH 硬化的標準組合拳。操作前務必確認擁有帶外管理入口(IPMI/IDRAC/VNC/控制台),並在生效前完成新埠實測,杜絕「一條指令鎖死自己」的慘劇。