如何让网站安全系数达到A+级别

前言:2017年开年第一博。2017年,本博客也进入第4个年头了。时光如梭,至今,收获近2000条评论,结交一些兴趣相投、志同道合的朋友。自2014年以来,本博依然保持着一定的更新频率,虽不是频繁更新,但也不忘初心,在兴趣的引领下,学习到许多互联网知识,也领悟到许多东西。农历新年也快到了,Javen在此祝愿大家新年快乐,身体健康,平安幸福。

一、2017,普及化HTTPS元年真正到来

2017年,在网站安全方面欠账的站长似乎有事情要忙了。综观网络发展趋势,可以很明显断定的一点就是,网站面临的安全威胁日趋增加,密码爆破、撞库已经在知名网站发生许多次,个人信息的隐私在所谓“大数据”的忽悠之下毫无遁形之力。在各个站长懒癌晚期病症和各类利益纠缠的作用下,近年HTTPS普及化的进展并不能称之为迅速。

chrome1然而,巨头谷歌要发力了:从2017年1月份正式发布的Chrome 56开始,Google将彻底把含有密码登录和交易支付等个人隐私敏感内容的HTTP页面标记为【不安全】,并且将会在后续更新的Chrome版本中,逐渐把所有的HTTP网站标记为【不安全】因此,Javen认为,2017年可以说将会是全球网站全面提升安全系数的一年。

chromeus1 如上图所示的提示,Chrome 56直接把含有用户密码或交易支付等信息敏感内容的HTTP页面,在地址栏上直接显示【不安全】的网站提醒文字。

chromeus2如上图,最终所有的HTTP网站将直接显示【不安全】的红色警告字样。
或许,在谷歌的大力推动下,Javen认为,2017年,也就是真正普及HTTPS的元年。

二、为什么要HTTPS?

好吧,又回到这个老生常谈的问题了。容我不再详述。

请参看本站历史博文。
启用全站HTTPS加密保护隐私的重要性
开启HSTS (HTTP Strict Transport Security)的重要性

三、如何提升安全系数?

  1. 加强SSH安全登录。

    包括强化SSH登录密码、修改常用端口、禁用登录密码、使用密钥登录等等。

    ①修改常用端口

    我们只需要修改22数字为任意的5个数字(这样妥当一点)。然后重启SSH:

    ②生成密钥

    然后下载生成的私钥id_rsa.然后在本地用puttygen工具生成putty的私钥ppk文件
    同时把vps上生成的id_rsa.pub文件改名为authorized_keys
    可以执行以下命令:

    然后修改下这个文件的权限为600

    这样就完成了vps上的公钥的生成。
    然后还需要对ssh进行相关的配置
    修改/etc/ssh/sshd_config 文件,将RSAAuthentication 和 PubkeyAuthentication 后面的值都改成yes ,保存。
    重启sshd服务,执行

    ③禁用密码登录
    最后需要把用口令登录关闭掉,只能使用密钥登录。
    1)修改/etc/ssh/sshd_config 文件
    将PasswordAuthentication yes 修改成 PasswordAuthentication no
    2)重启sshd服务/etc/init.d/ssh restart

  2. 网页和数据库的登录路径方面。

    1)网页登录路径修改(以Wordpress为例)。

    将你的数据库使用SSL加密链接。包括但不限于强化数据库登录密码、隐藏(修改)phpmyadmin、wordpress等登录地址、启用谷歌两步验证等。

    ①修改代码
    不用插件可以直接将下面的代码复制到当前主题的 functions.php 文件中:(本博客就是采用下面这种方法,推荐)

    这样只有打开 http://okwoo.com/wp-login.php?123=456,才会打开登录页,否则就会自动跳转到 http://okwoo.com/
    这样就有效的隐藏起来wordpress的登陆路径了,(备注:修改代码不要再记事本下进行)当然除了这种方法以外还有修改登陆路径文件名的方法。

    ②修改文件名
    修改登陆wordpress后台登陆路径wp-login.php文件名,比如将wp-login.php修改成wp-789.php,在文件名修改后还要打开这个文件,将里面所有的wp-login.php替换成wp-789.php(当然也可以你随意想一个路径)。这样登录地址便成了http://lisanbao.com/wp-789.php
    当然,还可以和前面一种方法结合
    跟前面那个方法结合起来,就成了http://okwoo.com/wp-789.php?123=456 。当然,除了这些办法之外也肯定还有其他办法,由于本人对wordpress没有研究 ,所以能用就行。为了增加被猜中的难度,其中123、456、789可以自行修改成数字、密码、特殊字符的组合。

    2)Mysql SSL 配置。

    进行完这个操作之后,可以保护你的节点和你数据库之间的连接。

    ①请确认你的 Mysql 支持 SSL ,LNMP 默认没有这个支持,需要自己编译。这是是 5.5 版本的方法,其他版本请自己参考 Mysql 官网的方法。

    ②然后就生成证书,按照
    http://dev.mysql.com/doc/refman/5.5/en/creating-ssl-files-using-openssl.html
    的方法,生成在 /etc/mysql/ 下。

    ③然后设置 my.cnf 的 [mysqld] 段添加

    ④添加完成,重启 mysql

    ⑤重启完毕,然后把 /etc/mysql/ 的 client-cert.pem 和 client-key.pem 和 ca.pem 传到你节点上 ssr mod 的目录下,我这里以 /root/shadowsocks 为例。

    ⑥然后设置 userapiconfig.py 添加或者设置如下

    重启节点上的程序,搞定。

  3. 为你的网站申请权威并且规范的SSL证书并配置。推荐进行全站HTTPS。

    全站HTTPS的难度在于你必须为全站的资源都进行HTTPS化,包括所有图片。在使用了站外http图床的网站则容易出现混合内容(Mixed contents)的安全警示。因此,必须修改所有站内链接为HTTPS,并替换所有未经加密的资源链接为HTTPS。在某些情况下,我们还需要下载某些文件并上传到自己的网站或启用了HTTPS的CDN上并修改为相应HTTPS链接。

    请参看本站历史博文。快速注册Let’s Encrypt SSL证书并续期让多说完美支持https让七牛插件完美支持httpswordpress更换域名教程

    The project aims to make encrypted connections in the World Wide Web the default case. By getting rid of payment, web server configuration, validation emails and dealing with expired certificates it is meant to significantly lower the complexity of setting up and maintaining TLS encryption.On a Linux web server, execution of only two commands is sufficient to set up HTTPS encryption, acquire and install certificates within 20 to 30 seconds.

    ssl1 ssl2

  4. 为你的网站开启HSTS(HTTP Strict Transport Security)。

    且设置的时效足够长。必要时申请加入Preload列表。

    请参看本站历史博文。开启HSTS (HTTP Strict Transport Security)的重要性

    HTTP Strict Transport Security (HSTS) is a web security policy mechanism which helps to protect secure HTTPS websites against downgrade attacks and cookie hijacking. It allows web servers to declare that web browsers (or other complying user agents) should only interact with it using secure HTTPS connections,[1] and never via the insecure HTTP protocol. HSTS is an IETF standards track protocol and is specified in RFC 6797.

    # max-age: 记住的时长, 单位是秒 (31536000 = 1 年)
    # includeSubdomains: 所有子域名都强制使用 https 访问, 这个如果不确定千万别开。
    # preload: 告诉浏览器可以预加载你的域名的 HSTS。

  5. 为你的网站开启HTTP/2协议。

    请参看本站历史博文。升级LNMP一键安装包以支持HTTP/2

    HTTP/2 is the first major upgrade to the HTTP protocol in over 15 years. Websites have changed dramatically in the interim, with the number of external image, CSS, and JavaScript assets growing by the year. HTTP/1.1 wasn’t designed for this kind of complexity. HTTP/2 is optimized for the modern website, improving performance without complicated hacks like domain sharding and file concatenation.

    http201

  6.  为你的网站域名开启DNSSEC,防范DNS污染。

    对于DNSSEC,Cloudflare官方的解释是,DNSSEC protects against forged DNS answers. DNSSEC protected zones are digitally signed to ensure the DNS records received are identical to the DNS records published by the zone owner. 用户只需遵照Cloudflare后台DNS配置页面的说明在域名申请机构网站配置即可。DNSSEC

  7.  为你的网站开启权威并且安全的CDN云加速,并开启反向代理以隐藏真实ip地址,以此防范各类DDOS攻击。

    请参看本站历史博文。启用了CloudFlare的CDN云加速和Universal SSL加密证书

  8. 更新并使用新的权威的流式加密算法。
  9. 定期备份数据库和重要的网站文件,包括配置文件。

    请参看本站历史博文。主机之间迁移数据简明教程

以上9步之中,3~6项尤为重要,这些项目的正确配置,将有助于你大幅提升网站的安全系数,并成为衡量一个网站安全系数是否达标的重要指标。

四、本站Nginx之vhost.conf文件示例:

五、测试你的网站安全性

完成必要的设置之后,在SSL测试网站,输入自己的网站地址,即可在线测试你的安全系数评级。最高级别为A+!

测试地址https://www.ssllabs.com/ssltest/index.html

本站安全系数已经达到A+级别
A+2A+3 A+4 A+5 A+6

另外的一个测试地址,快速有效:https://www.websiteplanet.com/zh-hans/webtools/ssl-checker/

iShot2021-05-03 19.31.24

后记:本文在一年以前就想写成,现在补上,作为梳理之用。普通站长做到以上几点,网站安全基本无虞。

 

升级LNMP一键安装包以支持HTTP/2

2016/719 更新:LNMP已經升級到1.3正式版。正式版初次安裝已經默認編譯编译 –with-http_v2_module模块。

很多知道HTTP/2的同学想必也听说过LNMP一键安装包的鼎鼎大名。众所周知,Nginx官方在1.9.5开始支持HTTP/2,想升级HTTP/2的站长们必须升级并重新编译Nginx。LNMP一键安装包也需要重新编译和更新。

军哥在2015年10月15日发布了LNMP 1.3测试版,截至本文发布时,LNMP 1.3测试版最新更新的日期是12月10日。Nginx官方最新版是1.9.9。
继续阅读升级LNMP一键安装包以支持HTTP/2

开启HSTS (HTTP Strict Transport Security)的重要性

HSTS (HTTP Strict Transport Security) 是什么,为什么我们要开启HSTS (HTTP Strict Transport Security)?

关于HTTPS的回顾

The security of HTTPS is that of the underlying TLS, which typically uses long-term public and private keys to generate a short term session key which is then used to encrypt the data flow between client and server. X.509 certificates are used to authenticate the server (and sometimes the client as well). As a consequence, certificate authorities and public key certificates are necessary to verify the relation between the certificate and its owner, as well as to generate, sign, and administer the validity of certificates.  继续阅读开启HSTS (HTTP Strict Transport Security)的重要性

CloudFlare已启用HTTP/2和SPDY

今早收到来自CloudFlare的邮件,说是已经给你默认启用了HTTP/2,可以全面提升HTTPS下的页面加载速度。我只知道有个SPDY,另外HTTP/2貌似是最近这几年才出来的产物,Nginx 1.9.5 版本加入了对HTTP/2的支持。趁着头脑清醒,赶紧上维基百科扫盲。然而维基上相关介绍非常少,但是透过CloudFlare的网页介绍能略知一二。http202

HTTP/2是什么?

HTTP/2(超文本传输协议第2版,最初命名为HTTP 2.0),是HTTP协议的的第二个主要版本,使用于万维网。HTTP/2是HTTP协议自1999年HTTP 1.1发布后的首个更新,主要基于SPDY协议。它由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小组进行开发。该组织于2014年12月将HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。HTTP/2标准于2015年5月以RFC 7540正式发表。

HTTP/2的目标包括异步连接复用,头压缩和请求反馈管线化并保留与HTTP 1.1的完全语义兼容。

SPDY是什么?

SPDY(发音如英语:speedy),一种开放的网络传输协定,由Google开发,用来传送网页内容。基于传输控制协议(TCP)的应用层协议 。Google最早是在Chromium中提出的SPDY协议。目前已经被用于Google Chrome浏览器中来访问Google的SSL加密服务。

HTTP/2主要以SPDY技术为主。Google Chrome,Mozilla Firefox,Opera和Internet Explorer均已支持SPDY协议。SPDY协议类似于HTTP,但旨在缩短网页的加载时间和提高安全性。SPDY协议通过压缩、多路复用和优先级来缩短加载时间。

它们的作用是什么?

如前文所述,二者的作用旨在提升访问速度。设计SPDY的目的在于降低网页的加载时间。通过优先级和多路复用,SPDY使得只需要建立一个TCP连接即可传送网页内容及图片等资源。SPDY中广泛应用了TLS加密,传输内容也均以gzip或DEFLATE格式压缩(与HTTP不同,HTTP的头部并不会被压缩)。另外,除了像HTTP的网页服务器被动的等待浏览器发起请求外,SPDY的网页服务器还可以主动推送内容。而CloudFlare作为一个处于用户和服务器之间的反向代理,它对HTTP/2和SPDY的支持使得用户对CloudFlare的访问速度进一步提升,用户无需对自己的服务器做任何更改。

尽管HTTP/2基于谷歌的实验性SPDY协议,但是它在不断改进。SPDY的诸多好处被保留下来:

  • 多路复用:多个请求被整合至一个TCP连接之中,减少服务器与用户之间的多重连接数量以提升效率。http201
  • 串流优先级:客户端可以指定哪些资源请求可被优先处理。
  • 压缩Header:减小header的体积。
  • 主动推送:在客户端尚未对某些资源发出请求时,服务器可以抢先作出回应。(当前Nginx和CF并未实施,未来会加入这一功能。)

尽管HTTP/2并不要求TLS,但是一些主要的浏览器厂商已经表示,他们将会只支持使用TLS加密技术使用HTTP/2。

演示对比:HTTP/1.1 VS HTTP/2

https://www.cloudflare.com/http2/

抛弃SPDY?

言之过早。不论SPDY还是HTTP/2,都对网站速度提升有好处。支持SPDY的浏览器还很多,所以保持对二者同时支持还是很有必要的。

大陆用户的纠结

我们都知道,CloudFlare是一个提供CDN的网站,它在香港有一个加速节点。但是经过测试得知,大陆用户访问通过CF的CDN加速的网站时,并不会通过香港的节点加速,而是绕道美国的一个节点。这样CDN加速的意义实际上已经不存在了。顶多也就是如果你的海外主机不稳定的话,开启CDN可能会稍微改善访问体验。

 

本文参考资料:

https://blog.cloudflare.com/introducing-http2/

https://zh.wikipedia.org/wiki/SPDY

https://zh.wikipedia.org/wiki/HTTP/2