🔒 云服务器 SSH 安全加固完整指南

一、引言:为什么需要 SSH 加固

📖 关于本指南

这是一份通用的云服务器 SSH 安全加固指南,适用于 AWS、阿里云、腾讯云、华为云、DigitalOcean、Vultr、Linode 等主流云服务商。无论你使用哪家云平台,核心操作步骤都是相同的,唯一的区别在于云服务商控制台的界面和入口位置。

当你购买了一台云服务器,默认的 SSH 配置通常是「开箱即用」的,方便但不安全。每天,你的服务器都在遭受来自全球的暴力破解攻击。让我给你看一组触目惊心的数据:

# 默认端口 22 的服务器,一天内的登录尝试 $ sudo grep "Failed password" /var/log/secure | wc -l 3847 # 是的,近 4000 次暴力破解尝试!

默认配置的致命风险:

  • 🔐 端口暴露:22 端口是攻击者的「首选目标」,自动扫描脚本 7x24 小时在扫
  • 🔑 密码认证:弱密码、字典攻击、撞库...密码登录是最大安全隐患
  • 👤 Root 直连:允许 Root 直接登录?攻击者只需猜对密码就获得最高权限
  • 📊 无监控:被攻击了都不知道,等发现时可能已被植入挖矿木马

⚠️ 警告

如果你使用的是默认配置(端口 22 + 密码登录),你的服务器就像「家门大开」,只需一个弱密码就会沦陷。本指南将帮你从零开始,全面加固 SSH 安全。

二、环境信息

本指南基于以下环境,适用于各类云服务器:

🖥️ 服务器配置

  • 云服务商:AWS / 阿里云 / 腾讯云 / DigitalOcean / Vultr 等(本指南通用)
  • 操作系统:OpenCloudOS 9.4(兼容 CentOS/RHEL 9,Ubuntu/Debian 同样适用)
  • 公网 IP:你的服务器公网IP(示例,请替换为你的真实 IP)
  • SSH 版本:OpenSSH 8.7+

💡 提示

本指南是一份通用的云服务器 SSH 加固教程。不同云服务商的控制台界面略有差异,但核心操作步骤相同。如果你使用 Ubuntu/Debian,部分命令略有不同,我会特别标注。

三、SSH 安全加固步骤

3.1 准备工作:添加普通用户

永远不要用 Root 直接操作!先创建一个普通用户,赋予 sudo 权限:

# 创建新用户(替换 yourname 为你的用户名)
sudo adduser yourname

# 设置密码
sudo passwd yourname

# 添加到 wheel 组(RHEL/CentOS 系)
sudo usermod -aG wheel yourname

# Ubuntu/Debian 使用 sudo 组
# sudo usermod -aG sudo yourname

3.2 配置 SSH 密钥登录

步骤 1:在本地生成密钥对

在你的本地电脑上执行(不是服务器):

# 生成 ED25519 密钥(推荐,比 RSA 更安全、更短)
ssh-keygen -t ed25519 -C "your_email@example.com"

# 按提示操作:
# 1. 选择保存位置(默认 ~/.ssh/id_ed25519)
# 2. 设置密码短语(可选,增加安全性)
# 3. 确认

# 查看公钥(稍后需要)
cat ~/.ssh/id_ed25519.pub

🔐 为什么选择 ED25519?

  • 更短的密钥(68 字符 vs RSA 2048 的 372 字符)
  • 更快的签名/验证速度
  • 更强的安全性(128 位安全强度)
  • OpenSSH 6.5+ 原生支持

步骤 2:上传公钥到服务器

方法一:使用 ssh-copy-id(推荐)

# 本地执行(替换用户名和 IP)
ssh-copy-id -i ~/.ssh/id_ed25519.pub yourname@你的服务器公网IP

方法二:手动复制(如果没有 ssh-copy-id)

# 在服务器上执行
mkdir -p ~/.ssh
chmod 700 ~/.ssh

# 将本地公钥内容粘贴到 authorized_keys
nano ~/.ssh/authorized_keys

# 设置正确权限
chmod 600 ~/.ssh/authorized_keys

步骤 3:测试密钥登录

# 本地执行,测试是否能免密登录
ssh yourname@你的服务器公网IP

# 成功后,应显示类似:
# Last login: Wed Mar 18 20:00:00 2026 from xxx.xxx.xxx.xxx

⚠️ 重要:确认密钥登录成功再继续!

在禁用密码登录前,务必确认密钥登录正常工作。否则你可能永久失去服务器访问权限!

3.3 修改 SSH 端口

将默认端口 22 改为非常规端口,可以避开 99% 的自动化扫描:

# 编辑 SSH 配置文件
sudo nano /etc/ssh/sshd_config

# 找到并修改以下配置
# Port 22              → Port 22222
# PermitRootLogin yes  → PermitRootLogin no
# PasswordAuthentication yes → PasswordAuthentication no
# PubkeyAuthentication no    → PubkeyAuthentication yes

完整的加固配置示例:

# /etc/ssh/sshd_config 安全加固配置

# 网络设置
Port 22222                          # 非常规端口
AddressFamily inet                  # 仅 IPv4
ListenAddress 0.0.0.0               # 监听所有接口

# 认证设置
PermitRootLogin no                  # 禁止 Root 直接登录
PasswordAuthentication no           # 禁用密码认证
PubkeyAuthentication yes            # 启用密钥认证
AuthorizedKeysFile .ssh/authorized_keys

# 安全加固
MaxAuthTries 3                      # 最大认证尝试次数
MaxSessions 5                       # 最大会话数
LoginGraceTime 60                   # 登录超时(秒)
ClientAliveInterval 300             # 保活检测间隔
ClientAliveCountMax 2               # 保活检测次数

# 禁用不安全特性
X11Forwarding no                    # 禁用 X11 转发
AllowTcpForwarding no               # 禁用 TCP 转发
AllowAgentForwarding no             # 禁用 Agent 转发
PermitEmptyPasswords no             # 禁止空密码
PermitTunnel no                     # 禁用隧道

# 加密算法(可选,更严格)
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com

3.4 配置防火墙放行新端口

关键步骤!在重启 SSH 之前,必须先放行新端口!

# 检查 firewalld 状态
sudo systemctl status firewalld

# 如果未运行,启动并设置开机自启
sudo systemctl enable --now firewalld

# 放行新端口(先添加,再删除旧端口)
sudo firewall-cmd --permanent --add-port=22222/tcp

# 同时放行旧端口(防止配置错误导致无法连接)
sudo firewall-cmd --permanent --add-port=22/tcp

# 重载防火墙
sudo firewall-cmd --reload

# 查看已放行端口
sudo firewall-cmd --list-ports

3.5 配置云服务商安全组/防火墙

云服务器通常有双重防火墙:系统防火墙(firewalld/ufw)+ 云服务商安全组。两者都要配置!

☁️ 云服务商控制台操作步骤

不同云服务商的入口略有不同:

  • 阿里云:云服务器 ECS → 实例详情 → 安全组
  • 腾讯云:云服务器 CVM → 实例详情 → 安全组
  • AWS:EC2 → 实例 → Security Groups
  • DigitalOcean:Networking → Firewalls
  • Vultr:实例详情 → Firewall

通用配置步骤:

  1. 登录你的云服务商控制台
  2. 找到对应的服务器实例
  3. 进入「安全组」或「防火墙」设置
  4. 添加入站规则:
    • 协议:TCP
    • 端口:22222(你设置的新 SSH 端口)
    • 来源:0.0.0.0/0(或限制为你的 IP,更安全)
    • 策略:允许
  5. 保存后立即生效

💡 安全组最佳实践

如果你的 IP 是固定的(如公司网络、家庭宽带),强烈建议将来源设为你的 IP 地址,这样即使端口暴露,也只有你能连接。不同云服务商的安全组界面略有差异,但核心配置相同。

3.6 验证并重启 SSH

# 检查配置语法是否正确(必须无报错!)
sudo sshd -t

# 如果无输出,说明配置正确,可以重启
sudo systemctl restart sshd

# 查看服务状态
sudo systemctl status sshd

3.7 测试新配置

在关闭当前连接前,新开一个终端测试连接!

# 本地执行,指定新端口连接
ssh -p 22222 yourname@你的服务器公网IP

# 简化连接:编辑本地 ~/.ssh/config
# 添加以下内容:
Host myserver
    HostName 你的服务器公网IP
    Port 22222
    User yourname
    IdentityFile ~/.ssh/id_ed25519

# 之后只需
ssh myserver

3.8 清理:删除旧端口规则

确认新端口连接正常后,删除防火墙的 22 端口规则:

# 删除旧端口规则
sudo firewall-cmd --permanent --remove-port=22/tcp
sudo firewall-cmd --reload

# 确认
sudo firewall-cmd --list-ports
# 应只显示:22222/tcp

3.9 安装防护脚本(可选但推荐)

安装 Fail2ban 自动封禁暴力破解 IP:

# 安装 EPEL 仓库(RHEL/CentOS 系)
sudo dnf install -y epel-release

# 安装 Fail2ban
sudo dnf install -y fail2ban

# 创建 SSH 防护配置
sudo cat > /etc/fail2ban/jail.d/sshd.local << 'EOF'
[sshd]
enabled = true
port = 22222
filter = sshd
logpath = /var/log/secure
maxretry = 3
findtime = 600
bantime = 86400
EOF

# 启动服务
sudo systemctl enable --now fail2ban

# 查看封禁状态
sudo fail2ban-client status sshd

四、自动备份系统

安全加固后,定期备份关键配置和数据:

4.1 创建备份脚本

#!/bin/bash
# /usr/local/bin/backup-ssh-config.sh
# SSH 配置自动备份脚本

BACKUP_DIR="/root/ssh-backups"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30

# 创建备份目录
mkdir -p "$BACKUP_DIR"

# 备份 SSH 配置
tar -czf "$BACKUP_DIR/ssh-config-$DATE.tar.gz" \
    /etc/ssh/sshd_config \
    /root/.ssh \
    /etc/firewalld \
    /etc/fail2ban 2>/dev/null

# 清理旧备份
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete

# 记录日志
echo "[$(date)] SSH config backup completed: $BACKUP_DIR/ssh-config-$DATE.tar.gz" >> /var/log/ssh-backup.log

# 发送通知(可选)
# curl -X POST "https://your-webhook-url" -d "SSH backup completed: $DATE"

4.2 配置定时任务

# 添加执行权限
sudo chmod +x /usr/local/bin/backup-ssh-config.sh

# 配置每日凌晨 3 点执行
sudo crontab -e

# 添加以下行:
0 3 * * * /usr/local/bin/backup-ssh-config.sh

4.3 备份保留策略

📦 推荐的备份策略

  • 每日备份:保留 30 天,自动清理
  • 周备份:保留 12 周(约 3 个月)
  • 月备份:保留 12 个月
  • 异地备份:定期同步到对象存储(阿里云 OSS / 腾讯云 COS / AWS S3)或本地电脑

五、系统监控脚本

实时监控 SSH 登录状态,及时发现异常:

5.1 SSH 登录监控脚本

#!/bin/bash
# /usr/local/bin/ssh-monitor.sh
# SSH 安全监控脚本

LOG_FILE="/var/log/ssh-monitor.log"
ALERT_THRESHOLD=5  # 1 小时内失败次数阈值

# 检查最近的登录失败
FAILED_COUNT=$(grep "$(date '+%b %d')" /var/log/secure | \
    grep "Failed password" | \
    grep -v "$(date '+%H')" | wc -l)

# 检查今天的成功登录
SUCCESS_LOGINS=$(grep "$(date '+%b %d')" /var/log/secure | \
    grep "Accepted publickey" | \
    awk '{print $NF}' | sort | uniq -c | sort -rn)

# 记录状态
{
    echo "========================================"
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] SSH Monitor Report"
    echo "========================================"
    echo "Failed login attempts (last hour): $FAILED_COUNT"
    echo ""
    echo "Successful logins today:"
    echo "$SUCCESS_LOGINS"
    echo ""
    echo "Active SSH connections:"
    who | grep pts
    echo ""
} >> "$LOG_FILE"

# 告警(失败次数过多)
if [ "$FAILED_COUNT" -gt "$ALERT_THRESHOLD" ]; then
    echo "[ALERT] High failed login attempts detected: $FAILED_COUNT" >> "$LOG_FILE"
    # 发送告警通知(可选)
    # curl -X POST "your-webhook-url" -d "SSH Alert: $FAILED_COUNT failed attempts"
fi

# 显示 Fail2ban 封禁状态
if command -v fail2ban-client &> /dev/null; then
    echo "Fail2ban banned IPs:" >> "$LOG_FILE"
    fail2ban-client status sshd >> "$LOG_FILE" 2>&1
fi

5.2 配置定时监控

# 添加执行权限
sudo chmod +x /usr/local/bin/ssh-monitor.sh

# 每小时检查一次
sudo crontab -e

# 添加:
0 * * * * /usr/local/bin/ssh-monitor.sh

5.3 实时查看监控日志

# 查看最新监控报告
sudo tail -f /var/log/ssh-monitor.log

# 查看今天的登录失败
sudo grep "$(date '+%b %d')" /var/log/secure | grep "Failed"

# 查看最近登录成功的用户
sudo last -n 10

六、常用命令速查

6.1 SSH 连接命令

# 标准连接
ssh -p 22222 yourname@你的服务器公网IP

# 使用配置别名
ssh myserver

# 指定密钥文件
ssh -i ~/.ssh/id_ed25519 -p 22222 yourname@你的服务器公网IP

# SCP 传输文件
scp -P 22222 file.txt yourname@你的服务器公网IP:/home/yourname/

# SFTP 连接
sftp -P 22222 yourname@你的服务器公网IP

6.2 查看备份

# 列出所有备份
ls -la /root/ssh-backups/

# 查看备份内容
tar -tzf /root/ssh-backups/ssh-config-20260318.tar.gz

# 恢复备份
cd /
sudo tar -xzf /root/ssh-backups/ssh-config-20260318.tar.gz

# 查看 SSH 备份日志
sudo cat /var/log/ssh-backup.log

6.3 手动执行脚本

# 手动执行备份
sudo /usr/local/bin/backup-ssh-config.sh

# 手动执行监控
sudo /usr/local/bin/ssh-monitor.sh

# 查看防火墙状态
sudo firewall-cmd --list-all

# 查看 Fail2ban 状态
sudo fail2ban-client status sshd

# 手动解封 IP
sudo fail2ban-client set sshd unbanip 1.2.3.4

6.4 故障排查

# SSH 服务状态
sudo systemctl status sshd

# 查看 SSH 错误日志
sudo journalctl -u sshd -f

# 检查端口是否监听
sudo ss -tlnp | grep 22222

# 检查防火墙规则
sudo iptables -L -n | grep 22222

# 测试本地 SSH 连接(在服务器上执行)
ssh -p 22222 yourname@localhost

七、总结

恭喜你!完成以上步骤后,你的云服务器 SSH 安全已经达到了生产级别。本指南是一份通用的 SSH 加固方案,适用于:

  • ☁️ 主流云服务商:AWS、阿里云、腾讯云、华为云、DigitalOcean、Vultr、Linode 等
  • 🐧 主流 Linux 发行版:CentOS/RHEL/Rocky/AlmaLinux(使用 firewalld)、Ubuntu/Debian(使用 ufw)
  • 🏠 自建服务器:家庭实验室、NAS、树莓派等

让我们回顾一下做了什么:

✅ 完成的安全加固

  1. 端口隐蔽:22 → 22222,避开 99% 自动扫描
  2. 认证加固:禁用密码,仅允许密钥登录
  3. 权限隔离:禁止 Root 直连,使用 sudo 提权
  4. 防火墙:双重防护(系统 + 安全组)
  5. 入侵防御:Fail2ban 自动封禁
  6. 监控告警:实时监控登录状态
  7. 备份恢复:自动备份,定期清理

⚠️ 不要忘记

  • 定期更新系统和软件包:sudo dnf update
  • 定期检查备份是否正常
  • 监控日志,关注异常登录
  • 密钥文件妥善保管,不要泄露

如果这篇指南对你有帮助,欢迎分享给更多人。安全无小事,让我们一起守护服务器的安全!🔒

参考资料: