こんにちは! 現在CS課でOJT中の日高です。
AWS ConfigからS3にログが書き込めなくなった原因を解明したいという目的で調査、検証する機会がありましたので本記事にまとめます。
結果だけ知りたい方は、2章の検証内容をとばして「まとめ」をご覧ください。
- 概要
- 検証内容
- まとめ
概要
AWS Configは、AWSリソースの設定を評価、監査、審査できるサービスのことです。
AWSリソースが「いつ、どのような変更があったのか」の記録を残してくれます。
ただし、AWS Config はAWSで提供されている全てのサービスをサポートしているわけではないためご注意ください。
AWS Config でサポートされているリソースタイプについては以下のリンクをご確認ください。
またAWS ConfigではS3バケットにログを出力することができます。
本記事ではAWS ConfigとS3が同じアカウント上にある場合の検証をしていきます。
検証内容
前提
今回検証内容としてAWS ConfigとS3が同じアカウント上で同一リージョンにある場合として、以下のことを試してみます。
今回S3への書き込み権限を明示的に与えられていないIAMロールはサービスにリンクされたIAMロール(AWSServiceRoleForConfig)を使用します。
IAMの画面のIAMロールから「 AWSServiceRoleForConfig」と検索すると与えられている許可ポリシーを閲覧することが可能なので気になる方は是非見てみてください。
※AWS Config のサービスにリンクされたロールについて詳しくは以下をご覧ください。
docs.aws.amazon.comAWS Config のサービスにリンクされたロールの使用 - AWS Config
①サービスにリンクされたロール(put権限無し)を割り当てたAWS Config+S3バケットポリシーを設定しない場合
S3の作成
マネジメントコンソールでS3を作成していきます。
今回私はバケットの名前を「test-s3-config-hidaka」としました。
リージョンは東京に作成して、名前以外はすべてデフォルトで作成しました。
作成した時点ではバケットポリシーは空の状態です。
AWS Configの有効化
有効化されていない方は有効化してください。
私はすでに有効化しており他のバケットにログを送付していたのでここでは特に設定を行っていません。
AWS Configの設定変更
こちらもマネジメントコンソールで作業を行いました。
AWS Configの左ペインから「設定」を選択して編集で「既存の AWS Config サービスにリンクされたロールを使用」、S3を先ほど作成した「test-s3-config-hidaka」とし保存を押したところ以下のようなエラーが起きました。
エラー 次のいずれかの理由により、AWS Config で設定を保存できません。 ・IAM ロールをシステムで更新中です。しばらく待ってからもう一度お試しください。 ・指定された S3 バケットに設定情報を送信するための十分なアクセス許可が AWS Config にありません。ロールまたはバケットアクセス許可を更新して、もう一度お試しください。
この状態だと権限が足りていないようです。
②サービスにリンクされたロール(put権限無し)を割り当てたAWS Config+S3バケットポリシーを設定する場合
S3のバケットポリシーの記述
このAWSドキュメントを参考に以下のS3バケットポリシーを記述しました。 (アカウントIDはお見せできないため××××××××××××で記述しています)
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AWSConfigBucketPermissionsCheck", "Effect": "Allow", "Principal": { "Service": "config.amazonaws.com" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::test-s3-config-hidaka", "Condition": { "StringEquals": { "AWS:SourceAccount": "××××××××××××" } } }, { "Sid": "AWSConfigBucketExistenceCheck", "Effect": "Allow", "Principal": { "Service": "config.amazonaws.com" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::test-s3-config-hidaka", "Condition": { "StringEquals": { "AWS:SourceAccount": "××××××××××××" } } }, { "Sid": "AWSConfigBucketDelivery", "Effect": "Allow", "Principal": { "Service": "config.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::test-s3-config-hidaka/AWSLogs/××××××××××××/Config/*", "Condition": { "StringEquals": { "AWS:SourceAccount": "××××××××××××", "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }
AWS Configの設定変更
AWS Configの左ペインから「設定」を選択して編集で「既存の AWS Config サービスにリンクされたロールを使用」、S3を先ほど作成した「test-s3-config-hidaka」とし保存を押したところ無事ログが書き込まれていました。
③ユーザー作成のIAMロールをもつAWS Config + S3バケットポリシーを設定しない場合
AWS ConfigにアタッチするIAMロールを作成するためにIAMポリシーを作る
マネジメントコンソールでS3への書き込み権限を許可した以下のIAMポリシー「kensyo-hidaka-config-s3-put」を作成しました。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::test-s3-config-hidaka/*" ], "Condition": { "StringLike": { "s3:x-amz-acl": "bucket-owner-full-control" } } }, { "Effect": "Allow", "Action": [ "s3:GetBucketAcl" ], "Resource": "arn:aws:s3:::test-s3-config-hidaka" } ] }
AWS ConfigにアタッチするIAMロールを作成
先ほど作成したIAMポリシー「kensyo-hidaka-config-s3-put」とAWS管理ポリシーである「AWS_ConfigRole」をアタッチした「kensyo-hidaka-config-s3-put-role」を作成します。
IAMロールを作成する際の信頼されたエンティティタイプはカスタム信頼ポリシーにして、以下を記述しました。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "config.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
S3バケットポリシーを削除
先ほど作成したS3バケットポリシーをすべて削除します。
これでバケットポリシーが空の状態になりました。
AWS Configの設定変更
AWS Configの左ペインから「設定」を選択して編集で「アカウントからロールを選択」で先ほど作成した「kensyo-hidaka-config-s3-put-role」、S3を「test-s3-config-hidaka」とし保存を押したところ無事ログが書き込まれていました。
④ユーザー作成のIAMロールをもつAWS Config + S3バケットポリシーを設定する場合
S3バケットポリシーを変更
検証②と同様に以下のS3バケットポリシーを記述しました。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AWSConfigBucketPermissionsCheck", "Effect": "Allow", "Principal": { "Service": "config.amazonaws.com" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::test-s3-config-hidaka", "Condition": { "StringEquals": { "AWS:SourceAccount": "××××××××××××" } } }, { "Sid": "AWSConfigBucketExistenceCheck", "Effect": "Allow", "Principal": { "Service": "config.amazonaws.com" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::test-s3-config-hidaka", "Condition": { "StringEquals": { "AWS:SourceAccount": "××××××××××××" } } }, { "Sid": "AWSConfigBucketDelivery", "Effect": "Allow", "Principal": { "Service": "config.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::test-s3-config-hidaka/AWSLogs/××××××××××××/Config/*", "Condition": { "StringEquals": { "AWS:SourceAccount": "××××××××××××", "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }
AWS Configの設定変更
AWS Configの左ペインから「設定」を選択して編集で「アカウントからロールを選択」で先ほど作成した「kensyo-hidaka-config-s3-put-role」、S3を「test-s3-config-hidaka」とし保存を押したところ無事ログが書き込まれていました。
まとめ
本検証でAWS ConfigとS3が同じアカウント上にある場合、IAMポリシーかS3のバケットポリシーのいずれかが許可されていればアクセス可能なことが分かりました。
AWS Configのログ送付の挙動として、マルチアカウントでの内容を弊社の松田が書いているのでもしよければご覧ください。
本記事が誰かの力になれれば幸いです。
日高 僚太(執筆記事の一覧)
2024 Japan AWS Jr. Champions / 2024 Japan AWS All Certifications Engineers
EC部クラウドコンサルティング課所属。2022年IT未経験でSWXへ新卒入社。
記事に関するお問い合わせや修正依頼⇒ hidaka@serverworks.co.jp