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

許可ポリシーを表示すると、文字列 withcond の後にハッシュ値を含むロール名が表示されることがあります。たとえば、roles/iam.serviceAccountAdmin_withcond_2b17cc25d2cd9e2c54d8 のようなロール名が表示されます。

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

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

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

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

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

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

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

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

条件を含む許可ポリシー全体を表示して更新できるようにするには、許可ポリシーを取得または設定するときに、常にバージョン 3 を指定する必要があります。ポリシー バージョン 3 を指定するには、次の各セクションの作業をすべて行います。

gcloud ツールを更新する

Google Cloud CLI を使用する場合は、gcloud version を実行してバージョン番号を確認します。出力には、Google Cloud CLI 279.0.0 のような文字列が含まれます。

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

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

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

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

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

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

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

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

REST API 呼び出しを更新する

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

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

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

  • 許可ポリシーを取得または設定するすべてのリクエストでバージョン 3 を指定します。
  • 許可ポリシーを設定するすべてのリクエストに etag フィールドを含めます。

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

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

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

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

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

    {
      "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. ツールを使用して、更新された許可ポリシーを取得します。このツールでは、許可ポリシーをリクエストするときに許可ポリシーのバージョンを指定しないため、ロール名が変更されたバージョン 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 が指定されるように管理ツールを更新する必要があります。

次のステップ