Drupal 基础安全实战
最近翻译了一篇老外写的全站SSL介绍,感觉水得一塌糊涂,恰好前一段时间被合作方的安全团队在安全方面骚扰很久,涉及的问题范围较广,也比较全面,这里做个总结,也给大家一个参考。
下面行文主要从 Issues List 里面提取,顺序上可能稍显跳跃,因为是工程案例,所以偏重于见招拆招的解决问题,而较少提供问题的剖析,不过尽量会提供引文供读者延伸阅读。
SSLv3 Enabled
Apache Server的配置:
SSLProtocol all -SSLv3 -SSLv2
Nginx Server的配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
检查方法:
openssl s_client -connect [host_name]:[port_number] -ssl3
返回内容应有一行类似内容
CONNECTED(00000003)
55339:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
HTTPS访问
这个很简单,建议使用全站 HTTPS 的方案来做。
需要注意的是,自颁发的证书基本相当于是无效的。配置过程中,要注意证书链这个概念。
非常好的一篇数字证书入门:《数字证书原理》
提供两个检查 https 配置情况的在线工具:
http://www.networking4all.com/en/support/tools/site+check
https://www.sslshopper.com/ssl-checker.html
另外还可以利用 Security Kit 模块启用 HSTS。强制浏览器使用 HTTPS 通信。
Input Validation
在工期较紧,又包含大量自开发模块的项目中,经常会出现这种问题,缺乏对 Form 输入的基本验证。
Flood Control
Drupal对登陆行为自带了 Flood Control 用于防止暴力破解。但是这部分涉及的系统变量和 Ban List 都属于隐藏内容,无法直接操作,可以通过 Flood control模块对登陆行为进行控制。
fbip 模块据说更进一步的提供了对所有 Form 的 Flood Control,笔者目前还没有实测。
密码策略
可以通过 Password policy 模块设定密码的复杂度策略。
PHP 错误信息
为防止站点出错时,泄露服务器信息,可以在 admin/config/development/logging
下选择None来禁止错误信息的显示。
自动完成
多数时候,这一特性方便了用户,但在多个用户使用同一终端的情况下,有可能造成信息泄露,对于HTML5浏览器,可以写一个 form_alter
,禁止指定或全部 Form 的自动完成:
function auto_complete_off_form_alter(&$form) {
$form['#attributes']['autocomplete'] = 'off';
}
Click Jacking
文中也写到 X-FRAME-OPTIONS
这一 HTTP 头能够有效防御这一攻击
前文提到的 Security Kit 即可设置。
Trace Method
HTTP/1.1(RFC2616)规范定义了HTTP TRACE方法,主要是用于客户端通过向Web服务器提交TRACE请求来进行测试或获得诊断信息。当Web服务器启用TRACE时,提交的请求头会在服务器响应的内容(Body)中完整的返回,其中HTTP头很可能包括Session Token、Cookies或其它认证信息。攻击者可以利用此漏洞来欺骗合法用户并得到他们的私人信息。该漏洞往往与其它方式配合来进行有效攻击,由于HTTP TRACE请求可以通过客户浏览器脚本发起(如XMLHttpRequest),并可以通过DOM接口来访问,因此很容易被攻击者利用。
禁用的方法很简单:
Apache,启用Rewrite:
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^TRACE
RewriteRule .* - [F]
Nginx已经禁止很久了。
检测方法
telnet your_host
Trying your_ip...
Connected to your_host.
Escape character is '^]'.
TRACE / HTTP/1.0
查看返回内容是否 4xx 即可。