Amazon web services 如何使用Elastic Beanstalk在部署时指定敏感环境变量
我正在使用Elastic Beanstalk部署一个Python Flask应用程序。我有一个配置文件Amazon web services 如何使用Elastic Beanstalk在部署时指定敏感环境变量,amazon-web-services,amazon-elastic-beanstalk,Amazon Web Services,Amazon Elastic Beanstalk,我正在使用Elastic Beanstalk部署一个Python Flask应用程序。我有一个配置文件/.ebextensions/01.config,其中我设置了一些环境变量,其中一些应该是机密的 该文件如下所示: packages: yum: gcc: [] git: [] postgresql93-devel: [] option_settings: "aws:elasticbeanstalk:application:environment": S
/.ebextensions/01.config
,其中我设置了一些环境变量,其中一些应该是机密的
该文件如下所示:
packages:
yum:
gcc: []
git: []
postgresql93-devel: []
option_settings:
"aws:elasticbeanstalk:application:environment":
SECRET_KEY: "sensitive"
MAIL_USERNAME: "sensitive"
MAIL_PASSWORD: "sensitive"
SQLALCHEMY_DATABASE_URI: "sensitive"
"aws:elasticbeanstalk:container:python:staticfiles":
"/static/": "app/static/"
对某些价值观保密的最佳做法是什么?目前,.ebextensions
文件夹处于源代码管理之下,我喜欢它,因为它与所有人共享,但同时我不想将敏感值置于源代码管理之下
部署时是否有办法通过EB CLI工具指定一些环境变量(例如,
EB deploy-config…
)?或者AWS部署工具是如何涵盖此用例的 您应该能够从eb web控制台将敏感值指定为环境变量:您的eb应用程序->您的eb环境->配置->软件配置->环境属性
或者,您也可以利用此功能:
编辑:虽然这是2015年被接受的答案,但这不应该是你们处理它的方式。现在您可以使用AWS Secrets Manager来实现这一目的。我一直在使用另一个shell脚本,比如./deploy\u production.sh来设置特定于环境的变量。在shell脚本中,可以使用“eb setenv NAME1=VAR1 NAME2=VAR2…”来设置env var
这个文件不需要进入git repo。这个问题已经有了答案,但我想为这个问题提供一个替代解决方案。我不必在环境变量中保守秘密(然后这些变量必须在版本控制之外的某个地方进行管理和存储,另外您需要记住在部署时设置它们),而是将我的所有秘密放在一个加密的S3存储桶中,该存储桶只能从EB运行时的角色访问。然后我在启动时获取秘密。这样做的好处是将部署与配置完全解耦,并且您永远不必再在命令行中处理机密 如果需要(例如,如果在应用程序设置过程中需要机密,例如获取代码的存储库的密钥),您还可以使用带有
S3Auth
指令的.ebextensions
配置文件轻松地将所述S3存储桶的内容复制到您的本地实例;否则,只需在启动时使用AWS SDK从应用程序获取所有机密即可
编辑:截至2018年4月,AWS为机密管理提供专门的托管服务;AWS秘密经理。它以字符串或json格式、版本控制、阶段、轮换等方式方便安全地存储机密。当涉及到KMS、IAM等时,它还消除了一些配置,以便更快地进行设置。我认为没有真正的理由使用任何其他AWS服务来存储静态敏感数据,如私钥、密码等。因为环境变量可能以各种方式公开:
使用环境为应用程序提供连接信息
属性是防止密码进入代码的好方法,但是
这不是一个完美的解决方案。可在中发现环境属性
环境管理控制台,并且可以由具有
描述环境中配置设置的权限。
根据平台的不同,环境属性也可能出现在
实例日志
下面的示例来自文档,您应该参考该文档以了解完整的详细信息。简而言之,您需要:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "database",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::my-secret-bucket-123456789012/beanstalk-database.json"
]
}
]
}
s3 connection info file.config
的文件添加到应用程序包根目录中的/.ebextensions
,并包含以下内容:
Resources:
AWSEBAutoScalingGroup:
Metadata:
AWS::CloudFormation::Authentication:
S3Auth:
type: "s3"
buckets: ["my-secret-bucket-123456789012"]
roleName: "aws-elasticbeanstalk-ec2-role"
files:
"/tmp/beanstalk-database.json" :
mode: "000644"
owner: root
group: root
authentication: "S3Auth"
source: https://s3-us-west-2.amazonaws.com/my-secret-bucket-123456789012/beanstalk-database.json
然后更新应用程序代码,从文件
/tmp/beanstalk database.json
(或您决定将其放入实际配置的任何位置)中提取值。其他一些答案提到,使用参数存储/机密管理器可能有更好的方法
我在下面的回答中描述了我如何使用AWS Systems Manager参数存储(它也为您提供了一个到Secrets Manager的接口)实现这一点:。基本上,您可以让Beanstalk ECS IAM角色访问相关参数,然后在启动时从应用程序代码中加载它。有没有办法从aws cli执行此操作?如果它不在git repo中,您如何在实例上运行它?我刚刚偶然发现,这可能也是存储敏感信息的解决方案(但不是具体的环境变量。)它“为配置数据管理和机密管理提供安全、分层存储。”看起来很像HashiCorp的执政官。如何修改环境属性,环境属性列表不可见。我想更新我已经设置的环境属性,应用程序也正在运行。我已经按照你的回答完成了。我是新手。PS。坏习惯。请使用AWS机密管理器来完成此操作。@Manuel yup right.since这篇文章是在2015年发表的,我继续使用参数存储,最终使用了secrets manager。太好了!只是想提醒未来的读者。最近的Codecov security Undecent实际上表明,环境变量很容易暴露。