如何通过这篇HTTPS安全加固配置指南提升站点安全性?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2405个文字,预计阅读时间需要10分钟。
目录 +0x02 HTTPS安全加固指南
1.连接安全性及加密选择
2.站点内容安全(Content Security)
3.避免站点额外信息泄露
4.避免Web服务器中间件脆弱性
+0x03 HTTPS安全与兼容性如何选择
+0x0n 入坑出坑 目录- 0x02 HTTPS安全加固指南
- 1.连接安全性和加密选择
- 2.站点内容安全(Content security)
- 3.避免站点额外信息泄露
- 4.避免Web服务器中间件脆弱性
- 0x03 HTTPS安全与兼容性如何抉择
- 0x0n 入坑出坑
- 1.通过blog.weiyigeek.top/2019/10-21-10.html )
SSL与TLS协议原理和证书签名生成实践指南 ( blog.weiyigeek.top/2019/10-21-12.html )
原文链接
HTTPS安全优化配置最佳实践指南简述 ( blog.weiyigeek.top/2022/4-6-11.html )
0x02 HTTPS安全加固指南描述: 当你的网站上了 HTTPS 以后,可否觉得网站已经安全了,其实不然前面说过想要部署TLS是非常容易,只需要证书与密钥文件然后根据中间件的配置ssl方法进行配置即可,默认的配置通常不满足weiyigeek.top,它存在这个头。header 告诉浏览器,如果证书 key 匹配,或者在发出证书链中有一个 key 匹配,那么在将来才会再次连接。其他的指令组合是可能的。它们都极大地减少了攻击者在客户端和合法主机之间模拟主机或拦截通信的可能性。
Public-Key-Pins: max-age=5184000; pin-sha256="+oZq/vo3Kcv0CQPjpdwyInqVXmLiobmUJ3FaDpD/U6c="; pin-sha256="47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="温馨提示: 设置 HSTS header
Strict-Transport-Security长的生命周期,即 max-age 的时间不能小于15552000,最好是半年及以上。
温馨提示: 确定是否需要为您的站点使用 PKP, 如果要是使用它请注意在SSL/TLS密钥需要更新时建立备份计划, 优先创建备份密钥和离线存储。
2.站点内容安全(Content security)安全加固实践
-
2.1) 避免混合 HTTPS 和 HTTP 内容(
Mixed HTTPS and HTTP Content), 如果 HTTPS 部署在主站上,请将任何地方的所有内容都 HTTPS 化(全站 HTTPS)。 -
2.2) 建议配置良好的内容安全策略
(CSP - Content Security Policy)响应头, 它可以帮助抵御跨站点脚本(XSS)和其他注入攻击等攻击,现在主流的浏览器都是支持CSP头的。
一个理想的CSP策略是基于白名单的方法,不允许任何东西,除了明确允许的内容,它还限制了 javascript 的来源和允许操作。
# 从限制性策略开始在必要时放松。 Content-Security-Policy: default-src 'none'; # 现在让我们允许自托管 scripts、images、CSS、fonts 和 AJAX,以及 jQuery CDN 托管脚本和 Google Analytics: Content-Security-Policy: default-src 'none'; script-src 'self' code.jquery.com www.google-analytics.com; img-src 'self' www.google-analytics.com; connect-src 'self'; font-src 'self'; style-src 'self'; # 一个不那么严格的策略 Content-Security-Policy: default-src 'self'; # 更少的限制性策略,然后添加限制,非常不建议如此使用。 Content-Security-Policy: default-src '*';- 2.3) 建议配置
X-Frame-Options非标准的响应头, 它规定了控制站点是否可以放置在<iframe>,<frame> 或 <object>标签, 从而防止了clickjacking (点击劫持)攻击。所以启用它时请确定你的网站是否需要被允许呈现在一个 frame 中。
# HTTP header: 完全不允许使用 sameorigin 拒绝或允许同源框架的选项 X-Frame-Options: deny # 该响应头可选值 DENY:不能被嵌入到任何iframe或者frame中。 SAMEORIGIN:页面只能被本站页面嵌入到iframe或者frame中 ALLOW-FROM uri:只能被嵌入到指定域名的框架中 # Nginx, 允许 music.163.com 放置在站点之中 add_header X-Frame-Options ALLOW-FROM music.163.com;- 2.4) 建议配置
XSS Protection(XSS过滤器) 可选, 跨站点脚本(XSS 或 CSS)的保护被构建到大多数流行的浏览器中,例如Chorme、IE等,但除了 Firefox 浏览器之外。
# HTTP header: X-Xss-Protection: 1; block # Nginx: add_header X-XSS-Protection "1; mode=block";- 2.5) 建议配置
Cache Control, 其表示缓存页面输出的首选项,适当的值随网站数据的性质而变化,但强烈推荐使用偏好, 如果允许缓存则应该将 max-age 值包含在 Cache-Control 以及 Etag 头文件中,以允许客户端缓存验证。
# HTTP header: Cache-Control: public* # 可选参数: 其中的一个 public,private,no-cache 或 no-store。- 2.6) 建议配置
Content Type Options,当浏览器以不同的方式处理来自服务器的文件时,MIME 嗅探就是服务器指令,例如当一个网站承载不受信任的内容(如用户提供的)时这是非常危险的。所以我们可以采用非标准的标头X-Content-Type-Options选项指示浏览器不做任何模仿指定类型的 MIME。
# HTTP header: X-Content-Type-Options: nosniff # Nginx add_header X-Content-Type-Options nosniff;- 2.7) 建议验证子资源完整性(
Subresource Integrity), 浏览器通常从外部域加载大量资源、javascript 和样式表, 例如第三方的js或者css,如果如果外部资源被破坏修改可能导致所以调用的站点存在一系列的脆弱性,所以我们设置外部 javascript 和样式表的完整性属性或者将外部脚本保存到本地路径中进行相对路径调用。
# 完整性校验,该文件的SHA384值 <script src="ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js" integrity="sha384-6ePHh72Rl3hKio4HiJ841psfsRJveeS+aLoaEf3BWfS+gTF0XdAqku2ka8VddikM"></script> # 或者本地相对调用 <script>window.jQuery || document.write('<script src="/jquery.min.js"><\/script>')</script>- 2.8) 建议配置 Iframe Sandbox,如果你的站点存在iframe标签的使用,建议配置 sandbox 属性允许对 iframe 中可以进行的操作进行限制。
# 设置 iframe 的 sandbox 属性,然后添加所需的权限。 <iframe src="weiyigeek.top" sandbox="allow-same-origin allow-scripts"></script>- 2.8) 建议配置 TLS服务器时间同步,我们可使用网络时间协议(NTP)来保持服务器时钟的准确性,这是由于服务器包括所有响应的时间戳,不准确的时钟不会给客户机浏览器带来问题。
ntpdate ntp.aliyun.com
10 Apr 07:39:18 ntpdate[41371]: adjust time server 203.107.6.88 offset 0.000460 sec- 2.9) 建议配置 Cookie Security, 如果你的站点包含敏感信息的 cookie,特别是会话 id,需要标记为安全的,建议会话 cookie 应该与 HttpOnly 值进行标记 和 正确配置 HSTS 响应头。以防止它们被 javascript 访问,这可以防止攻击者利用 XSS 窃取会话 cookie。
# 标记所有 cookie 安全为HttpOnly Set-Cookie: Key=Value; path=/; secure; HttpOnly, Key2=Value2; secure; HttpOnly # 例如, Tomcat7 中进行 HttpOnly 与 secure 配置 # tomcat/conf/server.xml <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" secure="true" /> # tomcat/conf/web.xml <session-config> <session-timeout>30</session-timeout> <cookie-config> <www.openssl.org/source/ wget -c www.openssl.org/source/openssl-1.1.1n.tar.gz tar -zxf openssl-1.1.1n.tar.gz && cd openssl-1.1.1n ./config --prefix=/usr/local/openssl make && sudo make install # lib 库加载到系统 echo "/usr/local/openssl/lib" >> /etc/ld.so.conf.d/libc.conf ldconfig # 可以看到当下系统的Openssl版本已经更新到最新 # root@weiyigeek-top:/usr/local/openssl/bin# openssl version # OpenSSL 1.1.1n 15 Mar 2022- 4.2) 推荐使用最新稳定的Web服务器软件及其版本, 例如 Nginx、Apache、Tomcat等中间件,请选择当前无脆弱性的版本。
# Nginx 中间件版本查看 $ nginx -V nginx version: nginx/1.21.6 built by gcc 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04) built with OpenSSL 1.1.1n 15 Mar 2022 TLS SNI support enabled configure arguments: --prefix=/usr/local/nginx --with-pcre=../pcre-8.45 --with-zlib=../zlib-1.2.11 --user=ubuntu --group=ubuntu --sbin-path=/usr/sbin/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --error-log-path=/var/log/nginx/error.log --ssl-config.mozilla.org/),例如我们生成具有多种客户端的通用服务器Nginx SSL配置。# generated 2022-04-10, Mozilla Guideline v5.6, nginx 1.26.1, OpenSSL 1.1.1n, intermediate configuration # ssl-config.mozilla.org/#server=nginx&version=1.26.1&config=intermediate&openssl=1.1.1n&guideline=5.6 server { listen 80 default_server; listen [::]:80 default_server; location / { return 301 $host$request_uri; } } server { listen 443 ssl ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam ssl_dhparam /path/to/dhparam; # intermediate configuration ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # HSTS (ngx_myssl.com/chain_download.html)补全证书链。# 下载证书链 curl myssl.com/api/v1/get_chain/5FFAFB3E5757A13292C4E3C0A045257E915D27DA > full_chain_ecc.crt # 在 Nginx 中配置证书链 ssl_certificate /app/ssl/weiyigeek.top_ecc/full_chain_ecc.crt; ssl_certificate_key /app/ssl/weiyigeek.top_ecc/weiyigeek.top.key;本文章来源 我的Blog站点 或 WeiyiGeek 公众账号 以及 我的BiliBili专栏 (
技术交流、友链交换请邮我哟),
欢迎各位志同道合的朋友一起学习交流,如文章有误请留下您宝贵的知识建议,通过邮箱联系我哟! -
- 1.通过blog.weiyigeek.top/2019/10-21-10.html )
本文共计2405个文字,预计阅读时间需要10分钟。
目录 +0x02 HTTPS安全加固指南
1.连接安全性及加密选择
2.站点内容安全(Content Security)
3.避免站点额外信息泄露
4.避免Web服务器中间件脆弱性
+0x03 HTTPS安全与兼容性如何选择
+0x0n 入坑出坑 目录- 0x02 HTTPS安全加固指南
- 1.连接安全性和加密选择
- 2.站点内容安全(Content security)
- 3.避免站点额外信息泄露
- 4.避免Web服务器中间件脆弱性
- 0x03 HTTPS安全与兼容性如何抉择
- 0x0n 入坑出坑
- 1.通过blog.weiyigeek.top/2019/10-21-10.html )
SSL与TLS协议原理和证书签名生成实践指南 ( blog.weiyigeek.top/2019/10-21-12.html )
原文链接
HTTPS安全优化配置最佳实践指南简述 ( blog.weiyigeek.top/2022/4-6-11.html )
0x02 HTTPS安全加固指南描述: 当你的网站上了 HTTPS 以后,可否觉得网站已经安全了,其实不然前面说过想要部署TLS是非常容易,只需要证书与密钥文件然后根据中间件的配置ssl方法进行配置即可,默认的配置通常不满足weiyigeek.top,它存在这个头。header 告诉浏览器,如果证书 key 匹配,或者在发出证书链中有一个 key 匹配,那么在将来才会再次连接。其他的指令组合是可能的。它们都极大地减少了攻击者在客户端和合法主机之间模拟主机或拦截通信的可能性。
Public-Key-Pins: max-age=5184000; pin-sha256="+oZq/vo3Kcv0CQPjpdwyInqVXmLiobmUJ3FaDpD/U6c="; pin-sha256="47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="温馨提示: 设置 HSTS header
Strict-Transport-Security长的生命周期,即 max-age 的时间不能小于15552000,最好是半年及以上。
温馨提示: 确定是否需要为您的站点使用 PKP, 如果要是使用它请注意在SSL/TLS密钥需要更新时建立备份计划, 优先创建备份密钥和离线存储。
2.站点内容安全(Content security)安全加固实践
-
2.1) 避免混合 HTTPS 和 HTTP 内容(
Mixed HTTPS and HTTP Content), 如果 HTTPS 部署在主站上,请将任何地方的所有内容都 HTTPS 化(全站 HTTPS)。 -
2.2) 建议配置良好的内容安全策略
(CSP - Content Security Policy)响应头, 它可以帮助抵御跨站点脚本(XSS)和其他注入攻击等攻击,现在主流的浏览器都是支持CSP头的。
一个理想的CSP策略是基于白名单的方法,不允许任何东西,除了明确允许的内容,它还限制了 javascript 的来源和允许操作。
# 从限制性策略开始在必要时放松。 Content-Security-Policy: default-src 'none'; # 现在让我们允许自托管 scripts、images、CSS、fonts 和 AJAX,以及 jQuery CDN 托管脚本和 Google Analytics: Content-Security-Policy: default-src 'none'; script-src 'self' code.jquery.com www.google-analytics.com; img-src 'self' www.google-analytics.com; connect-src 'self'; font-src 'self'; style-src 'self'; # 一个不那么严格的策略 Content-Security-Policy: default-src 'self'; # 更少的限制性策略,然后添加限制,非常不建议如此使用。 Content-Security-Policy: default-src '*';- 2.3) 建议配置
X-Frame-Options非标准的响应头, 它规定了控制站点是否可以放置在<iframe>,<frame> 或 <object>标签, 从而防止了clickjacking (点击劫持)攻击。所以启用它时请确定你的网站是否需要被允许呈现在一个 frame 中。
# HTTP header: 完全不允许使用 sameorigin 拒绝或允许同源框架的选项 X-Frame-Options: deny # 该响应头可选值 DENY:不能被嵌入到任何iframe或者frame中。 SAMEORIGIN:页面只能被本站页面嵌入到iframe或者frame中 ALLOW-FROM uri:只能被嵌入到指定域名的框架中 # Nginx, 允许 music.163.com 放置在站点之中 add_header X-Frame-Options ALLOW-FROM music.163.com;- 2.4) 建议配置
XSS Protection(XSS过滤器) 可选, 跨站点脚本(XSS 或 CSS)的保护被构建到大多数流行的浏览器中,例如Chorme、IE等,但除了 Firefox 浏览器之外。
# HTTP header: X-Xss-Protection: 1; block # Nginx: add_header X-XSS-Protection "1; mode=block";- 2.5) 建议配置
Cache Control, 其表示缓存页面输出的首选项,适当的值随网站数据的性质而变化,但强烈推荐使用偏好, 如果允许缓存则应该将 max-age 值包含在 Cache-Control 以及 Etag 头文件中,以允许客户端缓存验证。
# HTTP header: Cache-Control: public* # 可选参数: 其中的一个 public,private,no-cache 或 no-store。- 2.6) 建议配置
Content Type Options,当浏览器以不同的方式处理来自服务器的文件时,MIME 嗅探就是服务器指令,例如当一个网站承载不受信任的内容(如用户提供的)时这是非常危险的。所以我们可以采用非标准的标头X-Content-Type-Options选项指示浏览器不做任何模仿指定类型的 MIME。
# HTTP header: X-Content-Type-Options: nosniff # Nginx add_header X-Content-Type-Options nosniff;- 2.7) 建议验证子资源完整性(
Subresource Integrity), 浏览器通常从外部域加载大量资源、javascript 和样式表, 例如第三方的js或者css,如果如果外部资源被破坏修改可能导致所以调用的站点存在一系列的脆弱性,所以我们设置外部 javascript 和样式表的完整性属性或者将外部脚本保存到本地路径中进行相对路径调用。
# 完整性校验,该文件的SHA384值 <script src="ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js" integrity="sha384-6ePHh72Rl3hKio4HiJ841psfsRJveeS+aLoaEf3BWfS+gTF0XdAqku2ka8VddikM"></script> # 或者本地相对调用 <script>window.jQuery || document.write('<script src="/jquery.min.js"><\/script>')</script>- 2.8) 建议配置 Iframe Sandbox,如果你的站点存在iframe标签的使用,建议配置 sandbox 属性允许对 iframe 中可以进行的操作进行限制。
# 设置 iframe 的 sandbox 属性,然后添加所需的权限。 <iframe src="weiyigeek.top" sandbox="allow-same-origin allow-scripts"></script>- 2.8) 建议配置 TLS服务器时间同步,我们可使用网络时间协议(NTP)来保持服务器时钟的准确性,这是由于服务器包括所有响应的时间戳,不准确的时钟不会给客户机浏览器带来问题。
ntpdate ntp.aliyun.com
10 Apr 07:39:18 ntpdate[41371]: adjust time server 203.107.6.88 offset 0.000460 sec- 2.9) 建议配置 Cookie Security, 如果你的站点包含敏感信息的 cookie,特别是会话 id,需要标记为安全的,建议会话 cookie 应该与 HttpOnly 值进行标记 和 正确配置 HSTS 响应头。以防止它们被 javascript 访问,这可以防止攻击者利用 XSS 窃取会话 cookie。
# 标记所有 cookie 安全为HttpOnly Set-Cookie: Key=Value; path=/; secure; HttpOnly, Key2=Value2; secure; HttpOnly # 例如, Tomcat7 中进行 HttpOnly 与 secure 配置 # tomcat/conf/server.xml <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" secure="true" /> # tomcat/conf/web.xml <session-config> <session-timeout>30</session-timeout> <cookie-config> <www.openssl.org/source/ wget -c www.openssl.org/source/openssl-1.1.1n.tar.gz tar -zxf openssl-1.1.1n.tar.gz && cd openssl-1.1.1n ./config --prefix=/usr/local/openssl make && sudo make install # lib 库加载到系统 echo "/usr/local/openssl/lib" >> /etc/ld.so.conf.d/libc.conf ldconfig # 可以看到当下系统的Openssl版本已经更新到最新 # root@weiyigeek-top:/usr/local/openssl/bin# openssl version # OpenSSL 1.1.1n 15 Mar 2022- 4.2) 推荐使用最新稳定的Web服务器软件及其版本, 例如 Nginx、Apache、Tomcat等中间件,请选择当前无脆弱性的版本。
# Nginx 中间件版本查看 $ nginx -V nginx version: nginx/1.21.6 built by gcc 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04) built with OpenSSL 1.1.1n 15 Mar 2022 TLS SNI support enabled configure arguments: --prefix=/usr/local/nginx --with-pcre=../pcre-8.45 --with-zlib=../zlib-1.2.11 --user=ubuntu --group=ubuntu --sbin-path=/usr/sbin/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --error-log-path=/var/log/nginx/error.log --ssl-config.mozilla.org/),例如我们生成具有多种客户端的通用服务器Nginx SSL配置。# generated 2022-04-10, Mozilla Guideline v5.6, nginx 1.26.1, OpenSSL 1.1.1n, intermediate configuration # ssl-config.mozilla.org/#server=nginx&version=1.26.1&config=intermediate&openssl=1.1.1n&guideline=5.6 server { listen 80 default_server; listen [::]:80 default_server; location / { return 301 $host$request_uri; } } server { listen 443 ssl ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam ssl_dhparam /path/to/dhparam; # intermediate configuration ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # HSTS (ngx_myssl.com/chain_download.html)补全证书链。# 下载证书链 curl myssl.com/api/v1/get_chain/5FFAFB3E5757A13292C4E3C0A045257E915D27DA > full_chain_ecc.crt # 在 Nginx 中配置证书链 ssl_certificate /app/ssl/weiyigeek.top_ecc/full_chain_ecc.crt; ssl_certificate_key /app/ssl/weiyigeek.top_ecc/weiyigeek.top.key;本文章来源 我的Blog站点 或 WeiyiGeek 公众账号 以及 我的BiliBili专栏 (
技术交流、友链交换请邮我哟),
欢迎各位志同道合的朋友一起学习交流,如文章有误请留下您宝贵的知识建议,通过邮箱联系我哟! -
- 1.通过blog.weiyigeek.top/2019/10-21-10.html )

