nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > Nginx 安全加固

Nginx 安全加固的几种方法

作者:BullSmall

本文详细介绍了Nginx服务器的安全加固方案,重点围绕权限设置、配置优化和系统防护三个方面,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧

Nginx 的安全加固核心围绕最小权限原则配置硬 ening访问控制审计监控展开,权限设置则是其中最基础也最关键的一环。下面我会分模块给出可落地的加固方案,所有操作都提供具体命令和配置示例。

一、基础权限加固(核心)

1. 创建专用低权限用户 / 组

Nginx 默认可能以 rootnginx 用户运行,需确保运行进程的用户无登录权限、无系统管理权限:

# 1. 创建专用用户(禁止登录、无家目录)
useradd -r -s /sbin/nologin -M nginx

# 2. 验证用户是否创建成功
id nginx
# 输出示例:uid=998(nginx) gid=996(nginx) groups=996(nginx)

2. 配置 Nginx 以低权限用户运行

编辑主配置文件(通常 /etc/nginx/nginx.conf),确保 user 指令指向专用用户:

# 开头添加/修改:指定运行用户和组
user nginx nginx;
 
# 其他核心配置(保持默认即可)
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

3. 修复文件 / 目录权限

遵循「最小权限」原则,不同目录 / 文件设置不同权限,避免过度开放:

# 1. 核心目录权限(仅 root 可写,nginx 可读)
# Nginx 配置目录
chown -R root:root /etc/nginx
chmod -R 755 /etc/nginx       # 目录:root可读写执行,其他只读执行
chmod 644 /etc/nginx/*.conf   # 配置文件:root可读写,其他只读

# 2. 日志目录(nginx 可写,其他无权限)
chown -R nginx:nginx /var/log/nginx
chmod -R 700 /var/log/nginx   # 仅 nginx 用户可访问

# 3. 运行目录(pid/锁文件)
chown -R nginx:nginx /var/run/nginx
chmod -R 700 /var/run/nginx

# 4. 网站根目录(根据业务调整,示例为 /usr/share/nginx/html)
chown -R root:nginx /usr/share/nginx/html  # root 可写,nginx 可读
chmod -R 750 /usr/share/nginx/html         # 禁止其他用户访问

# 5. Nginx 二进制文件(仅 root 可修改)
chown root:root /usr/sbin/nginx
chmod 755 /usr/sbin/nginx                  # 禁止普通用户修改

4. 禁止 Nginx 进程提权

二、配置层面安全加固

1. 隐藏 Nginx 版本信息

避免暴露版本号被针对性攻击,编辑 nginx.conf

http {
    # 隐藏版本号
    server_tokens off;
 
    # 可选:修改 Server 响应头(需编译时开启模块,或用第三方模块)
    # more_set_headers 'Server: WebServer';
}

2. 限制请求参数(防止攻击)

httpserver 块中添加:

http {
    # 限制请求体大小(防止 POST 大文件攻击,根据业务调整)
    client_max_body_size 10M;
 
    # 限制请求头大小
    client_header_buffer_size 1k;
    large_client_header_buffers 4 1k;
 
    # 超时设置(防止 Slowloris 攻击)
    client_body_timeout 10s;
    client_header_timeout 10s;
    keepalive_timeout 65s 20s;
    send_timeout 10s;
 
    # 限制并发连接(可选,根据服务器性能调整)
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_conn perip 20;  # 单个 IP 最大 20 个并发连接
}

3. 访问控制

限制 IP 访问(如后台管理页面):

location /admin/ {
    allow 192.168.1.0/24;  # 仅允许内网 IP 访问
    deny all;              # 拒绝其他所有 IP
}

禁止访问敏感文件

# 禁止访问 .htaccess、.env 等敏感文件
location ~ /\.(ht|env|git|svn) {
    deny all;
}
 
# 禁止访问配置文件/日志文件
location ~* (\.conf|\.log)$ {
    deny all;
}

4. 启用 HTTPS 并加固(必做)

server {
    listen 443 ssl http2;
    server_name yourdomain.com;

    # SSL 证书路径
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;

    # 禁用弱加密算法
    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 on;

    # 会话缓存
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # HSTS(强制 HTTPS)
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # 其他安全头
    add_header X-Frame-Options DENY;          # 禁止iframe嵌入
    add_header X-Content-Type-Options nosniff; # 防止MIME类型嗅探
    add_header X-XSS-Protection "1; mode=block"; # 防XSS
}

# 重定向 HTTP 到 HTTPS
server {
    listen 80;
    server_name yourdomain.com;
    return 301 https://$host$request_uri;
}

三、系统层面加固

1. 启用 SELinux(Linux 系统)

# 1. 查看 SELinux 状态
getenforce

# 2. 若为 Disabled,临时启用(重启失效)
setenforce 1

# 3. 永久启用(修改配置文件)
sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config

2. 限制 Nginx 端口访问

通过防火墙(firewalld/iptables)仅开放必要端口(如 80/443):

# firewalld 示例
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload

# 禁止其他无关端口
firewall-cmd --permanent --remove-all-ports  # 先清空(谨慎!仅新服务器)
firewall-cmd --permanent --add-port=80/tcp --add-port=443/tcp
firewall-cmd --reload

3. 定期审计日志

# 1. 配置日志轮转(避免日志过大)
# 编辑 /etc/logrotate.d/nginx(通常已存在,检查配置)
/var/log/nginx/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 0640 nginx nginx
    postrotate
        /usr/bin/systemctl reload nginx > /dev/null 2>&1
    endscript
}

# 2. 定期检查错误日志(关注权限/攻击行为)
tail -f /var/log/nginx/error.log
grep -i "error" /var/log/nginx/error.log
grep -i "denied" /var/log/nginx/access.log

四、验证加固效果

# 1. 检查 Nginx 运行用户
ps aux | grep nginx
# 输出应显示 nginx 进程以 nginx 用户运行(master 进程可能为 root,正常)

# 2. 检查配置语法
nginx -t

# 3. 重启 Nginx 使配置生效
systemctl restart nginx

# 4. 验证版本号是否隐藏
curl -I http://yourdomain.com
# 响应头中不应包含 "Server: nginx/1.20.1" 这类版本信息

# 5. 检查文件权限
ls -l /etc/nginx/nginx.conf  # 应为 -rw-r--r-- 1 root root
ls -ld /var/log/nginx        # 应为 drwx------ 2 nginx nginx

总结

  1. 权限核心:创建专用 nginx 低权限用户,配置文件归 root 所有(只读),日志 / 运行目录归 nginx 所有(仅自身可访问);
  2. 配置加固:隐藏版本号、限制请求参数、启用 HTTPS 并禁用弱加密、添加安全响应头;
  3. 系统层面:启用 SELinux、防火墙仅开放必要端口、定期审计日志,形成完整安全闭环。

所有操作完成后,建议用 Nmap、OpenVAS 等工具扫描 Nginx 服务,验证加固效果。

到此这篇关于Nginx 安全加固的几种方法的文章就介绍到这了,更多相关Nginx 安全加固内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文