最近看了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
在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 [email protected]
服务器端
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安全,一起共同进步。
可以看一下egg的安全插件
@i5ting 大致看了一下,值得好好研究,考虑的很完善果真是阿里良心啊。如果koa2有这样的套件那就太完美了。
@18820227745 无缝拿走,哈哈哈
这边我拿走了,谢谢