Node.js Mongoose没有以纯文本形式存储连接字符串

时间:2014-05-06 19:13:52

标签: node.js mongodb unix

从文档中,基本的猫鼬连接字符串是mongoose.connect('mongodb://username:password@host:port/database?options...');

问题是用户名:密码以纯文本形式存储在源代码中。我们担心的攻击媒介是,如果有人要访问我们的源代码,他们也可以访问数据库。

有哪些策略可以避免此漏洞?

  1. 我可以加密密码,然后在连接之前解密密码,但如果有人访问我们的源代码,他们也可以访问我们的解密器,因为在连接之前需要解密器。
  2. 如果有人要获得对服务器的root权限,我相信无论如何我们都会成为一条小溪,但有没有办法让人们无法访问我们的源代码然后妥协我们的DB?

2 个答案:

答案 0 :(得分:3)

你是认为如果有人能够访问服务器本身并不重要,那么数据可以在服务器上以纯文本形式公开,但加密它不会受到伤害(例如如果您正在查看包含它的文件。)

有两种策略可以解决这个问题:

  1. 将密码或其他敏感数据作为环境a-la Heroku
  2. 的一部分传递
  3. 包含不受版本控制且包含敏感数据(加密或其他)的配置文件。
  4. 例如,如果您在Heroku上托管,您的配置可能如下所示:

    {
        "development": {
            "db": "mongodb://localhost/app_devel"
        },
        "production": {
            "db": process.env.MONGOLAB_URI
        }
    }
    

答案 1 :(得分:1)

我们最终解决的最终解决方案是将加密的密码存储在提交给我们VCS的配置文件中。

为了解密密码,我们创建了一个简单的小二进制文件golang(< 100 LoC),它验证了机器的某些物理属性(mac地址+其他)并运行解密。这是通过child_process.exec执行的。加密/解密二进制文件的源代码存储在我们系统的特权部分,只有少数员工可以访问。

这样做的最终结果是,如果有人要获取我们的应用程序源代码,包括已编译的加密/解密二进制文件,那么它们就不会有好处,因为密码是加密的并且二进制文件不会工作,除非它和& #39;在我们已经过身份验证的计算机上运行。

系统中的缺陷是,如果有人获得经过身份验证的计算机的root访问权限,他们就可以升级到数据库。此外,如果有人获得加密二进制文件的源代码,他们可以学习解密方案。出于我们的目的,我们认为这些可能的入境点是可以接受的。