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

阿里云上云采购季 2核2G云服务器99元/年 续费同价

你的云服务器上线第一天就可能被扫描、被爆破、被挖矿。本文总结 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 "[email protected]"

# 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' [email protected]" | 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% 的个人用户。但安全没有终点,保持警惕、持续维护才是关键。


关于作者

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

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

发表评论