《远程访问安全加固策略》
第3章 SSH服务端加固

3、SSH服务端加固:禁用root登录、修改默认端口、使用密钥认证

SSH(Secure Shell)是远程管理Linux服务器的核心通道,但默认配置往往存在严重安全隐患。本课程将系统讲解三项最关键的加固措施:禁用root直接登录、修改默认22端口以及强制使用密钥认证。这三项措施如同为服务器安装了三把安全锁,能有效抵御暴力破解、端口扫描和权限提升攻击。

SSH 服务端三层安全加固架构 第一层 禁用root登录 阻止超级管理员 直接远程登录 PermitRootLogin no 第二层 修改默认端口 避开自动化扫描 减少攻击面 Port 2222 第三层 密钥认证 非对称加密验证 杜绝密码泄露 PubkeyAuthentication yes 三层防护叠加,构建纵深防御体系

3.1 禁用root直接登录

root账户拥有系统最高权限,直接使用root进行SSH登录是极其危险的行为。攻击者一旦通过暴力破解获取root密码,即可完全控制服务器。正确的做法是:使用普通用户登录,再通过sudo提权。

配置项 推荐值 说明
PermitRootLogin no 禁止root直接SSH登录
PermitRootLogin prohibit-password 仅允许密钥登录root(次优方案)

配置步骤:

  1. 使用普通用户登录服务器
  2. 编辑SSH配置文件:sudo vim /etc/ssh/sshd_config
  3. 找到 #PermitRootLogin yes,修改为 PermitRootLogin no
  4. 重启SSH服务:sudo systemctl restart sshd
# 修改前
#PermitRootLogin yes

# 修改后
PermitRootLogin no
登录方式对比:root直连 vs 普通用户+sudo ❌ root直连(危险) 攻击者直接暴力破解root密码 一旦破解,服务器完全沦陷 风险等级:高 ✅ 普通用户+sudo(安全) 先破解普通用户密码 再通过sudo提权,多一层防护 风险等级:低 →

3.2 修改默认SSH端口

SSH默认监听22端口,全球自动化扫描工具会优先扫描该端口。修改为高位端口(如2222、10022等)可以有效避开90%以上的自动化攻击。

端口范围 推荐用途 说明
1024-49151 SSH服务端口 建议选择5000以上的端口
49152-65535 动态/私有端口 也可使用,但需注意防火墙规则

配置步骤:

  1. 编辑配置文件:sudo vim /etc/ssh/sshd_config
  2. 找到 #Port 22,修改为 Port 2222(或其他端口)
  3. 配置防火墙放行新端口:sudo ufw allow 2222/tcp
  4. 重启SSH服务:sudo systemctl restart sshd
  5. 重要:保持原22端口会话不退出,另开终端测试新端口连接成功后再关闭旧会话
# 修改前
#Port 22

# 修改后
Port 2222

# 防火墙放行
sudo ufw allow 2222/tcp
sudo ufw reload
端口扫描命中率对比 端口 22(默认) 扫描命中率:98% 几乎所有扫描器都会扫描22端口 端口 2222(自定义) 扫描命中率:<5% 自动化扫描器很少扫描高位端口

3.3 使用密钥认证

密码认证存在被暴力破解、中间人窃听等风险。密钥认证采用非对称加密(RSA/Ed25519),安全性远高于密码认证。推荐使用Ed25519算法,兼顾安全性与性能。

认证方式 安全性 便捷性 推荐场景
密码认证 ⭐ ⭐⭐⭐ 仅用于临时访问
RSA密钥(4096位) ⭐⭐⭐⭐ ⭐⭐⭐⭐ 兼容性要求高时使用
Ed25519密钥 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 强烈推荐

配置步骤:

  1. 客户端生成密钥对:ssh-keygen -t ed25519 -C "your_email@example.com"
  2. 复制公钥到服务器:ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip -p 2222
  3. 服务器端配置:编辑 /etc/ssh/sshd_config,确保以下配置生效
  4. 重启SSH服务:sudo systemctl restart sshd
# 服务器端 sshd_config 关键配置
PubkeyAuthentication yes          # 启用密钥认证
PasswordAuthentication no         # 禁用密码认证(重要!)
ChallengeResponseAuthentication no # 禁用挑战响应认证
UsePAM no                         # 禁用PAM认证(可选)

# 客户端生成密钥
ssh-keygen -t ed25519 -C "admin@example.com"

# 复制公钥到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.168.1.100 -p 2222
SSH密钥认证流程 客户端 持有私钥 服务器 持有公钥 ① 发起连接请求 ② 发送随机挑战(用公钥加密) ③ 用私钥解密挑战,返回响应 ④ 验证通过,建立安全连接 ✅ 认证成功

3.4 综合加固检查清单

完成上述三项加固后,建议使用以下清单进行验证:

  • 禁用root登录:尝试 ssh root@server_ip,应被拒绝
  • 端口修改:使用 nmap -p 22 server_ip 确认22端口关闭
  • 密钥认证:尝试使用密码登录,应被拒绝
  • 防火墙规则:确认新端口已放行,旧端口已关闭
  • 日志检查:查看 /var/log/auth.log 确认无异常登录尝试
# 验证命令汇总
# 1. 测试root登录(应失败)
ssh root@server_ip -p 2222

# 2. 测试密码认证(应失败)
ssh user@server_ip -p 2222 -o PreferredAuthentications=password

# 3. 测试密钥认证(应成功)
ssh user@server_ip -p 2222 -i ~/.ssh/id_ed25519

# 4. 查看SSH日志
sudo tail -f /var/log/auth.log | grep sshd
SSH安全加固效果对比 加固前 ❌ root可直接登录 ❌ 默认22端口暴露 ❌ 仅使用密码认证 安全评分:20/100 加固后 ✅ 禁用root登录 ✅ 修改为高位端口 ✅ 强制密钥认证 安全评分:95/100 →

💡 核心要点:SSH服务端加固是服务器安全的第一道防线。禁用root登录切断最高权限入口,修改默认端口规避自动化扫描,密钥认证杜绝密码泄露风险。三项措施缺一不可,建议在服务器初始化时立即实施。