IAM Conditionsで特定のGCSバケットのみアクセスできるようにする


通常は、GCPプロジェクトに対してオーナー(Owner)や編集者(Editor)などの権限を付与すると、すべてのGoogle Cloud Storage(GCS)バケットにアクセスできてしまいます。そこで、一部の人に対して、特定のGCSバケットのみアクセスできるようにしたいと思います。

GCSバケットのアクセス制限について調べると、GCSバケット側で権限追加する方法が紹介されています。この方法は簡単なのですが、どのGCSバケットにどのユーザー、サービスアカウントがアクセス許可されているのかがわかりづらいです。

そこで今回は、IAM Conditionsの機能を使って、IAM側でGCSバケットのアクセス制御を行ってみます。

IAM Conditionsとは

GCPのIAM(Cloud IAM)において、リソース名や時間などを条件にアクセス制御を定義する機能です。AWS IAMにおいてポリシーで定義できていたもので、GCPも対応するようになりました。

Overview of IAM Conditions  |  IAM Documentation  |  Google Cloud

GCSバケットの作成

アクセスするためのGCSバケットを作成します。その際にオブジェクトへのアクセス制御において均一(Uniform)を選択してください。

setting-gcs-access-policy

IAM Conditionsの設定

GCPのIAMコンソール画面に行き、アクセス許可したいユーザーもしくはサービスアカウントを選択します。

ロールの選択時に「Storage オブジェクト管理者(storage.objectAdmin)」を選択し、横にある[条件を追加]を選択します。

update-cloud-iam

下図のように設定します。

setting-cloud-iam-conditions

項目
タイトル Allow access only specific buckets
条件ビルダ OR
条件タイプ① 名前
Operator① =
値① projects/_/buckets/<GCSバケット名>
条件タイプ② 名前
Operator② 次から始まる
値② projects/_/buckets/<GCSバケット名>/objects/

条件エディタだと以下のようになります。

resource.name == "projects/_/buckets/<GCSバケット名>" ||
resource.name.startsWith("projects/_/buckets/<GCSバケット名>/objects/")

GCSバケット一覧を表示するカスタムロールの作成

以上の設定で特定のGCSバケットのオブジェクトに対して作成や削除ができるようになりました。しかし、GCSのコンソールからアクセスした際にバケットの一覧表示ができないので、コンソール画面上で操作したい場合はバケットを一覧表示できるようにする必要があります。GCPから提供されている事前定義ロールにバケットのみを閲覧するロールがないため、今回は「Storage Bucket Viewer」というカスタムロールを作成します。

IAMのコンソール画面から「ロール」に遷移し、下図のように設定します。

create-custom-role-bucket-viewer

項目
タイトル Storage Bucket Viewer
説明 GCSバケットの一覧表示用ロール
ID storage.bucketViewer
ロールのリリース段階 一般提供

[権限を追加]からはstorage.buckets.getstorage.buckets.listを選択します。[作成]を押すとカスタムロールが作成されます。

IAMのコンソール画面に戻り、権限追加したいユーザーを選択し、さきほど作成したカスタムロールを指定すれば完了です。

edit-iam-user-permission