云服务器安全加固指南:从端口配置到入侵检测的 12 个必做项


阿里云推广

云服务器安全加固指南:从端口配置到入侵检测的 12 个必做项

你的云服务器上线第一天就可能被扫描、被爆破、被挖矿。本文总结 12 个必须做好的安全加固项,帮你把服务器安全等级从”裸奔”提升到”铜墙铁壁”。

先看一组触目惊心的数据

根据某云厂商的安全报告,一台新上架的云服务器,平均 5 分钟内就会被自动化脚本扫描24 小时内会遭受超过 2000 次 SSH 爆破尝试。如果你还在用默认密码、开放着不必要的端口,被入侵只是时间问题。

本文覆盖从系统配置到入侵检测的 12 个关键环节,每一条都附带可直接执行的命令。


一、系统基础加固(4 项)

1. 禁用 root 远程登录

这是最基础也是最重要的一步。root 账号拥有最高权限,一旦被爆破成功,整个服务器就沦陷了。

操作步骤:

# 1. 先创建一个普通用户(如果还没有的话)
adduser deploy
usermod -aG sudo deploy

# 2. 为新用户配置 sudo 免密(可选)
echo "deploy ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/deploy

# 3. 切换到新用户,测试 sudo 权限
su - deploy
sudo whoami   # 应该输出 root

# 4. 修改 SSH 配置
sudo vim /etc/ssh/sshd_config

修改以下配置项:

# 禁止 root 远程登录
PermitRootLogin no

# 禁用空密码
PermitEmptyPasswords no

# 最大认证尝试次数(默认是 6,改为 3)
MaxAuthTries 3

# 登录超时时间(60 秒内未完成认证则断开)
LoginGraceTime 60
# 5. 重启 SSH 服务
sudo systemctl restart sshd

⚠️ 重要提醒:修改前确保你有其他方式可以登录服务器(比如云厂商控制台 VNC),否则配置错误会导致无法登录。


2. 配置 SSH 密钥登录 + 禁用密码认证

密码登录是 SSH 爆破的主要入口,改用密钥认证可以从根本上杜绝暴力破解。

本地生成密钥(在你的电脑上操作):

# 生成 4096 位的 RSA 密钥对
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

# Windows 用户可以用 Git Bash 或 PowerShell
# 密钥保存位置:~/.ssh/id_rsa(私钥)和 ~/.ssh/id_rsa.pub(公钥)

上传公钥到服务器:

# 方法一:使用 ssh-copy-id(推荐)
ssh-copy-id -i ~/.ssh/id_rsa.pub deploy@你的服务器IP

# 方法二:手动复制
cat ~/.ssh/id_rsa.pub | ssh deploy@你的服务器IP "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

# 方法三:如果禁用了密码登录,用云厂商控制台复制公钥到 ~/.ssh/authorized_keys

禁用密码认证:

sudo vim /etc/ssh/sshd_config
# 启用公钥认证
PubkeyAuthentication yes

# 禁用密码认证
PasswordAuthentication no

# 禁用键盘交互认证
ChallengeResponseAuthentication no
sudo systemctl restart sshd

3. 更改 SSH 默认端口

虽然改端口不能防止针对性攻击,但可以过滤掉 95% 以上的自动化扫描脚本。

# 修改 SSH 端口为 22222(或其他高位端口)
sudo vim /etc/ssh/sshd_config
Port 22222
# 更新防火墙规则
sudo firewall-cmd --permanent --add-port=22222/tcp
sudo firewall-cmd --reload

# SELinux 系统还需要额外操作
sudo semanage port -a -t ssh_port_t -p tcp 22222

# 重启 SSH
sudo systemctl restart sshd

# 之后登录命令改为
ssh -p 22222 deploy@你的服务器IP

4. 系统自动安全更新

保持系统补丁最新是安全的基础,手动更新容易忘记。

# Ubuntu/Debian
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

# CentOS/RHEL
sudo yum install yum-cron
sudo systemctl enable --now yum-cron

配置只更新安全补丁(Ubuntu):

sudo vim /etc/apt/apt.conf.d/50unattended-upgrades
# 只自动更新安全更新
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
    "${distro_id}ESMApps:${distro_codename}-apps-security";
    "${distro_id}ESM:${distro_codename}-infra-security";
};

# 自动重启(安全更新需要重启时)
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "03:00";

二、网络安全防护(4 项)

5. 配置防火墙规则(firewalld)

防火墙是最直接的网络访问控制手段。默认只开放必要的端口,其他全部拒绝。

# 确认防火墙状态
sudo systemctl enable --now firewalld

# 查看当前规则
sudo firewall-cmd --list-all

# 删除默认开放的 sshd 服务(如果我们改了端口)
sudo firewall-cmd --remove-service=ssh --permanent

# 只开放必要的端口
sudo firewall-cmd --permanent --add-port=22222/tcp    # SSH
sudo firewall-cmd --permanent --add-port=80/tcp        # HTTP
sudo firewall-cmd --permanent --add-port=443/tcp       # HTTPS
sudo firewall-cmd --permanent --add-port=3306/tcp      # MySQL(仅限内网IP)

# 限制 MySQL 只允许内网访问
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port port="3306" protocol="tcp" accept'

# 设置默认策略
sudo firewall-cmd --permanent --set-default-zone=public

# 重载生效
sudo firewall-cmd --reload

最小端口原则对照表:

服务 端口 是否对外开放 说明
—— —— ———— ——
SSH 22222 是(或限制IP) 管理入口
HTTP 80 Web 服务
HTTPS 443 Web 服务
MySQL 3306 **否** 仅内网
Redis 6379 **否** 仅内网
Prometheus 9090 **否** 仅内网
Grafana 3000 视情况 建议仅内网+VPN

6. 安装配置 Fail2Ban 防暴力破解

Fail2Ban 会自动监控日志文件,发现多次失败登录后自动封禁 IP。

# 安装
sudo apt install fail2ban   # Ubuntu/Debian
sudo yum install fail2ban   # CentOS/RHEL

# 创建本地配置(不修改默认配置文件)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vim /etc/fail2ban/jail.local
[DEFAULT]
# 封禁时间:2小时
bantime = 7200
# 在 10 分钟内失败 5 次就封禁
findtime = 600
maxretry = 5
# 封禁动作:防火墙 + iptables
banaction = firewallcmd-multiport

[sshd]
enabled = true
port = 22222
filter = sshd
logpath = /var/log/secure    # CentOS
# logpath = /var/log/auth.log  # Ubuntu
maxretry = 3
bantime = 86400    # SSH 尝试封禁 24 小时
# 启动 Fail2Ban
sudo systemctl enable --now fail2ban

# 查看被封禁的 IP
sudo fail2ban-client status sshd

# 手动解封某个 IP(慎用)
sudo fail2ban-client set sshd unbanip 1.2.3.4

7. 云安全组配置

云服务器的安全组是第一道防线,在云厂商控制台配置,优先级高于系统防火墙。

腾讯云 / 阿里云安全组推荐配置:

规则方向 协议 端口 来源 说明
——— —— —— —— ——
入站 TCP 22222 你的IP/32 SSH 限制来源 IP
入站 TCP 80 0.0.0.0/0 HTTP 全部放行
入站 TCP 443 0.0.0.0/0 HTTPS 全部放行
入站 TCP 3306 内网IP段 MySQL 仅内网
入站 ICMP 你的IP/32 Ping 限制来源
出站 全部 全部 0.0.0.0/0 出站默认全部放行
入站 全部 全部 0.0.0.0/0 **默认拒绝**

关键原则:

  • SSH 端口一定要限制来源 IP,不要对全量开放
  • 数据库端口(3306/6379/27017)**绝对不要**对公网开放
  • 安全组采用”默认拒绝 + 按需放行”的策略

  • 8. 关闭不必要的网络服务

    每多一个监听端口,就多一个攻击面。

    # 查看当前所有监听端口
    sudo ss -tulnp
    
    # 关闭不必要的服务示例
    # 关闭 IPv6(如果不使用)
    sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
    sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
    
    # 关闭 Avahi(mDNS,通常不需要)
    sudo systemctl disable --now avahi-daemon
    
    # 关闭 CUPS(打印服务,服务器通常不需要)
    sudo systemctl disable --now cups
    
    # 永久关闭写法
    echo "net.ipv6.conf.all.disable_ipv6 = 1" | sudo tee -a /etc/sysctl.conf
    echo "net.ipv6.conf.default.disable_ipv6 = 1" | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p

    三、入侵检测与日志审计(4 项)

    9. 安装入侵检测系统(Lynis)

    Lynis 是一个轻量级的安全审计工具,能扫描系统安全配置并给出改进建议。

    # 安装
    sudo apt install lynis   # Ubuntu/Debian
    sudo yum install lynis   # CentOS/RHEL
    
    # 执行全量安全扫描
    sudo lynis audit system
    
    # 输出示例:
    # -[ Lynis 3.0.9 Results ]-
    #
    # Tests performed: 285
    # Plugins loaded:   2
    #
    # Hardening index : 65 [############        ]
    # Tests performed: 285
    # 
    # 检测到的问题和建议会逐条列出...

    建议:每周执行一次 Lynis 扫描,跟踪安全指数变化。


    10. 配置系统日志审计

    配置 auditd 记录关键操作日志,便于事后追溯。

    # 安装
    sudo apt install auditd   # Ubuntu/Debian
    sudo yum install auditd   # CentOS/RHEL
    
    # 监控关键文件和目录的修改
    sudo auditctl -w /etc/passwd -p wa -k "passwd_changes"
    sudo auditctl -w /etc/shadow -p wa -k "shadow_changes"
    sudo auditctl -w /etc/sudoers -p wa -k "sudoers_changes"
    sudo auditctl -w /etc/ssh/sshd_config -p wa -k "ssh_config_changes"
    
    # 监控系统调用(监控谁执行了 su/sudo)
    sudo auditctl -a always,exit -F arch=b64 -S execve -F euid=0 -k "root_exec"
    
    # 查看审计日志
    sudo ausearch -k passwd_changes
    sudo ausearch -k root_exec
    
    # 永久规则写入配置文件
    sudo vim /etc/audit/rules.d/audit.rules
    # audit.rules 内容
    -w /etc/passwd -p wa -k passwd_changes
    -w /etc/shadow -p wa -k shadow_changes
    -w /etc/sudoers -p wa -k sudoers_changes
    -w /etc/ssh/sshd_config -p wa -k ssh_config_changes
    -a always,exit -F arch=b64 -S execve -F euid=0 -k root_exec

    11. 部署文件完整性监控(AIDE)

    AIDE(Advanced Intrusion Detection Environment)可以检测文件是否被篡改,是发现入侵的重要手段。

    # 安装
    sudo apt install aide   # Ubuntu/Debian
    sudo yum install aide   # CentOS/RHEL
    
    # 初始化数据库(首次运行,耗时较长)
    sudo aideinit
    
    # 将初始化数据库复制为参考基准
    sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
    
    # 检查文件完整性
    sudo aide --check
    
    # 定期检查(添加到 crontab)
    # 每天凌晨 3 点检查
    echo "0 3 * * * root /usr/bin/aide --check | mail -s 'AIDE Report' your_email@example.com" | sudo tee /etc/cron.d/aide-check
    
    # 更新基准数据库(修改系统后执行)
    sudo aide --update
    sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

    12. 设置登录告警通知

    让服务器在有人登录时自动通知你,第一时间发现异常访问。

    # 创建登录通知脚本
    sudo vim /etc/profile.d/login-notify.sh
    #!/bin/bash
    
    if [ -n "$SSH_CLIENT" ]; then
        IP=$(echo $SSH_CLIENT | awk '{print $1}')
        TIME=$(date "+%Y-%m-%d %H:%M:%S")
        
        # 获取地理位置(可选)
        # GEO=$(curl -s "http://ip-api.com/json/${IP}" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f\"{d['city']}, {d['country']}\")" 2>/dev/null || echo "未知")
        
        # 通过企业微信 Webhook 发送通知
        WEBHOOK_URL="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的KEY"
        MESSAGE="{\"msgtype\":\"text\",\"text\":{\"content\":\"⚠️ 服务器登录通知\\n用户: ${USER}\\nIP: ${IP}\\n时间: ${TIME}\\n主机: $(hostname)\"}}"
        
        curl -s -X POST "$WEBHOOK_URL" -H 'Content-Type: application/json' -d "$MESSAGE" > /dev/null 2>&1
    fi
    # 赋予执行权限
    sudo chmod +x /etc/profile.d/login-notify.sh

    12 项加固清单速查

    序号 加固项 优先级 预计耗时
    —— ——– ——– ———
    1 禁用 root 远程登录 🔴 最高 5 分钟
    2 SSH 密钥登录 + 禁用密码 🔴 最高 10 分钟
    3 更改 SSH 默认端口 🟡 高 5 分钟
    4 系统自动安全更新 🟡 高 5 分钟
    5 配置防火墙规则 🔴 最高 10 分钟
    6 安装 Fail2Ban 🔴 最高 10 分钟
    7 云安全组配置 🔴 最高 10 分钟
    8 关闭不必要服务 🟡 高 5 分钟
    9 安装 Lynis 安全扫描 🟢 中 15 分钟
    10 配置日志审计 🟡 高 10 分钟
    11 部署 AIDE 文件监控 🟢 中 15 分钟
    12 设置登录告警通知 🟢 中 10 分钟

    前 8 项必须做,后 4 项强烈建议做。 全部完成大约需要 2 小时


    加固后如何验证?

    完成所有配置后,用以下方法验证安全加固效果:

    # 1. 扫描开放端口(在你的电脑上执行,不是服务器上)
    nmap -sT -sV 你的服务器IP
    
    # 期望结果:只看到 80、443、22222 端口
    
    # 2. 尝试密码登录(应该被拒绝)
    ssh -p 22222 deploy@你的服务器IP
    # 应该提示:Permission denied (publickey)
    
    # 3. 尝试 root 登录(应该被拒绝)
    ssh -p 22222 root@你的服务器IP
    # 应该提示:Permission denied
    
    # 4. 查看防火墙规则
    sudo firewall-cmd --list-all
    
    # 5. 查看 Fail2Ban 状态
    sudo fail2ban-client status sshd
    
    # 6. 运行 Lynis 扫描
    sudo lynis audit system
    # 安全指数应该 > 60

    进阶:自动化安全巡检脚本

    如果有多台服务器,可以写一个简单的巡检脚本:

    #!/bin/bash
    # security_check.sh - 服务器安全巡检脚本
    
    echo "====== 安全巡检报告 ======"
    echo "时间:$(date)"
    echo "主机:$(hostname)"
    echo ""
    
    # 检查 root 登录是否禁用
    echo "[1] Root 远程登录:"
    if grep -q "^PermitRootLogin no" /etc/ssh/sshd_config; then
        echo "  ✅ 已禁用"
    else
        echo "  ❌ 未禁用(高危)"
    fi
    
    # 检查密码认证是否禁用
    echo "[2] 密码认证:"
    if grep -q "^PasswordAuthentication no" /etc/ssh/sshd_config; then
        echo "  ✅ 已禁用"
    else
        echo "  ❌ 未禁用(高危)"
    fi
    
    # 检查防火墙状态
    echo "[3] 防火墙状态:"
    if systemctl is-active --quiet firewalld; then
        echo "  ✅ 已启用"
    else
        echo "  ❌ 未启用"
    fi
    
    # 检查 Fail2Ban
    echo "[4] Fail2Ban:"
    if systemctl is-active --quiet fail2ban; then
        echo "  ✅ 已启用"
        BANNED=$(sudo fail2ban-client status sshd | grep "Banned IP" | grep -o "[0-9]*")
        echo "  当前封禁 IP 数:${BANNED}"
    else
        echo "  ❌ 未启用"
    fi
    
    # 检查 SSH 端口
    echo "[5] SSH 端口:"
    SSH_PORT=$(grep "^Port " /etc/ssh/sshd_config | awk '{print $2}')
    echo "  当前端口:${SSH_PORT:-22}"
    if [ "$SSH_PORT" = "22" ]; then
        echo "  ⚠️  仍为默认端口"
    fi
    
    # 检查监听端口
    echo "[6] 对外监听端口:"
    sudo ss -tulnp | grep LISTEN | awk '{print $4}' | sed 's/.*://' | sort -n | uniq

    总结

    安全加固不是一次性的事,而是一个持续的过程。建议建立以下安全运维习惯:

    1. 每月一次:Lynis 安全扫描 + AIDE 文件完整性检查

    2. 每周一次:检查 Fail2Ban 封禁日志,分析攻击趋势

    3. 每次部署后:确认防火墙规则没有被误改

    4. 安全补丁:保持系统自动更新,重大漏洞 24 小时内修复

    最后强调:12 项加固全部做完,你的服务器安全等级可以超过 90% 的个人用户。但安全没有终点,保持警惕、持续维护才是关键。


    关于作者

    长期关注大模型应用落地与云服务器实战,专注技术在企业场景中的落地实践。

    个人博客:yunduancloud.icu —— 持续更新云计算、AI大模型实战教程,欢迎访问交流。

    发表评论