产品不断迭代, 安全却很少关注, 这在小团队司空见惯吗? 前两天拿到一份站点的安全检测报告:
例举几点:
你是否将 MySQL,Redis,Mongo 等端口暴露在公网?
你是否采用 22,3306 这种极易被扫描的默认端口?
你是否强制使用 HTTPS? 是否将 HTTP 重定向到了 HTTPS?
你是否设置了 HTTP Security Headers?
...
还有检测不出来的, 如果用了云服务器, 是否禁用了 root 用户以密码登录? 是否开启了安全组?...
本文整理几个 HTTP Security Header , 属于图中的 Application Security 部分. 将用 nginx 来演示这些配置. 通过文中材料链接可查看更详细的信息.
HTTP Security Header
检测报告提示: 未遵守 X-Frame-Options,X-XSS-Protection,HSTS,X-Content-Type-Options 的最佳实践, 这几个都是 HTTP Response header.nginx 配置 demo 将在最下面给出.
X-Frame-Options
X-Frame-Options 用来告诉浏览器, 页面能不能以 frame, iframe, object 形式嵌套在其他站点中, 用来避免点击劫持 (clickjacking) 攻击. 例如用下面代码将百度以 iframe 嵌入到自己的站点, 然后监听 iframe 事件做些其他事情, 用户如果不看 URL 估计以为自己在用百度.
<iframe src="https://www.baidu.com/" width="100%" height="100%" frameborder="no"></iframe>
可选值:
DENY: 页面不允许在 frame 中展示
SAMEORIGIN:same origin, 页面可以在相同域名页面的 frame 中展示
ALLOW-FROM uri: 页面可以在指定来源的 frame 中展示
X-XSS-Protection
用于处理跨站脚本攻击 (XSS).
可选值:
0: 禁止 XSS 过滤
1: 启用 XSS 过滤. 如果检测到跨站脚本攻击, 浏览器将清除页面中不安全的部分, 但页面仍然可以访问.
1;mode=block: 启用 XSS 过滤. 如果检测到攻击, 浏览器将直接阻止页面加载.
HSTS
HSTS(HTTP Strict Transport Security,RFC 6797) HTTP 严格传输安全 , 指告诉浏览器自动从 HTTP 切换到 HTTPS(当然, 站点得支持 HTTPS).
举例说明, 如下图(nginx 将 http 重定向到 https):
左边没加 HSTS 配置, 301 正常重定向, 耗时 80ms ;
右边配置了 HSTS, 浏览器利用 cache, 直接将 HTTP 转成了 HTTPS, 耗时 2ms , 免去了重定向过程.
状态从 301 变成了 307 Internal Redirect 即浏览器内部跳转.
X-Content-Type-Options
X-Content-Type-Options 用来提示客户端一定要遵循在 Content-Type 首部中对 MIME 类型 的设定, 而不能对其进行修改, 用于禁用了客户端的 MIME 类型嗅探行为.
当资源缺失 MIME 类型或设置了错误的 MIME 类型时, 浏览器可能会通过查看资源来进行 MIME 嗅探. 简单来说, 就是如果浏览器不确定资源是什么, 就会看看资源的内容, X-Content-Type-Options 就是让浏览器不要干这个事情.
可选值:
nosniff:sniff 即嗅探.
nginx 配置 demo
HTTP Strict Transport Security (HSTS) and NGINX
通过 nginx add_header 指令在 response 中添加如下 header, 可以根据需要调整. add_header 可以作用于 nginx 的 http,server,location.
Spring Security
如果你使用了 Spring Security, 默认会利用 HeaderWriterFilter 将上面的安全配置全部写入 response.
如果你想在流量入口统一做安全设置, 可以禁用或调整应用中 Spring Security 配置. 修改你自定义的 webSecurityConfig :
- @Configuration
- public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
- @Override
- protected void configure(HttpSecurity http) throws Exception {
- // 下面的所有实例代码都在这里
- }
- }
修改配置
禁用 Secure Header
http.headers().disable();
禁用 X-Frame-Options
其他选项不一一列出
http.headers().frameOptions().disable();
nginx 中剔除配置
如果应用中启用了 HTTP Secure Headers, 但是最终返回的 Response 需要剔除某个配置. 在不改代码前提下, 可以通过 nginx 来剔除, 例如从 response 中剔除 X-Frame-Options 配置:
proxy_hide_header X-Frame-Options;
小结
本文主要是想增长一丢丢安全意识, 这些配置倒是次要的, 还有更多的安全相关配置, 需要时查查资料就好.
请通过阅读原文访问文中链接与参考资料
来源: http://www.tuicool.com/articles/yM3aQz7