説明
バケット ACL の WRITE_ACP は、そのバケットの ACL を変更する権限です。オブジェクトのアップロードや内容の変更とは異なります。ACL の管理が不要なアカウントやグループに付与すると、意図しない権限変更を許す可能性があります。付与先がバケット所有者、外部アカウント、S3 のサービス用グループのどれに該当するかを確認してください。
ACL は AWS アカウントや定義済みの S3 グループに権限を与えるもので、個々の IAM ユーザーに直接付与する仕組みではありません。権限を受けたアカウントは、そのアカウントのユーザーへ委任できます。FULL_CONTROL にも ACL の管理権限が含まれるため、すべての権限付与を確認してください。新しいバケットでは既定の BucketOwnerEnforced により ACL が無効になり、ポリシーでアクセスを管理します。
想定される影響
- 不要な ACL 管理権限により、新たなアクセスの許可や既存の権限の変更が可能になる場合があります。影響は、付与先、関連するポリシー、パブリックアクセスブロックによって異なります。
- 誤った ACL 変更は、正当なアクセスやログ配信を妨げる可能性があります。特定のサービス用グループへの権限を、すべての匿名ユーザーへの権限と混同しないでください。
対処方法
- 各付与先の業務上の必要性を確認し、不要な
WRITE_ACPを削除してください。所有者に必要な管理権限は維持し、ほかの付与先の権限をより強いFULL_CONTROLに置き換えないでください。 - 可能なら ACL に依存するアクセスをポリシーに移し、
BucketOwnerEnforcedで ACL を無効化してください。既存バケットでは、先に ACL の外部への権限付与を削除する必要があります。 - S3 サーバーアクセスログには、ログ配信サービスに必要な権限をバケットポリシーで与える方式を優先してください。ACL 方式を残す場合、
LogDeliveryにはWRITEとREAD_ACPが必要です。WRITE_ACPはログのアップロード権限の代わりにはなりません。
例
以下は ACL を維持する必要がある環境向けの別々の構成案です。同時に適用しないでください。バケット名は利用可能な一意の名前に変更し、ログの送信元バケットとログ設定も用意してください。新しく設計する場合は、ACL を無効にしてバケットポリシーを使う方式を優先してください。
ログ配信グループへの ACL 管理権限
data "aws_canonical_user_id" "current" {}
resource "aws_s3_bucket" "example" {
bucket = "my-tf-example-bucket"
}
resource "aws_s3_bucket_ownership_controls" "example" {
bucket = aws_s3_bucket.example.id
rule {
object_ownership = "BucketOwnerPreferred"
}
}
resource "aws_s3_bucket_acl" "example" {
depends_on = [aws_s3_bucket_ownership_controls.example]
bucket = aws_s3_bucket.example.id
access_control_policy {
grant {
grantee {
id = data.aws_canonical_user_id.current.id
type = "CanonicalUser"
}
permission = "FULL_CONTROL"
}
grant {
grantee {
type = "Group"
uri = "http://acs.amazonaws.com/groups/s3/LogDelivery"
}
permission = "WRITE_ACP"
}
owner {
id = data.aws_canonical_user_id.current.id
}
}
}
LogDelivery は S3 のログ配信グループであり、すべての匿名ユーザーを表すものではありません。この設定は同グループに不要な ACL 管理権限を与える一方、ログ配信に必要な WRITE と READ_ACP を付与していません。
ログ配信に必要な ACL 権限
data "aws_canonical_user_id" "current" {}
resource "aws_s3_bucket" "example" {
bucket = "my-tf-example-bucket"
}
resource "aws_s3_bucket_ownership_controls" "example" {
bucket = aws_s3_bucket.example.id
rule {
object_ownership = "BucketOwnerPreferred"
}
}
resource "aws_s3_bucket_acl" "example" {
depends_on = [aws_s3_bucket_ownership_controls.example]
bucket = aws_s3_bucket.example.id
access_control_policy {
grant {
grantee {
id = data.aws_canonical_user_id.current.id
type = "CanonicalUser"
}
permission = "FULL_CONTROL"
}
grant {
grantee {
type = "Group"
uri = "http://acs.amazonaws.com/groups/s3/LogDelivery"
}
permission = "WRITE"
}
grant {
grantee {
type = "Group"
uri = "http://acs.amazonaws.com/groups/s3/LogDelivery"
}
permission = "READ_ACP"
}
owner {
id = data.aws_canonical_user_id.current.id
}
}
}
所有者の FULL_CONTROL を維持し、ログ配信グループには WRITE と READ_ACP だけを付与します。オブジェクト所有権と明示的な依存関係により、先に ACL を有効化します。これは権限の設定例であり、ログ配信を有効にする完全な構成ではありません。送信元と送信先のバケットは同じアカウントとリージョンに置き、送信先の暗号化やほかのログ配信要件も確認してください。