2017-03-27 10 views
4

AWS CodePipelineを使用して構築され、ECSにデプロイされているアプリケーションにビルド時間と実行時の秘密を提供するという問題に対処しています。AWS CodePipelineの実行時間とビルド時間の秘密の扱い

最終的には、私たちのビジョンは、次の目標を達成し、当社の各アプリケーションのための一般的なパイプラインを作成することです:アプリ-・パイプラインのアクセスの

  • 完全に分離
    • サービスができません資格証明書のいずれかにアクセスしたり、割り当てられた開発者 によるAPP-B-パイプラインとその逆
  • 秘密の管理に使用するキーのいずれかを使用します
    • のみアプリ-ここ

ためのアプリ - 読み取りおよび書き込みも秘密を担当する開発者は、問題が手元にある:

  • は、私たちのアプリケーションの中には、民間へのアクセスを必要としますビルド時の依存関係解決のためのリポジトリ たとえば、私たちのJavaアプリケーションは、正常にビルドするためにプライベートMavenリポジトリにアクセスする必要があります
  • 私たちのアプリのいくつか

    • 私たちのコードベースが常駐:licationsは、たとえばランタイム でデータベースアクセスの資格情報を必要とし、我々のアプリを実行しているサーブレットコンテナは、いくつかの注意点とともに.xmlファイルを見つけるために資格情報を含む構成ファイルとアクセスデータベース

    が必要ですパブリックリポジトリに保存します。 ECRのアクセスが制限されている場合でも、当社は、平文または当社のリポジトリに秘密の暗号文のいずれかを置くことによって秘密を公開したくない

  • 我々はCodeBuildで作成された当社ドッカー画像へのランタイムの秘密を焼くしたくない
  • Cloudformation ECSリソースおよび関連するパラメータファイルのテンプレートは、パブリックリポジトリの平文で格納されます。これにより、実行時の秘密をパラメータを介してパラメータを介してECS Cloudformationテンプレートに渡す可能性が排除されます(私の知る限り)

資格情報の管理に役立つツールを使用することを検討しました。このソリューションでは、CodeBuildタスクインスタンスとECSタスクインスタンスの両方にAWS CLIを使用する必要があります。より多くの資格情報をシャッフルするのを避けるため、AWS CLIの使用が必要なインスタンスに特権ロールを割り当てることが最善の方法であると判断しました。このようにして、CLIはインスタンスのメタデータのロールから資格情報を推測できます

これらの制限がある場合、私たちは秘密を管理する方法を考案しようとしました。各アプリケーションについて、パイプラインを作成します。Cloudformationテンプレートを使用して、我々は作成します。

  • 4リソース:

    • DynamoDBの資格テーブル
    • KMS資格キー
    • ECRレポ
    • CodePipelineを(、展開、などの構築)
  • 3役割: DynamoDBの資格テーブルに

    ECRレポへ
    • KMSキー 書き込みとDynamoDBの資格テーブルにCodeBuildRole 読み取りアクセス decryptパーミッション
    • ECSTaskRole 読み取りアクセスECRレポ
    • からKMSキー 読むと decryptパーミッションDeveloperRole DynamoDB資格情報テーブルへの読み取りおよび書き込みアクセス KMSキーによるアクセス許可の暗号化と復号化

CodePipelineのCodeBuildステップでは、CodeBuildRoleが、資格テーブルからビルド時間の秘密を読み取ることができるようにします。 CodeBuildはプロジェクトをビルドし、ECRにプッシュするドッカーイメージを生成します。最終的に、展開ステップでは、Cloudformテンプレートと、プロジェクトのパブリック・リポジトリにある付随するパラメータ・ファイルを使用してECSサービスを作成します。ECSタスク定義には、タスクがランタイム・シークレットを信任表から読み取り、 ECRから。

Here is a simple diagram of the AWS resources and their relationships as stated above

我々の現在提案された解決策は、次の問題があります。

  • 役割重い
    • 作成役割は我々の組織では、特権アクションです。現状では
      • は、開発者が手動でDeveloperRoleを想定する必要があります:ない上記のパイプラインを作成しようとするすべての開発者は、必要な役割DeveloperRoleの
    • マニュアル仮定を作成する権限を持つことになります。私たちは、開発者ユーザARNのリストをパイプラインのCloudformテンプレートのパラメータとして渡すという考えに戸惑いました。 CloudFormは特定のユーザにロールまたはポリシーを割り当てるメカニズムを持っていますか?

我々が一望できるかもしれない、あるいは、これは我々が得ることができる最高であることをCodePipelineで周りの秘密を渡すために、より十分に確立方法はありますか?

答えて

3

つの思考:

AWS Parameter Storeは、きめ細かいアクセスとアクセスキーを保護することができます。このアクセスはServiceRolesに基づいて行うことができます。

ECSは、このパターンを介しServiceRoleへのアクセスを提供します。

build: 
    commands: 
     - curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI | jq 'to_entries | [ .[] | select(.key | (contains("Expiration") or contains("RoleArn")) | not) ] | map(if .key == "AccessKeyId" then . + {"key":"AWS_ACCESS_KEY_ID"} else . end) | map(if .key == "SecretAccessKey" then . + {"key":"AWS_SECRET_ACCESS_KEY"} else . end) | map(if .key == "Token" then . + {"key":"AWS_SESSION_TOKEN"} else . end) | map("export \(.key)=\(.value)") | .[]' -r > /tmp/aws_cred_export.txt 
     - chmod +x /tmp/aws_cred_export.txt 
     - /aws_cred_export.txt && YOUR COMMAND HERE 

CodeBuildタスクに提供するあなたのServiceRoleはあなたが行くように良いことがあります。パラメータストアキーを使用するためのアクセス権を持っている場合。

ハッピーハンティングとこれが役に立ったらいいですね

+1

Ericがパラメータストア(別のAWSサービス)を使うことをお勧めします。 AWSのウェブサイトには、コンテナが特定の役割を果たすECSアプリケーションの秘密管理のための例を紹介したブログ記事があります:https://aws.amazon.com/blogs/compute/managing-secrets- for-amazon-ecs-applications-using-tasks-for-tasks/ スクリプト/アプリケーションは、API CLI。 – Kirkaiya

0

高度なレベルでは、細かい権限(これはあなたのやりたいことに似ています)を持つ単一のAWSアカウント、または複数のAWSアカウントを使用してアプリケーションを分離することができます。それ自体は間違っても間違ってもいませんが、開始場所が完全に分離されているため、個別の権限を管理することとは別のAWSアカウントを優先させる傾向があります。