A+2

如何让网站安全系数达到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

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

 

  1. 最近也用上SSL了,感觉如下,SSL付费还是很贵的,免费的也不知道以后还有没有,另外https比http慢,引用不了http资源,对于依靠免费外链的朋友是个悲剧,不过这是个趋势,我自己而言,跟风成分更大,哈哈~~

    • http混合内容的问题确实需要一定时间来解决。实际上只要用心优化,https速度也不错了。

      • 其实速度现在也很满意,http混的内容太多了,几年的文章了,改sql又没规律可循,只能放弃了,今后尽量不引入http啦。

  2. Nice啊,之前还在吐槽你首页数据量过大,没想到你这么快就把这些都搞定了。我之前关注的都是速度,SSL Server Test的A+都没拿到,改天努努力

      • 感觉你可以尝试一下Pagespeed模块,应该能大大降低首页的size。https://modpagespeed.com/doc/filter-image-optimize

Javen留言 取消回复