Cloud IAM Conditions の概要

はじめに

このページでは、Cloud Identity and Access Management の Conditions 機能について説明します。この機能を使用すると、Google Cloud Platform(GCP)リソースに対して条件付きの属性ベースのアクセス制御を定義して適用できます。

Cloud IAM Conditions では、構成された条件が満たされている場合にのみ、ID(メンバー)に権限を付与できます。たとえば、本番環境に関する問題が発生した場合、ユーザーに対して一時的なアクセス権を構成したり、本社の従業員に対してリソースへのアクセスを制限したりできます。

Conditions は、リソースの Cloud IAM ポリシーの役割バインディングで指定されます。条件が存在している場合、条件式が true に評価される場合にのみ役割が付与されます。各条件式は、チェックする 1 つまたは多数の属性を指定するための一連の論理ステートメントのセットとして定義されます。

条件付き Cloud IAM ポリシー

Cloud IAM ポリシーは、1 つまたは複数の役割バインディングで構成され、構造は次のようになります。

"bindings": [
  {
    "role": ...
    "members": ...
    "condition": ...
  },
  ...
]

condition オブジェクトはオプションであり、各役割バインディングに含めることができるのは 1 つだけです。ただし、条件式には、多数のさまざまな属性を評価する複数のステートメントを含めることができます。条件チェックが不要なため、指定されたメンバーに対して condition オブジェクトなしの役割バインディングが常に付与されます。condition オブジェクトの構造は次のとおりです。

"condition": {
    "title": ...
    "description": ...
    "expression": ...
}

条件の title は必須ですが、description はオプションです。title と description はいずれも純粋な情報フィールドであり、条件を特定して説明するのに役立ちます。expression フィールドは、CEL(Common Expression Language)のサブセットを使用する属性ベースの論理式を定義します。詳細については、CEL 仕様とその言語の定義をご覧ください。

一般に、条件式は、論理演算子(&&||!)を使用して結合される 1 つまたは複数の句で構成されます。各句は、バインディングに適用される属性ベースの制御ルールを表します。

条件の属性

この限定公開ベータ版リリースでは、サポートされる条件属性は、リクエストされたリソース(タイプや名前など)に基づくか、リクエストの詳細(タイムスタンプや発信元の IP アドレスなど)に基づきます。以下に両方の属性タイプの例と説明を示します。

リソースの属性

リソースの属性では、リソースタイプ、リソース名、使用されている GCP サービスなど、アクセス リクエスト内のリソースに基づいて制限を設けます。

式の例

VM へのアクセスを許可するが、他のタイプのリソースへのアクセスは許可しない:

resource.type == “compute.instances”

Cloud Storage リソースへのアクセスを許可するが、他のサービスのリソースへのアクセスは許可しない:

resource.service == “storage”

名前が指定された文字列で始まるリソースにのみアクセスを許可する:

resource.name.startsWith("projects/_/buckets/exampleco-site-assets-")

リクエストの属性

リクエストの属性では、日時、予想される URL ホスト / パス(Cloud IAP の場合)、アクセスレベルなど、アクセス リクエストに関する詳細に基づいて制限を設けます。アクセスレベルは組織の構成から導出され、現在は許可された発信元の IP アドレスに対する制限が許可されます。詳細については、Access Context Manager のドキュメントをご覧ください。

日時式の例

指定された期限切れ日時まで一時的にアクセスを許可する:

request.time < timestamp("2019-01-01T07:00:00Z")

指定された業務時間にのみアクセスを許可する:

request.time.getHours("Europe/Berlin") >= 9 &&
request.time.getHours("Europe/Berlin") <= 17 &&
request.time.getDayOfWeek("Europe/Berlin") >= 1 &&
request.time.getDayOfWeek("Europe/Berlin") <= 5

指定された月と年にのみアクセスを許可する:

request.time.getFullYear("Europe/Berlin") == 2018
request.time.getMonth("Europe/Berlin") < 6

URL ホスト / パス式の例(Cloud IAP の場合)

リクエスト内の特定のサブドメインまたは URL パスにのみアクセスを許可する:

request.host == "hr.example.com"
request.host.endsWith(".example.com")
request.path == "/admin/payroll.js"
request.path.startsWith("/admin")

アクセスレベル式の例

お客様が定義したアクセスレベルとリクエストが一致している場合にのみアクセスを許可する。この場合、企業ネットワークの IP 範囲は「TrustedCorpNet」アクセスレベルで指定されます。

"accessPolicies/199923665455/accessLevels/TrustedCorpNet" in
request.auth.access_levels

複数の属性がある式の例

特定の時間内にリクエストが行われ、リソース名の接頭辞、目的のアクセスレベル、特定のリソースタイプと一致している場合にアクセスを許可する:

request.time > timestamp("2018-08-03T16:00:00-07:00") &&
request.time < timestamp("2018-08-03T16:05:00-07:00") &&
((resource.name.startsWith("projects/project-123/zones/us-east1-b/instances/dev") ||
 (resource.name.startsWith("projects/project-123/zones/us-east1-b/instances/prod") &&
  "accessPolicies/34569256/accessLevels/CorpNetwork2" in request.auth.access_levels)) ||
 resource.type != "compute.instances")

条件の設定方法

条件付きの役割バインディングは、他の役割バインディングを構成するために使用されるのと同じ setIamPolicy メソッドを使用して設定されます。たとえば、プロジェクトの条件で役割バインディングを設定するには、REST APIgcloud コマンドライン ツール、または Cloud Console の IAM ページを使用できます。

次の JSON の例では、完全な Cloud IAM ポリシーのコンテキストでの条件を示しています。

{
  "bindings": [
    {
      "role": "roles/storage.objectViewer",
      "members": "user:jane@example.com",
      "condition": {
          "title": "expires_end_of_2018",
          "description": "Expires at midnight on 2018-12-31",
          "expression": "request.time < timestamp(\"2019-01-01T00:00:00Z\")"
      }
    }
  ]
}

限定公開ベータ版のお申し込み方法

現在、Cloud IAM Conditions を使用するには、限定公開ベータ版の利用に同意する必要があります。適用するにはこのフォームにご入力ください。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Identity and Access Management のドキュメント