koa2部署最佳实践--安全篇(Express 部署最佳实践-安全篇的补充)
发布于 6 年前 作者 18820227745 7129 次浏览 来自 分享

最近看了zhangmingkai4315的Express 部署最佳实践-安全篇很赞,补充写了一个koa2的安全篇。

网站低权限

添加新用户

#首先登录 root 账号

#新建用户
useradd username
#更改用户密码,激活使用
passwd username

ssh登录

创建秘钥对(创建的用户为centos)

su centos
cd /home/centos
mkdir .ssh
cd .ssh
ssh-keygen
mv id_rsa.pub authorized_keys 

设置权限(root用户)

chmod 700 /home/centos/.ssh
chmod 600 /home/centos/.ssh/authorized_key

windows下通过winscp软件将私钥下载到本地 使用puttygen软件将私钥转化成ppk格式 使用putty软件加载秘钥登录

用pm2开机自启网站

切换到username目录下,并将网站源码拷贝到username的家目录下 新建pm2启动配置文件

cd youProject
npm i
vi run.json

run.json的内容

{
  "apps": [
      {
          "name": "projectName",
          "script": "./index.js",
          "args": [],
          "watch": true,
          "ignore_watch": [
              "node_modules",
              "public"
          ],
          "node_args": "",
          "exec_mode": "cluster",
          "merge_logs": true,
          "cwd": "/home/username/youProject",
          "env": {
            "NODE_ENV": "production",
            "PORT": 80
        }
      }
  ]
}

script: 项目启动文件 ignore_watch: 不监控的文件夹 cwd:项目的根目录 env:设置的环境变量

启动项目

pm2 start run.json

设置开机自启

pm2 startup

3333333.png

在root用户下执行提示的命令

# env PATH=$PATH:/usr/local/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u centos --hp /home/centos

在username用户下,执行

pm2 save

使用Helmet补充

在koa中使用:

# 安装
npm install koa-helmet --save

# 使用
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)

额外需要考虑的问题补充

1.使用提交速率限制,防止蛮力攻击,使用koa-limit来限制用户的提交和查询的速度。

# 安装
npm install koa-limit

# 使用
var koa = require('koa');
var favicon = require('koa-favicon');
var limit = require('koa-limit');
 
var app = koa();
// If you are using reverse proxy on the front of node, like 'nginx', please set this 
// app.proxy = true; 
app.use(favicon());
app.use(limit({
  limit: 1000,
  interval: 1000 * 60 * 60
}));
 
app.use(function *() {
  this.body = 'hello';
});
 
app.listen(7001);

2.使用csurf来阻止CSRF攻击

浅谈CSRF攻击方式 CSRF是什么?

CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

CSRF可以做什么?

你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账…造成的问题包括:个人隐私泄露以及财产安全。

koa2中使用csurf 安装

npm install --save koa-csrf@3.x

服务器端

import Koa from 'koa';
import bodyParser from 'koa-bodyparser';
import session from 'koa-generic-session';
import convert from 'koa-convert';

const app = new Koa();

// set the session keys 
app.keys = [ 'a', 'b' ];

// add session support 
app.use(convert(session()));

// add body parsing 
app.use(bodyParser());

// add the CSRF middleware 
app.use(new CSRF({
 invalidSessionSecretMessage: 'Invalid session secret',
 invalidSessionSecretStatusCode: 403,
 invalidTokenMessage: 'Invalid CSRF token',
 invalidTokenStatusCode: 403,
 excludedMethods: [ 'GET', 'HEAD', 'OPTIONS' ],
 disableQuery: false
}));

// your middleware here (e.g. parse a form submit) 
app.use((ctx, next) => {

 if (![ 'GET', 'POST' ].includes(ctx.method))
   return next();

 if (ctx.method === 'GET') {
   ctx.body = ctx.csrf;
   return;
 }

 ctx.body = 'OK';

});

app.listen();

客户端pug模板

form(action='/register', method='POST')
  input(type='hidden', name='_csrf', value=csrf)
  input(type='email', name='email', placeholder='Email')
  input(type='password', name='password', placeholder='Password')
  button(type='submit') Register

Express 部署最佳实践-安全篇中的有些 还没有试到后面再补充。

欢迎大家一起讨论koa2安全,一起共同进步。

4 回复

可以看一下egg的安全插件

@i5ting 大致看了一下,值得好好研究,考虑的很完善果真是阿里良心啊。如果koa2有这样的套件那就太完美了。

@18820227745 无缝拿走,哈哈哈

这边我拿走了,谢谢

回到顶部