【Security Hub修復手順】[CodeBuild.2] CodeBuild プロジェクト環境変数にクリアテキストの認証情報を含めることはできません

AWS SecurityHub 基礎セキュリティのベストプラクティスコントロール修復手順をご紹介します。
2023.01.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。AWS事業本部コンサルティング部に所属している今泉(@bun76235104)です。

皆さん、お使いのAWS環境のセキュリティチェックはしていますか?

当エントリでは、AWS Security HubによるAWS環境のセキュリティ状況スコアリングに該当する項目についての修正手順をご紹介します。

本記事の対象コントロール

[CodeBuild.2] CodeBuild プロジェクト環境変数にクリアテキストの認証情報を含めることはできません

[CodeBuild.2] CodeBuild project environment variables should not contain clear text credentials

前提条件

本記事はAWS Security Hubで「AWS基礎セキュリティのベストプラクティススタンダード」を利用されている方向けの内容となります。 AWS Security Hubの詳細についてはこちらのブログをご覧ください。

修正手順

1 是正対象のCodeBuild プロジェクトを特定する

まずAWS Security HubのコンソールからCodeBuild.2のチェック結果を確認します。是正対象のCodeBuild プロジェクトを確認できます。

20230129_securityhub_remediation_codebuild2_specify_resource

2 IAMユーザーに代わるIAMロールを作成する

本コントロールはAWS_ACCESS_KEY_IDまたはAWS_SECRET_ACCESS_KEYという環境変数をCodeBuildプロジェクトにクリアテキスト(プレーンテキスト)として持たせている場合に発生します。

20230129_securityhub_remediation_codebuild2_check_accesskey_env

つまりIAMユーザーを作成・アクセスキーとシークレットアクセスキーを発行することでCodeBuildプロジェクトにIAMユーザーの権限を利用させている可能性が高いです。

IAMロールを利用することでアクセスキー/シークレットアクセスキーを使わずにCodeBuildプロジェクトに権限を付与できます。

不要なアクセスキー発行・漏洩について以下記事が参考になりますのでご参照ください。

たとえば今回はCodeBuildプロジェクトで「DockerイメージをビルドしてECRにプッシュしたい」と仮定して、最小限の権限を付与するIAMロールを作成してみます。

以下手順で作成しているIAMポリシーに付与している権限は一例となります。ご自身のCodeBuildプロジェクトで行いたいことに合わせて権限の設定が必要です

IAMポリシーの作成

まずはIAMロールに付与するIAMポリシーを作成します。

IAMのコンソール > 「ポリシー」 > 「ポリシーを作成」の順に進みます。

ポリシーのJSONを定義していきます。

20230129_securityhub_remediation_codebuild2_create_policy_json

今回は以下の権限を付与するために以下のようにJSONを定義しました。

  • CodeBuildの実行ログをAmazon CloudWatch Logsに出力する
  • CodeBuildの結果(アーティファクト)を特定のS3バケットに出力する
  • ECRへのプッシュ
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Resource": [
                "arn:aws:logs:ap-northeast-1:<アカウントID>:log-group:/aws/codebuild/test-alarm",
                "arn:aws:logs:ap-northeast-1:<アカウントID>:log-group:/aws/codebuild/test-alarm:*"
            ],
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ]
        },
        {
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::<バケット名>"
            ],
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:GetBucketAcl",
                "s3:GetBucketLocation"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ecr:CompleteLayerUpload",
                "ecr:GetAuthorizationToken",
                "ecr:UploadLayerPart",
                "ecr:InitiateLayerUpload",
                "ecr:BatchCheckLayerAvailability",
                "ecr:PutImage"
            ],
            "Resource": "<特定のecrのarn>"
        }
    ]
}

以下のプレースホルダーは環境に合わせて変更してください。

<アカウントID>
<バケット名>
<特定のecrのarn>

問題なければ「次のステップ:タグ」をクリックします。

特にタグは必要ないので、「次のステップ:確認」へ進みます。

20230129_securityhub_remediation_codebuild2_create_policy_tag

「名前」にIAMポリシーの名前を入力します。

今回はtest-codebuild-project-policyとし、「ポリシーの作成」をクリックします。

20230129_securityhub_remediation_codebuild2_create_policy_confirmation

IAMロールの作成

詳細設定 - AWS CodeBuildの「CodeBuild サービスロールの作成」を参考にして以下のようにIAMロールを作成しました。

IAMのコンソール -> 「ロール」 -> 「ロールを作成」の順に進みます。

「信頼されたエンティティタイプ」として「AWSのサービス」を選択肢、「ユースケース」で「CodeBuild」を選択して「次へ」をクリックします。

20230129_securityhub_remediation_codebuild2_create_assume_policy

許可ポリシーとして先ほど作成した「test-codebuild-project-policy」を検索して、チェックを有効にして「次へ」をクリックします。

20230129_securityhub_remediation_codebuild2_create_role_add_policy

ロール名をtest-codebuild-project-roleとして入力して、「ロールを作成」をクリックします。

20230129_securityhub_remediation_codebuild2_create_role_confirmation

3 CodeBuildプロジェクトに作成したIAMロールを設定する

CodeBuildのコンソールから是正対象のプロジェクトを選択します。

20230129_securityhub_remediation_codebuild2_select_project

次に「ビルドの詳細」タブをクリックして「環境」のブロックの「編集」をクリックします。

20230129_securityhub_remediation_codebuild2_enter_project_edit_form

作成したIAMロールを設定する

「サービスロール」で先ほど作成したIAMロールを選択します。

20230129_securityhub_remediation_codebuild2_select_created_role_codebuild

クリアテキスト(プレーンテキスト)の環境変数を削除

「追加設定」のトグルを開いて、AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYの環境変数を削除しましょう。

20230129_securityhub_remediation_codebuild2_delete_env

あとは、画面最下部の「環境の更新」をクリックすれば是正完了です。

その他機密情報の設定方法

このコントロールではAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYという環境変数に起因するものであるため、IAMロールを利用する方法を紹介しました。

もちろんこれら以外の機密情報を環境変数としてクリアテキスト(プレーンテキスト)として保持してはいけません。

ビルド環境の環境変数 - AWS CodeBuildにも以下のように記述されています。

このコントロールのガイドでも記載されていますが、AWS Systems Manager Parameter StoreやAWS Secrets Managerを利用することでセキュアに機密情報をCodeBuildで取り扱えます。

CodeBuildプロジェクトへの設定方法については、少し古い記事ですが以下のブログが参考になると思います。

たとえば、こちらの記事では外部サービスのトークン情報をParameter Storeに設定しています。

Parameter StoreやSecrets Managerから読み込み場合はIAMロールに追加でIAMポリシーを付与するのも忘れないようにしましょう。

以下は、Parameter Storeの場合のIAMポリシーの一例です。

{
  "Version": "2012-10-17",
  "Statement": [
    "Effect": "Allow",
    "Action": [
      "ssm:GetParameters",
    ],
    "Resource": [
      "arn:aws::ssm:ap-northeast-1:xxxxxxxxx:parameter/SAMPLE"
    ]
  ]
}

最後に

今回は、AWS Security HubによるAWS環境のセキュリティ状況スコアリングに該当する項目についての修正手順をご紹介しました。

コントロールを修正して、お使いのAWS環境のセキュリティをパワーアップさせましょう!

最後までお読みいただきありがとうございました!どなたかのお役に立てれば幸いです。

以上、今泉でした!