使用sails.js时,如何安全地存储连接字符串

时间:2014-01-28 23:02:03

标签: node.js encryption sails.js

我在config \ adapters.js中有一个数据库连接字符串,如下所示。我不想以纯文本形式保留连接字符串。保护该信息以及服务可以调用和连接到数据库的最佳方法是什么?

module.exports.adapters = {

  // If you leave the adapter config unspecified 
  // in a model definition, 'default' will be used.
  'default': 'mssql',

    mssql: {
        connectionString: 'Driver={SQL Server Native Client 10.0};Server=foo.domain.com;Database=RODDY;Uid=jsmith;Pwd=nw0ow21',
        module: 'sails-mssql'
    }

};

3 个答案:

答案 0 :(得分:6)

所有其他答案都是很好的答案,这是另一种方法。

设置一个名为SQL_STRING ..

的环境变量

这假设您使用的是ubuntu ..

#edit /etc/profile or ~/.profile
vim /etc/profile;
#add this line to it.
export SQL_STRING=<insert your sql string>

现在在config/local.js文件中为connectionString:

添加此内容
connectionString: process.env.SQL_STRING

这将加载连接字符串作为环境变量。这将做两件事,

  1. 如果需要,您现在可以将local.js提交到您的仓库,无论您在何处部署应用程序,它都会继承env变量设置的任何内容。这对于开发环境等很有用。

  2. 从应用程序文件中删除安全数据,因此没有人可以查看它们,他们必须进行一些挖掘以获取实际数据。

  3. 我目前在sailsjs应用程序的生产中执行此操作,我有一个特殊的sails用户,其~/.profile的所有MAILGUN,db和其他凭据数据被定义为环境变量。此用户受限于sudo,ssh访问,并被锁定以只能访问一个或两个文件夹。

    实际上,唯一可以看到这些环境变量的人是root用户和该用户。

答案 1 :(得分:2)

隐藏连接凭据的问题在于,您的应用需要访问权限才能与数据库进行通信,并最终需要以明文形式访问它。 Web应用程序开发人员已达成共识,可以将其存储在您的filesytsem中。如果攻击者可以访问您的文件系统,则您的系统已经严重受损。

作为一个网络应用程序,由于其暴露于世界,它本身就存在攻击的风险。您可以遵循安全,注重安全的做法来帮助管理风险:

  • 仅使用所需的权限在数据库中创建用户帐户,仅此而已。您永远不应该使用过度特权帐户(例如root)让您的应用与数据库
  • 进行通信
  • 禁止对数据库的外部访问
  • 定期备份(另一台服务器,我使用s3存储桶)
  • 使用防火墙阻止除访问外部世界所需的所有端口(通常是http,https,ssh)
  • 禁用FTP以及以明文形式发送数据的所有其他协议
  • 为您的人工帐户使用强密码,并为Web应用程序使用的帐户使用长期随机生成的密码。

这个清单并非详尽无遗,你可以做更多的事情,但这是一个很好的起点。

答案 2 :(得分:0)

如果您想要的是从版本控制中隐藏适配器连接凭据, sails.js允许您在config/local.js中定义适配器配置,默认情况下,它会添加到.gitignore中,因此不会检入git [1]。查看sails.js部署指南,了解有关使用local.js [2]的更多信息。如部署指南所示,您可以使用local.js,如下所示:

// Local configuration
// 
// Included in the .gitignore by default,
// this is where you include configuration overrides for your local system
// or for a production deployment.
//
// For example, to use port 80 on the local machine, override the `port` config
module.exports = {
    port: 80,
    environment: 'production',
    adapters: {
        mssql: {
            connectionString: 'Driver={SQL Server Native Client 10.0};Server=foo.domain.com;Database=RODDY;Uid=jsmith;Pwd=nw0ow21'
        }
    }
}

但这并不会阻止有权访问您服务器的人获取对此信息的访问权限。如果您对此感到担心,那么@SamT给出的建议很有用。