ちょっとドハマリしたのでメモ。
前提
まず、自分のアカウントでS3に監査ログを既存のS3バケット
に吐き出す場合は以下を参考にしてやってみます。
Amazon Redshiftでデータベース監査ログをS3に出力する
Redshiftにバケットを作成させる場合はマネジメントコンソールで有効化すれば特段なにも考えずともよしなに連携してくれます。
別アカウントのS3
ブログに書かれているように、Redshfitを保持しているアカウントの権限をS3のバケットに入れれば問題はありません。
注意点の一つとして、マネジメントコンソールではなくCLIから設定します。
RS_CLUSTER="クラスターのID"
S3_BUCKET="S3のバケット名"
REGION="Redshiftを立てているリージョン"
aws redshift enable-logging \
--cluster-identifier ${RS_CLUSTER} \
--bucket-name ${S3_BUCKET} \
--s3-key-prefix "redshift" \
--region ${REGION}
この際、enable-logging
を投げている認証主体にもputObject
の権限が必要です。
ログをアップロードするために put object のアクセス許可が必要です。 また、ロギングを有効にする IAM ユーザーまたは IAM ロールには、s3:PutObject バケットへの Amazon S3 アクセス許可が必要です。
ですので、バケットポリシは以下のようになります。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Put bucket policy needed for audit logging",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::404641285394:user/logs"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<redshiftlogtestbucket-name>/*"
},
{
"Sid": "Get bucket policy needed for audit logging ",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::404641285394:user/logs"
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::<redshiftlogtestbucket-name>"
},
++++++++++ここから別アカウント用の設定+++++++++++++++++
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<RedShiftのaccountID>:user/<IAM-USER-NAME>"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::<redshiftlogtestbucket-name>",
"arn:aws:s3:::<redshiftlogtestbucket-name>/*"
]
}
++++++++++ここから別アカウント用の設定+++++++++++++++++
]
}
document上はputObject
でいいのですが、引っかかると嫌だったので検証時はs3:*
でやってしまっています。
S3バケットが暗号化されていた場合
ここでドハマりしました。
私の保持していたバケットはSSE-KMSを利用していたため引っかかったのですが、結論としてSSE-KMS
は非対応です。
注記
現在、Amazon S3 管理キー (SSE-S3) 暗号化 (AES-256) のみを監査ログ記録に使用できます。
よく読んだらdocumentに補足が書いてありましたね。
KMSにGRANTしたり、Redshiftを持ってるアカウントで使用できるようにPolicy書いたり迷走しましたが、できないようです。
Redshiftの監査ログを保管するS3バケットの暗号化方式は注意しましょう。