云服务器安全加固指南:从端口配置到入侵检测的 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 | **默认拒绝** |
关键原则:
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大模型实战教程,欢迎访问交流。
