Nginx安全加固参考
程序员文章站
2022-05-07 08:20:55
...
注:最近部门领导要求梳理一份常用工具的安全加固参考手册,基于此需求,针对工作中经常遇到的被漏扫发现的问题,进行了梳理,参考了官网内容及网上各位大神的内容,不足之处,还望指正,版本环境为nginx1.18稳定版,若有参数不能正常使用,请参考nginx官网。
安全加固参考
Nginx部署规范
常用编译参考
--with-pcre=/asop/soft/pcre-8.43
--with-zlib=/asop/soft/zlib-1.2.11
--with-openssl=/asop/soft/openssl-1.0.1j
--with-http_geoip_module
可选:
#启用https支持支持
--with-http_ssl_module
#启用http状态信息查看
--with-http_stub_status_module
Nginx优化及加固参考
版本信息隐藏
1、隐藏版本信息
配置参考:
vi conf/nginx.conf
#在http段中加入如下信息
server_tokens off;
2、隐藏http响应头中的server信息
配置参考:
#隐藏server信息需要修改源码重新编译
1、src/core/nginx.h
#define nginx_version 000000
#define NGINX_VERSION "0.00"
#define NGINX_VER "GW/" NGINX_VERSION
2、src/http/ngx_http_header_filter_module.c
static char ngx_http_server_string[] = "Server: GW" CRLF;
开启CPU亲和
#开启CPU亲和是为了将nginx的进程绑定到对应的CPU核心上,使各核心的使用率基本均衡,避免多个核心同时运行着多个进程。
#开启亲和需要先确认CPU数量
配置参考:
#查询当前服务器的物理CPU数量
cat /proc/cpuinfo | grep "physical id"|sort|uniq|wc -l
#查看每CPU的逻辑核数
cat /proc/cpuinfo | grep "cpu cores"|uniq
#worker_processes 定义nginx启动的进程数,对应等于CPU的总的核数(物理数量* 单CPU核数)
#worker_cpu_affinity 绑定CPU 此处为八核的绑法,几核就对应几组(例如:4核 0001 0010 0100 1000),也可以设置为auto,自动分配
vi conf/nginx.conf
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000
**增加nginx进程可打开的最大文件数**
worker_rlimit_nofile 65535;
日志格式定义
配置参考:
1、定义日志格式
vi conf/nginx.conf 取消如下内容注释,使所有server主机都可以使用
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
2、定义日志路径
vi conf/nginx.conf 在每个server段内定义或者修改
access_log logs/host.access.log main
禁止目录列出
配置参考:
vi conf/nginx.conf 在http段中加入如下信息:
autoindex off;
自定义错误页面
配置参考:
#http段中加入如下信息
ErrorDocument 400 /custom400.html
ErrorDocument 401 /custom401.html
ErrorDocument 403 /custom403.html
ErrorDocument 404 /custom404.html
ErrorDocument 405 /custom405.html
ErrorDocument 500 /custom500.html
禁用不安全的http方法
配置参考:
location块中加入如下信息
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 501;
}
防DOS攻击
控制超时时间
#设置客户端请求主体读取超时时间
client_body_timeout 10;
#设置客户端请求头读取超时时间
client_header_timeout 10;
#设置长连接的超时时间
keepalive_timeout 5;
#指定响应客户端的超时时间
send_timeout 10;
限制连接数
#涉及http_limit_conn_module
#限制客户端与服务器的连接数
配置参考:
#定义一个共享内存区conip,大小为10M,配置于http段中可以复用
limit_conn_zone $binary_remote_addr zone=conip:10m;
#限制每个客户端与服务器的连接数,需要在server主机中加入如下内容
#限制每个客户端IP可以与服务器建立的连接数,perip 为上面再http段中定义的zone 名字,针对的为单个ip
limit_conn conip 10;
限制连接速率
#涉及http_limit_req_module,默认即构建
#限制单ip请求的处理速度
#定义一个共享内存区one,大小为10M,每个客户端每秒接收的请求数不超过5个,http段中加入如下内容:
配置参考:
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
#以下配置可以放置于server段中,也可放置于location段中,进行目录级别的限制,
#限制突发请求不超过8个,每秒的请求数会从上方的http段中的配置中继承
配置参考:
limit_req zone=one burst=8;
#以上限制为针对的所有ip地址,若需要限制单独的ip地址,则需要编译–with-http_geoip_module 模块,并在http段中增加如下内容
配置参考:
geo $wip {
default 0;
127.0.0.1 1;
172.16.0.0 1;
}
map $wip $limit{
0 $binary_remote_addr
1 "";
}
防止点击劫持
#增加如下配置至server段,可以防止iframe嵌套导致的点击劫持
配置参考:
add_header X-Frame-Options SAMEORIGIN;