网站安全评估,指的是对网站的安全进行信息技术安全测试和风险评估。
diogomonica.com(使用Jekyll创建)是一个静态生成博客,但即便是这样的一个网站,当你在使用SSL Labs以及Security Headers等网站对其进行安全评估时,你总是能够发现一些非常有趣的事情。
不幸的是,在上周,当我使用securityheaders.io的安全检查器对该网站进行检测时,我得到了下面的结果:
对于该网站的安全工程师而言,这绝对会让他感到尴尬。虽然我的博客系统并不需要用到这些高级的安全header,但我决定要将其安全评估提升至A+。
这些header是什么?
在我们将这些红色的警告框变成看起来更加舒服的绿色框之前,你不光得先对这些header进行详细的了解,而且你还得明白为什么你要确保你的网页属性中包含这些信息。
| Content-Security-Policy (CSP):允许网站定义一个专门处理从外部域导入的JavaScript,css,以及图片等信息的策略。以防止XSS以及其他类型的跨站注入攻击。
| X-Content-Type-Options:防止IE浏览器和谷歌Chrome在MIME嗅探中泄漏其声明的内容类型。
| X-Frame-Options:抵御点击劫持攻击。
| X-XSS-Protection:基本上是没有作用的;在现代浏览器中,它是默认启动的。
| Strict-Transport-Security (HSTS):它能够让你的浏览器在连接至一个特定的域名时,总是使用HTTPS进行链接。攻击者无法劫持此类链接,而且用户也不会忽视TLS警告。
| Public-Key-Pins (HPKP):它能够让你的浏览器对一个指定的域名和一个专用的公共密钥进行绑定。以防止攻击者从其他的证书颁发机构获取到有用的证书凭证。
从最简单的修复开始
在程序的设置部分并没有多少有意思的地方,因为改变程序的设置将很有可能破坏你网站中的应用,而且出了问题也很难查找到根源。除此之外,修改这些header的设置其实并不会对你的网站产生多大的影响。
现在,我将使用nginx作为我的网站服务器,并把add_header指令添加进我的配置文件中:
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
当我们为这三个header选择参数的时候,我们并没有很多选择。如果你想要了解更多有关的信息,请查看Mozilla公司提供的相关介绍。
添加HSTS和CSP
如果你所部署的CSP策略要求过为严苛,浏览器将有可能不会加载任何内容,这就会导致用户无法打开你的网站。如果你部署了一个HSTS策略,并且在此之后禁用了网站或者web应用的HTTPS功能,用户暂时无法访问你的网站。
HSTS
由于我在架设网站时,总是会用到TLS协议,所以我会启用HSTS,并将其参数max-age设为7776000(秒)。这一参数将会告诉浏览器,在接下来的三个月时间内,它们只能尝试通过HTTPS协议来访问diogomonica.com:
add_header Strict-Transport-Security max-age=7776000;
另一个非常重要的HSTS参数是includeSubDomains,我将这个参数设为了禁用,因为我通常会在运行无https协议的网站时才会用到这个参数。如果你能确定网站的每一个子域名都会使用HTTPS协议,那么你应该启用这一参数。
CSP
CSP有两种不同的操作模式:执行和报告。如果你使用了Content-Security-Policy header,CSP将会进入执行模式;如果你使用的是Content-Security-Policy-Report-Only,那么CSP将会进入报告模式。
CSP策略十分的复杂,我建议用户可以先启用它的报告模式,因为它可以帮助你了解在启动执行模式之前,你还需要做哪些准备。当然了,你也应该了解CSP策略中不同的操作指令。
就我个人所遇到的情况而言,从来没有人抱怨过我的博客无法打开。我会直接启用执行模式,然后在Chrome浏览器开发者控制台的帮助下,一个接一个地修复那些红色的警告框,结果如下:
add_header Content-Security-Policy "default-src 'self';
script-src 'self' 'unsafe-eval' https://ssl.google-analytics.com https://ajax.cloudflare.com;
img-src 'self' https://ssl.google-analytics.com ;
style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
font-src 'self' https://fonts.googleapis.com https://fonts.gstatic.com;
object-src 'none'";
在我重启了我的nginx服务器之后,下图显示的是securityheaders.io对本网站现在的安全评级:
得到A+(启用HPKP)
HPKP的工作机制是:它会让浏览器自动查询HPKP header,并检测这些pin码是否与证书链中的SPKI凭证相匹配。这也就意味着,你可以使用证书链中的任意pin码来进行操作了,即从子证书一直到根证书你都可以使用。
然后,我为我的密钥获取到了相应的SPKI凭证。在这一步中,有很多方法可以实现。
通过openssl命令,我从当前正在使用的证书中获取到了相应凭证:
root@burly:/etc/ssl# openssl x509 -in cloudflare-diogomonica.com.crt -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | base64
bDk6Wbfj83EpcaKgT5WkBfiiml66Tln3DskDJneGBoo=
HPKP在所有的安全header中,可以算是最危险的了。与HSTS一样,如果某些地方发生了错误,(你的私钥被别人获取了),用户可能在一段时间(具体时间取决于你所设置的max_age参数)内将无法访问你的网站。同样的,类似CSP,但HPKP通常只有Report-Only模式,你可以利用它来测试你的pin码,而不会受到服务器停机的风险。如果你想要了解更多有关HPKP的信息,请查看这篇由Tim Taubert所发表的博客文章。
正如我在之前所提到的,由于这个博客目前缺少读者,所以我就可以直接进入执行模式了,并将这个新的header添加进我nginx服务器的配置文件中:
add_header Public-Key-Pins 'pin-sha256="bDk6Wbfj83EpcaKgT5WkBfiiml66Tln3DskDJneGBoo="; pin-sha256="E8WztKzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGWooE="; max-age=60';
在此,我要指出的是,我承认我有些随便,因为我将max_age的值设为了60(秒),但这只是为了测试。这样一来,我就可以直接禁用掉某些header,如果我弄错了pin码,只需要等待一分钟我就可以继续进行操作了。
结果截图
在重新配置了所有的header,并重启了nginx服务器之后,下图显示的是最新的评分:A+
为了得到这一结果,我们似乎进行了一系列非常复杂的操作,有没有一些实用的小技巧可以让我直接得到A+的评分呢?
因为securityheaders.io只会检测这些header是否存在(它甚至不会对其中的参数进行解析),回答当然是“有的”:
add_header Strict-Transport-Security max-age=0;
add_header X-Frame-Options "ANYTHINGREALLY";
add_header X-Content-Type-Options anythingreally;
add_header X-XSS-Protection "0";
add_header Content-Security-Policy "default-src *";
add_header Public-Key-Pins max-age=0;
在SSL Labs的检测中得到A+评分?
如果得到A你就已经满意的话,你可以使用cloudflare。如果你真的想要得到A+,你可以阅读这篇文章以获取更多的信息。
结论
除非你拥有一个成熟的SecOps团队作为支撑,除此之外,我不建议普通用户开启HPK。除了HPKP之外,你应该在你所部属的所有网站以及web应用程序中启用上述所提到的全部header。
请记住:如果你的网站目前的访问量不是很大的话,你的配置过程将会非常的简单。所以宜早不宜迟,赶快行动吧!
还没有评论,来说两句吧...