3行でまとめ(時間がない人向け)
GCSはprefix指定による権限制御が不可能
- つまり、バケットの特定フォルダ(厳密にはprefix)配下へのアクセスのみを許可したサービスアカウントを発行する、といった制御が実施不可能
- GCSで設定可能な権限制御の単位は、バケットかオブジェクトのみ
S3の場合
IAM policyにより、特定prefix配下の権限制御を設定可能
例: hoge-bucket
に対して、huga/
配下のみ、read権限を与えるIAM policy
{
"Sid": "ReadOnlyFuga",
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::hoge-bucket"],
"Condition":{"StringLike":{"s3:prefix":["huga/*"]}}
}
GCSの場合
権限制御可能な単位はバケットまたはオブジェクトのみ
バケット単位での権限制御
IAMで設定
例: サービスアカウント(gs-hoge-readonly@xx.iam.gserviceaccount.com
)に対して、 hoge-bucket
のread権限を付与。terraformによる例。
resource "google_service_account" "gs-hoge-readonly" {
account_id = "gs-hoge-readonly"
display_name = "gs-hoge-readonly"
}
resource "google_storage_bucket_iam_member" "gs-hoge-readonly-objectviewer" {
bucket = "hoge-bucket"
role = "roles/storage.objectViewer"
member = "serviceAccount:${google_service_account.gs-hoge-readonly.email}"
}
オブジェクト単位での権限制御
ACLで設定
例: サービスアカウント(gs-hoge-object-readOnly@xx.iam.gserviceaccount.com
)に対して、 hoge-bucket
の huga/image.jpg
のみread権限を付与。terraformによる例。
resource "google_service_account" "gs-hoge-object-readonly" {
account_id = "gs-hoge-object-readonly"
display_name = "gs-hoge-object-readonly"
}
resource "google_storage_object_acl" "gs-hoge-object-readonly" {
bucket = "hoge-bucket"
object = "huga/image.jpg"
role_entity = [
"READER:user-${google_service_account.gs-hoge-object-readonly.email}",
]
}
さいごに
AWSを使っていると、特定prefix配下のみの権限を許可したIAM roleを発行する運用がよくあるので、GCPでも当たり前にできるものかと思っていたら、出来なくて衝撃的だったので書いてみました。