【发布时间】:2018-06-01 06:08:18
【问题描述】:
我们在 eb 环境之外有一个 db 实例,密码存储在一个属性文件中,该文件将与 jar 一起压缩并上传和部署。这不是很安全,因为密码实际上是随身携带的。 (与旧的部署方式相比,其中密码存储在服务器上,通过 JNDI 与其他连接信息一起提取)。有没有更好的方法以更安全的方式管理数据库密码?
【问题讨论】:
标签: amazon-web-services amazon-elastic-beanstalk
我们在 eb 环境之外有一个 db 实例,密码存储在一个属性文件中,该文件将与 jar 一起压缩并上传和部署。这不是很安全,因为密码实际上是随身携带的。 (与旧的部署方式相比,其中密码存储在服务器上,通过 JNDI 与其他连接信息一起提取)。有没有更好的方法以更安全的方式管理数据库密码?
【问题讨论】:
标签: amazon-web-services amazon-elastic-beanstalk
考虑使用AWS Parameter Store 来管理数据库密码等应用程序机密。
AWS Systems Manager Parameter Store 提供安全的分层 用于配置数据管理和机密管理的存储。你 可以存储密码、数据库字符串和许可证代码等数据 作为参数值。您可以将值存储为纯文本或加密 数据。然后,您可以使用您指定的唯一名称来引用值 创建参数时指定。高度可扩展,可用, Parameter Store 经久耐用,由 AWS 云提供支持。 参数 商店免费提供。
【讨论】:
aws ssm get-parameter 选项。如果您在 EB 中启动自己的 docker 容器,这似乎是可能的,但正如您的回答所暗示的,这绝对不是一个直截了当的“开箱即用”解决方案。
我同意 Rodrigo M 的观点,即 AWS Parameter Store 是一个好主意。这是一个小方法:
Elastic Beanstalk 在 EC2 上运行。当您在 EC2 上运行 AWS CLI 时,它会自动拥有分配给 EC2 的任何 IAM 角色的权限。因此,这意味着您可以创建一个 IAM 角色,该角色授予 EC2 实例获取密钥的权限,然后在启动时在您的应用程序代码中获取它。
IAM:例如,将 AmazonSSMReadOnlyAccess 策略附加到 aws-elasticbeanstalk-ec2-role。这会让你继续前进。可能有更严格和更安全的方法来做到这一点,例如,这里有一个示例https://aws.amazon.com/blogs/compute/managing-secrets-for-amazon-ecs-applications-using-parameter-store-and-iam-roles-for-tasks/ 的策略只允许访问命名参数,而不是所有参数。
有一个开发工具包允许您从应用程序中使用 AWS CLI。见https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SSM.html。
npm install aws-sdk
然后在您的代码中:
const AWS = require('aws-sdk');
const ssm = new AWS.SSM({'region': 'us-east-1'});
var params = {
Name: 'db-pw',
WithDecryption: true
};
ssm.getParameter(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else {
const dbPw = data.Parameter.Value;
}
});
这在今天的一个小测试中对我有用。对我来说似乎没问题,但我不是安全专家,所以我会在产品中使用它之前与同事检查安全方面。
【讨论】:
{{resolve:ssm:</path/to/ssm/secret>:<version nubmer>}} e.g. {{resolve:ssm:/myapp/db-secret>:1}}。注意目前使用这个方法only supports plain text configuration, not encrypted one.