この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは!コンサル部のinomaso(@inomasosan)です。
前回、GitHub ActionsからECSのCI/CDについて試してみました。
その際、GitHub ActionsにはAWS管理ポリシーによる強めの権限を付与して検証しました。
本番運用を考慮する場合は、FullAccess等の強い権限だと思わぬ事故につながります。
今回はセキュリティの観点から、GitHub Actions用にIAMポリシーの最小権限例を作成してみました。
構成図
GitHub ActionsのDeploy to Amazon ECSテンプレートからワークフロー実行する際の大まかな構成図となります。
今回はIAMポリシーのAction
とResource
をメインに権限を見直していきます。
IAMポリシーの最小化権限例
今回作成したIAMポリシーは以下の通りです。
<>
で囲った値は、ご自身の環境毎の値に置き換えてください。
ECR用
GitHub ActionsでビルドしたコンテナイメージをECRにプッシュするための、IAMポリシーの最小権限を設定していきます。
今回はAWS公式ドキュメントのポリシー例である1 つの Amazon ECR リポジトリにアクセスするをベースにAction
とResource
を修正しました。
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 ロールをベースにAction
とResource
を修正しました。
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
から小さく試していきます。
ワークフローによるデプロイが失敗した場合は、以下のような詳細なエラーメッセージが出力されるため、トライ&エラーを繰り返して必要な権限を追加していきました。
エラーメッセージには具体的に修正すべきなAction
やResource
が表示されるため、修正はそこまで苦労しませんでした。
参考URL
まとめ
GitHub ActionsからECSとECRへCI/CDする際に、最低限必要なIAMポリシーをすぐに見つけられなかったので検証してみました。
この記事が、どなたかのお役に立てば幸いです。それでは!