前面我们讲完了关于 SSL 的加速优化方面的内容与方法技巧,现在来看看有关安全方面的内容。
HeartBleed
这算是个很长远的事情了。wikipedia 对这个漏洞当初有发布文章说过,主要就是靠更新 OpenSSL 的版本。
令我惊讶的是,这个漏洞竟然还有专门的网站:heartbleed.com
收到影响的版本:
- 1.0.1
- 1.0.1a
- 1.0.1b
- 1.0.1c
- 1.0.1d
- 1.0.1e
- 1.0.1f
修复:
1
2
3
4
5
|
#CentOS
yum install openssl -y
#Debian & Ubuntu
apt-get update
apt-get install openssl
|
只要是升级到 1.0.1g 以上的版本均可。
SSL v3相关
SSL v3 协议中由于数据交换的保密性不够好,能够出现像 Heartbleed 漏洞一样的缓冲区攻击,所以各大游览器厂商及网站均已经停用了 SSL v3 协议。
除了限制服务器使用的安全算法外,还要设置优先使用服务器提供的加密算法而非客户端指定的加密算法,以缓解 BEAST 攻击。
编辑 Nginx.conf,并添加以下内容:
1
2
3
4
5
6
7
8
|
http
{
[...]
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
[...]
}
|
这样就关闭了服务端 SSL v3 的支持,也禁止了已经不再安全的加密算法。
DHE
配置强度更大的 DHE (Ephemeral Diffie-Hellman,一次性迪菲-赫尔曼密钥)参数。OpenSSL 默认使用 1024 位的 DHE 参数,而现在大部分人都会使用强度更大的 2048 位数字证书,所以也需要加大DHE参数的强度:
1
2
|
openssl dhparam -out dhparam.pem 2048
ssl_dhparam /[path]/dhparam.pem;
|
HSTS & Preload
全称 HTTP Strict Transport Security ,是用来配置浏览器和服务器之间安全的通信。它主要是用来防止中间人攻击,因为它强制所有的通信都走 TLS 。目前 IE 还不支持 STS 头。需要注意的是,在普通的http 请求中配置 STS 是没有作用的,因为攻击者很容易就能更改这些值。为了防止这样的现象发生,很多浏览器内置了一个配置了STS的站点list,用于强制要求游览器缓存目标网站状态,强制 HTTPS 连接。可以有效阻挡中间人攻击。
有了 HSTS ,只要客户端接收到一次 HSTS ,很长时间内就会强制 HTTPS ,这样就不给 HTTPS 前端劫持多少机会了。毕竟此类( HTTPS 前端劫持)中间人攻击多数情况下只发生在一些公共 WiFi 等计算机不会长时间停留的网络接入上(长城除外, HSTS 不是用来防长城的),多数计算机在接入此类网络前都已经访问过“易被攻击站点”获得过 HSTS 头了。(就例如支付宝,难道你新买一台电脑 二话不说先到公共 WiFi 上去登录支付宝么。多数情况下都应该在较安全的网络环境里登录过了)
有了这一步,估计你就可以省了前面讲过的301跳转了...
要使得服务端支持 HSTS ,请在 vhost 配置文件中的 server 添加如下内容:
1
2
3
4
5
6
|
server
{
[...]
add_header Strict-Transport-Security max-age=15768000;
[...]
}
|
但是,HSTS 的 header 信息可以很轻易的被攻击者消去,为了避免这种情况就出现了 Preload。
使用 Preload 可以彻底阻断中间人攻击。当然,你也可以向 Google Chrome Preload 研发团队提交你的 Preload 请求,但要求全站(包括所有子域名)都开启 SSL 及 HSTS 功能才有效。
要使得服务端支持 Preload ,请在 vhost 配置文件中的 server 字段中添加如下内容(修改上面的也行):
1
2
3
4
5
6
|
server
{
[...]
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';
[...]
}
|
有关 HSTS 字段的配置还有:
max-age=31536000 – 告诉浏览器将域名缓存到STS list里面,时间是一年。
max-age=31536000; includeSubDomains – 告诉浏览器将域名缓存到STS list里面并且包含所有的子域名,时间是一年。
max-age=0 – 告诉浏览器移除在STS缓存里的域名,或者不保存此域名。
请注意不要出现错误的配置(例子):直接将 includeSubDomains 设置为 https://www.example.com ,但是用户依然可以通过 http://example.com 来访问此站点。如果example.com 并没有跳转到 https://example.com 并设置 STS header,那么访问 http://www.example.com 就会直接被浏览器重定向到 https://www.example.com 。
max-age=60 – 这个只设置域名保存时间为60秒。这个时间太短了,可能并不能很好的保护用户,可以尝试先通过http来访问站点,这样可以缩短传输时间。
max-age=31536000 includeSubDomains – max-age 和 includeSubDomains 直接必须用分号分割。这种情况下,即使max-age的值设置的没有问题,chrome也不会将此站点保存到STS缓存中。
max-age=31536000, includeSubDomains – 同上面情况一样。
max-age=0 – 尽管这样在技术上是没有问题的,但是很多站点可能在处理起来会出差错,因为0可能意味着永远不过期。
要判断一个网站是否存在于你的游览器的 STS 表的方法也很简单:chrome 可以通过访问 chrome://net-internals/#hsts,首先,通过域名请求选项来确认此域名是否在你的STS缓存中。然后,通过 https 访问这个网站,尝试再次请求返回的 STS 头,来决定是否添加正确。
综上,HSTS 是为了避免中间人攻击,Preload 则是为了完全杜绝中间人攻击。
反射性跨域 XSS
这个 header 主要是用来防止浏览器中的反射性 xss 。现在,只有 IE , chrome 和 safari (webkit)支持这个header。日前,Firefox 也宣称支持该 header。
要使得服务端支持反反射性 XSS ,请在 vhost 配置文件中的 server 字段中添加如下内容:
1
2
3
4
5
6
|
server
{
[...]
add_header X-XSS-Protection "1; mode=block";
[...]
}
|
其他参数:
0 – 关闭对浏览器的 xss 防护
1 – 开启 xss 防护
1; mode=block – 开启 xss 防护并通知浏览器阻止而不是过滤用户注入的脚本。
1; report=http://site.com/report – 这个只有 chrome 和 webkit 内核的浏览器支持,这种模式告诉浏览器当发现疑似 xss 攻击的时候就将这部分数据 post 到指定地址。
OK,正文完。
顺便说说我最近看到的“史上最牛” Nginx 配置:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples
server {
listen 80;
listen [::]:80 ipv6only=on;
# rest of the all stuffs will be here
# we skipped to HTTPS
# Includes HSTS Preload
}
# HTTPS server
#
server {
listen 443 ssl spdy default;
keepalive_timeout 70;
server_name thecustomizewindows.com;
server_tokens off;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
root /usr/share/nginx/html;
index index.php index.html index.htm;
ssl on;
access_log off;
spdy_headers_comp 0;
ssl_certificate /etc/nginx/ssl/thecustomizewindows.com.crt;
ssl_certificate_key /etc/nginx/ssl/thecustomizewindows.com.key;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_session_timeout 10m;
ssl_session_cache shared:NginxCache123:50m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:RC4-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK';
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/ssl/signed_cert_plus_intermediate.crt;
resolver 8.8.8.8 8.8.4.4 valid=86400;
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';
location ~ \.php$ {
# fastcgi_split_path_info ^(.+\.php)(/.+)$;
# # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
#
# # With php5-cgi alone:
# fastcgi_pass 127.0.0.1:9000;
# # With php5-fpm:
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_param PHP_VALUE "upload_max_filesize = 100M \n post_max_size=101M";
fastcgi_index index.php;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
include fastcgi_params;
# BEGIN W3TC stuffs
## W3C stuffs here
# END W3TC stuffs
}
location / {
try_files $uri $uri/ /index.php;
}
}
# if more thing exits will go here
|
轉載自:https://www.deamwork.com/archives/about-ssl-stuff-security.orz6
沒有留言:
張貼留言