全新的 Web 服务器上线几分钟内就会被扫描。如果你做好了基础工作,其中大部分流量都是自动化且无害的。本指南在 15 分钟加固的基础上更进一步,涵盖防火墙、用 fail2ban 防暴力破解,以及更安全的 Nginx 设置。
步骤 1:用 UFW 配置默认拒绝的防火墙
只允许你需要的,阻止其余的。先添加 SSH,以免把自己锁在外面。
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
如果你使用非标准的 SSH 端口,请允许该端口,而不是 OpenSSH。
步骤 2:用 fail2ban 应对反复失败
fail2ban 监视日志,并封禁不断登录失败的 IP 地址。
sudo apt install -y fail2ban
sudo tee /etc/fail2ban/jail.local > /dev/null <<'CONF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
[nginx-http-auth]
enabled = true
[nginx-botsearch]
enabled = true
CONF
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
同时使用 SSH 密钥并关闭密码登录。请参阅 SSH 密钥详解。
步骤 3:隐藏 Nginx 版本并添加安全标头
在 /etc/nginx/nginx.conf 中,位于 http 块内:
server_tokens off;
在你网站的 server 块中:
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
只有当 HTTPS 对你的域名及你使用的所有子域名都正常工作时,才添加 HSTS 标头。
步骤 4:限制滥用请求
速率限制可减缓对登录页面的暴力破解尝试:
# in the http block
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
# in your server block
location = /wp-login.php {
limit_req zone=login burst=5 nodelay;
# ...your usual PHP handling
}
使用 sudo nginx -t && sudo systemctl reload nginx 测试并应用。
步骤 5:保持更新
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
自动安全更新无需你操作即可修补已知漏洞。
需要关注什么
- 用
sudo fail2ban-client status sshd检查封禁情况。 - 偶尔查看
/var/log/nginx/error.log。 - 如果你位于代理或 CDN 之后,请确保 fail2ban 读取的是真实的客户端 IP,否则你可能会封禁自己的代理。