转载

Nginx 配置之安全篇

之前有细心的朋友问我,为什么你的博客副标题是「专注 WEB 端开发」,是不是少了「前端」的「前」。我想说的是,尽管我从毕业到现在七年左右的时间一直都在专业前端团队从事前端相关工作,但这并不意味着我的知识体系就必须局限于前端这个范畴内。现在比较流行「全栈工程师」的概念,我觉得全栈意味着一个项目中,各个岗位所需要的技能你都具备,但并不一定意味着你什么都需要做。你需要做什么,更多是由能力、人员配比以及成本等各个因素所决定。尽管我现在的工作职责是在 WEB 前端领域,但是我的关注点在整个 WEB 端。

我接触过的有些前端朋友,从一开始就把自己局限在一个很小的范围之中,这在大公司到也无所谓,大公司分工明确,基础设施齐全,你只要做好自己擅长的那部分就可以了。但是当他们进入创业公司之后,会发现一下子来了好多之前完全没有接触过的东西,十分被动。

去年我用 Lua + OpenResty 替换了线上千万级的 PHP + Nginx 服务,至今稳定运行,算是前端之外的一点尝试。我一直认为学习任何知识很重要的一点是实践,所以我一直都在折腾我的 VPS,进行各种 WEB 安全、优化相关的尝试。我打算从安全和性能两方面介绍一下本博客所用 Nginx 的相关配置,今天先写安全相关的。

隐藏不必要的信息

大家可以看一下我的博客请求响应头,有这么一行server: nginx,说明我用的是 Nginx 服务器,但并没有具体的版本号。由于某些 Nginx 漏洞只存在于特定的版本,隐藏版本号可以提高安全性。这只需要在配置里加上这个就可以了:

server_tokens   off;

如果想要更彻底隐藏所用 Web Server,可以修改 Nginx 源码,把 Server Name 改掉再编译,具体步骤可以自己搜索。需要提醒的是:如果你的网站支持 SPDY,只改动网上那些文章写到的地方还不够,跟 SPDY 有关的代码也要改。更简单的做法是改用 Tengine 这个 Nginx 的增强版,并指定server_tag为 off 或者任何想要的值就可以了。另外,既然想要彻底隐藏 Nginx,404、500 等各种出错页也需要自定义。

同样,一些 WEB 语言或框架默认输出的x-powered-by也会泄露网站信息,他们一般都提供了修改或移除的方法,可以自行查看手册。如果部署上用到了 Nginx 的反向代理,也可以通过 proxy_hide_header 指令隐藏它:

proxy_hide_header        X-Powered-By;

禁用非必要的方法

由于我的博客只处理了 GET、POST 两种请求方法,而 HTTP/1 协议还规定了 TRACE 这样的方法用于网络诊断,这也可能会暴露一些信息。所以我针对 GET、POST 以及 HEAD 之外的请求,直接返回了 444 状态码(444 是 Nginx 定义的响应状态码,会立即断开连接,没有响应正文)。具体配置是这样的:

if ($request_method !~ ^(GET|HEAD|POST)$ ) {     return    444; }

合理配置响应头

我的博客是由自己用 ThinkJS 写的 Node 程序提供服务,Nginx 通过 proxy_pass 把请求反向代理给 Node 绑定的 IP 和端口。在最终输出时,我给响应增加了以下头部:

add_header  Strict-Transport-Security  "max-age=31536000"; add_header  X-Frame-Options  deny; add_header  X-Content-Type-Options  nosniff; add_header  Content-Security-Policy  "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://a.disquscdn.com; img-src 'self' data: https://www.google-analytics.com; style-src 'self' 'unsafe-inline'; frame-src https://disqus.com";

Strict-Transport-Security(简称为 HSTS)可以告诉浏览器,在指定的 max-age 内,始终通过 HTTPS 访问我的博客。即使用户自己输入 HTTP 的地址,或者点击了 HTTP 链接,浏览器也会在本地替换为 HTTPS 再发送请求。另外由于我的证书不支持多域名,我没有加上includeSubDomains。关于 HSTS 更多信息,可以查看 我之前的介绍 。

[1]  [2] [3]  下一页

正文到此结束
Loading...