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)を選択してください。
IAM Conditionsの設定
GCPのIAMコンソール画面に行き、アクセス許可したいユーザーもしくはサービスアカウントを選択します。
ロールの選択時に「Storage オブジェクト管理者(storage.objectAdmin)」を選択し、横にある[条件を追加]を選択します。
下図のように設定します。
項目 | 値 |
---|---|
タイトル | 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のコンソール画面から「ロール」に遷移し、下図のように設定します。
項目 | 値 |
---|---|
タイトル | Storage Bucket Viewer |
説明 | GCSバケットの一覧表示用ロール |
ID | storage.bucketViewer |
ロールのリリース段階 | 一般提供 |
[権限を追加]からはstorage.buckets.get
、storage.buckets.list
を選択します。[作成]を押すとカスタムロールが作成されます。
IAMのコンソール画面に戻り、権限追加したいユーザーを選択し、さきほど作成したカスタムロールを指定すれば完了です。
Discussion