web-dev-qa-db-ja.com

ElasticBeanstalkを使用してデプロイ時に機密性の高い環境変数を指定する方法

Python FlaskアプリケーションとElasticBeanstalkをデプロイしています。構成ファイルがあります/.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フォルダーはソース管理下にあり、すべての人と共有されるのでこれが好きですが、同時に機密値をソース管理下に置きたくありません。

デプロイ時にEBCLIツールを使用していくつかの環境変数を指定する方法はありますか(例:eb deploy -config ...)?または、このユースケースはAWSデプロイメントツールでどのようにカバーされていますか?

19
Iulian

EbWebコンソールから環境変数として機密値を指定できるはずです:EBアプリ-> EB環境->構成->ソフトウェア構成->環境プロパティ

または、これを利用することもできます: http://docs.aws.Amazon.com/elasticbeanstalk/latest/dg/eb3-setenv.html

3
Samar

AWSドキュメントではS3に機密情報を保存することを推奨しています 環境変数はさまざまな方法で公開される可能性があるため:

環境プロパティを使用してアプリケーションへの接続情報を提供することは、パスワードをコードから除外するための良い方法ですが、完全なソリューションではありません。環境プロパティは、環境管理コンソールで検出でき、環境の構成設定を説明する権限を持つすべてのユーザーが表示できます。プラットフォームによっては、環境プロパティもインスタンスログに表示される場合があります。

以下の例はドキュメントからのものであり、詳細については参照する必要があります。要するに、あなたはする必要があります:

  1. 最小限の権限でファイルをS3にアップロードします 暗号化されている可能性があります
  2. ElasticBeanstalk自動スケーリンググループのインスタンスプロファイルのロールへの読み取りアクセスを許可します。ポリシーは次のようになります。

    {
        "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
    

次に、アプリケーションコードを更新して、ファイル/tmp/beanstalk-database.json(または実際の構成に配置することを決定した場所)から値を抽出します。

15
Carl G

この質問にはすでに答えがありますが、私はこの問題の代替ソリューションを提供したいと思います。シークレットを環境変数に保持する代わりに(バージョン管理外の場所で管理および保存する必要があり、展開時にそれらを設定することを忘れないでください)、暗号化されたS3バケットにすべてのシークレットを配置します。 EBが実行されている役割。次に、起動時にシークレットを取得します。これには、展開を構成から完全に切り離すという利点があり、コマンドラインでシークレットをいじる必要はもうありません。

必要に応じて(たとえば、コードがフェッチされるリポジトリへのキーなど、アプリのセットアップ中にシークレットが必要な場合)、.ebextensionsディレクティブを含むS3Auth設定ファイルを使用して、上記のコンテンツを簡単にコピーすることもできます。ローカルインスタンスへのS3バケット。それ以外の場合は、AWS SDKを使用して、起動時にアプリからすべてのシークレットをフェッチします。

編集:2018年4月の時点で、AWSはシークレット管理専用のマネージドサービスを提供しています。 AWSシークレットマネージャー。文字列またはjson形式、バージョン管理、ステージ、ローテーションなどのシークレットの便利で安全なストレージを提供します。また、KMS、IAMなどの構成の一部が削除され、セットアップが迅速になります。秘密鍵やパスワードなどの静的な機密データを保存するために他のAWSサービスを使用する本当の理由はわかりません。

7
JHH

私は別のシェルスクリプト、何か./deploy_production.shを使用して、環境固有の変数を設定しています。シェルスクリプトでは、「eb setenv NAME1 = VAR1 NAME2 = VAR2 ...」を使用してenv変数を設定できます。

そして、このファイルはgitリポジトリに入る必要はありません。

0
CCK

他の回答のいくつかは、Parameter Store/SecretsManagerでより良い方法があるかもしれないと述べています。

この回答では、AWS Systems Managerパラメーターストア(Secrets Managerへのインターフェイスも提供します)を使用してこれをどのように行ったかを説明しました: https://stackoverflow.com/a/59910941/159178 。基本的に、Beanstalk ECS IAMロールに関連するパラメーターへのアクセスを許可し、起動時にアプリケーションコードからロードします。

0
Fletch