<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[沧海一粟]]></title> 
<link>http://www.dzhope.com/index.php</link> 
<description><![CDATA[Web系统架构与服务器运维,php开发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[沧海一粟]]></copyright>
<item>
<link>http://www.dzhope.com/post//</link>
<title><![CDATA[这样配置，让Nginx更安全]]></title> 
<author>jed &lt;jed521@163.com&gt;</author>
<category><![CDATA[服务器技术]]></category>
<pubDate>Sat, 25 Jan 2025 06:04:39 +0000</pubDate> 
<guid>http://www.dzhope.com/post//</guid> 
<description>
<![CDATA[ 
	引言<br/>作为使用最广泛的Web服务器之一，Nginx的安全配置显得尤为重要。本文将从多个维度详细介绍如何增强Nginx的安全性，帮助开发运维人员构建一个更安全的Web服务环境。<br/><br/>一、基础安全配置<br/>1. 隐藏版本号信息<br/>默认情况下，Nginx会在响应头中显示版本号，这可能会给攻击者提供服务器信息。攻击者可以根据版本号查找对应版本的已知漏洞进行定向攻击。<br/><div class="code"><br/>http &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 关闭在响应头中显示Nginx版本号<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 默认响应头: Server: nginx/1.18.0<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 关闭后响应头: Server: nginx<br/>&nbsp;&nbsp;&nbsp;&nbsp;server_tokens off;<br/>&#125;<br/></div><br/>2. 配置安全Headers<br/>添加安全相关的HTTP响应头，可以有效防御常见的Web攻击：<br/><div class="code"><br/># 防止网站被嵌入恶意网页中，避免点击劫持<br/>add_header X-Frame-Options &quot;SAMEORIGIN&quot;;<br/><br/># 启用浏览器XSS防护功能，并在检测到攻击时，停止渲染页面<br/>add_header X-XSS-Protection &quot;1; mode=block&quot;;<br/><br/># 禁止浏览器猜测（嗅探）资源的MIME类型，防止资源类型混淆攻击<br/>add_header X-Content-Type-Options &quot;nosniff&quot;;<br/><br/># 控制引用地址信息的传递，增强隐私保护<br/>add_header Referrer-Policy &quot;strict-origin-origin-when-cross-origin&quot;;<br/><br/># 内容安全策略，控制资源加载来源，防止XSS等攻击<br/># default-src &#039;self&#039;: 只允许加载同源资源<br/># http: https:: 允许通过HTTP和HTTPS加载资源<br/># data:: 允许data:URI的资源（如base64编码的图片）<br/># blob:: 允许blob:URI的资源（如视频流）<br/># &#039;unsafe-inline&#039;: 允许内联脚本和样式（根据需要配置）<br/>add_header Content-Security-Policy &quot;default-src &#039;self&#039; http: https: data: blob: &#039;unsafe-inline&#039;&quot;;<br/></div><br/>二、访问控制优化<br/>1. 限制连接数<br/>为防止DOS攻击，应该限制单个IP的连接数和请求频率：<br/><div class="code"><br/>http &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 定义一个共享内存区域，用于存储IP连接数信息<br/>&nbsp;&nbsp;&nbsp;&nbsp;# $binary_remote_addr: 使用二进制格式存储客户端IP，节省空间<br/>&nbsp;&nbsp;&nbsp;&nbsp;# zone=addr:10m: 指定共享内存区域名称为addr，大小为10MB<br/>&nbsp;&nbsp;&nbsp;&nbsp;limit_conn_zone $binary_remote_addr zone=addr:10m;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 限制每个IP同时最多100个连接<br/>&nbsp;&nbsp;&nbsp;&nbsp;limit_conn addr 100;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 定义请求频率限制，每个IP每秒最多10个请求<br/>&nbsp;&nbsp;&nbsp;&nbsp;# rate=10r/s: 每秒10个请求<br/>&nbsp;&nbsp;&nbsp;&nbsp;limit_req_zone $binary_remote_addr zone=req_zone:10m rate=10r/s;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 应用请求频率限制，burst=20表示最多允许20个请求排队<br/>&nbsp;&nbsp;&nbsp;&nbsp;limit_req zone=req_zone burst=20 nodelay;<br/>&#125;<br/></div><br/>2. 配置白名单<br/>对于管理后台等敏感区域，建议配置IP白名单：<br/><div class="code"><br/>location /admin/ &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 允许内网IP段访问<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 192.168.1.0/24: 允许192.168.1.x网段的所有IP<br/>&nbsp;&nbsp;&nbsp;&nbsp;allow 192.168.1.0/24;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 允许另一个内网IP段访问<br/>&nbsp;&nbsp;&nbsp;&nbsp;allow 10.0.0.0/8;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 拒绝其他所有IP访问<br/>&nbsp;&nbsp;&nbsp;&nbsp;deny all;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 开启基础认证<br/>&nbsp;&nbsp;&nbsp;&nbsp;auth_basic &quot;Restricted Access&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;auth_basic_user_file /etc/nginx/.htpasswd;<br/>&#125;<br/></div><br/>三、SSL/TLS安全配置<br/>1. 启用HTTPS<br/>配置SSL证书并强制HTTPS访问：<br/><div class="code"><br/>server &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 监听443端口，启用SSL<br/>&nbsp;&nbsp;&nbsp;&nbsp;listen 443 ssl;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 指定SSL证书路径<br/>&nbsp;&nbsp;&nbsp;&nbsp;ssl_certificate /path/to/cert.pem;<br/>&nbsp;&nbsp;&nbsp;&nbsp;ssl_certificate_key /path/to/key.pem;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 将所有HTTP请求重定向到HTTPS<br/>&nbsp;&nbsp;&nbsp;&nbsp;if ($scheme != &quot;https&quot;) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 301 https://$server_name$request_uri;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 启用HSTS，强制浏览器在指定时间内使用HTTPS访问<br/>&nbsp;&nbsp;&nbsp;&nbsp;add_header Strict-Transport-Security &quot;max-age=31536000&quot; always;<br/>&#125;<br/></div><br/>2. 优化SSL配置<br/>使用更安全的SSL配置参数：<br/><div class="code"><br/># 只允许TLS 1.2和1.3版本，禁用不安全的SSL和早期TLS版本<br/>ssl_protocols TLSv1.2 TLSv1.3;<br/><br/># 配置加密套件，按推荐顺序排列<br/># ECDHE: 使用椭圆曲线密钥交换<br/># AES-GCM: 使用AES-GCM加密模式<br/>ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;<br/><br/># 优先使用服务器的加密套件<br/>ssl_prefer_server_ciphers on;<br/><br/># 配置SSL会话缓存，提高性能<br/># shared:SSL:10m: 所有工作进程共享的缓存，大小为10MB<br/>ssl_session_cache shared:SSL:10m;<br/><br/># SSL会话超时时间<br/>ssl_session_timeout 10m;<br/><br/># 启用OCSP Stapling，提供证书状态信息<br/>ssl_stapling on;<br/>ssl_stapling_verify on;<br/>resolver 8.8.8.8 8.8.4.4 valid=300s;<br/>resolver_timeout 5s;<br/></div><br/>四、文件上传安全<br/>1. 限制上传文件大小<br/>防止通过上传大文件耗尽服务器资源：<br/><div class="code"><br/># 限制请求体大小，即上传文件的最大大小为10MB<br/>client_max_body_size 10m;<br/><br/># 设置请求体缓冲区大小为128KB<br/># 超过此大小的请求体会被写入临时文件<br/>client_body_buffer_size 128k;<br/><br/># 配置临时文件存储路径<br/>client_body_temp_path /var/nginx/client_body_temp;<br/></div><br/>2. 配置上传目录权限<br/>确保上传目录的权限配置正确：<br/><div class="code"><br/>location /uploads/ &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 指定上传根目录<br/>&nbsp;&nbsp;&nbsp;&nbsp;root /var/www/uploads;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 指定临时文件目录<br/>&nbsp;&nbsp;&nbsp;&nbsp;client_body_temp_path /var/www/tmp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 允许的WebDAV方法<br/>&nbsp;&nbsp;&nbsp;&nbsp;dav_methods PUT DELETE MKCOL COPY MOVE;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 自动创建上传目录<br/>&nbsp;&nbsp;&nbsp;&nbsp;create_full_put_path on;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 设置目录访问权限<br/>&nbsp;&nbsp;&nbsp;&nbsp;# user:rw - 文件所有者可读写<br/>&nbsp;&nbsp;&nbsp;&nbsp;# group:rw - 组用户可读写<br/>&nbsp;&nbsp;&nbsp;&nbsp;# all:r - 其他用户只读<br/>&nbsp;&nbsp;&nbsp;&nbsp;dav_access user:rw group:rw all:r;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 限制上传文件类型<br/>&nbsp;&nbsp;&nbsp;&nbsp;if ($request_filename ~* ^.*?&#92;.(php&#124;php5&#124;sh&#124;pl&#124;py)$) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 403;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/></div><br/>五、防止常见攻击<br/>1. 防止SQL注入<br/>配置特殊字符过滤：<br/><div class="code"><br/>location / &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 检查URL中是否包含特殊字符<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 如果包含分号、单引号、尖括号等字符，返回444状态码<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 444是Nginx特殊状态码，表示关闭连接而不发送响应头<br/>&nbsp;&nbsp;&nbsp;&nbsp;if ($request_uri ~* &#91;;&#039;&lt;&gt;&#93; ) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 444;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 检查查询字符串中的特殊字符<br/>&nbsp;&nbsp;&nbsp;&nbsp;if ($args ~* &#91;;&#039;&lt;&gt;&#93; ) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 444;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 保护敏感URI<br/>&nbsp;&nbsp;&nbsp;&nbsp;location ~* /(admin&#124;backup&#124;config&#124;db&#124;src)/ &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deny all;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/></div><br/>2. 防止目录遍历<br/>禁止访问隐藏文件和目录：<br/><div class="code"><br/># 禁止访问所有以点开头的隐藏文件和目录<br/>location ~ /&#92;. &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 拒绝所有请求<br/>&nbsp;&nbsp;&nbsp;&nbsp;deny all;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 禁止记录访问日志<br/>&nbsp;&nbsp;&nbsp;&nbsp;access_log off;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 禁止记录404错误日志<br/>&nbsp;&nbsp;&nbsp;&nbsp;log_not_found off;<br/>&#125;<br/><br/># 禁止访问特定目录<br/>location ~* ^/(uploads&#124;images)/.*&#92;.(php&#124;php5&#124;sh&#124;pl&#124;py&#124;asp&#124;aspx&#124;jsp)$ &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;deny all;<br/>&#125;<br/><br/># 防止目录列表<br/>location / &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;autoindex off;<br/>&#125;<br/></div><br/>六、日志安全<br/>1. 配置访问日志<br/>详细记录访问信息，便于安全分析：<br/><div class="code"><br/># 定义详细的日志格式<br/>log_format detailed &#039;$remote_addr - $remote_user &#91;$time_local&#93; &#039;&nbsp;&nbsp;# 记录客户端IP和访问时间<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;&quot;$request&quot; $status $body_bytes_sent &#039;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 记录请求信息、状态码和发送字节数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;&quot;$http_referer&quot; &quot;$http_user_agent&quot; &#039;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 记录来源页面和用户代理<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;$request_time $upstream_response_time&#039;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 记录请求处理时间和上游响应时间<br/><br/># 配置访问日志<br/># buffer=32k: 使用32KB缓冲区<br/># flush=5s: 每5秒刷新一次日志<br/>access_log /var/log/nginx/access.log detailed buffer=32k flush=5s;<br/><br/># 对于静态资源，可以关闭访问日志以提高性能<br/>location /static/ &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;access_log off;<br/>&#125;<br/></div><br/>2. 配置错误日志<br/>设置适当的错误日志级别：<br/><div class="code"><br/># 设置错误日志级别为warn<br/># 可选级别: debug, info, notice, warn, error, crit, alert, emerg<br/>error_log /var/log/nginx/error.log warn;<br/><br/># 对于开发环境，可以使用debug级别获取更多信息<br/># error_log /var/log/nginx/error.log debug;<br/></div><br/>七、其他安全措施<br/>1. 禁止执行脚本<br/>在静态资源目录中禁止执行脚本：<br/><div class="code"><br/>location /static/ &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 禁止执行PHP文件<br/>&nbsp;&nbsp;&nbsp;&nbsp;location ~ &#92;.(php&#124;php5)$ &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deny all;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;# 只允许特定文件类型<br/>&nbsp;&nbsp;&nbsp;&nbsp;location ~* &#92;.(css&#124;js&#124;jpg&#124;jpeg&#124;png&#124;gif&#124;ico&#124;svg&#124;woff&#124;woff2&#124;ttf&#124;eot)$ &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expires 30d;&nbsp;&nbsp;# 设置缓存时间<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_header Cache-Control &quot;public, no-transform&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/></div><br/>2. 配置超时时间<br/>设置合理的超时参数，防止慢速攻击：<br/><div class="code"><br/># 客户端请求体超时时间，单位秒<br/>client_body_timeout 10;<br/><br/># 客户端请求头超时时间<br/>client_header_timeout 10;<br/><br/># 客户端保持连接超时时间<br/># 第一个参数是客户端超时时间<br/># 第二个参数是在响应头中的Keep-Alive超时时间<br/>keepalive_timeout 5 5;<br/><br/># 向客户端发送响应的超时时间<br/>send_timeout 10;<br/><br/># 读取代理服务器响应的超时时间<br/>proxy_read_timeout 10;<br/><br/># 连接代理服务器的超时时间<br/>proxy_connect_timeout 10;<br/></div><br/>总结<br/>以上配置涵盖了Nginx安全加固的主要方面，每个配置都附带了详细的解释和注释。在实际应用中，建议根据具体的业务需求和安全级别要求，对这些配置进行适当的调整。同时，要注意以下几点：<br/>定期更新Nginx到最新的稳定版本<br/><br/>使用配置文件包含（include）来组织大型配置<br/><br/>在应用配置前，使用 nginx -t 检查配置正确性<br/><br/>定期检查日志文件，及时发现安全问题<br/><br/>配合WAF（Web应用防火墙）使用，提供更全面的安全防护<br/><br/>原文：<a href="https://mp.weixin.qq.com/s/OvKZE9wbGzlSL3pu0_2LXg" target="_blank">https://mp.weixin.qq.com/s/OvKZE9wbGzlSL3pu0_2LXg</a>
]]>
</description>
</item><item>
<link>http://www.dzhope.com/post//#blogcomment</link>
<title><![CDATA[[评论] 这样配置，让Nginx更安全]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.dzhope.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>