本系列:SSH 安全加固实战(共 5 篇) ① 为什么你的 SSH 正在裸奔 → ② 先读懂配置文件再动手(本篇) → ③ 用密钥认证告别密码 → ④ 限制谁能登录、从哪里登录 → ⑤ 防暴力破解与安全审计

第 1 篇我们确认了"门是裸的"。很多人这时候会急着改配置,结果改错直接把自己锁在门外。这篇先打地基:配置文件在哪、每个关键开关什么意思、以及怎么改才能万无一失地不锁死自己。最后给一份可直接套用的安全基线。

两套配置别搞混

Linux 上有两套 SSH 配置,新手极易混淆:

文件作用对象服务器路径示例
ssh_config控制本机作为客户端出去连接别人/etc/ssh/ssh_config
sshd_config控制本机作为服务端接受别人连进来/etc/ssh/sshd_config

我们要加固的是被连进来的那一侧,也就是服务端,所以一切改动都对着 sshd_config

提示框:sshd_config 不一定在 /etc/ssh/,可先定位。Debian/Ubuntu 通常就在 /etc/ssh/sshd_config;想确认服务实际用的配置文件,可执行 sshd -T(下方会讲)。

读懂关键指令

用编辑器打开配置文件(这里用 sudo + 编辑器,Ubuntu 可用 nano,RHEL 系常配 vim):

sudo vim /etc/ssh/sshd_config    # RHEL/CentOS/Rocky 常用 vim
sudo nano /etc/ssh/sshd_config   # Debian/Ubuntu 若偏好 nano

下面逐条看这些"命门"开关:

Port 22                                  # 监听端口,默认 22(改端口利弊见第 4 篇)
PermitRootLogin prohibit-password        # 是否允许 root 直接登录
PasswordAuthentication yes               # 是否允许密码登录
PubkeyAuthentication yes                 # 是否允许公钥登录

逐一解释:

  • Port:监听端口。默认 22,是扫描器的头号目标。
  • PermitRootLogin:控制 root 能否 SSH 登录。yes=允许任意方式、prohibit-password=仅允许密钥(禁止密码)、no=禁止 root 直登(推荐,改用 sudo)。永远别开成 yes
  • PasswordAuthentication:是否允许密码登录。破解就是冲它来的,用密钥后应改为 no(第 3 篇详解)。
  • PubkeyAuthentication:是否接受公钥登录,建议保持 yes

提示框:版本差异——prohibit-password 是新版 OpenSSH 写法,老版本用 without-password,含义相同(仅密钥)。写 noprohibit-password 通常都安全。

关键一步:别"锁死"自己

SSH 是服务器唯一入口,改配置时最怕的是:systemctl restart ssh 后连不上,人又不在机房。正确的安全改法分四步:

第 1 步:先开一个"逃生会话"并保持登录

改动前,先保留一个已登录的终端窗口不要关。一旦配置出问题,至少还有一个活着的会话能救命。

第 2 步:只改你懂的,一次只改一点

不要一次堆十处改动。每改一处、验证一处、回退容易。

第 3 步:改完先校验语法,再重载而不是重启

sshd 自带语法检查,改完先跑:

sudo sshd -t        # 语法正确无输出;有错会打印具体行号

提示框:Debian 系 sshd -t 可能需要 sudo /usr/sbin/sshd -t;RHEL 系通常直接 sshd -t。若提示找不到 sshd,用 which sshd 或发行版的完整路径。

语法 OK 后,用重载(reload)而非重启(restart)。重载不中断已建立的会话,只是让新连接用新配置:

# Debian / Ubuntu
sudo systemctl reload ssh

# RHEL / CentOS / Rocky
sudo systemctl reload sshd

# 老系统(无 systemd)可尝试
sudo service ssh reload     # 或 service sshd reload

提示框:服务名差异——Debian/Ubuntu 服务名是 ssh,RHEL/CentOS/Rocky 是 sshd。不确定时 systemctl list-units | grep -i ssh 看一眼真实名字。若没有 systemd(很老的发行版),用 service sshd reload

第 4 步:别关逃生门,另开一个窗口测试新配置

保持逃生会话,另开一个终端用新配置连一次。确认能连上、且用的是你想要的方式(比如密钥)后,才考虑是否关闭逃生会话。

黄金法则:改动某开关并成功验证前,永远不要关闭你手里最后一条已登录会话。

直接可套用的安全基线

把下面这段追加或合并到 sshd_config 尾部(可先注释掉 PasswordAuthentication,第 3 篇配好密钥再放开 no):

# ---- 安全基线(结合后续文章逐步启用)----
PermitRootLogin prohibit-password   # 禁止 root 用密码直登,后续可改 no
PubkeyAuthentication yes
PasswordAuthentication no           # 先配好密钥再启用,见第 3 篇
ChallengeResponseAuthentication no  # 禁用额外的密码挑战

提示框:务必配合第 3 篇——在你确认能用密钥登录之前,别把 PasswordAuthentication 设成 no,否则会把自己关在门外。这也是为什么前面强调"逃生门 + 另开会话验证"。

本篇小结

  • 加固改的是 /etc/ssh/sshd_config(服务端),不是 ssh_config(客户端)。
  • 关键开关:PortPermitRootLoginPasswordAuthenticationPubkeyAuthentication
  • 安全改配置四步:留逃生会话 → 一次改一点 → sshd -t 校验 → systemctl reload + 另开会话测试。
  • prohibit-password 新旧版本写法有差异,systemd reload vs service、服务名 ssh vs sshd 因发行版而异。

下一篇预告

你已经能安全地改配置了。第 3 篇进入全系列最关键的一步:生成密钥对、用密钥登录、彻底关掉密码登录。这是告别爆破最有效的手段。

现在可以先按本篇基线配置里可安全启用的项(root 禁止密码、保持密钥开启)改起来,记得留好逃生会话。我们下一篇见。