条件付きロール バインディングの管理

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

始める前に

条件付きロール バインディングのポリシーへの追加

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

既存のポリシーに条件付きロール バインディングを追加するには、次の手順を行います。

Console

  1. Cloud Console で [IAM] ページに移動します。

    IAM ページに移動

  2. リストから目的のメンバーを見つけて、 ボタンをクリックします。

  3. [権限の編集] パネルで、条件を構成するロールを見つけます。次に [条件] の下にある [条件を追加] をクリックします。

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

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

    条件ビルダー:

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

    条件エディタ:

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

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

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

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

gcloud

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

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

コマンド:

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

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

{
  "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 ツールのバージョン 263.0.0 以降を使用していない場合は、version 値が 3 に更新されていることを確認してください。新しいバージョンの gcloud ツールを使用している場合は、最大のポリシー値が自動的に設定されます。

{
  "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

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

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

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

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

  • project-id: Google Cloud プロジェクト ID
  • 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 メソッドは、リクエストのポリシーをプロジェクトの新しい IAM ポリシーとして設定します。

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

  • project-id: Google Cloud プロジェクト ID

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')"
        }
      }
    ]
  }
}

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

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


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

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

既存のポリシーで条件付きロール バインディングを変更するには、次の手順を行います。

Console

  1. Cloud Console で [IAM] ページに移動します。

    IAM ページに移動

  2. リストから目的のメンバーを見つけて、 ボタンをクリックします。

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

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

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

    条件ビルダー:

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

    条件エディタ:

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

gcloud

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

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

コマンド:

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

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

{
  "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

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

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

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

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

  • project-id: Google Cloud プロジェクト ID

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 メソッドは、リクエストのポリシーをプロジェクトの新しい IAM ポリシーとして設定します。

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

  • project-id: Google Cloud プロジェクト ID

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"
        ],
      }
    ]
  }
}

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

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


条件付きロール バインディングの削除

IAM ポリシーで条件付きロール バインディングを削除すると、リソースへのアクセスがロール バインディングの範囲のみに限定されます。このセクションでは、Cloud Console、gcloud コマンドライン ツール、REST API を使用して、ポリシー内の時間ベースの条件を削除する方法につい説明します。

ポリシー内のロール バインディングから条件を削除するには、次の手順を行います。

Console

  1. Cloud Console で [IAM] ページに移動します。

    IAM ページに移動

  2. リストから目的のメンバーを見つけて、 ボタンをクリックします。

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

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

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

gcloud

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

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

コマンド:

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

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

{
  "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 に設定されたままなので、ご注意ください。条件付きロール バインディングと無条件のロール バインディングの両方でポリシーを設定する場合は、常に最も高いポリシー バージョン番号を使用することをおすすめします。詳しくは、バージョンの要件をご覧ください。バージョン 263.0.0 以降の gcloud ツールを使用している場合は、最新のポリシー バージョンが更新されます。

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

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

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

REST

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

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

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

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

  • project-id: Google Cloud プロジェクト ID

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 メソッドは、リクエストのポリシーをプロジェクトの新しい IAM ポリシーとして設定します。

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

  • project-id: Google Cloud プロジェクト ID

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"
        ]
      }
    ]
  }
}

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

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