前言
默认地,node-red编辑器可以被任何访问的用户操作,包括修改节点,流数据,重新部署流。
这种默认的部署方式只适用于运行在可靠的网络中。下面我就给大家介绍一下,在公网上部署node-red后,如何对其进行安全加固和权限验证。
主要分为三部分
- 开启https权限
- 保护编辑器和admin api
- 保护http节点和node-red的仪表盘
开启https
node-red默认是使用http来进行访问,如果要配置https访问,你需要在node-red的配置文件setting
文件中配置一下https
部分的内容
在配置文件中 https配置项可以是一个json静态数据,也可以是一个函数。完整的配置参数事nodejs中http模块的配置 点击链接可以查看到完整的配置
在该配置项中,至少要有二项需要返回或配置。
- key PEM格式化后的密钥,类型可以是String 或Buffer
- cert PEM格式化后的 Cert chain,类型可以是String 或Buffer
配置的例子
https: {
key: require("fs").readFileSync('privkey.pem'),
cert: require("fs").readFileSync('cert.pem')
},
如果你要配置成一个function的话,请记得将key与cert放到promise中,如下
https: function() {
return new Promise((resolve, reject) => {
var key, cert;
// Do some work to obtain valid certificates
// ...
resolve({
key: key
cert: cert
})
});
}
如果你要在配置https后,自动刷新证书,并且不用重启node-red,node-red也是能做到的,需要nodejs在11之上,并且https必须配置成function,接着设置 httpsRefreshInterval
,类型为一个数字,表示几小时内循环自动刷新。
编辑器与Admin API的鉴权
node-red的编辑器与Admin api支持两种类型的鉴权
- 使用用户名 密码证书来进行鉴权
- 使用任何OAuth/OpenID提供商来进行鉴权,如Twitter活GitHub。
基于用户名和密码的鉴权只需要在setting配置文件中配置即可
如下是一个配置示例
adminAuth: {
type: "credentials",
users: [
{
username: "admin",
password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
permissions: "*"
},
{
username: "george",
password: "$2b$08$wuAqPiKJlVN27eF5qJp.RuQYuy6ZYONW7a/UWYxDTtwKFCdB8F19y",
permissions: "read"
}
]
}
管理员可以配置多个用户。这些用户的登录及权限数据都是写死的。包括登录的账号,密码,和权限。其中密码是使用bcrypt 算法工具进行hash加密。
生成hash密码可以使用 node-red admin hash-pw
(在node-red 1.1.0 之后)
使用OAuth/OpenID来进行授权
dminAuth: {
type:"strategy",
strategy: {
name: "twitter",
label: 'Sign in with Twitter',
icon:"fa-twitter",
strategy: require("passport-twitter").Strategy,
options: {
consumerKey: TWITTER_APP_CONSUMER_KEY,
consumerSecret: TWITTER_APP_CONSUMER_SECRET,
callbackURL: "http://example.com/auth/strategy/callback",
verify: function(token, tokenSecret, profile, done) {
done(null, profile);
}
},
},
users: [
{ username: "knolleary",permissions: ["*"]}
]
}
配置项详解:
name: 策略名称
lable/icon:在登录页显示的信息
strategy:需要使用到的库
options:根据strategy来进行配置,需要使用的参数
verify:验证函数,最后使用done函数将用户资料向下传递
设置默认用户
如果你想要限定没有登录时,node-red的一些权限,可以使用设置默认用户的方式来实现
配置一个默认用户,并配置其对于的权限。权限可以是全部,也可以是只读。
如下是一个例子
adminAuth: {
type: "credentials",
users: [ /* list of users */ ],
default: {
permissions: "read"
}
}
除来 * 和 read 两种大模块的权限限定外,管理员还可以配置Admin API
例如为了获取当前流的信息,用户将会要求 flow.read
权限。如果要更新流信息,他们需要使用flows.write
权限。
自定义用户鉴权
目前介绍的用户鉴权都是硬编码的鉴权,写死用户数据及对于的权限。这种方式不方便扩展,所以node-red又提供了另一种方式,自定义用户鉴权。以下是实现步骤
创建 <node-red>/user-authentication.js
按照以下模版编写授权代码
module.exports = {
type: "credentials",
users: function(username) {
return new Promise(function(resolve) {
// Do whatever work is needed to check username is a valid
// user.
if (valid) {
// Resolve with the user object. It must contain
// properties 'username' and 'permissions'
var user = { username: "admin", permissions: "*" };
resolve(user);
} else {
// Resolve with null to indicate this user does not exist
resolve(null);
}
});
},
authenticate: function(username,password) {
return new Promise(function(resolve) {
// Do whatever work is needed to validate the username/password
// combination.
if (valid) {
// Resolve with the user object. Equivalent to having
// called users(username);
var user = { username: "admin", permissions: "*" };
resolve(user);
} else {
// Resolve with null to indicate the username/password pair
// were not valid.
resolve(null);
}
});
},
default: function() {
return new Promise(function(resolve) {
// Resolve with the user object for the default user.
// If no default user exists, resolve with null.
resolve({anonymous: true, permissions:"read"});
});
}
}
最后在setting文件的adminAuth中配置adminAuth: require("./user-authentication")
结语
以上就是本篇的全部内容,这些内容对于想要精细化控制node-red的权限尤为重要,特别是要将其改造为一个多租户系统时。 谢谢观看。