Amazon Redshift の監査ログ保管用 S3 のバケットポリシーの Principal に “redshift.amazonaws.com” を指定するポリシーを試してみた

2022.10.23

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

はじめに

Amazon Redshift の監査ログを保管する S3 バケットのバケットポリシーを検討しているときに、AWS ユーザーガイドに記載されているポリシー例が変わっていることに気づきました。サービスプリンシパルとしてredshift.amazonaws.comを指定するポリシーになっていたので、クロスアカウント環境で試してみることにしました。私は気づくのが遅かったのですが、ユーザーガイドは 2021 年 12 月に更新されていました。

データベース監査ログ作成 - Amazon Redshift


2022 年 10 月 24 日時点では、次のポリシーがユーザーガイドに記載されています。ServiceNameは多くの場合redshift.amazonaws.comとなりますが、オプトインで有効化するリージョンの場合はredshift.<REGION>.amazonaws.comという形式にする必要があるとのことです。redshift.amazonaws.comからのログ配信を許可するシンプルで分かりやすいポリシーです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Put bucket policy needed for audit logging",
            "Effect": "Allow",
            "Principal": {
                "Service": "ServiceName"
            },
            "Action": [
                "s3:PutObject",
                "s3:GetBucketAcl"
            ],
            "Resource": [
                "arn:aws:s3:::BucketName",
                "arn:aws:s3:::BucketName/*"
            ]
        }
    ]
}

以前は下記のように、Principal として AWS が指定するアカウントの logs ユーザーを指定するポリシー例でした。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Put bucket policy needed for audit logging",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::AccountId:user/logs"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::BucketName/*"
        },
        {
            "Sid": "Get bucket policy needed for audit logging ",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::AccountID:user/logs"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::BucketName"
        }
    ]
}

AWS ユーザーガイドの更新時期を調べたところ、2021 年 12 月に更新されていました。

Periodic update - 12/22/2021 · awsdocs/amazon-redshift-management-guide@e908904 · GitHub

試してみた

下記構成のクロスアカウント環境で試してみました。

以降では、AWS アカウント ID を次の通りとします。

  • Jump アカウント 111122223333
  • Amazon Redshift 利用アカウント 444455556666
  • 監査ログ集約アカウント 777788889999

ログを保管する S3 バケットポリシーは次の設定としました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Put bucket policy needed for audit logging",
            "Effect": "Allow",
            "Principal": {
                "Service": "redshift.amazonaws.com"
            },
            "Action": [
                "s3:PutObject",
                "s3:GetBucketAcl"
            ],
            "Resource": [
                "arn:aws:s3:::test-redshift-audit-log-20221021-i",
                "arn:aws:s3:::test-redshift-audit-log-20221021-i/*"
            ]
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::444455556666:role/cm-testuser"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::test-redshift-audit-log-20221021-i/*"
        }
    ]
}

2 つ目の Statement は、監査ログの設定を有効化する IAM ユーザー/ロールに対してもs3:PutObjectの許可が必要となるため記載しています。今回の環境は Jump アカウント構成のため、スイッチロール先の IAM ロールを指定しています。

AWS ユーザーガイドにも 2 つ目の Statement が必要なことが記載されています。

データベース監査ログ作成 - Amazon Redshift

s3:PutObject このサービスは、ログをアップロードするため、put object のアクセス許可が必要です。また、ログ作成を有効にする IAM ユーザーまたは IAM ロールには、Amazon S3 バケットへの s3:PutObject アクセス許可を持っている必要があります。

また、次の AWS のブログにおいてポリシー例が紹介されており、分かりやすかったです。

Set up cross-account audit logging for your Amazon Redshift cluster | AWS Big Data Blog


次に、Amazon Redshift 利用アカウントで監査ログ記憶を有効化します。

クロスアカウントで監査ログを設定する場合はマネジメントコンソールから設定できません。今回は AWS CLI で設定します。

enable-loggingコマンドで有効化します。

aws redshift enable-logging \
  --cluster-identifier test-redshift-cluster-2 \
  --bucket-name test-redshift-audit-log-20221021-i \
  --s3-key-prefix "/"

実行結果です。

$ aws redshift enable-logging --cluster-identifier test-redshift-cluster-2 --bucket-name test-redshift-audit-log-20221021-i --s3-key-prefix "/"
{
    "LoggingEnabled": true,
    "BucketName": "test-redshift-audit-log-20221021-i",
    "S3KeyPrefix": "/"
}

この際に、S3 のバケットポリシーに 2 つ目の Statement がない場合は、バケットポリシーが原因であることを出力するエラーとなります。

$ aws redshift enable-logging --cluster-identifier test-redshift-cluster-2 --bucket-name test-redshift-audit-log-20221021-i --s3-key-prefix "/"

An error occurred (InsufficientS3BucketPolicyFault) when calling the EnableLogging operation: Cannot write to bucket test-redshift-audit-log-20221021-i. Please ensure that your IAM permissions are set up correctly.

以上で設定は終わりです。


Amazon Redshift の設定画面を確認すると監査ログ記録が有効でことが分かります。

また、S3 バケットに監査ログが保管されています。


上述したバケットポリシーは、Amazon Redshift を利用するアカウントが増えた場合に IAM ユーザー/ロールの追加が必要となります。そのため、アカウントが増えた際に更新しない方法はないか気になって調べました。

結論としては、AWS Organizations 環境前提となりますが、AWS グローバル条件コンテキストキーのaws:PrincipalOrgPathsを利用することで、指定した OU に所属するアカウントの IAM ユーザー/ロールに対して許可を与えるポリシーを設定できました。ただし、この場合は、IAM ユーザー/ロールを個別に設定する場合より広く許可を与えることになる点に注意が必要です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Put bucket policy needed for audit logging",
            "Effect": "Allow",
            "Principal": {
                "Service": "redshift.amazonaws.com"
            },
            "Action": [
                "s3:PutObject",
                "s3:GetBucketAcl"
            ],
            "Resource": [
                "arn:aws:s3:::test-redshift-audit-log-20221021-i",
                "arn:aws:s3:::test-redshift-audit-log-20221021-i/*"
            ]
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::test-redshift-audit-log-20221021-i/*",
            "Condition": {
                "ForAnyValue:StringLike": {
                    "aws:PrincipalOrgPaths": "o-xxxxxxxxxx/r-xxxx/ou-xxxx-xxxxxxx/*"
                }
            }
        }
    ]
}

aws:PrincipalOrgPaths に関する AWS ユーザーガイドは下記となります。

AWS グローバル条件コンテキストキー - AWS Identity and Access Management

aws:PrincipalOrgPaths の利用方法については、次の AWS ブログが参考になります。

Use IAM to share your AWS resources with groups of AWS accounts in AWS Organizations | AWS Security Blog


OU に所属するアカウントで Amazon Redshift の監査ログを有効化した実行結果です。

$ aws redshift enable-logging --cluster-identifier test-org-redshift-cluster --bucket-name test-redshift-audit-log-20221021-i --s3-key-prefix "/"
{
    "LoggingEnabled": true,
    "BucketName": "test-redshift-audit-log-20221021-i",
    "S3KeyPrefix": "/"
}

設定した OU が存在する AWS Organizations の組織外のアカウントから設定しようとすると、期待通りエラーとなります。

$ aws redshift enable-logging --cluster-identifier test-redshift-cluster-2 --bucket-name test-redshift-audit-log-20221021-i --s3-key-prefix "/"

An error occurred (InsufficientS3BucketPolicyFault) when calling the EnableLogging operation: Cannot write to bucket test-redshift-audit-log-20221021-i. Please ensure that your IAM permissions are set up correctly.

設定画面を確認すると監査ログ記録が有効になっています。

S3 バケットにログが保管されています。


ここからは余談です。

次のように Principal としてワイルドカードを利用できると楽だったのですが、Principal ではワイルドカードはサポートされていませんでした。

            "Principal": {
                "AWS": "arn:aws:iam::*:role/*"
            },

AWS ユーザーガイドに Principal でワイルドカードが利用できないことが記載されています。

AWS JSON ポリシーの要素: Principal - AWS Identity and Access Management

ワイルドカードとして使用して、プリンシパルの名前または ARN の一部に一致させることはできません。

また、ConditionStringLikeを利用することで、アカウント ID をワイルドカードにすることもできませんでした。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Put bucket policy needed for audit logging",
            "Effect": "Allow",
            "Principal": {
                "Service": "redshift.amazonaws.com"
            },
            "Action": [
                "s3:PutObject",
                "s3:GetBucketAcl"
            ],
            "Resource": [
                "arn:aws:s3:::test-redshift-audit-log-20221021-i",
                "arn:aws:s3:::test-redshift-audit-log-20221021-i/*"
            ]
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::test-redshift-audit-log-20221021-i/*",
            "Condition": {
                "StringLike": {
                    "aws:PrincipalArn": "arn:aws:iam::*:role/cm-testuser"
                }
            }
        }
    ]
}

さいごに

Amazon Redshift の監査ログを保管する S3 のバケットポリシーについて紹介しました。以前にユーザーガイドに記載されていたポリシーは Principal として AWS が指定するアカウントのlogsユーザーを設定するポリシーでした。現在は Principal としてredshift.amazonaws.comを設定するポリシーとなっていました。新しい方がシンプルで分かりやすいですね。今回、紹介したバケットポリシー以外の記載もあるかもしれないので模索していきたいです。

以上、このブログがどなたかのご参考になれば幸いです。