如何保护程序中纯文本中使用的凭据或密钥?

时间:2019-03-16 06:53:40

标签: database security

最近我一直在使用ExpressJS连接到连接在云(AWS)上的数据库。连接的定义如下:(来源:https://expressjs.com/en/guide/database-integration.html

var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'dbuser',
  password : 's3kreee7',
  database : 'my_db'
});

在AWS上,我一直通过AWS流程遍历环境变量:

var connection = mysql.createConnection({
    host: process.env.RDS_HOSTNAME,
    user: process.env.RDS_USERNAME,
    password: process.env.RDS_PASSWORD,
    port: process.env.RDS_PORT
});

尽管在AWS上运行时非常方便,但是如果我想在本地运行/对代码进行故障排除,这会很麻烦,因此我最终手动插入了用于连接数据库的实际值,类似于第一个示例中所示。我的帖子

使用纯文本形式列出的用户名和密码似乎并不安全。当然,您产品的任何版本控制都必须是私有的,否则任何人都可以获取数据库的凭据,即使那样,您可能也不想将凭据保存在版本控制历史记录中。围绕此的最佳实践是什么?人们是否总有某种方式连接到需要凭据,密钥或其他安全信息的代码中的数据库或安全资源?有标准吗?

这是我自己想到的最好的主意,请参考上面的示例:

host: process.env.RDS_HOSTNAME || hostVariablePulledFromLocalFile

如果在AWS上,这将连接到数据库,并且如果不使用存储在本地文本或json文件中的某些变量,该变量包含凭据和其他重要信息。这样一来,您可以推送到版本控制,而不必拥有您的凭据(当然,从存储库中排除信息文件)。

1 个答案:

答案 0 :(得分:1)

绝对不要在您的源代码树中放置秘密(例如数据库凭据)。这不仅损害了这些凭据,而且还使得不可能在开发和生产环境中部署相同的代码。

JavaScript应用程序的通用标准是dotenv。看来您可能已经在使用此功能,但是您可能尚未意识到.env文件应该在源代码控制中-应该用{{1}排除它},并在部署过程中单独安装。这样,您可以在自己的计算机上显示开发凭据,并在生产环境中使用生产凭据。

尤其对于Amazon RDS,you may be able to use instance IAM to handle database authentication。如果不合适,AWS Secrets Manager可能是另一个值得研究的选择。