ポリシーとロールのバインディングでの withcond のトラブルシューティング

Identity and Access Management(IAM)ポリシーを表示すると、ロールの名前に文字列 withcond が含まれ、その後にハッシュ値が表示されることがあります。たとえば、roles/iam.serviceAccountAdmin_withcond_2b17cc25d2cd9e2c54d8 のようなロール名が表示されます。

このページでは、IAM ポリシーで文字列 withcond が表示される条件と理由について説明します。また、この文字列が表示された場合の対処法も提示します。

ポリシー バージョンと条件付きロール バインディング

IAM ポリシーは、複数の異なる形式で表すことができます。それぞれの形式は、ポリシー バージョンと呼ばれます。

バージョン 1 を使用する IAM ポリシーでは、一部のロール バインディングのロール名に withcond という文字列が含まれ、その後にハッシュ値が続くことがあります。

{
  "bindings": [
    {
      "members": [
        "user:dana@example.com"
      ],
      "role": "roles/iam.serviceAccountAdmin_withcond_2b17cc25d2cd9e2c54d8"
    }
  ],
  "etag": "BwUjMhCsNvY=",
  "version": 1
}

この形式は、ロール バインディングが条件付きであることを示します。つまり、特定の条件が満たされた場合にのみロールが付与されます。

バージョン 1 ポリシーでは、これらの条件は表示されません。文字列 withcond とハッシュ値がある場合、表示されていない条件がロール バインディングに含まれています。

解決策: ポリシー バージョン 3 を指定する

IAM ポリシーとその条件をすべて表示、更新できるようにするには、リクエスト内で常にポリシー バージョン 3 を指定する必要があります。ポリシー バージョン 3 を指定するには、次の各セクションの作業をすべて行います。

gcloud ツールを更新する

gcloud コマンドライン ツールを使用する場合は、gcloud version を実行してそのバージョン番号を確認してください。出力には、Google Cloud SDK 279.0.0 のような文字列が含まれます。

バージョン番号が 263.0.0 より小さい場合は、gcloud components update を実行して gcloud ツールを更新します。バージョン 263.0.0 以降では、条件をサポートするポリシー バージョンが gcloud ツールによって自動的に指定されます。

クライアント ライブラリを更新する

アプリケーションでクライアント ライブラリを使用する場合は、次の手順を行います。

  1. クライアント ライブラリの名前とバージョン番号を見つけてから、ポリシー バージョンをサポートするクライアント ライブラリのリストを確認します。

    • すでにクライアント ライブラリの最新バージョンを使用していて、それがポリシー バージョンをサポートする場合は、クライアント ライブラリを更新する必要はありません。次のステップに進みます。

    • 古いバージョンのクライアント ライブラリを使用し、それより後のバージョンがポリシー バージョンをサポートしている場合は、クライアント ライブラリを最新バージョンに更新してください。

    • ポリシー バージョンをサポートしないクライアント ライブラリを使用している場合は、ポリシー バージョンをサポートする別のクライアント ライブラリをアプリケーションに追加できます。このクライアント ライブラリを使用して IAM ポリシーを操作します。また、IAM REST API を直接使用することもできます。

  2. IAM ポリシーを取得して設定するアプリケーション内のコードを更新します。

REST API 呼び出しを更新する

アプリケーションで IAM REST API を直接使用する場合は、IAM ポリシーの取得や設定を行うアプリケーション内のコードをすべて更新してください。

IAM ポリシーの管理ツールを更新する

Cloud IAM ポリシーのローカルコピーを保持する場合(たとえば、バージョン管理システムに保存してコードとして扱う場合)は、使用するすべてのツールが次の条件を満たしていることを確認してください。

  • すべてのリクエストがポリシー バージョン 3 を指定している
  • すべてのリクエストがリクエスト内の etag フィールドを含むポリシーを更新している

いずれかのツールがこれらの条件を満たしていない場合、そのツールの更新バージョンがあるかどうか確認してください。

また、条件を含まないロール付与を重複して追加するのではなく、必ず条件付きロール付与を管理ツールで保持してください。たとえば、次のシナリオについて考えてみましょう。

  1. サービス アカウント作成ロール(roles/iam.serviceAccountCreator)を、フォルダ my-folder でユーザー vikram@example.com に付与します。フォルダの IAM ポリシーは、次の例のようになります。

    {
      "bindings": [
        {
          "members": [
            "user:vikram@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator"
        }
      ],
      "etag": "BuFmmMhCsNY=",
      "version": 1
    }
  2. ツールを使用して IAM ポリシーを取得し、バージョン管理システムに格納します。

  3. ドイツのベルリンの日付と時刻に基づき、通常の勤務週にのみ vikram@example.com でサービス アカウントを作成できるように、条件を追加します。更新された IAM ポリシーは、次の例のようになります。

    {
      "bindings": [
        {
          "members": [
            "user:vikram@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator",
          "condition": {
            "title": "work_week_only",
            "expression": "request.time.getDayOfWeek('Europe/Berlin') >= 1 && request.time.getDayOfWeek('Europe/Berlin') <= 5"
          }
        }
      ],
      "etag": "BwWcR/B3tNk=",
      "version": 3
    }
  4. ツールを使用して、更新された IAM ポリシーを取得します。ポリシーをリクエストするときにポリシーのバージョンがツールで指定されないため、変更されたロール名とともにバージョン 1 ポリシーを受け取ります。

    {
      "bindings": [
        {
          "members": [
            "user:vikram@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator_withcond_a75dc089e6fa084bd379"
        }
      ],
      "etag": "BwWcR/B3tNk=",
      "version": 1
    }

この時点で、管理ツールは、vikram@example.com からロール roles/iam.serviceAccountCreator へのバインディングが消失し、元のロール バインディングをポリシーに復元する必要があると判断する可能性があります。

次のことは避けてください: 条件なしのロール バインディングを追加する

{
  "bindings": [
    {
      "members": [
        "user:vikram@example.com"
      ],
      "role": "roles/iam.serviceAccountCreator_withcond_a75dc089e6fa084bd379"
    },
    {
      "members": [
        "user:vikram@example.com"
      ],
      "role": "roles/iam.serviceAccountCreator"
    }
  ],
  "etag": "BwWd3HjhKxE=",
  "version": 1
}

この変更は正しくありません。この場合、曜日に関係なく、ロール roles/iam.serviceAccountCreatorvikram@example.com に付与されてしまいます。そのため、最初のロール バインディングの条件が効果を失うことになります。

管理ツールがこのような変更を行おうと試みた場合は、変更を承認しないでください。代わりに、リクエストでポリシー バージョン 3 が指定されるように管理ツールを更新する必要があります。

次のステップ