GCPの拒否ポリシーが有能なので使用方法を解説します(IAMロールの権限制御) # GoogleCloud
1. IAMと拒否ポリシーの概要
IAM(Identity and Access Management)とは
Google CloudのIAMポリシーは、デフォルトでは許可を指定するポリシーです。
よって、リソースに対するユーザーやグループ、サービスアカウントへの権限付与を明示的に許可することになります。
IAMロール周りの記事は過去に短く解説しているので、拝見下さい。
【Google Cloud:IAMのイメージについてざっくりまとめてみた】
拒否ポリシーとは
IAMポリシーに対して、拒否ポリシーはこの挙動を反転させるものです。
つまり、ユーザーが特定のリソースに対して行うことができる操作を明示的に制限(拒否)します。
【公式から引用】
Identity and Access Management(IAM)拒否ポリシーを使用すると、Google Cloud リソースへのアクセスにガードレールを設定できます。拒否ポリシーを使用すると、付与されるロールに関係なく、特定のプリンシパルが特定の権限を使用できないようにする拒否ルールを定義できます。
よって、こちらの文言を見ても分かる通り、拒否ポリシーは有効な権限(ロール)を所持していても、拒否ポリシーに指定されている権限やロールは適応の範囲外になるということです。
2. 拒否ポリシーの設定
手順1(権限の設定)
今回の手順では、VPCの作成権限を拒否するポリシーを追加していきます。
- 操作ユーザーに組織の拒否管理者を設定します。
- [IAM]で検索→[IAMと管理]へ移動→[アクセス権を付与]を押し、ユーザーを入力し拒否管理者を設定してください。
手順2(拒否ルールファイルの作成)
- Cloud Shellを開き、拒否管理者持つユーザーでJsonファイルを作成します。
- vim deny-policy.jsonを実行。
- iを押下し、下記ファイルをCtl+vでペースト。
- [esc]→[:]→[wq] でフォルダを保存
test-accessグループに、networks.create権限を操作させないというJsonファイルです。
"ここにグループ名を追加"を適応させたいグループに書き換えてください。
【deny-policy.json】
{ "displayName": "vpc-deny-policy", "rules": [ { "denyRule": { "deniedPrincipals": [ "principalSet://goog/group/"ここにグループ名を追加" ], "deniedPermissions": [ "compute.googleapis.com/networks.create", ] } } ] }
手順3(拒否ルールの作成)
- Cloud Shellの操作に戻り、コード1を実行し、ファイルを適応させていきます。
- コード1はfolders/フォルダIDとしていますが、組織やプロジェクトに適応させる場合には、organizationsとprojectsに変更します。
- コード末尾のファイルは先程作成したdeny-policy.jsonです
【コード1】
gcloud iam policies create deny-policy --attachment-point=cloudresourcemanager.googleapis.com/folders/フォルダID --kind=denypolicies --policy-file=deny-policy.json
手順4(適応の確認)
- 作成したdeny-policy.jsonが適応されているか、コード2のgcloud iam policies listで確認します。
【コード2】
gcloud iam policies list --attachment-point=cloudresourcemanager.googleapis.com/folders/フォルダID --kind=denypolicies --format=json
以上で、エラーが出なければ拒否ポリシーの適応が完了です。
拒否ポリシーをコンソールで確認する
最後に、実際に編集者権限が付与されているにも関わらず、VPCの作成ができないか確かめてみましょう。
下記のようにフォルダの[IAMと管理]にて、編集者ロールの付与を確認。
VPCネットワークの管理画面に移動し、VPCネットワークを作成がグレーアウトされていることを確認する。(本来編集者を持つユーザーは操作可能)
この操作には権限が必要です。必要な権限: compute.networks.create
という記載の通り、先程設定したcompute.networks.create権限が拒否されていることが確認できました。
まとめ
今回は拒否ポリシーの基本的な操作方法について解説&検証しました。
複雑なカスタムロールを作成したくない場合や強制的に権限を制御したい場合に有効です。
機会があれば、さらに拒否ポリシーの条件を追加した設定の解説もしてみたいと思っています。