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

时间:2015-05-27 18:47:35

标签: amazon-web-services elastic-beanstalk amazon-elastic-beanstalk

我正在使用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部署工具如何涵盖此用例?

5 个答案:

答案 0 :(得分:14)

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

  

使用环境为您的应用程序提供连接信息   属性是将密码保留在代码之外的好方法,但它是   不完美的解决方案。环境属性是可以发现的   环境管理控制台,任何有用户都可以查看   允许描述您环境中的配置设置。   根据平台的不同,环境属性也可能出现在   实例日志。

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

  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. 使用以下内容在应用程序包根目录中向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
    
  4. 然后更新您的应用程序代码以从文件/tmp/beanstalk-database.json中提取值(或者您决定将其放入实际配置中的任何位置。)

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:3)

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

或者,您可以使用此功能:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb3-setenv.html

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

其他答案中提到,使用参数存储/秘密管理器可能会有更好的方法。

我在以下答案中描述了我如何使用AWS Systems Manager参数存储(它还为您提供了Secrets Manager的界面)进行此操作:https://stackoverflow.com/a/59910941/159178。基本上,您可以让Beanstalk ECS IAM角色访问相关参数,然后在启动时从应用程序代码中加载它。