继上一篇
《如何打造一个全满分网站》
之后,这一次我们来谈谈如何打造一个在安全方面也能打满分的网站。因为对于一个网站来讲,仅有功能是不够的,还需要考虑性能,仅有性能也不够,还需要考虑安全。
由于网站安全方面涉及因素很多,例如如何防止
跨域攻击
,如何防止
SQL注入
等等软件开发方面的安全考虑,如果真想做到全面防护的话,还需要有更专业的机构进行漏洞检测,我们这里谈的只是最基本的在传输层面的
https
安全。
评测工具
跟上次的思路一样,开始动手之前,我们还是先来熟悉一下评测工具,这次介绍的主要是两个网站,基本上你如果在一个网站上拿不到高分,在另一个网站也是一样。
又拍云网络安全监测
又拍云
为了推广自己的
HTTPS
服务,提供了一个免费检测工具。就拿我们熟悉的
segmentfault
来说吧:
很不幸,在安全方面完全不合格。
又拍云
提供的方案有两个:
-
直接购买
又拍云HTTPS
服务;
-
自己按照优化建议进行优化。
如果自己优化的话,其实最关键的核心问题是一点:
服务器易受到CVE-2016-2107漏洞攻击,降级为F
。只要解决了这个问题,评分就能上升很多。
Qualys SSL Test
另外一个工具是Qualys SSL Lab提供的免费服务,和
又拍云
类似,但是不推销产品。还是拿
segmentfault.com
来做一下实验:
同样是
F
,不合格。根本原因还是在这个
CVE-2016-2107
。
解决方案
CVE-2016-2107
那么,到底什么是
CVE-2016-2107
呢?
Cloudflare
给出了详细解释,不过如果你不是安全方面的专家,基本上如读天书不知所云。
粗略地来讲,
CVE-2016-2107
是
OpenSSL1.0
的一个漏洞,是
2016
年刚刚发现的编号为
2107
号漏洞。安全系统的漏洞就像人的衣服破了一个洞一样,对付漏洞的手段无非就是两个:要不然打个补丁接着穿,要不然换件新的。
OpenSSL
官方给出的解决方案是把
OpenSSL
升级到
1.0.2h
就行了。但是怎么升级是一个问题,如果你用
yum update
升的话根本也升不上去,况且就算升上去了,也于事无补,因为你的
nginx
软件包里用的继续还是旧版本的
OpenSSL
,只有用正确的参数重新编译
nginx
才能解决这个问题。关于如何编译
nginx
,可以参考我的《免费给你的网站加上蓝色小闪电》的后半部分。
但据我的实际测试发现,即使把
OpenSSL
升级到
1.0.2h
也无法解决此问题,为此直接把
OpenSSL
升级到了最新的
1.1.0g
,但造成的问题是
nginx
又不兼容了,为此还需要把
nginx
也升级到最新版本
1.13.6
。经过这样的升级后,你的网站穿上了新衣服,这个漏洞就算堵住了。
nginx
的相关编译参数如下:
--prefix=/usr/local/nginx --with-http_ssl_module --with-openssl=/root/src/openssl-1.1.0g --user=nginx --group=nginx --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_geoip_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'
按照这个方法,还顺带解决了
http/2
的传输问题,详见《免费给你的网站加上蓝色小闪电》一文。
ECC
解决完了
CVE-2016-2107
漏洞,我们来看一看证书,似乎和别人的不太一样:
那么什么是
RSA
,什么又是
椭圆曲线
呢?简单来说,
RSA
是利用大数因数分解的困难性来增加黑客破解的难度。比如你问小明:
15
等于几乘以几?他可以很快答出
3x5
,如果你问他:
51
等于几乘以几?他可能就要掏出计算器来算一算,才能告诉你等于
17x3
。如果再问:
10,497,479
等于几乘以几?恐怕他拿着计算器也算不出来,正确答案是
3229x3251
,而实际上我们真正用于
RSA
的两个质数还要远大于这个数字,所以因数分解的困难性是保证
RSA
安全的重要前提。
然而,
2015
年的时候,号称有一种算法已经可以破译RSA,于是安全专家们又提出了
ECC(EllipticCurveCryptography)
,中文叫作“
椭圆曲线加密
”算法。
椭圆
我们都知道,但
椭圆曲线
是个什么东西呢?
这是一个
椭圆
:
下面这两个都是
椭圆曲线
:
长的根本就不像好吧,那为什么又要叫
椭圆曲线
呢?简单来说,椭圆曲线这个名称的来源只是和椭圆周长的计算有关,从图形上看它们没有任何关系。
那好吧,这么一条曲线怎么加密呢?
加密的公式很简单,就如上图所示:
P+Q=R
,假设
R
就是我们的公钥,如果只给你一个
R
,让你反推出
P
和
Q
来,就像给你一个大数,让你对它进行因数分解一样困难,这就构成了
ECC
加密算法的安全保障。
听上去好高大上,那么我该如何获得一张
椭圆曲线加密算法
的证书呢?
花钱能办了的事那都不是事,重要的是我们可以免费获得!你要知道,以前一张
RSA
证书一年的费用是
5000
元,每年还要续费,这构成了很多商业公司盈利的重要来源,其中包括
Symantec
赛门铁克。
当你吃饭吃的很舒服的时候,市场就会出来搅局者。感谢开源软件精神,
Letsencrypt
砸掉了很多安全公司的饭碗。我在《letsencrypt在nginx下的配置》一文中曾经讲过如何配置
Letsencrypt
,后来又写过《CentOS 6.5下利用Docker使用Letsencrypt》,但是现在有更好的方法:acme.sh,你只需要安装好
acme.sh
:
curl https://get.acme.sh | sh
然后执行:
acme.sh --issue -w /home/wwwroot/example.com -d example.com --keylength ec-256
就可以得到一张免费的
椭圆曲线安全证书
了。注意上面命令结尾这个
ec-256
,
ec
是不是让你想起了什么呢?对的,这就是我们提到的
椭圆曲线
(
elliptic curve
)。
免费的证书有了,安装到你的
nginx
里看一下吧,证书签名算法瞬间变成了
椭圆曲线
!是不是立刻变得高大上了呢?重要的是还免费哦!
CAA
升级完了椭圆曲线还不够,接下来我们再来看看
CAA(CertificationAuthorityAuthorization)
,中文翻译为
授权机构认证
。什么是
授权
?什么是
机构
?什么又是
认证
?
简单来说,你做了一个网站,为了安全起见,为了需要向别人证明你就是你,你需要一张网站的身份证,那么谁有权颁发这个证件呢?在中国,只有公安局有权发身份证,那么这个有权发证件,并且得到所有人认可的机构,就叫
授权机构