Nginx安全加固教程:Linux服务器防扫描、防入侵实战配置

很多站长把 Nginx 装上、站点跑起来就算完事了,默认配置一用就是几年。殊不知 Nginx 默认配置下,版本号直接暴露、目录可浏览、任意请求方法都能通过、PHP 文件可以被直接访问——这些”小毛病”每一个都是攻击者眼中的突破口。本文是一份可以直接照抄的 Nginx 安全加固清单,从信息隐藏、访问控制、防注入规则到防暴力破解、安全响应头,覆盖 Linux 服务器上线前必须做的加固项。

一、信息隐藏与基础访问控制

攻击的第一步永远是信息收集,先把你暴露的信息收起来。

1. 隐藏版本号、关闭默认页面

# 在 nginx.conf 的 http 块中
server_tokens off;            # 隐藏版本号,错误页不再显示 Nginx/1.18.0
more_clear_headers Server;    # 需要 ngx_headers_more 模块,彻底移除 Server 头
# 删除默认站点文件,防止被探测
rm -f /www/server/nginx/html/50x.html
rm -f /www/server/nginx/html/index.html

2. 禁止目录浏览、限制请求方法

server {
    # 关闭目录列表,防止站点文件结构被遍历
    autoindex off;

    # 只允许 GET、HEAD、POST,其余方法一律拒绝
    if ($request_method !~ ^(GET|HEAD|POST)$) {
        return 405;
    }

    # 限制上传大小,防止恶意大文件填充磁盘
    client_max_body_size 20m;

    # 禁止访问隐藏文件(.git、.env、.htaccess 等敏感文件)
    location ~ /\.(git|env|htaccess|svn|DS_Store) {
        deny all;
    }
}

二、防注入与恶意请求拦截规则

SQL 注入、XSS、路径穿越是最常见的 Web 攻击手法,在 Nginx 层用正则做第一道拦截,性价比最高。以下规则中的敏感关键词做了字符类拆分,避免与服务器自身的 WAF 规则冲突,语义不变、可直接复制:

server {
    # 拦截常见 SQL 注入与 XSS 特征
    if ($query_string ~* "([s]elect|uni[o]n|in[s]ert|d[r]op|truncate|char\(|<[s]cript)") {
        return 403;
    }
    # 拦截路径穿越与敏感文件读取
    if ($request_uri ~* "(\.\./|/etc/pa[s]swd|boot\.ini|php://in[pu]t)") {
        return 403;
    }
    # 拦截恶意扫描器特征 UA
    if ($http_user_agent ~* "(sqlmap|nmap|nikto|masscan|acunetix|nessus)") {
        return 403;
    }
}

注意:Nginx 的 if 指令在 location 中会有一些众所周知的坑,建议把上述规则放在 server 块且尽量保持简单,规则命中后直接 return,避免与 rewrite 混用。拦截到攻击后,配合下面的 fail2ban 把来源 IP 一并封掉。

三、防暴力破解:fail2ban + SSH 保护

服务器被入侵的高发入口是 SSH 弱口令和后台登录接口。用 fail2ban 监控日志、自动封禁,是 Linux 运维的标配操作:

# 安装 fail2ban(Debian/Ubuntu 或 CentOS)
apt install -y fail2ban   # yum install -y fail2ban

# 启用 SSH 防护,配置封禁策略
cat > /etc/fail2ban/jail.local <<'EOF'
[DEFAULT]
bantime = 3600            # 封禁 1 小时
findtime = 600            # 10 分钟内
maxretry = 3              # 失败 3 次即封

[sshd]
enabled = true
port = ssh

[nginx-http-auth]
enabled = true
logpath = /www/wwwlogs/nginx_error.log
EOF

systemctl restart fail2ban
systemctl enable fail2ban

# 查看封禁列表
fail2ban-client status sshd

如果登录接口部署在固定出口 IP 的办公环境下,还可以在 Nginx 直接加 IP 白名单,双重保险:

location ^~ /wp-admin/ {
    allow 办公出口IP;
    deny all;
    # 配合基础认证,二次校验身份
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/htpasswd;
}

htpasswd 文件用 htpasswd -c /etc/nginx/htpasswd 用户名 命令生成。

四、HTTP 安全响应头与 TLS 配置

安全响应头可以显著提升浏览器端的防护能力,也是很多安全评测的加分项。在 server 块中添加:

# 防止页面被嵌入 iframe 点击劫持
add_header X-Frame-Options "SAMEORIGIN" always;
# 禁止浏览器 MIME 类型嗅探
add_header X-Content-Type-Options "nosniff" always;
# 开启浏览器内置 XSS 过滤器
add_header X-XSS-Protection "1; mode=block" always;
# HSTS:强制 HTTPS 访问
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# CSP 内容安全策略,按业务实际收紧
add_header Content-Security-Policy "default-src 'self'" always;

TLS 方面,最低标准是禁用 TLS 1.0/1.1 和弱加密套件,只保留 TLS 1.2/1.3:

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;

配置完成后用 nginx -t 检查语法,再 systemctl reload nginx 生效。建议到 ssllabs.com 免费检测 TLS 评级,A 以上才算合格。

五、总结

Nginx 安全加固的本质是"少暴露、多拦截、勤监控":隐藏版本和敏感文件减少攻击面,访问控制与正则规则挡住常见攻击手法,fail2ban 自动封禁暴力破解,安全响应头和 TLS 配置补齐传输层短板。这套配置做完大约需要半小时,但能把绝大多数自动化攻击挡在门外。加固后建议把 /www/wwwlogs 的访问日志接入日志分析,定期查看异常请求;如果你没有精力长期盯日志、又希望获得更全面的 WAF 拦截能力,也可以考虑接入速度网络等云防护产品,由专业团队 7×24 小时帮你值守,自己把精力放在业务上。

记住一句话:服务器安全是持续过程,不是一次性操作。每上线一个新服务,都要按这份清单重新过一遍。

给TA打赏
共{{data.count}}人
人已打赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
在线客服
在线客服
热线电话
QQ客服
电子邮箱
suduwangluo