服务器安全加固检查清单:从裸机到铜墙铁壁的深度防御体系
结论先行:服务器安全讲求纵深防御体系:网络层(UFW 限速 + Cloudflare 隐藏源站)、系统层(内核参数与权限隔离)、应用层(安全响应头 + 数据库最小权限)与监控层(自动化日志告警)层层互锁。必须把 P0 三件套(SSH 密钥禁用密码、Fail2ban、UFW 防火墙)执行到位,再补齐内核参数加固与 Nginx 安全头;2FA 与 Cloudflare 白名单按业务暴露面选用,即可阻断 99% 的全网自动化攻击与扫描爆破。
💡 真实教训:很多独立开发者的第一台 VPS 往往没做任何加固,上线第 3 天执行
top查看系统进程,就会发现异常进程(如kdevtmpfsi或xmrig)占满 100% CPU,沦为黑客的挖矿肉鸡。拿到 VPS 的第一要务不是急着部署业务,而是完整过一遍这套安全基线清单。
0、写在前面
在基础初始化阶段,通常已完成常规配置:Ed25519 密钥登录、关闭密码认证、启用 UFW 防火墙、配置 Fail2ban 防爆破。
但这仅仅是入门。为什么?
- 基础防火墙只能挡住盲目扫描:针对特定 API 路径或 slowloris 慢速连接攻击完全无能为力
- SSH 仅保护了管理入口:Web 应用框架、反向代理、数据库权限配置不当同样会被提权
- Fail2ban 属于事后被动防御:在黑客尝试数十次之后才触发封禁,存在时差窗口
- 缺乏告警监控相当于盲盒:系统被植入反弹 shell 或挖矿木马后很难第一时间察觉
服务器安全需要建立纵深防御体系(Defense in Depth):网络层、系统内核、应用中间件与审计监控多维协同。
1、期望目标与落地清单
本清单带你实现以下安全防护目标:
- [ ] 网络层进阶加固:配置 UFW 连接限速(Rate Limiting)、恶意网段阻断与 Cloudflare IP 严格白名单
- [ ] 系统内核参数防御:启用 SYN Cookie 抵御洪水攻击、开启反向路径验证(rp_filter)与核心转储禁用
- [ ] SSH 高度防护:升级 Ed25519 算法、配置 Google Authenticator 2FA 双因素与连接频率收紧
- [ ] 应用层安全基线:注入 HSTS、CSP 等安全响应头,禁用 PHP 高危函数,落实数据库最小权限
- [ ] 持续审计与自动化补丁:配置 Logwatch 每日简报、Unattended-Upgrades 安全热更新与 Lynis 安全审计
2、计划思考与防御模型
攻击面与防护手段对照
| 常见攻击方式 | 基础防护能否阻断 | 深度加固手段 |
|---|---|---|
| 全网随机暴力破解 SSH | ✅ 密钥认证可阻断 | 升级 Ed25519 密钥,加配 2FA |
| SYN Flood / 端口耗尽 | ❌ 基础防火墙会被打爆 | 内核开启 tcp_syncookies 与 tcp_synack_retries 优化 |
| IP 欺骗与源路由探测 | ❌ 默认放行 | 启用 rp_filter=1,关闭 accept_source_route |
| HTTP 应用层 CC / 慢速攻击 | ❌ 端口放行即透传 | UFW limit 模块 + Nginx limit_req_zone 限流 |
| 跨站脚本 (XSS) / 点击劫持 | ❌ 网络层无法识别 | 注入 X-Frame-Options 与 Content-Security-Policy |
| 已知 CVE 提权漏洞利用 | ❌ 不打补丁即失守 | 启用 unattended-upgrades 定时热修安全补丁 |
3、实战操作与配置速查
3.1 网络层:UFW 进阶与源站保护
1. 启用连接频次限制(Rate Limit)
1 | # 针对 SSH 端口(假设已改为非标准端口 2222)启用限速保护 |
2. 自定义 iptables 连接数与新建连接频次
若需要更细粒度的控制,编辑 /etc/ufw/before.rules,在 *filter 规则尾部(COMMIT 行之前)追加:
1 | # SSH 限速:单 IP 60 秒内最多发起 10 次握手请求,超出直接 DROP |
重载使规则生效:
1 | sudo ufw reload |
3. 严格仅允许 Cloudflare 回源(隐藏真实源站 IP)
当站点接入 Cloudflare CDN 后,源站必须封锁公网其他非 Cloudflare 来源的 80/443 请求,防止黑客绕过 WAF 直接打穿源站。
使用 ITTinker 开源的 cloudflare-ufw 工具实现全自动同步:
1 | # 下载并赋予执行权限 |
3.2 系统层:Linux 内核加固(sysctl)
编辑 /etc/sysctl.d/99-security.conf,将网络与内存安全参数固化到系统底层:
1 | # ============================================================================== |
加载生效:
1 | sudo sysctl -p /etc/sysctl.d/99-security.conf |
3.3 SSH 进阶防护:密钥算法与 2FA
1. 采用现代化 Ed25519 算法
淘汰过时的 RSA 2048 密钥,推荐在客户端生成抗量子计算攻击且计算性能更佳的 Ed25519 密钥对:
1 | ssh-keygen -t ed25519 -C "[email protected]" |
💡 快速加固:借助 ITTinker 开源的
ssh-key-setup脚本,可一键完成多台 VPS 的 Ed25519 密钥分发、权限收紧(chmod 700 ~/.ssh,chmod 600 authorized_keys)与别名映射。
2. 配置 Google Authenticator 双因素认证(2FA)
在具备超高保密要求的生产节点,建议开启“私钥 + 动态 6 位验证码”双因子验证:
1 | # 安装 PAM 模块 |
配置应答建议:
Make tokens on basis of time:yUpdate user .google_authenticator file:yDisallow multiple uses of the same token:yIncrease the time-skew window:nEnable rate-limiting:y
用手机端 Authenticator App 扫描终端打印的二维码。
修改 /etc/pam.d/sshd,在首部追加:
1 | auth required pam_google_authenticator.so nullok |
修改 /etc/ssh/sshd_config(或 /etc/ssh/sshd_config.d/99-security.conf):
1 | # 允许键盘交互式认证 |
测试验证无误后重载服务:
1 | sudo sshd -t && sudo systemctl reload sshd |
3.4 应用中间件安全:Nginx 与 PHP 加固
1. Nginx 生产安全响应头
在 /etc/nginx/conf.d/security-headers.conf 中统一配置,并在各 server 块中 include:
1 | # 严禁网站被放入 iframe,彻底杜绝点击劫持(Clickjacking) |
2. PHP-FPM 运行沙箱与高危函数禁用
编辑 php.ini(如 /etc/php/8.3/fpm/php.ini):
1 | # 禁用常见远程代码执行与提权函数 |
3.5 自动化审计与监控告警
1. 启用系统自动无感打安全补丁
1 | sudo apt install -y unattended-upgrades needrestart |
确认 /etc/apt/apt.conf.d/50unattended-upgrades 仅启用安全更新通道(${distro_id}:${distro_codename}-security)。
2. Lynis 安全基线定期扫描
1 | sudo apt install -y lynis |
Lynis 会输出系统 Hardening Index(安全加固指数)。对于独立开发者生产机,通常优化到 75~85 分即可兼顾极佳的安全防御与业务可用性。
4、加固核对清单与验证手册
| 防御层级 | 核心核对点 | 验证与检查命令 | 达标标准 |
|---|---|---|---|
| 网络层 | UFW 基础防火墙开启 | sudo ufw status numbered |
仅放行必要端口,默认策略全拦截 |
| 网络层 | UFW 限速模块生效 | grep LIMIT /var/log/ufw.log |
拦截记录可审计 |
| 网络层 | Cloudflare 白名单 | sudo ufw status | grep -i cloudflare |
80/443 仅允许 CF 边缘回源 |
| 系统层 | 内核 SYN Cookie | sysctl net.ipv4.tcp_syncookies |
输出 1 |
| 系统层 | 反向路径校验 | sysctl net.ipv4.conf.all.rp_filter |
输出 1 |
| SSH 层 | 密钥算法规范 | ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub |
采用 Ed25519 256 位算法 |
| SSH 层 | 密码认证关闭 | grep -E "^PasswordAuthentication" /etc/ssh/sshd_config |
输出 no |
| 应用层 | Nginx 安全响应头 | curl -I https://yourdomain.com |
包含 X-Frame-Options 与 HSTS |
| 应用层 | 隐藏服务指纹 | curl -I https://yourdomain.com |
Server 字段不暴露版本号 |
| 监控层 | 自动安全补丁运行 | systemctl is-active unattended-upgrades |
输出 active |
5、常见异常排查手册
Q1:配置 UFW limit 后导致合法业务 API 偶发超时?
排查方向:
UFW 的 limit 默认规则为单个 IP 在 30 秒内发起超过 6 次连接就会触发短暂丢包。对于高并发的前后端分离架构,应将连接限速移至 Nginx 应用层,使用 limit_req 配合 burst=30 nodelay,避免在网络第四层一刀切阻断。
Q2:修改内核参数后服务器无法访问外部网络?
排查方向:
检查 net.ipv4.conf.all.rp_filter 是否破坏了多网卡或复杂路由策略。如果你的机器存在容器网络(Docker桥接网卡)或虚拟隧道(WireGuard/Tailscale),请将 rp_filter 的值从 1(严格模式)调整为 2(宽松模式),然后执行 sudo sysctl -p。
Q3:开启 2FA 后新终端无法登录?
排查方向:
- 服务器时间不同步:TOTP 算法严格依赖系统时钟,若服务器与手机时间偏差超过 30 秒将导致验证失败。执行
timedatectl status确保 NTP 时钟同步服务处于活动状态。 - 若被锁死,使用云服务厂商控制台提供的 VNC 救援终端登入,编辑
/etc/pam.d/sshd注释掉pam_google_authenticator.so行即可紧急解锁。
6、FAQ(独立开发者核心问答)
Q1:独立开发者的个人小站点,这些配置全部都要做吗?
优先完成 P0 级基准:SSH Ed25519 密钥 + 禁用密码 + UFW 防火墙仅开放必要端口 + Fail2ban。仅需这四步即可规避 90% 以上的无差别批量自动化扫肉鸡行为。内核参数与 Nginx 安全头复制粘贴不到两分钟,极力建议补全。
Q2:使用了 Cloudflare 隐藏源站后,还有必要修改默认 SSH 端口吗?
建议修改。很多自动化扫描脚本会针对整个 C 段公网 IP 扫描默认的 22 端口。将 SSH 改为如 2222 或 52222 等五位数端口,可以减少 auth.log 中 99% 的无效暴力撞库日志垃圾,节约系统资源。
Q3:开启了自动更新(unattended-upgrades)会导致网站突然宕机吗?
不会。Ubuntu 的 unattended-upgrades 机制默认只检索拉取安全补丁(-security 分支),不执行任何跨大版本的库更新,稳定性经过全球数百万台生产机器验证。
相关资源与开源仓库
- Lynis 官方审计套件:https://github.com/CISOfy/lynis
- UFW 官方手册:https://manpages.ubuntu.com/manpages/jammy/en/man8/ufw.8.html
- ITTinker 自动化工具箱:
vps-init- VPS 生产级安全初始化一体化脚本ssh-key-setup- SSH 密钥自动化配置与加固cloudflare-ufw- Cloudflare IP 白名单自动化同步管理
