Nginx安全基线

236 阅读15分钟

背景

中间件安全是指保护中间件软件和服务的安全性,防止被恶意攻击或者滥用。中间件软件在操作系统和应用程序之间提供通信和集成功能,是信息系统中的重要组成部分。常见的中间件软件包括Apache、IIS、Tomcat、WebLogic、WebSphere、Jboss等。由于中间件在系统中的关键位置,其安全性直接关系到整个信息系统的安全稳定。因此,对中间件进行安全配置是确保信息系统安全的重要环节。今天我们来看下Nginx安全基线:

#需求检查方法修复方法风险描述优先级
使用安全的版本
0新安装,选用安全稳定版本关注nginx官网中对安全漏洞和新版本的发布公告及时了解漏洞信息及新版本的更新信息 查看官网Nginx 1.16最新补丁版本:nginx.org/en/CHANGES-… 建立审查流程定期判断版本是否存在安全隐患,是否需要更新下载最新版本并安装:nginx.org/en/download… 安装新版本 nginx 前,备份旧版本的nginx,回退时恢复旧版本的 nginx并重新启用 1.安装包要求从nginx官方网站获取,官方网站地址:nginx.org/ 2.安装包优先选用稳定版(stable)最新版,如果要跨大版本升级nginx,则要求在测试环境测试不存在兼容性问题后才在生产环境进行部署。 3.要求对下载的源码安装包文件进行完整性验证。使用最新稳定的安全版本和补丁,有助于修复漏洞,降低历史版本安全漏洞带来的风险。强制
基本安全配置
1新安装,关闭http_dav_module模块nginx -V 2>&1 "grep http_dav_module源码安装nginx时包含:./configure--withhttp_dav_module flaghttp_dav_module支持用于 Web 分布式创作和 HTTP 扩展 RFC 4918 定义的版本 (WebDAV)。这支持 Web 服务器上基于文件的操作,例如在服务器上创建、删除、更改和移动文件的能力。大多数现代架构已将此功能替换为基于云的对象存储,在这种情况下,不应安装模块
2新安装,关闭http_gzip_static_module模块nginx -V "grep 'http_gzip_module"http_gzip_static_module'源码安装nginx时包含:./configure --without-http_gzip_module
3关闭Nginx的目录浏览功能检查nginx_home/conf/nginx.conf文件的autoinde指令 egrep -i '^\sautoindex\s+' /etc/nginx/nginx.conf egrep -i '^\sautoindex\s+' /etc/nginx/conf.d/*默认是关闭此功能的,如果配置文件没有或者配置为OFF即可 autoindex off;如果打开了目录浏览功能,当WEB目录下不存在默认索引页面(如index.html)时,会将当前目录下的所有文件和目录都列出来,这是十分危险的。禁止目录列表功能可以避免因暴露目标网站的目录结构和敏感文件,最终造成敏感信息丢失。强制
4创建运行Nginx的用户和组检查nginx_home/conf/nginx.conf文件的user指令 user nginx nginx创建nginx用户和组 Unix系统: (1) 创建nginx组:groupadd nginx (2) 创建nginx用户并加入nginx组:useradd nginx–g nginx (3) 配置httpd.conf文件以apache身份启动服务以nginx用户运行服务,增强安全性;强制
5锁定 NGINX service账号运行命令查看nginx账号是否被锁定: passwd -S nginx 期望结果为:nginx LK 2010-01-28 0 99999 7 -1 (Password locked.)或nginx L 07/02/2012 -1 -1 -1 -1运行命令锁定nginx账号: passwd -l nginxnginx 用户帐户应具有有效的密码,但帐户应锁定。如果使用其他帐户运行nginx,则该帐户的名称应被替换 备注:这可确保 nginx 用户帐户不得被操作系统用户作为登录使用。强制
6确保nginx账号无法登录操作系统执行以下命令,确认返回结果中nginx的shell为/sbin/nologin grep nginx /etc/passwd运行命令修改nginx的shell chsh -s /sbin/nologin nginxnginx帐户不应具有登录能力,因此nginx账户shell应该修改为:/sbin/nologin 注 默认满足要求强制
7保护nginx文件及文件夹所属stat /etc/nginx;检查所属是否为rootchown -R root:root /etc/nginx仅向根组中的用户和根用户设置所有权将减少未经授权修改 nginx 配置文件的可能性。强制
8保护nginx文件权限find /etc/nginx -type d "xargs ls -ld 结果为:drwxr-x---. 4 root root 188 Nov 28 23:22 /etc/nginx find /etc/nginx -type f "xargs ls -l 结果为:-rw-r-----. 1 root root 2192 Nov 11 2017 /etc/nginx/nginx.conffind /etc/nginx -type d "
9修改nginx PID文件权限ls -l /var/run/nginx.pid 检查PID 文件是否root所有,权限为644chown root:root /var/run/nginx.pid chown 644 /var/run/nginx.pidPID 文件应归root所有。它也应该是对其他用户可读,但只能由root可写(权限644)。 可防止未经授权修改 PID 文件,导致拒绝服务。强制
信息泄露
10隐藏 Nginx 的版本号检查nginx_home/conf/nginx.conf文件的server_tokens指令值为off或查看响应是否会返回版本信息 curl -I 127.0.0.1 "grep -i server1.编辑nginx配置文件,在http块中添加 server_tokens off; 2. 重启nginx systemctl restart nginxserver_tokens指令负责在错误页面和服务器HTTP响应标题字段中显示NGINX版本编号和操作系统版本,攻击者可以使用这些响应标题在网站上进行侦察,然后针对与基础技术相关的特定已知漏洞进行攻击隐藏版本号后可以最大减少恶意攻击者通过漏扫工具来收集漏洞信息。
11修改默认错误页面nginx默认错误配置页/usr/share/nginx/html/,确认nginx未应用默认错误配置页面: grep -i nginx /usr/share/nginx/html/index.html grep -i nginx /usr/share/nginx/html/50x.html编辑/usr/share/nginx/html/index.html和usr/share/nginx/html/50x.html删除任何引用NGINX的行。NGINX 的默认错误和索引.html页面显示服务器是 NGINX。这些默认页面应被删除或修改,以便它们不会暴露服务器的信息。 通过收集有关服务器的信息,攻击者可以针对其已知的漏洞进行攻击。删除披露服务器运行 NGINX 的页面有助于减少对服务器的针对性攻击。强制
12确保NGINX反向代理不启用信息披露grep proxy_hide_header /etc/nginx/nginx.conf proxy_hide_header X-Powered-By;修改/etc/nginx/nginx.conf ,增加以下内容 location /docs { .... proxy_hide_header X-Powered-By; proxy_hide_header Server; .... }服务器和 x-powered-by标头可以指定应用程序使用的基础技术。NGINX 反向代理可能会通过这些标题,如果没有明确指示删除它们 当nginx作为反向代理的情况,使用proxy_hide_header删除不必要的一些头 location /docs { .... proxy_hide_header X-Powered-By; proxy_hide_header Server; .... }强制
加密
13将Web流量从HTTP重定向到安全的HTTPS设置HTTPS时确保以HTTP重定向到HTTPS的方式阻止所有通过HTTP的流量将以下更改添加到Nginx配置文件中,以便将所有流量从HTTP重定向到HTTPS版本: server { listen 80 default_server; server_name _; return 301 https://hosthostrequest_uri; } 重新加载Nginx服务设置HTTPS时确保以HTTP重定向到HTTPS的方式阻止所有通过HTTP的流量建议
14限制私钥访问权限检查秘钥权限是否为400 ls -l /etc/nginx/nginx.keychmod 400 /etc/nginx/nginx.keynginx.org/en/docs/htt…建议
15禁用不安全的SSL/TSL协议当nginx使用到https访问时,要求禁止使用SSLV1.0、SSLV2.0,SSLV3.0不安全协议,建议也不要使用TLSv1.0协议 grep -ir ssl_protocol /etc/nginx【web server】 在nginx配置文件中的ssl_protocols做如下配置: server { ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; } 【Proxy】 在nginx配置文件中的proxy_ssl_protocols 做如下配置: location / { proxy_pass cisecurity.org; proxy_ssl_protocols TLSv1.2; } 保存配置文件并重启nginx服务即可禁用某些 TLS 可能不允许传统用户代理连接到您的服务器。禁用与后端服务器进行特定协议的谈判也可能限制您与旧服务器连接的能力。在选择 TLS 协议时,您应始终考虑是否需要支持传统用户代理或服务器。强制
16禁用不安全的加密算法grep -ir ssl_ciphers /etc/nginx/ grep -ir proxy_ssl_ciphers /etc/nginx【web server】 server { ssl_ciphers ALL:!EXP:!NULL:!ADH:!LOW:!SSLv2:!SSLv3:!MD5:!RC4; } 【proxy】 location / { proxy_pass cisecurity.org; proxy_ssl_ciphers ALL:!EXP:!NULL:!ADH:!LOW:!SSLv2:!SSLv3:!MD5:!RC4; } 以下程序假定默认配置文件。如果您没有定义ssl_ciphers或proxy_ssl_ciphers,请将指令添加到您的代理或 Web 服务器配置配置文件中强大的密码配置可能不允许具有弱配置的旧用户代理或用户代理连接到您的网站。如果您的服务器还必须传递给传统的上游服务器,这可能会阻止它能够在上游协商密码强制
17Diffie-Hellman公共密钥强度配置grep ssl_dhparam /etc/nginx/nginx.conf1.首先生成大于1024bit(例如2048bit)的dhkey mkdir /etc/nginx/ssl openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048 chmod 400 /etc/nginx/ssl/dhparam.pem 2.然后在对应服务器中配置 http { server { ssl_dhparam /etc/nginx/ssl/dhparam.pem;} }SSL在传输层对网络连接进行加密,当服务器SSL/TLS的瞬时Diffie-Hellman公共密钥小于等于1024位时,存在可以恢复纯文本信息的风险。weakdh.org/sysadmin.ht…强制
18开启OCSP stapling检查ocsp是否开启:grep -ir ssl_stapling /etc/nginx ssl_stapling on; ssl_stapling_verify on;支持服务器能够主动访问证书校验服务器才能生效,并且在每次重启nginx的时候会主动请求一次,如果网络不通会导致nginx启动缓慢。 开启 OCSP Stapling ---当客户端访问时 NginX 将去指定的证书中查找 OCSP 服务的地址,获得响应内容后通过证书链下发给客户端。 server { ssl_stapling on; ssl_stapling_verify on; }浏览器会定期更新证书吊销列表(CRL)OCSP Stapling则解决此问题。服务端主动通过OCSP获得证书状态,并随着证书一起发送给客户端,这样客户端就可以跳过自己去验证的步骤,以提高SSL握手的效率。建议
19HSTS安全头配置(Strict-Transport-Security)检查安全头是否配置: grep -ir Strict-Transport-Security /etc/nginx add_header Strict-Transport-Security "max-age=15768000;";server { add_header Strict-Transport-Security "max-age=15768000;"; }HSTS 头有助于保护服务器用户通过未加密的访问服务器 协议。有助于防止 HTTP 降级攻击。相关配置及影响说明:www.nginx.com/blog/http-s…建议
20保护上游服务器的HTTP流量检查是否设置grep -ir proxy_ssl_certificate /etc/nginx为了实施此建议,您必须创建客户端证书才能进行认证并签名。一旦您有签名证书,请将证书放在您选择的位置 使用proxy_ssl_certificate和proxy_ssl_certificate_key指令添加客户端证书和将用于在每个上游服务器上对NGINX进行身份验证的密钥: proxy_ssl_certificate /etc/nginx/ssl/nginx.pem; proxy_ssl_certificate_key /etc/nginx/ssl/nginx.key;使用客户端证书验证允许您建立受信任的代理服务器 References: 1. docs.nginx.com/nginx/admin… 2. www.staticshin.com/programming… 3. nginx.org/en/docs/htt…建议
21应禁用 HTTPS 会话的会话恢复grep -ir ssl_session_tickets /etc/nginx关闭ssl_session_tickets指令,作为您的nginx配置中任何服务器块的一部分:ssl_session_tickets off;Perfect Forward Secrecy是特定密钥协商协议的功能,可以确保即使服务器的私钥受到破坏,您的会话密钥也不会受到破坏。建议
请求限制
22确保正确设置最大请求大小grep -ir client_max_body_size /etc/nginx此方法可用于在遭受攻击时用于减轻攻击的防范手段,平时不强制要求配置,查找您的nginx配置的HTTP或服务器块.如要配置,相关参数则需要根据实际情况来定,具体配置方法如下: http { client_max_body_size 100K; }有助于缓解拒绝服务攻击建议
23确定URIs的最大缓冲区大小grep -ir large_client_header_buffers /etc/nginx/large_client_header_buffers 2 1k;默认:large_client_header_buffers 4 8k;如果此指令设置不正确,用户可能会收到 414 请求-URI 过大错误。建议
24设置连接超时时间grep -ir send_timeout /etc/nginx grep -ir keepalive_timeout /etc/nginx此方法可用于在遭受攻击时用于减轻攻击的防范手段,平时不强制要求配置,查找您的nginx配置的HTTP或服务器块.如要配置,相关参数则需要根据实际情况来定,具体配置方法如下: http { client_body_timeout 10; client_header_timeout 30; keepalive_timeout 30; send_timeout 10; }有助于缓解拒绝服务攻击 keepalive_timeout 限制了持久连接可能保持打开的时间。设置保持实时超时允许在服务器端控制此超时。 send_timeout指令为连续两次编写操作之间向客户端传输响应设定了超时。在服务器端设置send_timeout指令有助于通过确保占用大量时间的写入操作被关闭,从而缓解 HTTP 对服务攻击的拒绝响应。建议
25限制不安全请求方法1、在burpsuite的repeater窗口构造请求如下: PUT /rsp/ HTTP/1.1 Host: 10.45.6.161:8282 Accept: / 2、将步骤1中的PUT方法依次改为DELETE、TRACE 3、查看响应配置拒绝除get,head和post方法以外的请求方法: 既可以在nginx配置文件 server 下进行全局设置,也可以在某个location下进行设置 【全局】 server{ ... ... if (request method! (GET"HEAD"POST)) { return 444; } 注:非标准的444错误代码可以强制关闭服务器与客户端的连接而不返回任何响应信息给客户端。
26X-Frame-Options安全头配置grep -ir X-Frame-Options /etc/nginxadd_header X-Frame-Options "SAMEORIGIN";应设置 X-Frame-Options安全头,允许特定网站或根本没有网站根据您的组织政策和应用需求将您的网站作为对象嵌入其中,以防止点击劫持 配置参考: developer.mozilla.org/en-US/docs/…建议
27X-Content-Type-Options安全头配置grep -ir X-Content-Type-Options /etc/nginxadd_header X-Content-Type-Options "nosniff";通过CSP标头,您可以为网站定义批准的内容来源的白名单。通过限制浏览器可以为您的站点加载的资产(例如js和css) scotthelme.co.uk/hardening-y…建议
28X-Xss-Protection 安全头配置grep -ir X-Xss-Protection /etc/nginxadd_header X-Xss-Protection "1; mode=block";HTTPX-XSS-Protection响应标头是Internet Explorer,Chrome和Safari的一项功能,当页面检测到反射的跨站点脚本(XSS)攻击时,该页面将阻止加载页面。建议

安全基线是指一组安全策略和配置要求,旨在确保系统在设计、部署和操作过程中的安全性。安全基线检查与配置对于中间件安全具有重要意义,主要体现在以下几个方面:

  1. 发现和修复潜在的安全漏洞:通过对中间件的安全基线配置进行检查,可以发现配置错误、弱点和漏洞,并及时采取措施进行修复。这可以显著提高中间件的抵御能力,确保信息系统免受攻击和破坏。
  2. 确保合规性:许多法律法规和行业规范都对信息系统的安全性提出了具体要求。进行安全基线配置检查可以确保中间件符合相关要求,避免违法和不合规的风险。
  3. 提高系统的稳定性和可靠性:合理的安全基线配置可以提高中间件系统的稳定性和可靠性,减少系统故障的发生和影响。这对于保障信息系统的持续运行和业务连续性至关重要。
  4. 加强安全防护:安全基线配置是构建最基本的安全防范壁垒与手段。通过实施严格的安全基线配置,可以加强中间件系统的安全防护能力,有效抵御各种网络攻击和威胁。

在安全基线检查与配置过程中,通常包括以下几个方面:

  • 操作系统配置:检查操作系统的安全配置,确保中间件运行的环境安全。
  • 中间件配置:针对具体的中间件软件,检查其安全配置参数,如账户管理、访问控制、日志记录等。
  • 网络配置:检查网络设备的安全配置,确保中间件与外界通信的安全。
  • 安全策略和控制:检查系统中的安全策略和控制措施,确保其有效性和适用性。

此外,在进行安全基线配置检查时,还需要注意以下几个方面:

  • 定期进行检查:安全基线配置检查不是一次性的工作,应定期进行,及时发现和修复安全隐患。
  • 与安全事件响应相结合:将安全基线配置检查与安全事件响应相结合,形成闭环管理,提高系统的整体安全性。
  • 关注最新安全威胁:及时关注最新的安全威胁和漏洞信息,更新安全基线要求,加强系统的安全防护。
  • 培训和教育员工:加强员工的安全意识教育和培训,提高他们对安全基线配置的认识和重视程度。