NGINX安全加固手册
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 |
实施风险 |
中 |
适用说明 |
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配置文件 |
确认方法 |
使用限制的IP地址访问nginx 提示403 |
实施风险 |
高 |
适用说明 |
2.11 限制仅允许域名访问
名称 |
限制仅允许域名访问 |
说明 |
限制仅允许域名访问 |
实施目的 |
限制仅允许域名访问,跳过ip扫描 |
问题影响 |
ip扫描到网站后会针对性攻击 |
实施步骤 |
编辑nging配置文件,新建一个sever,示例如下 server { listen 80 default; server_name _; return 403; } 执行nginx -s reload 动态更新配置文件 (如果有其他端口,同样加入其他端口的server) |
回退方案 |
恢复nginx配置文件 |
确认方法 |
使用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重定向到我们配置的的错误页面 |
实施风险 |
中 |
适用说明 |
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版本信息 |
实施风险 |
高 |
适用说明 |