这篇适合用于把服务器 SSH 登录方式整理成更稳、更清晰的状态:先完成 root + key 登录接入,再收紧为仅允许公钥登录。
推荐最终状态
root 只允许 SSH key 登录;关闭密码认证;修改完配置后,先保留当前会话,再开新窗口测试成功后再断开旧连接。
目标
- 允许 root 通过 SSH 登录
- 使用 SSH key 登录 root
- 最终关闭密码登录
- 让服务器只接受 key 登录,减少被爆破风险
一、临时开放 root SSH 登录(过渡阶段)
如果当前还不能直接用 root + key 登录,通常需要先做一个过渡配置,把 root 登录临时打开,方便导入公钥并完成首次测试。
1)给 root 设置密码
sudo passwd root
2)确认当前 SSH 配置文件结构
先看系统是不是用了 sshd_config.d:
grep -n '^Include ' /etc/ssh/sshd_config
如果能看到类似:
Include /etc/ssh/sshd_config.d/*.conf
说明这台机器支持把自定义配置单独写到 /etc/ssh/sshd_config.d/ 目录中。
推荐使用这种方式,不要反复往 /etc/ssh/sshd_config 末尾追加配置。
3)写入临时过渡配置
创建一个单独的过渡配置文件:
sudo mkdir -p /etc/ssh/sshd_config.d && \ printf '%s\n' \ 'PermitRootLogin yes' \ 'PasswordAuthentication yes' \ 'PubkeyAuthentication yes' \ | sudo tee /etc/ssh/sshd_config.d/01-root-bootstrap.conf >/dev/null
这一步的含义是:
- 允许 root 登录
- 临时允许密码认证
- 允许公钥认证
注意:这只是过渡阶段。后面确认 key 登录成功后,要收紧配置,并删除这份过渡文件。
4)检查配置并重新加载 SSH
sudo sshd -t && sudo systemctl reload ssh
如果你的系统服务名是 sshd,则使用:
sudo sshd -t && sudo systemctl reload sshd
二、在 Termius 中生成 SSH key
建议在 Termius → Keychain 中新建一把密钥:
- 类型:
Ed25519
生成后你会得到:
- 私钥:保存在 Termius 中
- 公钥:一串以
ssh-ed25519开头的文本
例如:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI**********************MASKED********************** example@termius
三、把公钥写入 root 的 authorized_keys
1)创建 .ssh 目录并设置权限
sudo mkdir -p /root/.ssh sudo chmod 700 /root/.ssh
2)写入公钥
把你自己的公钥写进去。为了避免重复添加同一把 key,推荐这样写:
grep -qxF 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI**********************MASKED********************** example@termius' /root/.ssh/authorized_keys 2>/dev/null || echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI**********************MASKED********************** example@termius' | sudo tee -a /root/.ssh/authorized_keys >/dev/null sudo chmod 600 /root/.ssh/authorized_keys
3)验证权限
sudo cat /root/.ssh/authorized_keys sudo ls -ld /root/.ssh sudo ls -l /root/.ssh/authorized_keys
正确权限应为:
/root/.ssh→700/root/.ssh/authorized_keys→600
四、在 Termius 中改成 Key 登录
在 Termius 的 host 配置中:
Username:rootAuthentication:选择KeyKey:选择刚才生成的那把 key- 不要再保存密码
建议:
- 删除旧密码
- 或单独新建一个
root-key专用 host
五、确认 key 登录成功后,收紧 SSH 配置
当你已经成功测试 root + key 登录后,就可以把 SSH 收紧成“只允许 key 登录”的最终状态。
推荐做法:单独写一个最终配置文件
sudo mkdir -p /etc/ssh/sshd_config.d && \ printf '%s\n' \ 'PermitRootLogin prohibit-password' \ 'PasswordAuthentication no' \ 'PubkeyAuthentication yes' \ 'KbdInteractiveAuthentication no' \ | sudo tee /etc/ssh/sshd_config.d/99-hardening.conf >/dev/null
这四项的含义分别是:
PermitRootLogin prohibit-password:root 可以登录,但不能用密码,只能用 keyPasswordAuthentication no:禁止密码认证PubkeyAuthentication yes:允许公钥认证KbdInteractiveAuthentication no:禁止交互式密码认证
删除过渡配置文件
如果前面创建过 01-root-bootstrap.conf,此时建议把它删除,避免留下过渡配置:
sudo rm -f /etc/ssh/sshd_config.d/01-root-bootstrap.conf
检查并重新加载 SSH
sudo sshd -t && sudo systemctl reload ssh
或者:
sudo sshd -t && sudo systemctl reload sshd
六、验收:确认最终生效配置
只修改文件还不够,最好直接看最终生效值:
sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication|pubkeyauthentication|kbdinteractiveauthentication|port)\b'
理想输出应类似:
port 22 permitrootlogin without-password pubkeyauthentication yes passwordauthentication no kbdinteractiveauthentication no
说明:without-password 与 prohibit-password 在这里可以视为同义,表示 root 不允许密码登录。
同时检查 22 端口、防火墙和权限
echo '=== sshd effective config ===' && \ sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication|pubkeyauthentication|kbdinteractiveauthentication|port)\b' && \ echo && \ echo '=== port 22 listening ===' && \ (sudo ss -tlnp | grep ':22' || true) && \ echo && \ echo '=== firewall ===' && \ (sudo ufw status verbose 2>/dev/null || sudo firewall-cmd --list-all 2>/dev/null || echo 'No ufw/firewalld detected') && \ echo && \ echo '=== root ssh dir perms ===' && \ sudo ls -ld /root /root/.ssh /root/.ssh/authorized_keys 2>/dev/null && \ echo && \ echo '=== authorized_keys preview ===' && \ (sudo tail -n 3 /root/.ssh/authorized_keys 2>/dev/null || echo 'authorized_keys not found')
重点看这些结果:
passwordauthentication nopubkeyauthentication yespermitrootlogin without-password或prohibit-password- 22 端口正常监听
- 防火墙已放行
22/tcp /root/.ssh权限为700authorized_keys权限为600
七、非常重要:不要先断开当前会话
修改 SSH 配置后,不要立刻关闭当前连接。
正确顺序是:
- 保持当前已登录会话不断开
- 新开一个 Termius 窗口
- 用
root + key再登录一次 - 确认新连接成功后,再关闭旧会话
这样可以避免把自己锁在服务器外面。
八、如果只想 root 禁止密码,但普通用户仍允许密码
有些人希望:
- root:只能 key 登录
- 普通用户:仍允许密码登录
可以使用下面这个折中方案:
sudo mkdir -p /etc/ssh/sshd_config.d && \ printf '%s\n' \ 'PermitRootLogin prohibit-password' \ 'PasswordAuthentication yes' \ 'PubkeyAuthentication yes' \ 'KbdInteractiveAuthentication no' \ | sudo tee /etc/ssh/sshd_config.d/99-hardening.conf >/dev/null
如果前面创建过过渡文件,同样建议删掉:
sudo rm -f /etc/ssh/sshd_config.d/01-root-bootstrap.conf
效果是:
- root:不能密码登录,只能 key 登录
- 普通用户:仍可密码或 key 登录
注意:这种做法适合过渡期,但安全性低于“全员仅 key 登录”。
九、常见误区
1)把配置项当成 shell 命令执行
下面这种写法是错的:
PermitRootLogin prohibit-password
因为这不是 shell 命令,而是 sshd_config 配置项。
2)不断往 sshd_config 里追加配置
下面这种写法虽然短期能用,但不推荐长期使用:
echo 'PasswordAuthentication no' | sudo tee -a /etc/ssh/sshd_config
原因是多执行几次后会造成:
- 同一配置项重复很多次
- 前后值冲突
- 文件越来越乱
- 不容易判断最终哪条生效
更推荐的方式是:
- 使用
/etc/ssh/sshd_config.d/*.conf - 或者用脚本检测后改写已有项
3)修改后不检查语法
每次修改 SSH 配置后,先执行:
sudo sshd -t
4)只看文件内容,不看最终生效值
有些系统会通过 /etc/ssh/sshd_config.d/*.conf 覆盖主配置。
所以除了看文件,还应执行:
sudo sshd -T
这样才能确认真正生效的配置。
十、最终推荐状态
- root:只允许 key 登录
- 不允许任何密码 SSH 登录
- 防火墙只开放必要端口
- Termius 固定使用 key 认证
推荐配置如下:
PermitRootLogin prohibit-password PasswordAuthentication no PubkeyAuthentication yes KbdInteractiveAuthentication no
这套配置兼顾了:
- 使用顺手
- 远程连接稳定
- 安全性更高
- 降低密码爆破风险
一句话总结:先用过渡配置把 root + key 接入,确认可用后删掉过渡文件,再切到最终的仅 key 登录状态。