第1章 概述

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

1.2 适用范围

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

1.3 适用版本

  • NIGNX服务器。

第2章 安全配置要求

2.1 nginx版本统一
统一集群内的Nginx版本,避免管理混乱
检测操作步骤 通过Nignx官网下载http://nginx.org/en/download.html

nginx -v 查看版本

2.2 使用普通账户启动nginx
新建jqsoft用户启动nginx,避免特权用户启动引起的安全隐患
检测操作步骤 编辑nginx配置文件,添加如下参数:

user jqsoft;

重启Nginx(需要将Nignx目录及相关静态文件授权给jqsoft用户)

ps -ef |grep nginx 查看nginx进程是否是jqsoft用户启动

回退方案 恢复nginx配置文件
2.3 禁用autoindex
禁用autoindex,避免目录浏览,减少安全隐患
检测操作步骤 编辑nginx配置文件,在http模块添加

autoindex off;

重启Nginx
确保nginx.conf配置文件上禁用autoindex
即autoindex off或者没有配置autoindex。
回退方案 恢复nginx配置文件

2.4 关闭服务器标记
关闭服务器标记,避免显示服务器版本信息
在nginx.conf配置文件中,http模块中添加

server_tokens off;

重启Nginx
查看错误页面http 返回头中server字段值中已经没有了服务器版本信息

2.5 设置timeout
设置timeout设低来防御DOS攻击
检测操作步骤 编辑nginx配置文件,在http模块中添加以下参数

client_body_timeout 10;
client_header_timeout 30;
keepalive_timeout 30  30;
send_timeout 10;

重启Nginx
访问Nignx网站查看返回头中已经包含了超时时间配置
回退方案 恢复nginx配置文件
2.6 设置NGINX缓冲区
防止缓冲区溢出攻击
检测操作步骤 编辑nginx配置文件,在server模块中需要限制的location中添加以下参数

client_body_buffer_size  1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;

重启Nginx
查看配置文件
回退方案 恢复nginx配置文件

2.7 限制nginx请求方法
限制nginx请求方法,仅允许常用的get post head
检测操作步骤 编辑nginx配置文件,在每个server模块中添加

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}

使用put/delete等请求返回444响应码
回退方案 恢复nginx配置文件
2.8 日志配置
统一使用规定好的日志格式
检测操作步骤 编辑nginx配置文件,在http模块中添加如下参数

log_format  main 
'$remote_addr - $remote_user [$time_local] "$request" ' 
'$status $body_bytes_sent "$http_referer" '  
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/host.access.log main;

重启nginx服务即可
查看logs/host.access.log文件,验证日志格式是否与如上配置的一致
回退方案 恢复nginx配置文件

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

#!/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访问指定资源
编辑nging配置文件,在每个server模块中的location添加需求的限制,示例如下

deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;

执行nginx -s reload 动态更新配置文件
使用限制的IP地址访问nginx 提示403
回退方案 恢复nginx配置文件

2.11 限制仅允许域名访问
限制仅允许域名访问,跳过ip扫描
编辑nging配置文件,新建一个sever,示例如下

server {
listen 80 default;
server_name _;
return 403;
}

执行nginx -s reload 动态更新配置文件
(如果有其他端口,同样加入其他端口的server)
使用IP地址访问nginx 提示403

2.12 错误页面重定向
nginx默认错误页面包含服务器版本信息,使用自定义错误页面避免版本信息泄露
新建错误页面,放到静态目录中,编辑Nignx配置文件,
在http模块中添加如下参数:

fastcgi_intercept_errors on;
errorpage 401 /401.html;
errorpage 402 /402.html;
errorpage 403 /403.html;
errorpage 404 /404.html;
errorpage 405 /405.html;
errorpage 500 /500.html

重启nginx服务
访问不存在的url重定向到我们配置的的错误页面
回退方案 恢复nginx配置文件

2.13 限制并发和速度
限制用户连接数及速度来预防DOS攻击
编辑Nignx配置文件,在Http模块中添加如下参数:

limit_zone one $binary_remote_addr 60m;
在server模块的location中,需要限制的location中添加如下参数:
limit_conn one 50; 
limit_rate 100k;

重启nginx服务
单个Ip建立尝试建立多个连接失败
回退方案 恢复nginx配置文件

2.14 nginx配置防盗链
防止第三方引用链接访问我们的图片,消耗服务器资源和网络流量
编辑nginx配置文件,在server模块中添加如下实例:

server {
  listen 80;
server_name www.myine.com;
  root /usr/share/nginx/html;
location ~*.(gif|jpg|jpeg|png|bmp|swf)$ {
validreferers none blocked www.myine.com;
    if ($invalidreferer) {
      return 403;
}
    }
 }

validreferers: 指定资源访问是通过以下几种方式为合法,即白名单。
none:允许缺失的头部访问。
blocked:允许referer没有对应值的请求。
Server_names:若referer站点域名与servername中本机配的域名一样允许访问
新建个人页面,图片引用使用nginx中的图片,访问个人页面图片提示403

2.15 限制php执行权限
限制php执行权限
编辑nignx配置文件,在需要限制的server模块中添加如下代码:

location ~ /(attachments|upload)/.*.(php|php5)?$ {
deny all;
}

以上的配置文件代码需要放到 location ~ .php{…}上面,相关目录需要写相对目录,重启nginx
nginx网站指定目录php文件不能执行、访问

2.16 nginx配置WAF模块
nginx配置waf模块,提升服务器的安全性
下载waf模块,wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip
配置waf相关Lua规则、目录、脚本等,
(nginx需要加载nginx_lua_module模块)
编辑nginx配置文件,在http模块中添加如下参数:

lua_package_path “/usr/local/nginx/conf/waf/?.lua”;
lua_shared_dict limit 10m;
init_by_lua_file /usr/local/nginx/conf/waf/init.lua;
access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;

新建攻击日志目录

mkdir -p /data/logs/hack/
chown -R nobody:nobody /data/logs/hack/
chmod -R 755 /data/logs/hack/

重启Nignx服务
查看目录/data/logs/hack/ 中的日志

2.17 安装官方补丁更新
防止攻击者利用nginx漏洞进行攻击
查看当前nginx版本

nginx -v

官网下载最新的安全补丁
登陆用户查看nginx版本信息