Ap Blog

Cold code, warm soul.

@Aploium2年前

01/31
20:31
安全

SSL Lab A+ nginx配置

SSL Lab A+

只是记录一下自己的配置过程

  • 证书来自Let’s encrypt
  • 开启HTTP/2
  • SSL Lab A+
  • 禁止裸IP访问(能挡掉很多扫描器)
  • 移除掉 Server: nginx 的header


系统是Ubuntu 16.04 LTS

 

首先从PPA安装nginx, 这样可以保证最新版

sudo add-apt-repository ppa:nginx/stable
sudo apt update
sudo apt install nginx

 

然后letsencrypt获取证书, 这部分略

 

接下来配置nginx本身

  1.  删除 /etc/nginx/conf.d/ 下的那个配置文件, 是一个默认的welcome站
  2.  修改 /etc/nginx/nginx.conf 加入一行
    server_tokens off; # 关闭nginx版本号显示

 

3. 创建一个Diffie-Hellman随机质数

参考 https://weakdh.org/sysadmin.html

openssl dhparam -out /etc/ssl/dhparams.pem 2048

 

4.

/etc/nginx/site-enabled/mysite.conf

# 开启http2
listen 443 ssl http2;

# ------------------ begin h5bp ----------------------
# 参考 https://github.com/h5bp/server-configs-nginx

# HSTS,  详见 https://zh.wikipedia.org/zh-cn/HTTP%E4%B8%A5%E6%A0%BC%E4%BC%A0%E8%BE%93%E5%AE%89%E5%85%A8
# 表示对本域名所有请求都强制使用HTTPS, 这里不加subdomains选项, 因为这个站并不是所有子域名都https的
add_header Strict-Transport-Security "max-age=31536000" always;

# https://weakdh.org/sysadmin.html
# 就是上面创建的那个文件
ssl_dhparam /etc/ssl/dhparams.pem;

# ssl_stapling 缓存OSCP响应
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 216.146.35.35 216.146.36.36 valid=60s;
resolver_timeout 2s;

# 关闭对SSL3.0的支持
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

# 只使用高强度的加密算法
# 注意这里不使用h5bp里的ssl_chiphers部分, 那里面包含了一些弱的方法
# 参考来源 https://weakdh.org/sysadmin.html
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-SHA256:AES256-SHA256: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缓存, 减少昂贵的握手开销
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 24h;
# 1400 MTU保证能塞进绝大多数网络的一帧
ssl_buffer_size 1400;
keepalive_timeout 600s;

# 下面这些是屏蔽对一些敏感文件的访问

# 以.开头的隐藏文件, 除 /.well-known/外
location ~* /\.(?!well-known\/) {
deny all;
}
# 备份文件
location ~* (?:\.(?:bak|conf|dist|fla|in[ci]|log|psd|sh|sql|sw[op])|~)$ {
deny all;
}
# 一些缓存设置
location ~* \.(?:manifest|appcache|html?|xml|json)$ {
expires -1;
}
# Feed
location ~* \.(?:rss|atom)$ {
expires 1h;
}
location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
expires 1M;
access_log off;
add_header Cache-Control "public";
}
location ~* \.(?:css|js)$ {
expires 1y;
access_log off;
}

同时用另一个配置文件来禁止裸IP访问

/etc/nginx/site-enabled/no-default.ssl.conf
server {
listen 443 ssl default_server;
return 444;
ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
}

移除 Server: nginx 头

这样的配置, 在响应中仍然会出现Server: nginx
这样的头, 尽管问题不大, 但是万一某天出现个nginx通杀0day呢, 所以需要把它弄掉
因为这段东西是hardcoded在nginx源码中的, 直接移除比较麻烦, 可以用别的头来覆盖掉它

# 需要先安装个东西
sudo apt-get install nginx-extras

然后修改/etc/nginx/site-enabled/mysite.conf
加入这样一句话

more_set_headers "Server: doge";

这样响应头中 Server: nginx 就变成了 Server: doge

唔其实这样还不够….我们可以把它修改成一些有趣的值来误导(潜在的)扫描器和攻击者
比如改成Apache, 同时如果系统是Ubuntu的话写成CentOS, 如果是CentOS的话写成Ubuntu
对了下面的OpenSSL/1.1.0h是写本文时尚不存在的未来版本, 故意写成这样的

more_set_headers "Server: Apache/2.4.37 (Win32) OpenSSL/1.1.0h PHP/5.6.37";

装的像一点也可以再加一句

more_set_headers "X-Powered-By: PHP/5.6.37";

 


其中大部分配置来源于 h5bp https://github.com/h5bp/server-configs-nginx

 

SSL Lab A+ nginx配置

  1. Firefox 57Firefox 57Ubuntu x64Ubuntu x64

    其实只要使用 Let’s Encrypt 的 Nginx 插件自动获取和配置证书,然后在Nginx配置文件中添加HSTS就能得到 A+ 了。

    add_header Strict-Transport-Security “max-age=31536000” always;

    回复

来一发吐槽叭O(∩_∩)O    仅首次吐槽时需要审核