GitHub ActionsからECSとECRへのCI/CDを最小権限で実行したい

GitHub Actionsに必要なIAMポリシーの最小権限例を作成してみました!
2021.12.28

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

こんにちは!コンサル部のinomaso(@inomasosan)です。

前回、GitHub ActionsからECSのCI/CDについて試してみました。
その際、GitHub ActionsにはAWS管理ポリシーによる強めの権限を付与して検証しました。

本番運用を考慮する場合は、FullAccess等の強い権限だと思わぬ事故につながります。
今回はセキュリティの観点から、GitHub Actions用にIAMポリシーの最小権限例を作成してみました。

構成図

GitHub ActionsのDeploy to Amazon ECSテンプレートからワークフロー実行する際の大まかな構成図となります。
今回はIAMポリシーのActionResourceをメインに権限を見直していきます。

IAMポリシーの最小化権限例

今回作成したIAMポリシーは以下の通りです。
<>で囲った値は、ご自身の環境毎の値に置き換えてください。

ECR用

GitHub ActionsでビルドしたコンテナイメージをECRにプッシュするための、IAMポリシーの最小権限を設定していきます。

今回はAWS公式ドキュメントのポリシー例である1 つの Amazon ECR リポジトリにアクセスするをベースにActionResourceを修正しました。

ecr:GetAuthorizationTokenリソースレベルのアクセス許可をサポートしていないため、Resource* ですべてのリソースを選択する必要があります。

ECR用IAMポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GetAuthorizationToken",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken"
            ],
            "Resource": "*"
        },
        {
            "Sid": "PushImageOnly",
            "Effect": "Allow",
            "Action": [
                "ecr:BatchCheckLayerAvailability",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload",
                "ecr:PutImage"
            ],
            "Resource": "arn:aws:ecr:ap-northeast-1:<AWSアカウントID>:repository/<リポジトリ名>"
        }
    ]
}

ECS用

GitHub Actionsで更新したタスク定義をECSに登録し、サービスをアップデートするための、IAMポリシーの最小権限を設定していきます。

今回はAWS公式ドキュメントのポリシー例にあるAmazon ECS CodeDeploy IAM ロールをベースにActionResourceを修正しました。

ecs:RegisterTaskDefinitionリソースレベルのアクセス許可をサポートしていないため、Resource* ですべてのリソースを選択する必要があります。

またiam:PassRoleは、ECSのアクションを実行する際にGitHub Actions用に作成したIAMではなく、ECSタスクに設定した既存のタスク実行ロールもしくはタスクロールが必要なため設定しています。
詳しくはAWS公式ドキュメントのiam:PassRole を実行する権限がないをご参照願います。

ECS用IAMポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RegisterTaskDefinition",
            "Effect": "Allow",
            "Action": [
                "ecs:RegisterTaskDefinition"
            ],
            "Resource": "*"
        },
        {
            "Sid": "UpdateService",
            "Effect": "Allow",
            "Action": [
                "ecs:UpdateServicePrimaryTaskSet",
                "ecs:DescribeServices",
                "ecs:UpdateService"
            ],
            "Resource": "arn:aws:ecs:ap-northeast-1:<AWSアカウントID>:service/httpd-cluster/<ECSサービス名>"
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::<AWSアカウントID>:role/ecsTaskExecutionRole",
            "Condition": {
                "StringLike": {
                    "iam:PassedToService": "ecs-tasks.amazonaws.com"
                }
            }
        }
    ]
}

IAMポリシーの修正方法

上記のIAMポリシーは一発で設定できたわけではありません。 最低限必要なIAMポリシーを設定し、GitHub Actionsワークフローを何回も実行しながら、エラーメッセージを頼りに修正していきました。

最初はActionから小さく試していきます。
ワークフローによるデプロイが失敗した場合は、以下のような詳細なエラーメッセージが出力されるため、トライ&エラーを繰り返して必要な権限を追加していきました。

エラーメッセージには具体的に修正すべきなActionResourceが表示されるため、修正はそこまで苦労しませんでした。

参考URL

まとめ

GitHub ActionsからECSとECRへCI/CDする際に、最低限必要なIAMポリシーをすぐに見つけられなかったので検証してみました。

この記事が、どなたかのお役に立てば幸いです。それでは!