You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Node-RED Docker容器adminAuth是否需哈希密码及配置咨询

解答

1. Node-RED是否要求使用哈希密码?

Node-RED不强制要求使用哈希密码,但官方强烈建议用bcrypt哈希存储密码——明文密码直接写在settings.js里存在严重安全风险,一旦配置文件泄露,账号密码直接暴露。

2. 当前认证方案能否在Docker中生效?

你的当前方案可以正常生效:只要settings.js被正确复制到容器内,Node-RED启动时会加载这个配置,当你访问管理界面时,会触发authenticate函数校验用户名密码。但明文密码的安全隐患极高,绝对不建议在生产环境使用。

3. 保留authenticate函数的前提下使用哈希密码

可以通过bcrypt库实现密码哈希校验,步骤如下:

  1. 提前生成密码哈希值
    在本地Node环境中安装bcrypt(npm install bcrypt),运行以下代码生成目标密码的哈希值:
    const bcrypt = require('bcrypt');
    const rawPassword = 'mypassword';
    bcrypt.hash(rawPassword, 10, (err, hash) => {
        if (err) throw err;
        console.log(hash); // 输出类似$2b$10$xxxxxxx的哈希字符串
    });
    
  2. 修改Dockerfile安装bcrypt
    容器内的Node-RED需要bcrypt依赖才能校验哈希,在Dockerfile中添加安装命令:
    RUN npm install bcrypt
    
  3. 更新settings.js的认证逻辑
    引入bcrypt,修改authenticate函数用哈希校验密码:
    const bcrypt = require('bcrypt');
    
    module.exports = {
        // 其他配置项
        adminAuth: {
            type: "credentials",
            users: function(username) {
                if (username === "myuser") {
                    return Promise.resolve({
                        username: "myuser",
                        permissions: "*",
                        password: "$2b$10$xxxxxxx" // 替换为你生成的哈希值
                    });
                } else {
                    return Promise.resolve(null);
                }
            },
            authenticate: function(username, password) {
                return new Promise((resolve, reject) => {
                    this.users(username).then(user => {
                        if (!user) return resolve(null);
                        // 对比明文密码和存储的哈希值
                        bcrypt.compare(password, user.password, (err, isValid) => {
                            if (err || !isValid) {
                                resolve(null);
                            } else {
                                resolve({ username: user.username, permissions: user.permissions });
                            }
                        });
                    }).catch(() => resolve(null));
                });
            }
        },
        // 其他配置项
    };
    

额外安全优化建议

  • 避免硬编码哈希:生产环境不要把哈希密码写死在settings.js里,可通过Docker环境变量传递,比如在settings.js中读取process.env.NODE_RED_ADMIN_HASH,这样既灵活又能避免密码提交到代码仓库。
  • 限制配置文件权限:在Dockerfile中添加命令,设置settings.js为只读且仅root用户可修改:
    RUN chmod 600 /usr/src/node-red/settings.js && chown root:root /usr/src/node-red/settings.js
    
  • 第三方认证替代方案:如果是企业级场景,可使用node-red-contrib-auth-openid等插件实现OAuth2/OIDC认证,比账号密码认证更安全。

内容的提问来源于stack exchange,提问作者bbartling

火山引擎 最新活动