vlambda博客
学习文章列表

NGINX安全加固手册



NIGNX系统安全

基线规范



1.概述

1.1 适用范围

 本配置标准的使用者包括:各事业部服务器负责人。
各事业部服务器负责人按规范要求进行认证、日志、协议、补丁升级、文件系统管理等方面的安全配置要求。对系统的安全配置审计、加固操作起到指导性作用。

1.2 文档内容

 本文档内容是nginx的安全加固操作项的详细操作指导,并明确在加固操作过程中可能出现的风险和所遵循的标准。

1.3 加固前的准备

1.3.1 需要重新启动验证系统

 需要重新启动以确定nginx的完整性、业务系统的正常性

1.3.2 备份文件

 在操作之前需要备份nginx重要的配置文件

1.3.3 加固操作注意事项

 需要手工确认系统是否需要加固,同时验证加固效果,系统可以正常运行

1.3.4 软件包相关

 操作系统中多余的软件或者加固需要安装的软件,需要与被加固系统负责人进行确认。

2.操作指导

2.1 nginx版本统一

名称

nginx版本统一

说明

统一集群内的Nginx版本,避免管理混乱

实施目的

统一使用官方Stable 高版本的nignx

问题影响

管理混乱,容易通过低版本漏洞被攻击

实施步骤

通过Nignx官网下载http://nginx.org/en/download.html

最新Stable版本

回退方案

确认方法

nginx -v 查看版本

实施风险

适用说明


2.2 使用普通账户启动nginx

名称

使用普通账户启动nginx

说明

使用普通账户启动nginx

实施目的

新建jqsoft用户启动nginx

问题影响

特权用户启动引起的安全隐患

实施步骤

编辑nginx配置文件,添加如下参数:

user jqsoft;

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

回退方案

恢复nginx配置文件

确认方法

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

实施风险

适用说明


2.3 禁用autoindex

名称

禁用autoindex

说明

禁用autoindex,避免目录浏览

实施目的

禁用autoindex,避免目录浏览,减少安全隐患

问题影响

通过了解目录结构从而攻击系统

实施步骤

编辑nginx配置文件,在http模块添加autoindex off;

重启Nginx

回退方案

恢复nginx配置文件

确认方法

确保nginx.conf配置文件上禁用autoindex
即autoindex off或者没有配置autoindex。

实施风险

适用说明


2.4 关闭服务器标记

名称

关闭服务器标记

说明

关闭服务器标记,避免显示服务器版本信息

实施目的

关闭服务器标记,避免显示服务器版本信息

问题影响

如果开启的话(默认情况下)所有的错误页面都会显示服务器的版本和信息

实施步骤

在nginx.conf配置文件中,http模块中添加 server_tokens off;

重启Nginx

回退方案

恢复配置文件

确认方法

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

实施风险

适用说明


2.5 设置timeout

名称

设置timeout

说明

设置timeout设低来防御DOS攻击

实施目的

设置timeout设低来防御DOS攻击

问题影响

DOS攻击拖垮服务器

实施步骤

编辑nginx配置文件,在http模块中添加以下参数

client_body_timeout 10;

client_header_timeout 30;

keepalive_timeout 30  30;

send_timeout 10;

重启Nginx

回退方案

恢复nginx配置文件

确认方法

访问Nignx网站查看返回头中已经包含了超时时间配置

实施风险

适用说明


2.6 设置NGINX缓冲区

名称

设置NGINX缓冲区

说明

设置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请求方法

说明

限制nginx请求方法,仅允许常用的get post head

实施目的

限制nginx请求方法,仅允许常用的get post head

问题影响

通过请求漏洞攻击服务器

实施步骤

编辑nginx配置文件,在每个server模块中添加

if ($request_method !~ ^(GET|HEAD|POST)$ ) {

return 444;

}

回退方案

恢复Nignx配置文件

确认方法

使用put/delete等请求返回444响应码

实施风险

适用说明


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文件,验证日志格式是否与如上配置的一致

实施风险

适用说明


2.9 Nginx日志切割

名称

Nginx日志切割

说明

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,仅允许指定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 动态更新配置文件

回退方案

恢复nginx配置文件

确认方法

实施风险

适用说明


2.11 限制仅允许域名访问

名称

限制仅允许域名访问

说明

限制仅允许域名访问

实施目的

限制仅允许域名访问,跳过ip扫描

问题影响

ip扫描到网站后会针对性攻击

实施步骤

编辑nging配置文件,新建一个sever,示例如下

server {

listen 80 default;

server_name _;

return 403;

}

执行nginx -s reload 动态更新配置文件

(如果有其他端口,同样加入其他端口的server)

回退方案

恢复nginx配置文件

确认方法

实施风险

适用说明


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重定向到我们配置的的错误页面

实施风险

适用说明


2.13 限制并发和速度

名称

限制并发和速度

说明

nginx客户端并发和速度

实施目的

限制用户连接数及速度来预防DOS攻击

问题影响

通过连接数来攻击nginx服务器

实施步骤

编辑Nignx配置文件,在Http模块中添加如下参数:

limit_zone one $binary_remote_addr 60m;

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

limit_conn one 50; 

limit_rate 100k;

重启nginx服务

回退方案

恢复配置文件

确认方法

单个Ip建立尝试建立多个连接失败

实施风险

适用说明


2.14 nginx配置防盗链

名称

nginx配置防盗链

说明

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执行权限

说明

限制php执行权限

实施目的

限制php执行权限

问题影响

通过执行php脚本入侵服务器

实施步骤

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

location ~ /(attachments|upload)/.*.(php|php5)?$ {

deny all;

}

以上的配置文件代码需要放到 location ~ .php{...}上面,相关目录需要写相对目录,重启nginx

回退方案

恢复配置文件

确认方法

nginx网站指定目录php文件不能执行、访问

实施风险

适用说明


2.16 nginx配置WAF模块

名称

nginx配置waf模块

说明

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服务

回退方案

删除配置文件的中的waf配置

确认方法

查看目录/data/logs/hack/ 中的日志

实施风险

适用说明


2.17 安装官方补丁更新

名称

安装官方补丁更新

说明

为nginx安装最新安全补丁

实施目的

防止攻击者利用nginx漏洞进行攻击

问题影响

系统安全性下降

实施步骤

查看当前nginx版本

nginx -v

官网下载最新的安全补丁

回退方案

确认方法

登陆用户查看nginx版本信息

实施风险

适用说明