条件付きロール バインディングを管理する

このトピックでは、Identity and Access Management(IAM)許可ポリシーで条件付きロール バインディングを追加、変更、削除する方法について説明します。

始める前に

  • Enable the IAM API.

    Enable the API

  • IAM の条件付きロール バインディングの基本については、IAM Conditions の概要をご覧ください。

  • 属性のリファレンスを参照して、式で使用できる条件の属性について確認してください。

必要なロール

リソースの許可ポリシーで条件付きロール バインディングを管理するには、リソースを取得するための権限と、リソースの許可ポリシーを取得して設定するための権限が必要です。これらの権限の形式は次のとおりです。ここで SERVICE はリソースを所有するサービスの名前、RESOURCE_TYPE はアクセスを管理するリソースタイプの名前です。

  • SERVICE.RESOURCE_TYPE.get
  • SERVICE.RESOURCE_TYPE.getIamPolicy
  • SERVICE.RESOURCE_TYPE.setIamPolicy

たとえば、プロジェクトの許可ポリシーで条件付きロール バインディングを管理するには、次の権限が必要です。

  • resourcemanager.projects.get
  • resourcemanager.projects.getIamPolicy
  • resourcemanager.projects.setIamPolicy

必要な権限を取得するには、管理者に依頼して、それらの権限を含む事前定義ロールまたはカスタムロールを取得してください。たとえば、管理者からセキュリティ管理者ロール(roles/iam.securityAdmin)が付与された場合、そのロールにはほぼすべての Google Cloud リソースを取得して許可ポリシーを管理する権限が含まれています。

条件付きロール バインディングをポリシーに追加する

新規または既存の許可ポリシーに条件付きロール バインディングを追加して、Google Cloud リソースへのアクセスをさらに細かく制御できます。このセクションでは、Google Cloud コンソール、Google Cloud CLI、REST API を使用して、既存のポリシーに単純な時間ベースの条件を追加する方法について説明します。

既存の許可ポリシーに条件付きロール バインディングを追加するには:

コンソール

  1. Google Cloud コンソールの [IAM] ページに移動します。

    [IAM] ページに移動

  2. プリンシパルのリストから、目的のプリンシパルを見つけて、[] ボタンをクリックします。

  3. [権限の編集] パネルで、条件を構成するロールを見つけます。[IAM の条件(省略可)] で、[IAM の条件を追加] をクリックします。

  4. [条件の編集] パネルで、条件のタイトルとオプションの説明を入力します。

  5. 条件作成ツールまたは条件エディタを使用して条件式を追加できます。条件作成ツールには、目的の条件タイプ、演算子、その他の式に関する適用可能な詳細を選択するためのインタラクティブなインターフェースが用意されています。条件エディタには、CEL 構文を使用して手動で式を入力するためのテキストベースのインターフェースが用意されています。

    条件作成ツール:

    1. [条件タイプ] プルダウンから [アクセスの有効期限] を選択します。
    2. [演算子] プルダウンから、[次の時間まで] を選択します。
    3. [時刻] プルダウンで、 ボタンをクリックし、日付と時刻の範囲から選択します。
    4. [保存] をクリックして条件を適用します。
    5. [条件の編集] パネルを閉じたら、[権限の編集] パネルでもう一度 [保存] をクリックし、許可ポリシーを更新します。

    条件エディタ:

    1. [条件エディタ] タブをクリックし、次の式を入力します。タイムスタンプはご自分のものに置き換えてください。

      request.time < timestamp("2019-12-31T12:00:00.000Z")
    2. 式を入力したら、右上のテキスト ボックスの上にある [リンターを実行] をクリックして、CEL 構文を検証することもできます。

    3. [保存] をクリックして条件を適用します。

    4. [条件の編集] パネルを閉じたら、[権限の編集] パネルでもう一度 [保存] をクリックし、許可ポリシーを更新します。

gcloud

許可ポリシーは、読み取り、変更、書き込みのパターンを使用して設定されます。

gcloud projects get-iam-policy コマンドを実行し、プロジェクトの現在の許可ポリシーを取得します。次の例では、JSON バージョンの許可ポリシーがディスク上のパスにダウンロードされます。

コマンド:

gcloud projects get-iam-policy project-id --format json > file-path

JSON 形式の許可ポリシーがダウンロードされます。

{
  "bindings": [
    {
      "members": [
        "user:project-owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "user:travis@example.com"
      ],
      "role": "roles/iam.securityReviewer"
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 1
}

許可ポリシーの現在の version1)に注意してください。アクセス権に有効期限を定めて許可ポリシーを構成するには、次の条件式(強調表示された部分)を追加します。タイムスタンプはご自分のものに置き換えてください。gcloud CLI により、バージョンが自動的に更新されます。

{
  "bindings": [
    {
      "members": [
        "user:project-owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "user:travis@example.com"
      ],
      "role": "roles/iam.securityReviewer",
      "condition": {
          "title": "Expires_2019",
          "description": "Expires at noon on 2019-12-31",
          "expression":
            "request.time < timestamp('2019-12-31T12:00:00Z')"
      }
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 3
}

次に、gcloud projects set-iam-policy コマンドを実行して新しい許可ポリシーを設定します。

gcloud projects set-iam-policy project-id file-path

新しい許可ポリシーが適用され、travis@example.com のロール バインディングは指定された時刻に期限切れになります。

REST

読み取り、変更、書き込みのパターンを使用して、特定の時間までアクセスを許可します。

まず、プロジェクトの許可ポリシーを読み取ります。

Resource Manager API の projects.getIamPolicy メソッドは、プロジェクトの許可ポリシーを取得します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
  • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。

HTTP メソッドと URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:getIamPolicy

リクエストの本文(JSON):

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

リクエストを送信するには、次のいずれかのオプションを開きます。

次のような JSON レスポンスが返されます。

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:project-owner@example.com"
      ]
    },
    {
      "role": "roles/iam.securityReviewer",
      "members": [
        "user:travis@example.com"
      ]
    }
  ]
}

許可ポリシーの現在の version1)に注意してください。

次に、特定の時間までアクセスを許可するように許可ポリシーを変更します。version フィールドを値 3 に変更します。

{
  "etag": "BwWKmjvelug=",
  "version": 3,
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:project-owner@example.com"
      ]
    },
    {
      "role": "roles/iam.securityReviewer",
      "condition": {
        "title": "Expires_2019",
        "description": "Expires at noon on 2019-12-31",
        "expression": "request.time < timestamp('2019-12-31T12:00:00Z')"
      },
      "members": [
        "user:travis@example.com"
      ]
    }
  ]
}

最後に、更新された許可ポリシーを作成します。

Resource Manager API の projects.setIamPolicy メソッドは、リクエストのポリシーをプロジェクトの新しい許可ポリシーとして設定します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。

HTTP メソッドと URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy

リクエストの本文(JSON):

{
  "policy": {
    "version": 3,
    "etag": "BwWKmjvelug=",
    "bindings": [
      {
        "role": "roles/owner",
        "members": [
          "user:project-owner@example.com"
        ]
      },
      {
        "role": "roles/iam.securityReviewer",
        "members": [
          "user:travis@example.com"
        ],
        "condition": {
          "title": "Expires_July_1_2020",
          "description": "Expires on July 1, 2020",
          "expression":
            "request.time < timestamp('2020-07-01T00:00:00.000Z')"
        }
      }
    ]
  }
}

リクエストを送信するには、次のいずれかのオプションを開きます。

レスポンスには、更新された許可ポリシーが含まれます。


既存の条件付きロール バインディングの変更

条件付きロール バインディングを作成した後は、いつでも条件式を変更できます。このセクションでは、Google Cloud コンソール、Google Cloud CLI、REST API を使用して、既存の許可ポリシーで時間ベースの条件を更新する方法について説明します。

既存の許可ポリシーで条件付きロール バインディングを変更するには:

コンソール

  1. Google Cloud コンソールの [IAM] ページに移動します。

    [IAM] ページに移動

  2. プリンシパルのリストから、目的のプリンシパルを見つけて、[] ボタンをクリックします。

  3. [権限の編集] パネルで、条件を構成するロールを見つけます。次に、[IAM の条件(省略可)] で、既存の条件の名前をクリックして編集します。

  4. [条件の編集] パネルで、条件の既存のタイトルと説明を保持または更新できます。

  5. 既存の条件式を編集するか、条件作成ツール条件エディタを使用して新しい条件式を追加します。条件作成ツールには、目的の条件タイプ、演算子、その他の式に関する適用可能な詳細を選択するためのインタラクティブなインターフェースが用意されています。条件エディタには、CEL 構文を使用して手動で式を入力するためのテキストベースのインターフェースが用意されています。

    条件作成ツール:

    1. 新しい条件式を追加するか、既存の条件式を変更します。
    2. [保存] をクリックして条件を適用します。
    3. [条件の編集] パネルを閉じたら、[権限の編集] パネルでもう一度 [保存] をクリックし、許可ポリシーを更新します。

    条件エディタ:

    1. [条件エディタ] タブをクリックし、新しい条件式を追加するか、既存の条件式を変更します。
    2. 式を入力したら、右上のテキスト ボックスの上にある [リンターを実行] をクリックして、CEL 構文を検証することもできます。
    3. [保存] をクリックして条件を適用します。
    4. [条件の編集] パネルを閉じたら、[権限の編集] パネルでもう一度 [保存] をクリックし、許可ポリシーを更新します。

gcloud

許可ポリシーは、読み取り、変更、書き込みのパターンを使用して設定されます。

gcloud projects get-iam-policy コマンドを実行し、プロジェクトの現在の許可ポリシーを取得します。次の例では、JSON バージョンの許可ポリシーがディスク上のパスにダウンロードされます。

コマンド:

gcloud projects get-iam-policy project-id --format json > file-path

JSON 形式の許可ポリシーがダウンロードされます。

{
  "bindings": [
    {
      "members": [
        "user:project-owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "user:fatima@example.com"
      ],
      "role": "roles/bigquery.dataViewer",
      "condition": {
        "title": "Duration_3_months",
        "description": "Expires in 3 months on 2019-10-12",
        "expression":
          "request.time > timestamp(\"2019-07-12T07:00:00.000Z\") && request.time < timestamp(\"2019-10-12T07:00:00.000Z\")"
      }
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 3
}

この例では、式の titledescription、timestamp の値を更新し、条件にスケジュールされたアクセスの期間を変更します。条件式の強調表示された部分を更新します。値はご自分のものに置き換えてください。

{
  "bindings": [
    {
      "members": [
        "user:project-owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "user:fatima@example.com"
      ],
      "role": "roles/bigquery.dataViewer",
      "condition": {
        "title": "Duration_5_months",
        "description": "Expires in 5 months on 2020-01-12",
        "expression":
          "request.time > timestamp('2019-07-12T07:00:00.000Z') && request.time < timestamp('2020-01-12T07:00:00.000Z')"
      }
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 3
}

次に、gcloud projects set-iam-policy コマンドを実行して新しい許可ポリシーを設定します。

gcloud projects set-iam-policy project-id file-path

更新された許可ポリシーが適用され、fatima@example.com のロール バインディングは新しい時刻に期限切れになります。

REST

条件付きロール バインディングを変更するには、読み取り、変更、書き込みのパターンを使用します。

まず、プロジェクトの許可ポリシーを読み取ります。

Resource Manager API の projects.getIamPolicy メソッドは、プロジェクトの許可ポリシーを取得します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。

HTTP メソッドと URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:getIamPolicy

リクエストの本文(JSON):

{
  "options": {
    "requestedPolicyVersion": 3
  }
}

リクエストを送信するには、次のいずれかのオプションを開きます。

次のような JSON レスポンスが返されます。

{
  "etag": "BwWKmjvelug=",
  "version": 3,
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:project-owner@example.com"
      ]
    },
    {
      "role": "roles/bigquery.dataViewer",
      "condition": {
        "title": "Duration_3_months",
        "description": "Expires in 3 months on 2019-10-12",
        "expression":
          "request.time > timestamp(\"2019-07-12T07:00:00.000Z\") && request.time < timestamp(\"2019-10-12T07:00:00.000Z\")"
      },
      "members": [
        "user:fatima@example.com"
      ]
    }
  ]
}

次に、許可ポリシーで条件付きロール バインディングを変更します。この例では、timestamp の値を更新し、条件にスケジュールされたアクセスの期間を変更します。条件式の強調表示された部分を更新します。タイムスタンプはご自分のものに置き換えてください。

{
  "etag": "BwWKmjvelug=",
  "version": 3,
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:project-owner@example.com"
      ]
    },
    {
      "role": "roles/bigquery.dataViewer",
      "condition": {
        "title": "Duration_5_months",
        "description": "Expires in 5 months on 2020-01-12",
        "expression":
          "request.time > timestamp('2019-07-12T07:00:00.000Z') && request.time < timestamp('2020-01-12T07:00:00.000Z')"
      },
      "members": [
        "user:fatima@example.com"
      ]
    }
  ]
}

最後に、更新された許可ポリシーを作成します。

Resource Manager API の projects.setIamPolicy メソッドは、リクエストのポリシーをプロジェクトの新しい許可ポリシーとして設定します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。

HTTP メソッドと URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy

リクエストの本文(JSON):

{
  "policy": {
    "etag": "BwWKmjvelug=",
    "version": 3,
    "bindings": [
      {
        "role": "roles/owner",
        "members": [
          "user:project-owner@example.com"
        ]
      },
      {
        "role": "roles/bigquery.dataViewer",
        "condition": {
          "title": "Duration_5_months",
          "description": "Expires in 5 months on 2020-01-12",
          "expression":
            "request.time > timestamp('2019-07-12T07:00:00.000Z') && request.time < timestamp('2020-01-12T07:00:00.000Z')"
        },
        "members": [
          "user:fatima@example.com"
        ],
      }
    ]
  }
}

リクエストを送信するには、次のいずれかのオプションを開きます。

レスポンスには、更新された許可ポリシーが含まれます。


ロール バインディングから条件を削除する

ロール バインディングから条件を削除しても、ロールは取り消されません。代わりに、そのロール バインディング内のすべてのプリンシパルがロール内の権限を無条件で使用できます。

このセクションでは、Google Cloud コンソール、Google Cloud CLI、REST API を使用して、許可ポリシー内の時間ベースの条件を削除する方法につい説明します。

許可ポリシーのロール バインディングから条件を削除するには:

コンソール

  1. Google Cloud コンソールの [IAM] ページに移動します。

    [IAM] ページに移動

  2. プリンシパルのリストから、目的のプリンシパルを見つけて、[] ボタンをクリックします。

  3. [権限の編集] パネルで、目的のロール バインディングを探します。次に、[IAM の条件(省略可)] で既存の条件の名前をクリックします。

  4. [条件の編集] パネルで、[削除] ボタンをクリックして条件を削除します。削除の確認を求めるメッセージが表示されます。

  5. [条件の編集] パネルを閉じたら、[権限の編集] パネルでもう一度 [保存] をクリックし、許可ポリシーを更新します。

gcloud

許可ポリシーは、読み取り、変更、書き込みのパターンを使用して設定されます。

gcloud projects get-iam-policy コマンドを実行し、プロジェクトの現在の許可ポリシーを取得します。次の例では、JSON バージョンの許可ポリシーがディスク上のパスにダウンロードされます。

コマンド:

gcloud projects get-iam-policy project-id --format json > file-path

JSON 形式の許可ポリシーがダウンロードされます。

{
  "bindings": [
    {
      "members": [
        "user:project-owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "user:fatima@example.com"
      ],
      "role": "roles/bigquery.dataViewer",
      "condition": {
        "title": "Duration_3_months",
        "description": "Expires in 3 months on 2019-10-12",
        "expression":
          "request.time > timestamp(\"2019-07-12T07:00:00.000Z\") && request.time < timestamp(\"2019-10-12T07:00:00.000Z\")"
      }
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 3
}

許可ポリシーから条件付きロール バインディングを削除するには、次のように condition ブロックを削除します。

{
  "bindings": [
    {
      "members": [
        "user:project-owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "user:fatima@example.com"
      ],
      "role": "roles/bigquery.dataViewer",
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 3
}

無条件のロール バインディングで必要となるのは許可ポリシーのバージョン 1 のみですが、version3 に設定されたままなので、ご注意ください。条件付きロール バインディングと無条件のロール バインディングの両方で許可ポリシーを設定する場合は、常に最も高いバージョン番号を使用することをおすすめします。詳しくは、バージョンの要件をご覧ください。gcloud CLI により、許可ポリシーのバージョン番号が自動的に更新されます。

次に、gcloud projects set-iam-policy コマンドを実行して、更新された許可ポリシーを設定します。

gcloud projects set-iam-policy project-id file-path

更新された許可ポリシーが適用され、fatima@example.com の条件付きロール バインディングが削除されます。ロール バインディングの有効期限もなくなります。

REST

条件付きロール バインディングを削除するには、読み取り、変更、書き込みのパターンを使用します。

まず、プロジェクトの許可ポリシーを読み取ります。

Resource Manager API の projects.getIamPolicy メソッドは、プロジェクトの許可ポリシーを取得します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。

HTTP メソッドと URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:getIamPolicy

リクエストの本文(JSON):

{
  "options": {
    "requestedPolicyVersion": 3
  }
}

リクエストを送信するには、次のいずれかのオプションを開きます。

次のような JSON レスポンスが返されます。

{
  "etag": "BwWKmjvelug=",
  "version": 3,
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:project-owner@example.com"
      ]
    },
    {
      "role": "roles/bigquery.dataViewer",
      "condition": {
        "title": "Duration_3_months",
        "description": "Expires in 3 months on 2019-10-12",
        "expression":
          "request.time > timestamp(\"2019-07-12T07:00:00.000Z\") && request.time < timestamp(\"2019-10-12T07:00:00.000Z\")"
      },
      "members": [
        "user:fatima@example.com"
      ]
    }
  ]
}

次に、条件付きロール バインディングを削除して許可ポリシーを変更します。

{
  "etag": "BwWKmjvelug=",
  "version": 3,
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:project-owner@example.com"
      ]
    },
    {
      "role": "roles/bigquery.dataViewer",
      "members": [
        "user:fatima@example.com"
      ]
    }
  ]
}

無条件のロール バインディングで必要となるのは許可ポリシーのバージョン 1 のみですが、version3 に設定されたままなので、ご注意ください。条件付きロール バインディングと無条件のロール バインディングの両方で許可ポリシーを設定する場合は、常に最も高いバージョン番号を使用することをおすすめします。詳しくは、バージョンの要件をご覧ください。

最後に、更新された許可ポリシーを作成します。

Resource Manager API の projects.setIamPolicy メソッドは、リクエストのポリシーをプロジェクトの新しい許可ポリシーとして設定します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。

HTTP メソッドと URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy

リクエストの本文(JSON):

{
  "policy": {
    "etag": "BwWKmjvelug=",
    "version": 3,
    "bindings": [
      {
        "role": "roles/owner",
        "members": [
          "user:project-owner@example.com"
        ]
      },
      {
        "role": "roles/bigquery.dataViewer",
        "members": [
          "user:fatima@example.com"
        ]
      }
    ]
  }
}

リクエストを送信するには、次のいずれかのオプションを開きます。

レスポンスには、更新された許可ポリシーが含まれます。


次のステップ