本站已被加入HSTS Preload List

大概一个多月前,本站启用了HSTS,并且配置了HSTS Preload,然后向https://hstspreload.appspot.com/提交了申请,虽然审核比较慢,但前几天终于在HSTS preload list中找到了本站的域名。通过Qualys SSL Labs,可以看到最先是Chrome的preload list中收录了本站,之后没过几天,几个主流的浏览器都陆续收录了本站的域名,HSTS完美了,从此以后不用担心任何劫持了。

关于HSTS的详细设置,请参见另一篇文章:Apache开启HSTS (HTTP Strict Transport Security)

Supervisor新手教程 (Debian)

虽然Supervisor其实很简单,想想还是写个教程吧,方便像我这样的新手。

首先是安装,Debian下直接apt-get就行,Ubuntu也一样。

apt-get update
apt-get install supervisor

其实Debian下安装完就已经在运行了,Ubuntu下似乎要手动执行或者重启一下。

接下来就是写要托管进程的配置文件了,放在/etc/supervisor/conf.d文件夹下命名为*.conf的话supervisor会自动读取运行。

创建一个example.conf

vi /etc/supervisor/conf.d/example.conf

然后写配置文件。完整的配置参数还是去官网找吧,这里就写点简单的。

[program:example]
command=/usr/local/bin/example -config
autorestart=true
user=nobody

第一行是托管的程序名称,可以自己定义,不用和运行的程序文件同名,只要不和托管的其他程序名称重名就行,第二行是运行命令,要写可执行文件的完整路径并且可以在后面加运行参数,第三行是设置进程被杀后自动重启托管的程序,第四行是执行托管的用户,应以能正常运行的最低权限用户运行程序以提高安全性。

保存退出,之后重启一下supervisor服务,example就已经在运行了。可以输入以下命令来查看运行状态。

supervisorctl status

就写这么多,高级的用途还是翻官方文档吧。

Windows环境nslookup有返回ping不能解析解决方法

单位有几台Windows的电脑无法访问某些地址,用nslookup查看能够顺利返回DNS解析信息,但ping却无法解析。最后发现是DNS Client服务的问题,重启服务就可以解决,但具体原因不详,待进一步查找原因。因为是单位内网机器,补丁也不全,怀疑系统组件或配置被破坏,也可能是病毒影响。

其中一台电脑系统问题太多,最后直接重装系统并安装了全部的安全补丁解决,其他机器安装了全部的安全补丁后解决,看来还是内网安全漏洞导致蠕虫传播引起了这些问题。

用Windows部署内网网络服务的缺点

又一次深深地体会到,内网部署网络服务不要用Windows!

单位的Windows Server 2003服务器彻底让我抓狂,具体不想说了。感觉像我们这种单位还是用CentOS或者上RHEL比较靠谱。

这里就简单说说用Windows部署内网网络服务的缺点。

一个最直接的问题是,一般单位内部的客户机几乎清一色是Windows,并且基本上都是以Windows 7为主,还有大量的Windows XP。别说Windows XP已经停止安全更新服务,如果是内网,别指望每台Windows都能够按时打上安全补丁,而内网的每一台机器,包括服务器本身,通常也会因为防止信息泄露等理由而无法连接外网,国内普通的单位一般也不会部署自己的Windows更新服务器。

综合这些原因,如果内网的服务器用的是Windows操作系统,很容易形成一个从客户端到服务器的安全薄弱环节,每一台机器都有大量的安全漏洞。这时候,如果其中某一台客户端中了蠕虫病毒,很容易导致该蠕虫病毒在内网大范围的传播,而此时,如果服务器也是Windows操作系统,而且还没有修补相应的安全漏洞,很容易造成整个内网的部分服务故障,甚至是彻底瘫痪。而如果服务器是Linux等其他操作系统,即使同样没有及时修补安全漏洞,但因为内核的区别,通常客户机的任何病毒都不会入侵服务器,最多只是会影响内网的效率,而不会导致内网的服务故障和瘫痪。

最后想再说一句,内网的信息安全是很重要的,不是说Windows服务器不好,但如果在内网使用了Windows服务器,一定要及时部署安全更新,修补安全漏洞,如果真的因为某些原因不能连接外网,一定要部署内网的升级服务器,才能保障整个内网的稳定和安全。

低配置机器Apache优化

手上另外有一台112MB RAM+24MB SWAP的VPS,装的Debian 8 x64,上面已经跑了两个服务,现在又要再挂个小网站上去,虽然只是静态内容,但Apache也不是省油的灯,默认配置下跑起来很吃力。于是稍微做了下优化,现在好多了。

那台Apache服务器版本是2.4.10,其他版本配置也类似。虽然是启用了SSL的HTTPS页面,但用的是MPM event,其实相当于MPM worker,优化之后的mpm_event.conf配置如下。

StartServers 1
MinSpareThreads 1
MaxSpareThreads 10
ThreadLimit 5
ThreadsPerChild 10
MaxRequestWorkers 50
MaxConnectionsPerChild 0

修改之后,跑起来内存占用好多了,机器性能足够支撑需求。目前稳定运行中,继续观察看看。

Apache开启HSTS (HTTP Strict Transport Security)

重定向HTTP至HTTPS并不能解决劫持问题,而且现在很多运营商劫持行为很普遍、WIFI热点劫持也非常多,在HTTP跳转至HTTPS之前就会劫持用户,这些都存在着很大的安全风险。因此,HSTS (HTTP Strict Transport Security,即HTTP严格传输安全) 就显得很重要了。

设置很简单,这里以Apache默认的SSL站点为例。首先启用Mod_Headers模块。

a2enmod headers

然后打开HTTPS站点的配置文件。

vi /etc/apache2/sites-available/default-ssl.conf

在<VirtualHost *:443>中添加如下内容。

# HSTS (mod_headers is required) (15768000 seconds = 6 months)
Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"

max-age为HSTS过期时间,一般建议不小于18周(10886400秒),这里设置为6个月,includeSubDomains是指包含子域名,为了最大程度地保护该域名下地所有站点,建议加上,而如果某个子域名不强制使用HTTPS,就不要在根域名加。preload代表启用HSTS Preload (HSTS预加载),只有被浏览器预加载的HSTS,才能够保证在任何情况下都不被劫持,否则在第一次访问该站点时还是有被劫持的可能。

最后再重启一下Apache使配置生效。

service apache2 restart

好了,HSTS已经可以使用了。再也不用担心用户访问自己的网站时被劫持了。当然,如果不启用HSTS Preload,第一次访问或者上面设置的半年时间失效后的第一次访问,还是有可能被劫持的。如果要启用HSTS Preload,在设置好上面的内容之后,还要去下面这个网址提交你的域名。方法很简单,照着提示做就好。

https://hstspreload.appspot.com/

需要注意的是,按照提交的要求,preload必须和includeSubDomains一起使用,并且保证max-age不小于18周,当然,使用有效并且可信的SSL证书,设置HTTP重定向到HTTPS这类常规要求肯定是要的。

有人觉得HSTS配置也可以写在.htaccess中,但其实Apache和HSTS规范中都是不建议这样做的,因为这会导致访问HTTP站点时也会收到HSTS Header。当然,这其实不是个问题,因为HSTS本身就是为强制使用HTTPS访问设计的,但规范中是不建议的。

Apache开启重定向HTTP至HTTPS

网站启用了SSL之后,需要使用HTTPS才能加密访问,默认还是可以通过明文的HTTP访问。但只要简单设置,就可以把HTTP请求重定向至HTTPS。

Apache开启重定向HTTP至HTTPS的方法有很多种,现在比较流行的是通过Mod_Rewrite实现。

首先启用Mod_Rewrite模块。

a2enmod rewrite

一种方法是修改HTTP虚拟站点配置文件。

打开HTTP虚拟站点配置文件,默认的话,Apache 2.4是/etc/apache2/sites-available/000-default.conf,而Apache 2.2是/etc/apache2/sites-available/default,在其中写入以下代码,把其他的内容都注释掉,就行了。

<VirtualHost *:80>
 RewriteEngine on
 RewriteCond %{HTTPS} !=on [NC]
 RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

另一种方法是修改.htaccess文件。

首先要启用Override使.htaccess文件配置生效。

如果是Apache 2.4,修改Apache的配置文件。

vi /etc/apache2/apache2.conf

找到以下内容,修改其中的AllowOverride为All。

<Directory /var/www/>
 Options Indexes FollowSymLinks
 AllowOverride All
 Require all granted
</Directory>

如果是Apache 2.2,修改Apache的网站配置文件,这里以默认的网站配置文件为例,先修改HTTP虚拟站点的配置文件。

vi /etc/apache2/sites-available/default

找到以下内容,修改其中的AllowOverride为All。

<Directory /var/www/>
 Options Indexes FollowSymLinks MultiViews
 AllowOverride All
 Order allow,deny
 allow from all
</Directory>

再修改HTTPS虚拟站点的配置文件。

vi /etc/apache2/sites-available/default-ssl

作同样修改。

<Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
</Directory>

之后就可以配置.htaccess文件了。

在网站根目录创建.htaccess文件,注意如果有子网站的话,子网站根目录也要创建。

vi /var/www/html/.htaccess

添加如下配置。

<IfModule mod_rewrite.c>
 RewriteEngine on
 RewriteCond %{HTTPS} !=on [NC]
 RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

更改.htaccess的所有者和组为www-data。

chown www-data:www-data /var/www/html/.htaccess

最后再重启一下Apache。

service apache2 restart

好了,去浏览器直接输入域名看看是不是可以自动跳转到HTTPS了。

其实,如果你是为WordPress开启重定向HTTP到HTTPS的话,还可以借助一款叫做Really Simple SSL的插件,根据提示做就行,非常方便,不过原理基本上是一样的。

最后,再说一说这两种方法的区别,第一种修改HTTP虚拟站点配置文件的方法,是针对该虚拟站点生效,访问该虚拟站点的HTTP请求都会被重定向到HTTPS。第二种修改.htaccess文件的方法,是针对.htaccess文件所在文件夹生效,访问该文件夹的HTTP请求会被重定向到HTTPS。具体还是要看需求而定,我两种方法都试过,现在比较偏向于修改HTTP虚拟站点配置。

Apache禁用SSLv3和RC4并启用Forward Secrecy

Apache默认是启用SSLv3和RC4的,但其实SSLv3和RC4都已经不够安全,应当禁用。而启用Forward Secrecy能够增强主流浏览器访问的前向安全性。方法很简单,首先修改网站的配置文件,下面以默认站点配置文件为例。

如果是Apache 2.4,编辑以下文件。

vi /etc/apache2/sites-available/default-ssl.conf

在文件最下方增加以下几行,第一行禁用SSLv3,同时也禁用了RC4等不安全的Cipher,第二行选择优先的Cipher,并为支持的浏览器启用Forward Secrecy,并保持向后兼容,第三行由服务器选择Cipher而不是客户端,第四行关闭SSL压缩,第五行关闭SSL Session Tickets。

SSLProtocol             all -SSLv3
SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder     on
SSLCompression          off
SSLSessionTickets       off

如果是Apache 2.2,有些地方有些变化,编辑以下文件。

vi /etc/apache2/sites-available/default-ssl

在文件最下方增加以下几行,第一行禁用SSLv3和SSLv2,同时也禁用了RC4等不安全的Cipher,第二行选择优先的Cipher,并为支持的浏览器启用Forward Secrecy,并保持向后兼容,第三行由服务器选择Cipher而不是客户端。

SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder     on

重新启动Apache。

service apache2 restart

测试一下吧,应该这样就OK了。

这里选用的是一种较为常用的Cipher Suite,可以根据自己需要做进一步的优化。