编程 Linux 服务器 SSH 同时开启密码 + 密钥登录:root 用户完整配置指南

2026-05-08 12:11:48 +0800 CST views 5

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_keys600SSH 认证文件
id_rsa(私钥)600私钥文件
id_rsa.pub(公钥)644公钥文件

常见错误:如果 .ssh 目录权限是 755775,SSH 会拒绝读取,登录直接失败且不会给明确提示。


七、第五步:重启 SSH 服务

systemctl restart sshd

重要提醒

  1. 执行前确保当前 SSH 会话不要断开。开个新终端窗口测试确认能登录,再关闭当前会话。
  2. 建议操作前保持一个备用连接(比如控制台/VNC),万一配置出问题还有退路。

八、验证配置是否生效

grep -E "PermitRootLogin|PasswordAuthentication|PubkeyAuthentication" /etc/ssh/sshd_config

期望输出:

PermitRootLogin yes
PasswordAuthentication yes
PubkeyAuthentication yes

如果哪行没出现或值不对,手动检查 /etc/ssh/sshd_config


九、客户端连接方式

9.1 密钥登录(Xshell / FinalShell)

  1. 新建连接 → 用户名填 root
  2. 用户名-authentication 方法选择「Public Key」
  3. 导入私钥文件 id_rsa
  4. 连接

9.2 密码登录

  1. 新建连接 → 用户名填 root
  2. 用户名-authentication 方法选择「Password」
  3. 输入服务器 root 密码
  4. 连接

优先级: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 用户同时支持密码和密钥登录。

记住这个优先级:密钥优先 → 密码兜底。日常用密钥,紧急用密码,两不耽误。

操作前记得备份配置,操作后先开新窗口测试再关闭当前会话。安全第一,稳步推进。

复制全文 生成海报 Linux SSH 服务器 安全 运维

推荐文章

浏览器自动播放策略
2024-11-19 08:54:41 +0800 CST
Redis函数在PHP中的使用方法
2024-11-19 04:42:21 +0800 CST
使用Vue 3和Axios进行API数据交互
2024-11-18 22:31:21 +0800 CST
Rust 高性能 XML 读写库
2024-11-19 07:50:32 +0800 CST
乐观锁和悲观锁,如何区分?
2024-11-19 09:36:53 +0800 CST
SQL常用优化的技巧
2024-11-18 15:56:06 +0800 CST
20个超实用的CSS动画库
2024-11-18 07:23:12 +0800 CST
解决python “No module named pip”
2024-11-18 11:49:18 +0800 CST
Python设计模式之工厂模式详解
2024-11-19 09:36:23 +0800 CST
Vue3中如何实现国际化(i18n)?
2024-11-19 06:35:21 +0800 CST
php strpos查找字符串性能对比
2024-11-19 08:15:16 +0800 CST
Boost.Asio: 一个美轮美奂的C++库
2024-11-18 23:09:42 +0800 CST
Rust 与 sqlx:数据库迁移实战指南
2024-11-19 02:38:49 +0800 CST
npm速度过慢的解决办法
2024-11-19 10:10:39 +0800 CST
开发外贸客户的推荐网站
2024-11-17 04:44:05 +0800 CST
JavaScript设计模式:组合模式
2024-11-18 11:14:46 +0800 CST
程序员茄子在线接单