Linux 服务器 SSH 同时开启密码 + 密钥登录:root 用户完整配置指南
引言
管理 Linux 服务器时,SSH 是最重要的入口。通常你会选择「密码登录」或「密钥登录」其中一种。但有时候需要两者同时启用——比如:
- 服务器刚初始化,还没有配置密钥
- 密钥丢了,需要临时用密码登录应急
- 多人协作,有人用密码有人用密钥
今天这篇文章,手把手教你把 Linux 服务器的 root 用户配置成密码和密钥双重认证,两种方式都能登录,互不冲突。
一、为什么需要双重登录?
1.1 密钥登录的优势
- 安全性高:不怕暴力破解
- 便捷性:不需要每次输入密码
- 可审计:谁用什么密钥登录,一目了然
1.2 密码登录的必要性
- 刚入手新服务器,还没来得及配置密钥
- 密钥丢失/损坏时的紧急恢复通道
- 临时需要多人登录的协作场景
1.3 双重登录的价值
密钥优先匹配,密码兜底应急。既能享受密钥的便利,又保留密码作为紧急通道。
二、脚本原理解析
先来看完整脚本:
#!/bin/bash
set -e
# 备份原始配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d%H%M%S)
# 开启 SSH 核心配置
sed -i 's/^#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -i 's/^PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -i 's/^#PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^#PubkeyAuthentication.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^PubkeyAuthentication.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
# 创建目录并设置安全权限
mkdir -p /root/.ssh
chmod 700 /root/.ssh
# 生成 PEM 格式密钥
ssh-keygen -m PEM -t rsa -b 2048 -N "" -f /root/.ssh/id_rsa
# 写入授权
cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
chmod 600 /root/.ssh/id_rsa
chmod 644 /root/.ssh/id_rsa.pub
# 重启 SSH
systemctl restart sshd
下面逐步拆解。
三、第一步:备份配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d%H%M%S)
为什么要备份? SSH 配置改错一步,可能直接导致远程连不上服务器。加时间戳是为了保留多份备份,方便随时回滚到任意版本。
回滚命令:
cp /etc/ssh/sshd_config.bak.20260508120000 /etc/ssh/sshd_config
systemctl restart sshd
四、第二步:修改 SSH 核心配置
三个关键的配置项:
4.1 PermitRootLogin
sed -i 's/^#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -i 's/^PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
| 值 | 含义 |
|---|---|
yes | 允许 root 登录 |
no | 禁止 root 登录 |
prohibit-password | 仅允许密钥,禁止密码 |
without-password | 同上(旧语法) |
4.2 PasswordAuthentication
sed -i 's/^#PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
开启后,客户端可以用用户名+密码的方式登录。
4.3 PubkeyAuthentication
sed -i 's/^#PubkeyAuthentication.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^PubkeyAuthentication.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
大多数发行版默认是 yes,但显式写出来多一层保险。
注意:sed -i 使用了两个替换规则——第一个处理注释行(# 开头),第二个处理已生效的配置行。这样无论原文件里是注释还是实际配置,都能正确覆盖。
五、第三步:生成 PEM 格式 SSH 密钥
mkdir -p /root/.ssh
chmod 700 /root/.ssh
ssh-keygen -m PEM -t rsa -b 2048 -N "" -f /root/.ssh/id_rsa
参数拆解:
| 参数 | 含义 |
|---|---|
-m PEM | 生成 PEM 格式私钥,兼容性最好 |
-t rsa | 密钥类型 RSA(最通用) |
-b 2048 | 密钥长度,够用且生成快 |
-N "" | 私钥密码为空,不用每次输入 passphrase |
-f /root/.ssh/id_rsa | 私钥输出路径 |
为什么要用 PEM 格式? Windows 上常用的 Xshell、FinalShell、PuTTY 对 PEM 格式兼容性最好,直接导入就能用,不需要额外转换。
生成后立刻复制私钥到本地! 服务器上只保留公钥,私钥应该在本地保存一份。
六、第四步:配置文件权限(最容易踩的坑)
cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
chmod 600 /root/.ssh/id_rsa
chmod 644 /root/.ssh/id_rsa.pub
SSH 对文件权限要求极其严格,错了就会静默失败。
| 文件/目录 | 正确权限 | 说明 |
|---|---|---|
/root/.ssh/ | 700 | 仅本人可读写 |
authorized_keys | 600 | SSH 认证文件 |
id_rsa(私钥) | 600 | 私钥文件 |
id_rsa.pub(公钥) | 644 | 公钥文件 |
常见错误:如果 .ssh 目录权限是 755 或 775,SSH 会拒绝读取,登录直接失败且不会给明确提示。
七、第五步:重启 SSH 服务
systemctl restart sshd
重要提醒:
- 执行前确保当前 SSH 会话不要断开。开个新终端窗口测试确认能登录,再关闭当前会话。
- 建议操作前保持一个备用连接(比如控制台/VNC),万一配置出问题还有退路。
八、验证配置是否生效
grep -E "PermitRootLogin|PasswordAuthentication|PubkeyAuthentication" /etc/ssh/sshd_config
期望输出:
PermitRootLogin yes
PasswordAuthentication yes
PubkeyAuthentication yes
如果哪行没出现或值不对,手动检查 /etc/ssh/sshd_config。
九、客户端连接方式
9.1 密钥登录(Xshell / FinalShell)
- 新建连接 → 用户名填
root - 用户名-authentication 方法选择「Public Key」
- 导入私钥文件
id_rsa - 连接
9.2 密码登录
- 新建连接 → 用户名填
root - 用户名-authentication 方法选择「Password」
- 输入服务器 root 密码
- 连接
优先级:SSH 默认优先尝试密钥,如果密钥不匹配再尝试密码。所以两种方式同时开着,不会互相干扰。
十、安全加固建议
双重登录虽方便,但也带来了更大的攻击面。以下是生产环境的额外建议:
10.1 限制密码登录来源
# 编辑 sshd_config,添加:
echo "AllowUsers root@你的IP" >> /etc/ssh/sshd_config
这样只有特定 IP 才能用密码登录。
10.2 限制登录失败次数
# 添加以下行到 sshd_config
MaxAuthTries 3
防止暴力破解。
10.3 更换默认端口
# 把 Port 22 改成其他高位端口
sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config
减少自动化扫描的攻击。
10.4 生产环境建议
如果长期使用,建议关闭密码登录,只保留密钥:
sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart sshd
这样最安全。双重登录模式建议只在初始化阶段使用。
总结
通过修改 /etc/ssh/sshd_config 中的三个关键配置项,加上正确的密钥生成和权限设置,你已经成功让服务器 root 用户同时支持密码和密钥登录。
记住这个优先级:密钥优先 → 密码兜底。日常用密钥,紧急用密码,两不耽误。
操作前记得备份配置,操作后先开新窗口测试再关闭当前会话。安全第一,稳步推进。