最近我一直在使用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文件中的某些变量,该变量包含凭据和其他重要信息。这样一来,您可以推送到版本控制,而不必拥有您的凭据(当然,从存储库中排除信息文件)。
答案 0 :(得分:1)
绝对不要在您的源代码树中放置秘密(例如数据库凭据)。这不仅损害了这些凭据,而且还使得不可能在开发和生产环境中部署相同的代码。
JavaScript应用程序的通用标准是dotenv。看来您可能已经在使用此功能,但是您可能尚未意识到.env
文件应该不在源代码控制中-应该用{{1}排除它},并在部署过程中单独安装。这样,您可以在自己的计算机上显示开发凭据,并在生产环境中使用生产凭据。
尤其对于Amazon RDS,you may be able to use instance IAM to handle database authentication。如果不合适,AWS Secrets Manager可能是另一个值得研究的选择。