LoginSignup
12
9

More than 3 years have passed since last update.

GCP Cloud IAM Conditionsを試す

Last updated at Posted at 2020-03-08

はじめに

2020/2/28にGAになったCloud IAM Conditionを試してみたいと思います。
AWSのIAMは以前からリソース名やタグ、Source IPでの認可設定のConditionを記載できてましたが、GCPのCloud IAMにもCloud IAM Conditionという名称で同様の機能が追加になりました。
認可設定を付与する際の条件が設定できます。

何が出来るのか

https://cloud.google.com/iam/docs/conditions-overview
現在、Conditionとして記載できるのは、大きく分けて時刻とリソースの2つになります。

時刻(request.time)
リソース(resource)

image.png

マニュアルに記載がある設定例

  • GCEインスタンス名などのリソース名やタイプを指定した制限(resource.name, resource.type)
指定されたプレフィックス文字列で始まる名前のリソースへのアクセスのみを許可します。
resource.name.startsWith("projects/_/buckets/exampleco-site-assets-")
  • 一時的なアクセスのみ許可(request.time)
指定された有効期限まで一時的にアクセスを許可します:
request.time < timestamp("2021-01-01T00:00:00Z")
  • 送信元IPアドレス制限(IAP TCPトンネリング用)
destination.ip == "14.0.0.1"

評価する際に使える機能

  • 複数の条件をAND(&&)やOR(||)で評価可能
  • 関数による複雑な条件の記載(request.path.startsWithなど)

参考、演算子の定義など

よくありそうなケース試してみる

VPC外のGCPサービスの実行する際の送信元IPを制限する

こちらは、IAM Conditionsではなく、VPC Service ControlとAccess Context Managerの組み合わせで、送信元を任意とVPCと任意のサブネットに制限できます。
https://qiita.com/atsumjp/items/096d101ba60f16b94349

特定のインスタンスを指定した認可設定

AWSでのタグを指定した制限はできない。現状、Cloud IAM Conditionのリソース制限は、タイプ/サービス/名前でのみ可能。

image.png

ということで、インスタンス名がinstanceから始まるリソースに対してのみssh可能になるようなCloud IAM Condition設定してみます。
今回は、サービスアカウントを作成し、そのサービスアカウントのIAM RoleでConditionを設定します。

最終的な構成は以下になります。
image.png

condition-testというサービスアカウントを作成し、ユーザから使用できるようにbindingを追加します。

$ gcloud iam service-accounts add-iam-policy-binding condition-test@<Project ID>.iam.gserviceaccount.com --member=user:atsum@uimoz.com --role=roles/iam.serviceAccountTokenCreator
Updated IAM policy for serviceAccount [condition-test@<Project ID>.iam.gserviceaccount.com].
bindings:
- members:
  - user:atsum@uimoz.com
  role: roles/iam.serviceAccountTokenCreator
etag: BwWgT6Y9U_o=
version: 1

作成したサービスアカウントにIAMロールを追加します。
sshするために、compute adminを付与し、Cloud IAM ConditionでInstanceから始まるように設定します。

resource.name.startsWith("projects/<Project ID>/zones/asia-northeast1-b/instances/instance")

image.png

また、compute.project.getはプロジェクトに対して必要なパーミッションになるため、Custom RoleでCondtionによる制限なしで設定します。

image.png

compute.project.getがプロジェクトに対して許可されていないと、任意のインスタンスにsshする権限がっても、以下のようなエラーになります。

$ gcloud compute ssh  instance-3 --zone asia-northeast1-b --impersonate-service-account=condition-test@<Project ID>.iam.gserviceaccount.com
WARNING: This command is using service account impersonation. All API calls will be executed as [condition-test@<Project ID>.iam.gserviceaccount.com].
ERROR: (gcloud.compute.ssh) Could not fetch resource:
 - Required 'compute.projects.get' permission for 'projects/<Project ID>'

テストの用にinstanceから始まる名称の仮想マシンとvmから始まる名称の仮想マシンを作成します。ssh可能なようにFirewallの設定をします。
gcloudコマンドでimpersonate-service-accountオプションで作成したサービスアカウントを指定します。
vmから始まるインスタンスにSSHしてみます。Conditionの制限が効いてSSHに失敗します。

$ gcloud compute ssh  vm-5 --zone asia-northeast1-b --impersonate-service-account=condition-test@<Project ID>.iam.gserviceaccount.com
WARNING: This command is using service account impersonation. All API calls will be executed as [condition-test@<Project ID>.iam.gserviceaccount.com].
ERROR: (gcloud.compute.ssh) Could not fetch resource:
 - Required 'compute.instances.get' permission for 'projects/<Project ID>/zones/asia-northeast1-b/instances/vm-5'

instanceから始まるインスタンスにSSHしてみます。こちらは成功します。

$ gcloud compute ssh  instance-3 --zone asia-northeast1-b --impersonate-service-account=condition-test@<Project ID>.iam.gserviceaccount.com
WARNING: This command is using service account impersonation. All API calls will be executed as [condition-test@<Project ID>.iam.gserviceaccount.com].
Linux instance-3 4.9.0-12-amd64 #1 SMP Debian 4.9.210-1 (2020-01-20) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Mar  8 06:06:53 2020 from 35.201.224.212

AWSのSTSのような一時的セキュリティ認証情報を付与する仕組みを考える

request.timeのConditionで認可される時間を指定します。

Condition on "Compute Admin" role
{
    "expression": "resource.name.startsWith(\"projects/<Project ID>/zones/asia-northeast1-b/instances/instance\") &&\nrequest.time < timestamp(\"2020-03-08T07:07:39.696Z\")",
    "title": "instance name",
    "description": ""
}
Use GCP APIs to manage IAM conditions.

image.png

指定した時間が経過するとsshが失敗します。

$ date;gcloud compute ssh  instance-3 --zone asia-northeast1-b --impersonate-service-account=condition-test@<Project ID>.iam.gserviceaccount.com
Sun Mar  8 16:09:32 +09 2020
WARNING: This command is using service account impersonation. All API calls will be executed as [condition-test@<Project ID>.iam.gserviceaccount.com].
ERROR: (gcloud.compute.ssh) Could not fetch resource:
 - Required 'compute.instances.get' permission for 'projects/<Project ID>/zones/asia-northeast1-b/instances/instance-3'

上記仕組みをCloud Functionsから更新する仕組みを作ろうと思いましたが、時間がなくなったのでまた次回。

投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。

12
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9