【问题标题】:Where to store Active Directory credentials in a Node.js application在 Node.js 应用程序中存储 Active Directory 凭据的位置
【发布时间】:2020-01-27 08:18:09
【问题描述】:

我是 node.js 的新手,我被要求创建一个应用程序(网站),用户可以在其中使用具有提升权限的 AD 帐户登录。然后,应用程序的目标是使用这些提升的凭据启动不同的 PowerShell 脚本和其他工具。

在网上搜索后,我们似乎需要以下包:

似乎是not a good ideausernamepassword 存储在jsonwebtoken 的payload 中。该令牌应该保持轻量级,并且只保存 AD 用户的唯一标识符(我猜这可能是他的 DistinguishedName)。

我的问题:用户的 AD 密码存储在哪里?如果它不能在jsonwebtoken 中,那么唯一剩下的地方可能是数据库?这是这样做的安全方式吗?如果数据库被入侵,它似乎也不安全。

如果数据库存储了 AD 密码,我们将需要在用户每次触发 PowerShell 脚本时请求一个 AD 凭据对象。将完整的 AD 凭据对象存储在数据库中,而不仅仅是 AD 密码,会更好吗?

我的事情可能过于复杂,但感谢您为我澄清这一点。

【问题讨论】:

  • 您可以使用bcrypt将密码存储在数据库中,最终护照也支持。
  • 当数据库被入侵时,密码可以被解密吗?应用可以在需要时解密密码吗?

标签: javascript node.js authentication active-directory


【解决方案1】:

使用NodeJs内部Crypto Library解决方案

  1. 通过选择加密选项,使用crypto.generateKeyPairSync() 生成公钥和私钥文件。来自同一页面的示例代码:
const { generateKeyPairSync } = require('crypto');
const { publicKey, privateKey } = generateKeyPairSync('rsa', {
  modulusLength: 4096,
  publicKeyEncoding: {
    type: 'spki',
    format: 'pem'
  },
  privateKeyEncoding: {
    type: 'pkcs8',
    format: 'pem',
    cipher: 'aes-256-cbc',
    passphrase: 'top secret'
  }
});
  1. 在您的代码中使用crypto.publicEncrypt(key, buffer) 来加密密码并将它们存储在数据库中。读取值时使用crypto.publicDecrypt(key, buffer) 获取原始值。
  2. 如果您想读取代码之外的值,请使用 privateDecrypt()privateEncrypt() 值以及密码。

这将确保在数据库中或通过传输/线路时的安全问题。

【讨论】:

  • 完美,非常感谢。当密码作为加密字符串存储在数据库中时,是否还需要salt 密码?我也可以考虑使用bcrypt,因为我认为这是广为人知和使用的。
  • 如果您使用crypto,则可能不需要额外的salt,但这取决于您的安全偏好。
【解决方案2】:

您根本不需要处理 AD 密码,只需将您的节点应用程序放在 IIS 后面,禁用匿名身份验证并启用 Windows 身份验证,它就会正确地完成工作,您将能够以经过身份验证的用户身份运行脚本。您可以在第一个示例中查看https://github.com/auth0/passport-windowsauth,您可能不需要为您的简单用例进行更高级的设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2011-12-05
    相关资源
    最近更新 更多