Root SSH 登录与 Key 登录配置

这篇适合用于把服务器 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/.ssh700
  • /root/.ssh/authorized_keys600

四、在 Termius 中改成 Key 登录

在 Termius 的 host 配置中:

  • Usernameroot
  • Authentication:选择 Key
  • Key:选择刚才生成的那把 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 可以登录,但不能用密码,只能用 key
  • PasswordAuthentication 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-passwordprohibit-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 no
  • pubkeyauthentication yes
  • permitrootlogin without-passwordprohibit-password
  • 22 端口正常监听
  • 防火墙已放行 22/tcp
  • /root/.ssh 权限为 700
  • authorized_keys 权限为 600

七、非常重要:不要先断开当前会话

修改 SSH 配置后,不要立刻关闭当前连接

正确顺序是:

  1. 保持当前已登录会话不断开
  2. 新开一个 Termius 窗口
  3. root + key 再登录一次
  4. 确认新连接成功后,再关闭旧会话

这样可以避免把自己锁在服务器外面。


八、如果只想 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 登录状态。

未分类

openclaw.json配置

2026-2-26 14:28:29

未分类

Debian 12 安装后必做的初始化命令清单

2026-4-5 22:18:41

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索