如何使用Elastic Beanstalk在部署时指定敏感环境变量

问题描述 投票:15回答:4

我正在使用Elastic Beanstalk部署Python Flask应用程序。我有一个配置文件/.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部署工具如何涵盖此用例?

amazon-web-services elastic-beanstalk amazon-elastic-beanstalk
4个回答
3
投票

您应该能够从eb Web控制台将敏感值指定为环境变量:您的EB应用程序 - >您的EB环境 - >配置 - >软件配置 - >环境属性

或者,你可以使用这个:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb3-setenv.html


14
投票

AWS documentation recommends storing sensitive information in S3因为环境变量可能以各种方式暴露:

使用环境属性向应用程序提供连接信息是将密码保留在代码之外的好方法,但这不是一个完美的解决方案。环境属性在Environment Management Console中是可发现的,任何有权描述环境配置设置的用户都可以查看。根据平台,环境属性也可能出现在实例日志中。

以下示例来自文档,您应参考该文档以获取完整详细信息。简而言之,您需要:

  1. 使用最小权限possibly encrypted将文件上传到S3。
  2. 授予对Elastic Beanstalk自动缩放组的实例配置文件角色的读访问权限。政策如下: { "Version": "2012-10-17", "Statement": [ { "Sid": "database", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::my-secret-bucket-123456789012/beanstalk-database.json" ] } ] }
  3. 在应用程序包root中添加一个名为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中提取值(或者您决定将其放入实际配置中的任何位置)。


7
投票

这个问题已经有了答案,但我想为这个问题提供替代解决方案。而不是必须在环境变量中保密(然后必须在版本控制之外的地方进行管理和存储,再加上你需要记住在部署时设置它们),我将所有秘密都放在加密的S3存储桶中,只能从EB正在运作的角色。然后我在启动时获取秘密。这样可以将部署与配置完全分离,您再也不必在命令行中调整秘密。

如果需要(例如,如果在应用程序设置期间需要密钥,例如获取代码的存储库的密钥),您还可以使用带有.ebextensions指令的S3Auth配置文件,以便轻松地将所述S3存储桶的内容复制到本地实例;否则只需使用AWS SDK在启动时从应用程序中获取所有机密。

编辑:自2018年4月起,AWS为秘密管理提供专门的托管服务; AWS秘密管理器。它以字符串或json格式,版本控制,阶段,旋转等提供方便安全的秘密存储。它还消除了KMS,IAM等的一些配置,以便更快地进行设置。我认为使用任何其他AWS服务存储静态敏感数据(如私钥,密码等)没有任何理由。


0
投票

我一直在使用另一个shell脚本,一些./deploy_production.sh来设置特定于环境的变量。在shell脚本中,您可以使用“eb setenv NAME1 = VAR1 NAME2 = VAR2 ...”来设置env var。

而且这个文件不需要进入git repo。

© www.soinside.com 2019 - 2024. All rights reserved.