Nginx - 安全基线配置与操作指南

2024-05-26 13:48:47 浏览数 (2)

概述

我们这里主要介绍针对Nginx中间件的安全基线配置指南,包括版本选择、用户创建、权限设置、缓冲区配置、日志管理、访问限制、错误页面处理、并发控制、补丁更新等方面。

同时还涵盖了如何配置正向代理模块、防止目录遍历以及服务监控等内容,旨在指导系统管理员确保中间件服务器的安全性


中间件安全基线配置手册

1. 概述

1.1 目的

本文档规定了中间件服务器应当遵循的安全性设置标准,旨在指导系统管理人员或安全检查人员进行中间件的安全合规性检查和配置。

1.2 适用范围

本配置标准的使用者包括:服务器系统管理员、应用管理员。 本配置标准适用的范围包括:中间件服务器。

2. Nginx基线配置

2.1 版本说明

使用Nginx官方稳定版本,当前提供下列版本:

  • Nginx 1.22.1
  • Nginx 1.24.0
2.2 安装目录
代码语言:javascript复制
/opt/nginx-{version}
2.3 用户创建

操作系统中新建nginx用户,用以启动Nginx Worker。

nginx.conf中配置:

代码语言:javascript复制
user nginx;
2.4 二进制文件权限
代码语言:javascript复制
/opt/nginx-{version}/sbin/nginx 二进制文件权限为 755
2.5 关闭服务器标记

关闭服务器标记,避免显示服务器版本信息。编辑nginx.conf,在http模块中添加:

代码语言:javascript复制
server_tokens off;
2.6 设置 timeout

设置 timeout 配置可防御 DOS 攻击。编辑nginx.conf,在http模块中添加:

代码语言:javascript复制
client_body_timeout 10;
client_header_timeout 30;
keepalive_timeout 30 30;
send_timeout 10;
2.7 设置 NGINX 缓冲区

防止缓冲区溢出攻击。编辑nginx.conf,在server模块中添加:

代码语言:javascript复制
client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
2.8 日志配置

统一使用规定好的日志格式。编辑nginx.conf,在http模块中添加:

代码语言:javascript复制
log_format main '$remote_addr - $remote_user [$time_local] "$request" "$http_host" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for" "$request_time" "$upstream_response_time" "$request_body"';
2.9 日志切割

切割 Nginx 日志,避免日志文件过大。新建日志切割脚本如下:

代码语言:javascript复制
#!/bin/bash
# 设置日志文件存放目录
logspath="/usr/local/nginx/logs/"
# 设置pid文件
pidpath="/usr/local/nginx/nginx.pid"
# 重命名日志文件
mv ${logspath}access.log ${logspath}access$(date -d "yesterday"  "%Y%m%d").log
# 向nginx主进程发信号重新打开日志
kill -USR1 `cat ${pidpath}`

配置定时任务每日凌晨执行脚本。

2.10 限制访问 IP

限制访问 IP,仅允许指定 IP 访问指定资源。编辑nginx.conf,在server模块中添加:

代码语言:javascript复制
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
2.11 限制仅允许域名访问

限制仅允许域名访问,跳过 IP 扫描。编辑nginx.conf,在server模块中添加:

代码语言:javascript复制
server {
    listen 80 default;
    server_name _;
    return 403;
}
2.12 错误页面重定向

Nginx 默认错误页面包含服务器版本信息,使用自定义错误页面避免版本信息泄露。新建错误页面,放到静态目录中,编辑nginx.conf,在http模块中添加:

代码语言:javascript复制
fastcgi_intercept_errors on;
error_page 401 /401.html;
error_page 402 /402.html;
error_page 403 /403.html;
error_page 404 /404.html;
error_page 405 /405.html;
error_page 500 /500.html;
2.13 限制并发和速度

限制用户连接数及速度来预防 DOS 攻击。编辑nginx.conf,在http模块中添加:

代码语言:javascript复制
limit_zone one $binary_remote_addr 60m;

server模块的location中,需要限制的location中添加如下参数:

代码语言:javascript复制
limit_conn one 50;
limit_rate 100k;
2.14 安装官方补丁更新

防止攻击者利用 Nginx 漏洞进行攻击,定期更新 Nginx 版本。查看当前 Nginx 版本:

代码语言:javascript复制
nginx -v

官网下载最新的安全补丁:Nginx 下载。

2.15 配置正向代理模块

由于项目需要使用到 HTTPS 正向代理,而 Nginx 官方模块仅支持做 HTTP 正向代理,ngx_http_proxy_connect_module模块可以实现隧道 SSL 请求的代理服务器。模块下载地址:GitHub。编译 Nginx 中添加该模块即可:

代码语言:javascript复制
--add-module=/root/ngx_http_proxy_connect_module

创建配置文件即可使用:

代码语言:javascript复制
server {
    resolver 114.114.114.114;
    resolver_timeout 30s;
    listen 80;
    proxy_connect;                          # 启用 CONNECT HTTP 方法
    proxy_connect_allow 443 80;             # 指定代理 CONNECT 方法可以连接的端口号或范围的列表
    proxy_connect_connect_timeout 20s;      # 定义客户端与代理服务器建立连接的超时时间
    proxy_connect_read_timeout 20s;         # 定义客户端从代理服务器读取响应的超时时间
    proxy_connect_send_timeout 20s;         # 设置客户端将请求传输到代理服务器的超时时间
    location / {
        proxy_pass $scheme://$http_host$request_uri;
    }
}
2.16 防止目录遍历

修改文件nginx.conf,在http模块下添加或修改为autoindex off;重新启动 Nginx 服务。

2.17 服务监控

为了保证 Nginx 服务正常,采用 Zabbix 监控nginx_status模块监控 Nginx 服务。Nginx 配置nginx_status IP 白名单:

代码语言:javascript复制
location /nginx_status {
    stub_status;
    allow 192.168.0.0/16;
    allow 127.0.0.1;
    deny all;
}

推荐: Loki收集Nginx日志并搭建日志聚合平台

0 人点赞