Quantcast
Channel: CNode:Node.js专业中文社区
Viewing all articles
Browse latest Browse all 14821

koa2项目安全加固建议-更新中

$
0
0

2017 年 12 月 27 日 14:36:56

参考:

1.使用 TLS 加密数据的传输

如果传输的信息的敏感性较高,比如用户的个人信息或者安全秘钥信息的传递,请考虑使用 TLS 协议来加密数据传输。另外普通的 Ajax 请求和 Post 请求在不加密的情况下很容易被包嗅探工具扫描到,并且可能遭受中间人攻击等风险。

可能很多人对于传统的 SSL 加密比较熟悉,而 TLS 就是 SSL 的下一代安全加密产品。对于 web app 我们可以使用 Nginx 来配置 TLS 加密,具体的操作方法可参考如下的配置文件,该配置文件适用于几乎所有的现代浏览器(老式浏览器可能会对于一些算法的支持度不好):

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

    # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
    ssl_dhparam /path/to/dhparam.pem;

    # modern configuration. tweak to your needs.
    ssl_protocols TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
    ssl_prefer_server_ciphers on;

    # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
    add_header Strict-Transport-Security max-age=15768000;

    # OCSP Stapling ---
    # fetch OCSP records from URL in ssl_certificate and cache them
    ssl_stapling on;
    ssl_stapling_verify on;

    ## verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;

    resolver <IP DNS resolver>;

    ....
}

2.使用 koa-helmet 中间件

koa-helmet 可以帮助你的 app 抵御一些比较常见的安全 web 安全隐患,它其实是将 9 个安全中间件集中到了一起,做了合并,大部分都是对于 http header 的操作,下面我们就来看一下这几个模块:

* csp: 通过设置 Content-Security-Policy 来阻止 XSS 攻击和一些其他的跨站注入风险。

  • csp:“网页安全政策”(Content Security Policy,缩写 CSP),CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。
  • Content-Security-Policy:通过设置可以启用 csp
  • meta:通过网页的 meta 标签也可以开启 csp 功能
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">
  • 使用
// Make sure you run "npm install helmet" to get the Helmet package.
var helmet = require("koa-helmet");

app.use(
  helmet.contentSecurityPolicy({
    directives: {
      defaultSrc: ["'self'"],
      styleSrc: ["'self'", "maxcdn.bootstrapcdn.com"]
    }
  })
);

参考:Content Security Policy 入门教程

* hidePoweredBy: 删除了 header 中的 X-Powered-By 标签

  • X-Powered-By:包含站点服务器信息与程序信息及版本
  • 使用:默认已启用

* hpkp:通过增加 Public key Pinning 来阻止伪造证书导致的中间人攻击。

  • HPKP:技术给予我们主动选择信任 CA 的权利。它的工作原理是通过响应头或者 meta 标签告诉浏览器当前网站的证书指纹,以及过期时间等其它信息。未来一段时间内,浏览器再次访问这个网站必须验证证书链中的证书指纹,如果跟之前指定的值不匹配,即便证书本身是合法的,也必须断开连接。
  • 使用:
// Make sure you run "npm install helmet" to get the Helmet package.
var helmet = require('koa-helmet')

var ninetyDaysInSeconds = 7776000
app.use(helmet.hpkp({
  maxAge: ninetyDaysInSeconds,
  sha256s: ['AbCdEf123=', 'ZyXwVu456=']
}))

参考:HTTP Public Key Pinning 介绍HTTP PUBLIC-KEY-PINNING EXPLAINED The what, why, and how of RFC 7469

* hsts: 设置 Strict-Transport-Security 来强制安全连接(http over SSL)到服务器(服务器需要支持 https)

  • HSTS: HSTS 的作用是强制客户端(如浏览器)使用 HTTPS 与服务器创建连接
  • 使用:默认已开启

参考:百度百科 HSTS

* ieNoOpen:为 ie8 设置 X-Download-Options

  • 原因:一些网络应用程序将提供不可信的 HTML 下载。默认情况下,IE 的某些版本将允许您在网站上下文中打开这些 HTML 文件,这意味着不可信的 HTML 页面可能会在页面的上下文中开始做坏事。
  • 使用:默认已开启

* noCache:设置 Cache-Control 关闭客户端缓存。

  • 使用:
// Make sure you run "npm install helmet" to get the Helmet package.
var helmet = require('koa-helmet')

app.use(helmet.noCache())

* noSniff: 设置 X-Content-Type-Options 阻止浏览器 MIME-sniffing。

  • 原因:if my server serves file.txt with a text/plain content-type, some browsers can still run that file with <script src=“file.txt”></script>. Many browsers will allow file.js to be run even if the content-type isn’t for JavaScript.
  • 使用:默认已开启

参考:[翻译] 危险的嗅探——IE 的 MIME 嗅探导致 XSS 攻击

* frameguard:设置 X-Frame-Options 阻止点击劫持风险

  • 点击劫持(clickjacking)是一种在网页中将恶意代码等隐藏在看似无害的内容(如按钮)之下,并诱使用户点击的手段
  • 使用:默认已开启

* xssFilter: 设置 X-XSS-Protection 启用

  • 目的:这个 header 主要是用来防止浏览器中的反射性 xss。现在,只有 IE,chrome 和 safari(webkit)支持这个 header。
  • 反射性 xss:主要是由于服务端接收到客户端的不安全输入,在客户端触发执行从而发起 Web 攻击。比如:在某购物网站搜索物品,搜索结果会显示搜索的关键词。搜索关键词填入<script>alert('handsome boy')</script>, 点击搜索。页面没有对关键词进行过滤,这段代码就会直接在页面上执行,弹出 alert。
  • 使用:默认已开启

参考:header 的安全配置指南

* koa-helmet功能默认启动表

moduledefault?
contentSecurityPolicy for setting Content Security Policyx
dnsPrefetchControl controls browser DNS prefetching
frameguard to prevent clickjacking
hpkp for HTTP Public Key Pinningx
hsts for HTTP Strict Transport Security
ieNoOpen sets X-Download-Options for IE8+
noCache to disable client-side cachingx
noSniff to keep clients from sniffing the MIME type
referrerPolicy to hide the Referer headerx
xssFilter adds some small XSS protections

* 默认使用

const Koa = require('koa')
const helmet = require('koa-helmet')
const app = new Koa()

app.use(helmet())

app.use((ctx) => {
  ctx.body = 'Hello World'
})

app.listen(4000)

Viewing all articles
Browse latest Browse all 14821

Trending Articles