前言

默认地,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的权限尤为重要,特别是要将其改造为一个多租户系统时。 谢谢观看。

相关新闻

发表回复

Your email address will not be published. 必填项已用 * 标注

邮箱

cloud@modbus.cn

QQ
QQ
微信
微信
分享本页
返回顶部