AWS ConfigからS3へのアクセス制御の挙動を検証してみた

記事タイトルとURLをコピーする

こんにちは! 現在CS課でOJT中の日高です。

AWS ConfigからS3にログが書き込めなくなった原因を解明したいという目的で調査、検証する機会がありましたので本記事にまとめます。


結果だけ知りたい方は、2章の検証内容をとばして「まとめ」をご覧ください。

概要

AWS Configは、AWSリソースの設定を評価、監査、審査できるサービスのことです。

docs.aws.amazon.com

AWSリソースが「いつ、どのような変更があったのか」の記録を残してくれます。
ただし、AWS Config はAWSで提供されている全てのサービスをサポートしているわけではないためご注意ください。
AWS Config でサポートされているリソースタイプについては以下のリンクをご確認ください。

docs.aws.amazon.com

また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のバケットポリシーの記述

docs.aws.amazon.com

この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のログ送付の挙動として、マルチアカウントでの内容を弊社の松田が書いているのでもしよければご覧ください。

blog.serverworks.co.jp

本記事が誰かの力になれれば幸いです。

日高 僚太(執筆記事の一覧)

EC部ソリューションアーキテクト2課 / AWS認定資格 12冠

2022年IT未経験で新卒入社しました。
最近はダーツとサウナが気になっています!
記事に関するお問い合わせや修正依頼⇒ hidaka@serverworks.co.jp