前言:2017年开年第一博。2017年,本博客也进入第4个年头了。时光如梭,至今,收获近2000条评论,结交一些兴趣相投、志同道合的朋友。自2014年以来,本博依然保持着一定的更新频率,虽不是频繁更新,但也不忘初心,在兴趣的引领下,学习到许多互联网知识,也领悟到许多东西。农历新年也快到了,Javen在此祝愿大家新年快乐,身体健康,平安幸福。
一、2017,普及化HTTPS元年真正到来
2017年,在网站安全方面欠账的站长似乎有事情要忙了。综观网络发展趋势,可以很明显断定的一点就是,网站面临的安全威胁日趋增加,密码爆破、撞库已经在知名网站发生许多次,个人信息的隐私在所谓“大数据”的忽悠之下毫无遁形之力。在各个站长懒癌晚期病症和各类利益纠缠的作用下,近年HTTPS普及化的进展并不能称之为迅速。
然而,巨头谷歌要发力了:从2017年1月份正式发布的Chrome 56开始,Google将彻底把含有密码登录和交易支付等个人隐私敏感内容的HTTP页面标记为【不安全】,并且将会在后续更新的Chrome版本中,逐渐把所有的HTTP网站标记为【不安全】。因此,Javen认为,2017年可以说将会是全球网站全面提升安全系数的一年。
如上图所示的提示,Chrome 56直接把含有用户密码或交易支付等信息敏感内容的HTTP页面,在地址栏上直接显示【不安全】的网站提醒文字。
如上图,最终所有的HTTP网站将直接显示【不安全】的红色警告字样。
或许,在谷歌的大力推动下,Javen认为,2017年,也就是真正普及HTTPS的元年。
二、为什么要HTTPS?
好吧,又回到这个老生常谈的问题了。容我不再详述。
请参看本站历史博文。
启用全站HTTPS加密保护隐私的重要性
开启HSTS (HTTP Strict Transport Security)的重要性
三、如何提升安全系数?
-
加强SSH安全登录。
包括强化SSH登录密码、修改常用端口、禁用登录密码、使用密钥登录等等。
①修改常用端口
1vi /etc/ssh/sshd_config我们只需要修改22数字为任意的5个数字(这样妥当一点)。然后重启SSH:
1234567#centos/etc/init.d/sshd restartsudo systemctl restart#debian或者ubuntu/etc/init.d/ssh restartsudo service ssh restart②生成密钥
1ssh-keygen -t rsa123456789101112131415161718192021Generating public/private rsa key pair.Enter file in which to save the key (/root/.ssh/id_rsa): //直接回车Created directory '/root/.ssh'.Enter passphrase (empty for no passphrase): //输入密钥密码Enter same passphrase again: //重复密钥密码Your identification has been saved in /root/.ssh/id_rsa. //提示公钥和私钥已经存放在/root/.ssh/目录下Your public key has been saved in /root/.ssh/id_rsa.pub.The key fingerprint is:15:23:a1:41:90:10:05:29:4c:d6:c0:11:61:13:23:dd root@localhostThe key's randomart image is:+--[ RSA 2048]----+|=&@Bo+o o.o ||=o=.E o . o || . . . || . || S || || || || |+-----------------+然后下载生成的私钥id_rsa.然后在本地用puttygen工具生成putty的私钥ppk文件
同时把vps上生成的id_rsa.pub文件改名为authorized_keys
可以执行以下命令:1mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys然后修改下这个文件的权限为600
1chmod 600 /root/.ssh/authorized_keys这样就完成了vps上的公钥的生成。
然后还需要对ssh进行相关的配置
修改/etc/ssh/sshd_config 文件,将RSAAuthentication 和 PubkeyAuthentication 后面的值都改成yes ,保存。
重启sshd服务,执行1/etc/init.d/ssh restart③禁用密码登录
最后需要把用口令登录关闭掉,只能使用密钥登录。
1)修改/etc/ssh/sshd_config 文件
将PasswordAuthentication yes 修改成 PasswordAuthentication no
2)重启sshd服务/etc/init.d/ssh restart -
网页和数据库的登录路径方面。
1)网页登录路径修改(以Wordpress为例)。
将你的数据库使用SSL加密链接。包括但不限于强化数据库登录密码、隐藏(修改)phpmyadmin、wordpress等登录地址、启用谷歌两步验证等。
①修改代码
不用插件可以直接将下面的代码复制到当前主题的 functions.php 文件中:(本博客就是采用下面这种方法,推荐)12345//修改后台路径function login_protection(){if($_GET[‘123’] != ‘456’)header(‘Location: http://okwoo.com/’);}add_action(‘login_enqueue_scripts’,’login_protection’);这样只有打开 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 官网的方法。
12345678910service mysql stopwget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.50.tar.gztar xvzf mysql-5.5.50.tar.gzcd mysql-5.5.50cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci -DWITH_READLINE=1 -DWITH_EMBEDDED_SERVER=1 -DENABLED_LOCAL_INFILE=1 -DWITH_SSL=systemmakemake installservice mysql start②然后就生成证书,按照
http://dev.mysql.com/doc/refman/5.5/en/creating-ssl-files-using-openssl.html
的方法,生成在 /etc/mysql/ 下。③然后设置 my.cnf 的 [mysqld] 段添加
123ssl-ca=/etc/mysql/ca.pemssl-cert=/etc/mysql/server-cert.pemssl-key=/etc/mysql/server-key.pem④添加完成,重启 mysql
1sevrice mysql restart⑤重启完毕,然后把 /etc/mysql/ 的 client-cert.pem 和 client-key.pem 和 ca.pem 传到你节点上 ssr mod 的目录下,我这里以 /root/shadowsocks 为例。
⑥然后设置 userapiconfig.py 添加或者设置如下
1234MYSQL_SSL_ENABLE = 1MYSQL_SSL_CERT = '/root/shadowsocks/client-cert.pem'MYSQL_SSL_KEY = '/root/shadowsocks/client-key.pem'MYSQL_SSL_CA = '/root/shadowsocks/ca.pem'重启节点上的程序,搞定。
-
为你的网站申请权威并且规范的SSL证书并配置。推荐进行全站HTTPS。
全站HTTPS的难度在于你必须为全站的资源都进行HTTPS化,包括所有图片。在使用了站外http图床的网站则容易出现混合内容(Mixed contents)的安全警示。因此,必须修改所有站内链接为HTTPS,并替换所有未经加密的资源链接为HTTPS。在某些情况下,我们还需要下载某些文件并上传到自己的网站或启用了HTTPS的CDN上并修改为相应HTTPS链接。
请参看本站历史博文。快速注册Let’s Encrypt SSL证书并续期、让多说完美支持https、让七牛插件完美支持https、wordpress更换域名教程
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.
-
为你的网站开启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。1add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; -
为你的网站开启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.
-
为你的网站域名开启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配置页面的说明在域名申请机构网站配置即可。
-
为你的网站开启权威并且安全的CDN云加速,并开启反向代理以隐藏真实ip地址,以此防范各类DDOS攻击。
请参看本站历史博文。启用了CloudFlare的CDN云加速和Universal SSL加密证书
-
更新并使用新的权威的流式加密算法。
-
定期备份数据库和重要的网站文件,包括配置文件。
请参看本站历史博文。主机之间迁移数据简明教程
以上9步之中,3~6项尤为重要,这些项目的正确配置,将有助于你大幅提升网站的安全系数,并成为衡量一个网站安全系数是否达标的重要指标。
四、本站Nginx之vhost.conf文件示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
server { listen 443 ssl http2; server_name okwoo.com; ssl on; ssl_certificate /etc/letsencrypt/live/okwoo.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/okwoo.com/privkey.pem; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; add_header Strict-Transport-Security max-age=31536000; ssl_session_cache shared:SSL:50m; ssl_prefer_server_ciphers on; index index.html index.htm index.php default.html default.htm default.php; root /home/wwwroot/okwoo.com; include wordpress.conf; #error_page 404 /404.html; location ~ [^/]\.php(/|$) { # comment try_files $uri =404; to enable pathinfo try_files $uri =404; fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_index index.php; include fastcgi.conf; #include pathinfo.conf; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } access_log off; } server { listen 80; server_name okwoo.com; rewrite ^(.*) https://javenfeng.com$1 permanent; } |
五、测试你的网站安全性
完成必要的设置之后,在SSL测试网站,输入自己的网站地址,即可在线测试你的安全系数评级。最高级别为A+!
测试地址https://www.ssllabs.com/ssltest/index.html
本站安全系数已经达到A+级别
另外的一个测试地址,快速有效:https://www.websiteplanet.com/zh-hans/webtools/ssl-checker/
后记:本文在一年以前就想写成,现在补上,作为梳理之用。普通站长做到以上几点,网站安全基本无虞。
最近也用上SSL了,感觉如下,SSL付费还是很贵的,免费的也不知道以后还有没有,另外https比http慢,引用不了http资源,对于依靠免费外链的朋友是个悲剧,不过这是个趋势,我自己而言,跟风成分更大,哈哈~~
我刚测了一下,只有A,请问博主这正常吗?还可以优化吗?
最高级别是A+,还有上升的空间
http混合内容的问题确实需要一定时间来解决。实际上只要用心优化,https速度也不错了。
其实速度现在也很满意,http混的内容太多了,几年的文章了,改sql又没规律可循,只能放弃了,今后尽量不引入http啦。
把HTTPS内容放到7牛镜像存储就是了,就个人博客来说也不贵。
既然已开启了 HSTS,不如同时加入 hstspreload list 豪华套餐吧。
因为哪天临时有变动,取消很麻烦。
也是。这个 hstspreload list 进去麻烦,出来也麻烦。我3个域名,一个花了一个月进入,另2个花了3个月才成功添加进去。
等的时间太长了。
然而却没有vps,安全等级远远达不到A
可以搞一個啊。
还需要开启hpkp
你的证书为何是.pem?
hpkp是啥?
LE簽出來就這樣了。就是這個格式。
这两年HTTPS确实很火,我的还没有改为HTTPS,看来今年也要考虑这个东东了
据我所知,百度seo对HTTPS特别不友好。
不明白mysql弄ssl干嘛?你的php与mysql不在同一部机器上么?
跨主机访问数据库更安全。
Nice啊,之前还在吐槽你首页数据量过大,没想到你这么快就把这些都搞定了。我之前关注的都是速度,SSL Server Test的A+都没拿到,改天努努力
首页数据我只是压缩了下图片再上传。7牛每月还收我https的cdn费用。
感觉你可以尝试一下Pagespeed模块,应该能大大降低首页的size。https://modpagespeed.com/doc/filter-image-optimize
我去试试看,从前你建议过,我试了没能成功就放弃了。