Kontextsensitiven Zugriff für Dienstkonten konfigurieren

In diesem Leitfaden wird beschrieben, wie Sie den kontextsensitiven Zugriff einrichten, um den Zugriff von Dienstkonten auf Google Cloud APIs anhand von Zugriffsebenen zu schützen, die Sie definieren.

Beschränkungen

Für Richtlinien für kontextsensitiven Zugriff für Dienstkonten gelten die folgenden Einschränkungen:

  • Netzwerkbasierte oder IP-adressenbasierte Attribute können nicht für Dienstkonto-Bindungen verwendet werden, wenn das Dienstkonto für Workflow-Ausführungen und Cloud Scheduler verwendet wird.

  • Verbindungen zu privaten GKE-Clustern über kubectl und zu Cloud SQL über den Auth-Proxy können nicht durch Richtlinien für kontextsensitiven Zugriff blockiert werden.

  • Wenn eine Zugriffsebene, die an ein Dienstkonto gebunden ist, nicht unterstützte Attribute wie Device-Attribute enthält, wird der API-Zugriff verweigert.

  • Bereichsbezogene Zugriffsebenen werden für Dienstkonten nicht unterstützt.

Wenn Sie Cloud Build und Cloud Run verwenden, empfehlen wir die folgenden integrierten VPC-Funktionen:

Hinweis

  1. Sie benötigen eine Google Cloud -Organisation und mindestens ein Google Cloud -Projekt.
  2. Melden Sie sich in Ihrem Google Cloud -Konto an. Wenn Sie mit Google Cloudnoch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  3. Installieren Sie die Google Cloud CLI.

  4. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  5. Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  6. Erstellen Sie ein Google Cloud Projekt oder wählen Sie eines aus.

    Rollen, die zum Auswählen oder Erstellen eines Projekts erforderlich sind

    • Projekt auswählen: Für die Auswahl eines Projekts ist keine bestimmte IAM-Rolle erforderlich. Sie können jedes Projekt auswählen, für das Ihnen eine Rolle zugewiesen wurde.
    • Projekt erstellen: Zum Erstellen eines Projekts benötigen Sie die Rolle „Projektersteller“ (roles/resourcemanager.projectCreator), die die Berechtigung resourcemanager.projects.create enthält. Weitere Informationen zum Zuweisen von Rollen
    • So erstellen Sie ein Google Cloud Projekt:

      gcloud projects create PROJECT_ID

      Ersetzen Sie PROJECT_ID durch einen Namen für das Google Cloud Projekt, das Sie erstellen.

    • Wählen Sie das von Ihnen erstellte Google Cloud Projekt aus:

      gcloud config set project PROJECT_ID

      Ersetzen Sie PROJECT_ID durch den Namen Ihres Projekts in Google Cloud .

  7. Prüfen Sie, ob die Abrechnung für Ihr Google Cloud Projekt aktiviert ist.

  8. Installieren Sie die Google Cloud CLI.

  9. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  10. Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  11. Erstellen Sie ein Google Cloud Projekt oder wählen Sie eines aus.

    Rollen, die zum Auswählen oder Erstellen eines Projekts erforderlich sind

    • Projekt auswählen: Für die Auswahl eines Projekts ist keine bestimmte IAM-Rolle erforderlich. Sie können jedes Projekt auswählen, für das Ihnen eine Rolle zugewiesen wurde.
    • Projekt erstellen: Zum Erstellen eines Projekts benötigen Sie die Rolle „Projektersteller“ (roles/resourcemanager.projectCreator), die die Berechtigung resourcemanager.projects.create enthält. Weitere Informationen zum Zuweisen von Rollen
    • So erstellen Sie ein Google Cloud Projekt:

      gcloud projects create PROJECT_ID

      Ersetzen Sie PROJECT_ID durch einen Namen für das Google Cloud Projekt, das Sie erstellen.

    • Wählen Sie das von Ihnen erstellte Google Cloud Projekt aus:

      gcloud config set project PROJECT_ID

      Ersetzen Sie PROJECT_ID durch den Namen Ihres Projekts in Google Cloud .

  12. Prüfen Sie, ob die Abrechnung für Ihr Google Cloud Projekt aktiviert ist.

  13. Aktualisieren Sie die Google Cloud CLI-Komponenten:
    gcloud components update --quiet
  14. Erstellen Sie ein Dienstkonto in Ihrem Projekt, falls noch keines vorhanden ist. Dieses Dienstkonto ist das Ziel der Zugriffsrichtlinie.

Erforderliche Rollen

In diesem Abschnitt werden die IAM-Rollen (Identity and Access Management) beschrieben, die für die Verwendung von kontextsensitivem Zugriff erforderlich sind.

Rollen auf Projektebene

Bitten Sie Ihren Administrator, Ihnen die IAM-Rolle Dienstkonto-Administrator (roles/iam.serviceAccountAdmin) für das Nutzerkonto oder Dienstkonto zuzuweisen, um die Berechtigung zu erhalten, die Sie auf Projektebene benötigen. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Diese vordefinierte Rolle enthält die Berechtigung the required permissions, die auf Projektebene erforderlich ist.

Sie können diese Berechtigung auch mit benutzerdefinierten Rollen oder anderen vordefinierten Rollen erhalten.

Rollen auf Organisationsebene

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für Ihr Nutzerkonto oder Dienstkonto zuzuweisen, um die Berechtigung zu erhalten, die Sie auf Organisationsebene benötigen:

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Diese vordefinierte Rolle enthält die Berechtigung the required permissions, die auf Organisationsebene erforderlich ist.

Sie können diese Berechtigung auch mit benutzerdefinierten Rollen oder anderen vordefinierten Rollen erhalten.

Zugriffsrichtlinien an verschiedene Ressourcenebenen binden

Sie können Zugriffsrichtlinien mit demselben Erzwingungsmodus an Ressourcen binden, die sich auf verschiedenen Ebenen der Ressourcenhierarchie befinden. Wenn eine Ressource versucht, auf eine andere Ressource zuzugreifen, verwendet der Kontextsensitive Zugriff die Richtlinie, die an diese Ressource gebunden ist, bevor versucht wird, eine Richtlinie zu verwenden, die an eine Ressource auf höherer Ebene gebunden ist.

Sie können beispielsweise eine Zugriffsrichtlinie im Erzwingungsmodus direkt an ein Dienstkonto und eine andere Richtlinie im Erzwingungsmodus an das Projekt binden, das das Dienstkonto enthält. Wenn das Dienstkonto versucht, auf Ressourcen zuzugreifen, wird die Richtlinie, die an das Dienstkonto gebunden ist, durch den kontextsensitiven Zugriff ausgewertet. Für andere Dienstkonten im Projekt, an die keine Zugriffsrichtlinien gebunden sind, wertet der Kontextsensitiver Zugriff die Richtlinie für den Erzwingungsmodus aus, die an das Projekt gebunden ist. Das gilt auch, wenn der Erzwingungsmodus sowohl für die Richtlinie auf Projektebene als auch für die Richtlinie auf Dienstkontoebene auf „Probelauf“ festgelegt ist.

Sie können mehrere Zugriffsrichtlinien verwenden, um Zugriffsrichtlinien inkrementell und selektiv bereitzustellen. Sie können beispielsweise Folgendes tun:

  1. Binden Sie eine Zugriffsrichtlinie im Probelaufmodus auf Projektebene und prüfen Sie in Cloud-Audit-Logs, ob sie wie erwartet funktioniert, indem Sie nach Ereignissen suchen, bei denen der Zugriff verweigert wurde.
  2. Binden Sie die Zugriffsrichtlinie im Erzwingungsmodus nur an bestimmte Dienstkonten.
  3. Binden Sie die Zugriffsrichtlinie im Erzwingungsmodus auf Projektebene und binden Sie bei Bedarf eine weniger restriktive Zugriffsrichtlinie im Erzwingungsmodus an bestimmte Dienstkonten.

Zugriffsebenenattribute für Dienstkonten

In diesem Abschnitt werden die Zugriffsebenen aufgeführt, die für Dienstkonten unterstützt werden.

Die folgenden Attribute werden für Dienstkonten unterstützt:

  • IP-Subnetzwerke, die auf der öffentlichen IP-Adresse basieren.
  • VPC-Netzwerke, die auf der privaten IP-Adresse basieren.
  • Geolokalisierung, die auf der öffentlichen IP-Adresse basiert.

    Wenn das Dienstkonto eine Anfrage an Google Cloud-APIs sendet, wird die Anfrage vom kontextsensitiven Zugriff ausgewertet und die IP-Adresse der Anfrage wird mit den in der Richtlinie für den kontextsensitiven Zugriff angegebenen IP-Adressen verglichen. Wenn die IP-Adressen übereinstimmen, ist der API-Aufruf zulässig. Wenn die IP-Adresse nicht übereinstimmt, wird der API-Aufruf abgelehnt.

  • Eine benutzerdefinierte Zugriffsebene mit einem Ausdruck in Common Expression Language (CEL). Der Ausdruck muss den Wert true ergeben, um den Zugriff zuzulassen, und false, um den Zugriff zu verweigern.

    Der folgende CEL-Ausdruck ist nützlich, um den Zugriff durch Dienstkonten einzuschränken.

    Der Ausdruck wird zu true ausgewertet, wenn die Anfrage von einer oder mehreren angegebenen Projektnummern stammt:

        expression: "originatesFromProjects(origin, [PROJECT_NUMBER, ...])"
        

    Mit originatesFromProjects wird geprüft, ob die Anfrage aus einem Netzwerk stammt, das mit dem angegebenen Projekt verknüpft ist, und ob die Anfrage von einer privaten IP-Adresse stammt.

  • Tageszeit, die auf der Uhrzeit und dem Datum der Anfrage in einer angegebenen Zeitzone basiert.

    Weitere Informationen finden Sie unter Zugriffsbedingungen für Uhrzeit und Tag konfigurieren.

Zugriffsebene erstellen

In diesem Abschnitt wird beschrieben, wie Sie eine Zugriffsebene in Ihrer Organisation erstellen. Zugriffsebenen definieren die Bedingungen, unter denen der Zugriff zulässig ist.

  1. Folgen Sie der Anleitung unter Einfache Zugriffsebene erstellen oder Benutzerdefinierte Zugriffsebene erstellen.

  2. Notieren Sie sich den vollständigen Namen der Zugriffsrichtlinie, der das folgende Format hat: accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME.

Zugriffsbindung erstellen

Binden Sie die Zugriffsebene an das ausgewählte Dienstkonto. Dadurch werden die in der Zugriffsebene definierten Bedingungen erzwungen. Sie können die Zugriffsebene an ein einzelnes Dienstkonto oder an alle Dienstkonten innerhalb eines Projekts binden.

Zugriffsebene an ein bestimmtes Dienstkonto binden

In diesem Abschnitt wird beschrieben, wie Sie die Zugriffsebene an ein bestimmtes Dienstkonto binden.

gcloud

Zugriffsebene mit der gcloud CLI an ein Dienstkonto binden

gcloud access-context-manager cloud-bindings create \
    --organization=ORGANIZATION_ID \
    --service-account=SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
    --level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

Ersetzen Sie Folgendes:

  • ORGANIZATION_ID: Ihre Google Cloud Organisations-ID
  • SERVICE_ACCOUNT_NAME: der Name, nicht die E-Mail-Adresse des Ziel-Dienstkontos
  • SERVICE_ACCOUNT_PROJECT_ID: die ID des Projekts, das das Zieldienstkonto enthält
  • POLICY_ID: die ID der Zugriffsrichtlinie
  • ACCESS_LEVEL_NAME: der Name der von Ihnen erstellten Zugriffsebene

    Wenn Sie den kontextsensitiven Zugriff verwenden möchten, ohne die Zugriffsebene zu erzwingen und den Zugriff zu verweigern, können Sie die Zugriffsebene im Probebetrieb binden.

REST API

Führen Sie den folgenden Befehl aus, um die Zugriffsebene mit der REST API an ein bestimmtes Dienstkonto zu binden:

  1. Erstellen Sie eine request.json-Datei mit folgendem Inhalt:

    {
      "principal": {
        "serviceAccount": "SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com"
      },
      "accessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
    }
    

    Ersetzen Sie Folgendes:

    • SERVICE_ACCOUNT_NAME: der Name, nicht die E-Mail-Adresse des Ziel-Dienstkontos

    • SERVICE_ACCOUNT_PROJECT_ID: die ID des Projekts, das das Zieldienstkonto enthält

    • POLICY_ID: die ID der Zugriffsrichtlinie

    • ACCESS_LEVEL_NAME: der Name der von Ihnen erstellten Zugriffsebene

  2. Führen Sie dazu diesen Befehl aus:

    curl -H "X-Goog-User-Project: PROJECT_ID" -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json; charset=utf-8" \
      -d @request.json \
      "https://accesscontextmanager.googleapis.com/v1/organizations/ORGANIZATION_ID/gcpUserAccessBindings"
    

    Ersetzen Sie Folgendes:

    • PROJECT_ID: die ID des Projekts, das Sie für die API-Aufrufe verwenden

    • ORGANIZATION_ID: Ihre Google Cloud Organisations-ID.

Zugriffsebene an alle Dienstkonten in einem Projekt binden

In diesem Abschnitt wird beschrieben, wie Sie die Zugriffsebene an alle Dienstkonten in einem Projekt binden.

gcloud

Führen Sie den folgenden Befehl aus, um die Zugriffsebene mit der gcloud CLI an alle Dienstkonten in einem Projekt zu binden:

gcloud access-context-manager cloud-bindings create \
  --organization=ORGANIZATION_ID \
  --service-account-project-number=PROJECT_NUMBER \
  --level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

Ersetzen Sie Folgendes:

  • ORGANIZATION_ID: Ihre Google Cloud Organisations-ID
  • PROJECT_NUMBER: die Projektnummer des Projekts, das alle Dienstkonten enthält, für die Sie den Zugriff binden möchten
  • POLICY_ID: die ID der Zugriffsrichtlinie
  • ACCESS_LEVEL_NAME: Der Name der von Ihnen erstellten Zugriffsebene.

REST API

So binden Sie die Zugriffsebene mithilfe der REST API an alle Dienstkonten in einem Projekt:

  1. Erstellen Sie eine request.json-Datei mit folgendem Inhalt:

    {
      "principal": {
        "serviceAccountProjectNumber": "PROJECT_NUMBER"
      },
      "accessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
    }
    

    Ersetzen Sie Folgendes:

    • PROJECT_NUMBER: die Projektnummer des Projekts, das alle Dienstkonten enthält, für die Sie den Zugriff binden möchten
    • POLICY_ID: die ID der Zugriffsrichtlinie
    • ACCESS_LEVEL_NAME: Der Name der von Ihnen erstellten Zugriffsebene.
  2. Führen Sie dazu diesen Befehl aus:

    curl -H "X-Goog-User-Project: PROJECT_ID" -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://accesscontextmanager.googleapis.com/v1/organizations/ORGANIZATION_ID/gcpUserAccessBindings"
    

    Ersetzen Sie Folgendes:

    • PROJECT_ID: die ID des Projekts, mit dem Sie die API-Aufrufe ausführen
    • ORGANIZATION_ID: Ihre Google Cloud Organisations-ID

Wenn Sie den kontextsensitiven Zugriff verwenden möchten, ohne die Zugriffsebene zu erzwingen und den Zugriff zu verweigern, können Sie die Zugriffsrichtlinie im Probebetrieb binden.

Die API-Antwort für den Vorgang zum Erstellen einer Bindung enthält den Namen der Bindung, der die eindeutige Bindungs-ID enthält.

Probelaufmodus verwenden

Sie können die Zugriffsrichtlinie im Probelaufmodus binden. Wenn Sie den Probelaufmodus verwenden, können Ihre Dienstkonten weiterhin ohne Erzwingung auf Ressourcen zugreifen. Wenn Ihre Dienstkonten jedoch versuchen, auf eine Weise zuzugreifen, die gegen Zugriffsrichtlinien verstößt, werden die Verstöße in Cloud-Audit-Logs protokolliert.

Zugriffsrichtlinien im Probelaufmodus binden

gcloud

Wenn Sie Zugriffsrichtlinien im Probelaufmodus binden möchten, ersetzen Sie den Parameter --level durch --dry-run-level, der so formatiert ist:

--dry-run-level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

REST API

Wenn Sie Zugriffsrichtlinien im Probebetrieb binden möchten, erstellen Sie die Datei request.json mit folgendem Inhalt:

{
"principal": {
  "serviceAccountProjectNumber": "TARGET_PROJECT_NUMBER"
},
"dryRunAccessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
}

Ersetzen Sie Folgendes:

  • TARGET_PROJECT_NUMBER: die Projektnummer des Zielprojekts
  • POLICY_ID: die ID der Zugriffsrichtlinie
  • ACCESS_LEVEL_NAME: der Name der Zugriffsebene

Cloud-Audit-Logs prüfen

In diesem Abschnitt wird beschrieben, wie Sie in Cloud-Audit-Logs nach Zugriffsverweigerungen im Probelaufmodus für Ihr Dienstkonto suchen. Weitere Informationen zum Suchen nach Einträgen im Probelaufmodus in Cloud-Audit-Logs finden Sie unter Logs im Probelaufmodus ansehen.

Console

So rufen Sie Dienstkonto-Zugriffsverweigerungen im Dry-Run-Modus von Cloud-Audit-Logs über die Google Cloud Console auf:

Rufen Sie in der Google Cloud Console das und die Seite Log-Explorer auf:

Zum Log-Explorer

Wenn Sie diese Seite über die Suchleiste suchen, wählen Sie das Ergebnis mit der Zwischenüberschrift Logging aus.

  1. Wählen Sie in der Google Cloud -Console Ihr Projekt oder Ihre Organisation aus.

  2. Geben Sie im Feld „Logabfrage“ die folgende Abfrage ein:

    protoPayload.serviceName="contextawareaccess.googleapis.com"
    protoPayload.metadata.dryRunEvaluationResult:DENIED
    SEARCH("`SERVICE_ACCOUNT_NAME`")
    
  3. Wählen Sie in der Zeitraumauswahl einen vordefinierten relativen Zeitraum aus, z. B. Letzte 30 Minuten, Letzte Stunde oder Letzte 24 Stunden, oder geben Sie einen benutzerdefinierten Zeitraum an.

gcloud

So rufen Sie mit der gcloud CLI Verweigerungen des Dienstkonto-Zugriffs im Probelaufmodus von Cloud-Audit-Logs auf:

gcloud logging read \
'protoPayload.serviceName="contextawareaccess.googleapis.com" AND
 protoPayload.metadata.dryRunEvaluationResult:DENIED AND
 SEARCH("`SERVICE_ACCOUNT_NAME`")' \
  --organization=ORGANIZATION_ID

Ersetzen Sie Folgendes:

  • ORGANIZATION_ID: die ID der Organisation
  • SERVICE_ACCOUNT_NAME: der Name des Dienstkontos

Der Befehl gcloud logging read unterstützt das Flag --freshness, um Protokollierungsinformationen über relative Zeiträume hinweg aufzurufen. Wenn Sie dem Befehl beispielsweise --freshness=3h hinzufügen, können Sie Logeinträge im Probeausführungsmodus der letzten drei Stunden aufrufen.

Fehlerbehebung

In diesem Abschnitt wird beschrieben, wie Sie Probleme mit dem kontextsensitiven Zugriff für Dienstkonten beheben.

Allgemeine Fehlerbehebung

  1. Cloud-Audit-Logs prüfen

    Verwenden Sie die folgende Logabfrage und sehen Sie sich die Logeinträge an, um weitere Informationen zu erhalten.

    protoPayload.serviceName="contextawareaccess.googleapis.com"
    
  2. Sehen Sie sich den Ressourcennamen der Zugriffsebene an, den der kontextsensitive Zugriff meldet, wenn er Erzwingungsereignisse protokolliert.

  3. Achten Sie darauf, dass die Zugriffsebene eine Ressource auf Organisationsebene ist.

  4. Achten Sie darauf, dass die Zugriffsebene in Ihren Zugriffsrichtlinien auf Attributen basiert, die für Dienstkonten unterstützt werden.

  5. Prüfen Sie, ob die Zugriffsrichtlinie an das gewünschte Dienstkonto gebunden ist.

  6. Achten Sie darauf, dass die Identität Ihres Nutzers nicht durch eine Zugriffsrichtlinie eingeschränkt wird. Dies kann passieren, wenn eine Nutzeridentität Mitglied einer Google-Gruppe mit einer gebundenen Zugriffsrichtlinie ist. Diese Richtlinie kann den Nutzerzugriff einschränken und so den Anruffluss zum Dienstkonto verhindern.

  7. Wenden Sie sich an Ihren Sicherheitsadministrator.

Zugriff verweigert

Der Zugriff wird aus folgenden Gründen verweigert:

  • Sie haben die Zugriffsrichtlinie im Erzwingungsmodus und nicht im Probelaufmodus gebunden.

    Anstelle der Erzwingung können Sie den Probelaufmodus verwenden, damit Dienstkonten auf Ressourcen zugreifen und Erzwingungsereignisse protokollieren können, ohne den Zugriff auf Ressourcen tatsächlich zu verweigern. Außerdem können Sie die allgemeinen Anleitungen zur Fehlerbehebung befolgen.

  • Die Zugriffsebene muss aktualisiert werden, um weitere Quellen einzuschließen. Beispiel: Es wird eine IP-Adresse verwendet, die beim Erstellen der Zugriffsebene nicht angegeben wurde.

Nächste Schritte