Fehlerbehebung bei "withcond" in Richtlinien und Rollenbindungen

Wenn Sie eine Richtlinie der Identitäts- und Zugriffsverwaltung (IAM, Identity and Access Management) aufrufen, enthält diese möglicherweise Rollennamen mit dem String withcond, gefolgt von einem Hashwert. Ein Rollenname kann beispielsweise so aussehen: roles/iam.serviceAccountAdmin_withcond_2b17cc25d2cd9e2c54d8.

Auf dieser Seite wird erläutert, wann und warum der String withcond in einer IAM-Richtlinie angezeigt wird. Außerdem werden Maßnahmen bei der Anzeige dieses Strings empfohlen.

Richtlinienversionen und bedingte Rollenbindungen

Eine IAM-Richtlinie kann in verschiedener Form dargestellt werden. Jede Form wird als Richtlinienversion bezeichnet.

In einer IAM-Richtlinie, die die Version 1 verwendet, enthalten einige Rollenbindungen möglicherweise den String withcond in einem Rollennamen, gefolgt von einem Hashwert:

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

Dieses Format gibt an, dass die Rollenbindung bedingt ist. Mit anderen Worten: Die Rolle wird nur gewährt, wenn bestimmte Bedingungen erfüllt sind.

In Richtlinien der Version 1 werden diese Bedingungen nicht angezeigt. Wenn Sie den String withcond und einen Hashwert sehen, enthält die Rollenbindung eine Bedingung, die nicht sichtbar ist.

Lösung: Richtlinienversion 3 angeben

Damit Sie die gesamte IAM-Richtlinie einschließlich ihrer Bedingungen aufrufen und aktualisieren können, müssen Sie in Ihren Anfragen immer die Richtlinienversion 3 angeben. Führen Sie die Aufgaben in den folgenden Abschnitten aus, um die Richtlinienversion 3 anzugeben.

gcloud-Tool aktualisieren

Wenn Sie das gcloud-Befehlszeilentool verwenden, führen Sie gcloud version aus, um dessen Versionsnummer zu prüfen. Die Ausgabe enthält einen String ähnlich wie Google Cloud SDK 279.0.0.

Wenn die Versionsnummer kleiner als 263.0.0 ist, führen Sie gcloud components update aus, um das gcloud-Tool zu aktualisieren. In Version 263.0.0 und höher gibt das gcloud-Tool automatisch eine Richtlinienversion an, die Bedingungen unterstützt.

Clientbibliotheken aktualisieren

Wenn Ihre Anwendung eine Clientbibliothek verwendet, gehen Sie so vor:

  1. Suchen Sie nach dem Namen und der Versionsnummer der Clientbibliothek und prüfen Sie dann die Liste der Clientbibliotheken, die Richtlinienversionen unterstützen.

    • Wenn Sie bereits eine aktuelle Version der Clientbibliothek verwenden, die Richtlinienversionen unterstützt, müssen Sie Ihre Clientbibliothek nicht aktualisieren. Fahren Sie mit dem nächsten Schritt fort.

    • Wenn Sie eine ältere Version der Clientbibliothek verwenden und eine höhere Version Richtlinienrichtlinien unterstützt, aktualisieren Sie Ihre Clientbibliothek auf die neueste Version.

    • Wenn Sie eine Clientbibliothek verwenden, die keine Richtlinienversionen unterstützt, können Sie Ihrer Anwendung eine weitere Clientbibliothek hinzufügen, die Richtlinienversionen unterstützt. Verwenden Sie diese Clientbibliothek, um mit IAM-Richtlinien zu arbeiten. Alternativ können Sie die IAM REST API direkt verwenden.

  2. Aktualisieren Sie den Code in Ihrer Anwendung, mit dem IAM-Richtlinien abgerufen und festgelegt werden:

REST API-Aufrufe aktualisieren

Wenn Ihre Anwendung die IAM REST API direkt verwendet, aktualisieren Sie den Code, der IAM-Richtlinien abruft und festlegt:

Tools zur Updateverwaltung für IAM-Richtlinien

Wenn Sie lokale Kopien Ihrer IAM-Richtlinien aufbewahren, z. B. wenn Sie sie in einem Versionsverwaltungssystem speichern und als Code behandeln, müssen alle verwendeten Tools folgende Kriterien erfüllen:

  • Alle Anfragen geben die Richtlinienversion 3 an.
  • Alle Anfragen zum Aktualisieren einer Richtlinie enthalten in der Anfrage das Feld etag.

Wenn ein Tool diese Kriterien nicht erfüllt, suchen Sie nach einer aktualisierten Version des Tools.

Achten Sie außerdem darauf, dass Ihre Managementtools bedingte Rollenzuweisungen beibehalten und keine doppelte Rollenzuweisung hinzufügen, die keine Bedingung enthält. Betrachten Sie beispielsweise das folgende Szenario:

  1. Sie erteilen dem Nutzer vikram@example.com für den Ordner my-folder die Rolle "Dienstkonten erstellen" (roles/iam.serviceAccountCreator). Die IAM-Richtlinie für den Ordner sieht in etwa so aus:

    {
      "bindings": [
        {
          "members": [
            "user:vikram@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator"
        }
      ],
      "etag": "BuFmmMhCsNY=",
      "version": 1
    }
  2. Sie verwenden ein Tool, um die IAM-Richtlinie abzurufen und in einem Versionsverwaltungssystem zu speichern.

  3. Sie fügen eine Bedingung hinzu, damit vikram@example.com Dienstkonten ausgehend von Datum und Uhrzeit in Berlin nur während der normalen Arbeitswoche erstellen kann. Die aktualisierte IAM-Richtlinie sieht in etwa so aus:

    {
      "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. Sie verwenden ein Tool, um die aktualisierte IAM-Richtlinie abzurufen. Das Tool fügt in die Anfrage der Richtlinie keine Richtlinienversion ein, sodass Sie eine Richtlinie der Version 1 mit einem geänderten Rollennamen erhalten:

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

An dieser Stelle könnte das Managementtool die Bindung von vikram@example.com an die Rolle roles/iam.serviceAccountCreator als nicht mehr vorhanden betrachten und die ursprüngliche Rollenbindung an die Richtlinie wiederherstellen wollen:

Zu vermeiden: Zusätzliche Rollenbindung ohne Bedingung

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

Diese Änderung ist nicht korrekt. In diesem Fall wird die Rolle roles/iam.serviceAccountCreator vikram@example.com unabhängig vom Wochentag zugewiesen. Folglich hat die Bedingung in der ersten Rollenbindung keine Wirkung.

Wenn Ihre Managementtools versuchen, dementsprechende Änderungen vorzunehmen, genehmigen Sie sie nicht. Aktualisieren Sie stattdessen Ihre Managementtools, damit diese in Anfragen die Richtlinienversion 3 angeben.

Weitere Informationen