VPS 安全加固
安全加固是 VPS 运维中最容易被忽视但最重要的环节之一。一台暴露在公网上的服务器,从上线的那一刻起就会面临来自全球的扫描和攻击。本文将系统性地介绍 VPS 安全加固的核心实践。
威胁模型概述
了解你面对的威胁,才能有针对性地防御。一台普通 VPS 通常面临以下类型的攻击:
| 攻击类型 | 说明 | 严重程度 |
|---|---|---|
| SSH 暴力破解 | 自动化脚本不断尝试登录你的服务器 | 高 |
| 端口扫描 | 扫描开放端口,寻找可利用的服务 | 中 |
| DDoS 攻击 | 大量流量淹没你的服务器,导致服务不可用 | 高 |
| 应用层漏洞利用 | 利用你部署的服务中的安全漏洞入侵 | 高 |
| 供应链攻击 | 通过被篡改的软件包或脚本植入后门 | 中 |
| 社会工程 | 通过钓鱼、欺骗等手段获取你的服务器访问权限 | 中 |
SSH 深度加固
基础部署 中已经介绍了 SSH 的基本加固。这里进一步深入:
使用证书认证(高级)
除了传统的 SSH Key 认证,还可以使用 SSH 证书进行更精细的访问控制:
# 生成 CA 密钥对
ssh-keygen -t ed25519 -f /etc/ssh/ca_key -C "SSH CA"
# 用 CA 签发用户证书(有效期 30 天)
ssh-keygen -s /etc/ssh/ca_key -I user_name -n yourname -V +30d id_ed25519.pub
在 SSH 配置中启用证书认证:
# /etc/ssh/sshd_config
TrustedUserCAKeys /etc/ssh/ca_key.pub
端口敲门(Port Knocking)
端口敲门可以隐藏 SSH 端口,只有在"敲"了正确序列的端口后,SSH 端口才会开放:
# 安装 knockd
sudo apt install -y knockd
# 配置 /etc/knockd.conf
[options]
UseSyslog
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /usr/sbin/ufw allow from %IP% to any port 2222
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /usr/sbin/ufw delete allow from %IP% to any port 2222
tcpflags = syn
使用时,先"敲门"再连接:
knock 你的服务器IP 7000 8000 9000
ssh yourname@你的服务器IP -p 2222
内核安全参数
通过内核参数增强网络安全性:
sudo vim /etc/sysctl.d/99-security.conf
添加以下内容:
# 防止 IP 欺骗
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 忽略 ICMP 广播请求(防止 Smurf 攻击)
net.ipv4.icmp_echo_ignore_broadcasts = 1
# 禁用 ICMP 重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# 启用 TCP SYN Cookie(防止 SYN Flood)
net.ipv4.tcp_syncookies = 1
# 禁用 IP 转发(如果不做路由器用途)
# 注意:如果你需要运行代理服务或 Docker,可能需要启用 IP 转发
# net.ipv4.ip_forward = 0
# 记录可疑的数据包
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# 增强 TIME-WAIT 回收
net.ipv4.tcp_tw_reuse = 1
# IPv6 安全设置(如果不使用 IPv6,可以禁用)
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
使配置生效:
sudo sysctl -p /etc/sysctl.d/99-security.conf
入侵检测
文件完整性监控
使用 AIDE(Advanced Intrusion Detection Environment)监控关键文件的变化:
# 安装 AIDE
sudo apt install -y aide
# 初始化数据库
sudo aideinit
# 复制数据库
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# 手动检查
sudo aide --check
设置定时任务自动检查:
# 每天凌晨 3 点检查一次
echo "0 3 * * * root /usr/bin/aide --check | mail -s 'AIDE Report' your_email@example.com" | sudo tee /etc/cron.d/aide-check
实时日志监控
使用 logwatch 自动分析日志并发送报告:
sudo apt install -y logwatch
# 测试运行
sudo logwatch --detail High --mailto your_email@example.com --range today
应用安全
使用 Docker 隔离服务
将服务容器化可以有效限制攻击面:
# Docker 安全最佳实践
# 1. 不要使用 root 用户运行容器
# 2. 限制容器资源
# 3. 使用只读文件系统
docker run -d \
--name my-service \
--user 1000:1000 \
--memory="256m" \
--cpus="0.5" \
--read-only \
--restart=always \
my-image
HTTPS 与 TLS 配置
所有对外暴露的 Web 服务都应使用 HTTPS:
# 使用 Certbot 自动获取 Let's Encrypt 证书
sudo apt install -y certbot
sudo certbot certonly --standalone -d yourdomain.com
# 设置自动续签
sudo systemctl enable certbot.timer
应急响应
如果你怀疑服务器已经被入侵,立即执行以下步骤:
- 不要恐慌——冷静地收集证据
- 检查登录记录:
last和lastb查看登录历史 - 检查异常进程:
ps aux和top查找可疑进程 - 检查网络连接:
ss -tulnp或netstat -tulnp查看异常连接 - 检查定时任务:
crontab -l和/etc/cron*/目录 - 检查 SSH 密钥:确认
~/.ssh/authorized_keys中没有未知的公钥 - 检查系统用户:
cat /etc/passwd查找异常用户 - 保存日志:将
/var/log/下的关键日志备份到本地
如果确认被入侵:
- 立即更改所有密码和 SSH Key
- 从干净的镜像重新部署(不要在被入侵的系统上做修复)
- 分析入侵途径,修补安全漏洞
- 检查是否有数据泄露
安全检查清单
定期(建议每月一次)进行以下安全检查:
- [ ] 系统和软件包已更新到最新版本
- [ ] 没有异常的用户账号
- [ ] SSH 配置没有被修改
- [ ] 防火墙规则符合预期
- [ ] Fail2Ban 正常运行
- [ ] 没有异常的定时任务
- [ ] 磁盘使用量正常
- [ ] 网络流量没有异常
- [ ] TLS 证书未过期
- [ ] 备份正常执行