IAM-Bedingungen verwenden

Mit IAM Conditions können Sie eine bedingte, attributbasierte Zugriffssteuerung für Google Cloud-Ressourcen einschließlich Cloud SQL-Instanzen definieren und erzwingen. Weitere Informationen zu IAM Conditions finden Sie auf der Seite Übersicht über IAM Conditions.

Einführung

In Cloud SQL können Sie den bedingten Zugriff anhand folgender Attribute erzwingen:

  • Datums-/Uhrzeitattribute: Wird verwendet, um den temporären (ablaufenden), geplanten oder zeitlich begrenzten Zugriff auf Cloud SQL-Ressourcen festzulegen. Beispielsweise können Sie einem Nutzer den Zugriff auf eine Datenbankinstanz bis zu einem bestimmten Datum erlauben. Sie können Datums-/Uhrzeitattribute auf jeder Ebene der Ressourcenhierarchie verwenden. Weitere Informationen finden Sie unter Temporären Zugriff konfigurieren.
  • Ressourcenattribute: Dienen zum Konfigurieren des bedingten Zugriffs basierend auf einem Tag, einem Ressourcennamen, einem Ressourcentyp oder einem Ressourcendienstattribut. In Cloud SQL können Sie die Attribute von Datenbankinstanzen verwenden, um den bedingten Zugriff zu konfigurieren. Beispielsweise können Sie einem Nutzer nur Zugriff auf Instanzen mit einem bestimmten Tag gewähren. Weitere Informationen finden Sie unter Ressourcenbasierten Zugriff konfigurieren.

Dies ist unter anderem in folgenden Fällen hilfreich:

  • Nutzern den Aufbau einer Verbindung zu bestimmten Instanzen erlauben.

  • Nutzer können Instanzen mit bestimmten Präfixen oder Suffixen erstellen (z. B. "Test").

  • Zugriff auf Sicherungsvorgänge für Testinstanzen beschränken

  • Nutzern erlauben, Entwicklungs- und Testinstanzen, aber keine Produktionsinstanzen zu löschen.

  • Nutzern an bestimmten Tagen oder zu bestimmten Zeiten die Ausführung administrativer Vorgänge erlauben.

Nutzern den Aufbau einer Verbindung zu bestimmten Instanzen erlauben

Angenommen, Sie möchten einem Nutzer oder Dienstkonto die Berechtigung erteilen, nur eine Verbindung zu einer bestimmten Cloud SQL-Instanz herzustellen. Sie können eine IAM-Bedingung in die IAM-Richtlinienbindung aufnehmen, die diesem Konto die Berechtigungen einer Cloud SQL-Rolle gewährt.

Standardmäßig erhalten Mitglieder der vordefinierten Cloud SQL-Clientrolle (roles/cloudsql.client), die die Berechtigung cloudsql.instances.connect enthält, die Berechtigung, eine Verbindung zu allen Cloud SQL-Instanzen in einem Projekt herzustellen. Durch Einfügen einer IAM-Bedingung in die Richtlinienbindung können Sie die Berechtigung auf eine benannte Instanz beschränken.

Console

Dieses Beispiel zeigt, wie Sie die vorhandene IAM-Bindung für das Projekt ändern, um einem Dienstkonto eine Cloud SQL-Clientrolle für eine bestimmte Instanz zuzuweisen.

In diesem Beispiel werden folgende Variablen verwendet:

  • PROJECT_ID: Ihr Google Cloud-Projekt.
  • INSTANCE_ID: Der Name der Instanz, der Sie Zugriff gewähren möchten.

  1. Öffnen Sie in der Google Cloud Console die Seite IAM.

    IAM aufrufen

  2. Klicken Sie auf Add.
  3. Geben Sie im Eingabefeld Neue Mitglieder die E-Mail-Adresse des Dienstkontos ein.
  4. Klicken Sie auf die Drop-down-Liste Rolle und wählen Sie die Rolle Cloud SQL-Client aus.
  5. Klicken Sie auf Bedingung hinzufügen.
  6. Geben Sie einen Titel und eine Beschreibung ein.
  7. Wählen Sie den Tab Bedingungseditor.
  8. Im Abschnitt Bedingungserstellung:
    • Geben Sie für Bedingungstyp – Ressource – Name den Wert projects/PROJECT_ID/instances/INSTANCE_ID ein.
    • Achten Sie darauf, dass die AND-Bedingung ausgewählt ist.
    • Wählen Sie für Bedingungstyp – Ressource – Dienst den Wert sqladmin.googleapis.com.
  9. Klicken Sie auf Speichern, um die Bedingung zu speichern.
  10. Klicken Sie auf Speichern, um die Richtlinie zu speichern.

gcloud

In diesem Beispiel wird gezeigt, wie Sie die vorhandene IAM-Richtlinienbindung für das Projekt ändern, um einem bestimmten Dienstkonto die Rolle "Cloud SQL-Client" nur für eine bestimmte Instanz zuzuweisen.

In diesem Beispiel werden folgende Variablen verwendet:

  • PROJECT_ID: Ihr Google Cloud-Projekt.
  • INSTANCE_ID: Der Name der Instanz, auf die Sie Zugriff gewähren möchten.
  • SERVICE_ACCOUNT_EMAIL: Die vollständige E-Mail-Adresse des Dienstkontos, dessen Zugriff Sie bearbeiten möchten.

  1. Rufen Sie die vorhandenen IAM-Richtlinienbindungen ab und geben Sie sie in die Datei bindings.json aus:
  2. gcloud projects get-iam-policy PROJECT_ID --format=json > bindings.json
    
  3. Fügen Sie der bindings.json-Datei folgende bedingte Rollenbindung hinzu:
    {
      "bindings": [
        {
          "role": "roles/cloudsql.client",
          "members": [
            "serviceAccount:SERVICE_ACCOUNT_EMAIL"
          ],
          "condition": {
            "expression": "resource.name == 'projects/PROJECT_ID/instances/INSTANCE_ID'
              && resource.service == 'sqladmin.googleapis.com'"
          }
        }
      ],
      "etag": "BwWKmjvelug=",
      "version": 3
    }
    
  4. Aktualisieren Sie die IAM-Richtlinie mit der neuen bindings.json-Datei.
    gcloud projects set-iam-policy PROJECT_ID bindings.json
    

Terraform

Damit Nutzer eine Verbindung zu bestimmten Instanzen herstellen können, verwenden Sie eine Terraform-google_iam_policy-Datenressource sowie eine google_project_iam_policy-Terraform-Ressource.

data "google_iam_policy" "sql_iam_policy" {
  binding {
    role = "roles/cloudsql.client"
    members = [
      "serviceAccount:${google_project_service_identity.gcp_sa_cloud_sql.email}",
    ]
    condition {
      expression  = "resource.name == 'projects/${data.google_project.project.project_id}/instances/${google_sql_database_instance.default.name}' && resource.type == 'sqladmin.googleapis.com/Instance'"
      title       = "created"
      description = "Cloud SQL instance creation"
    }
  }
}

resource "google_project_iam_policy" "project" {
  project     = data.google_project.project.project_id
  policy_data = data.google_iam_policy.sql_iam_policy.policy_data
}

Änderungen anwenden

Führen Sie die Schritte in den folgenden Abschnitten aus, um Ihre Terraform-Konfiguration auf ein Google Cloud-Projekt anzuwenden.

Cloud Shell vorbereiten

  1. Rufen Sie Cloud Shell auf.
  2. Legen Sie das Google Cloud-Standardprojekt fest, auf das Sie Ihre Terraform-Konfigurationen anwenden möchten.

    Sie müssen diesen Befehl nur einmal pro Projekt und in jedem beliebigen Verzeichnis ausführen.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Umgebungsvariablen werden überschrieben, wenn Sie in der Terraform-Konfigurationsdatei explizite Werte festlegen.

Verzeichnis vorbereiten

Jede Terraform-Konfigurationsdatei muss ein eigenes Verzeichnis haben (auch als Stammmodul bezeichnet).

  1. Erstellen Sie in Cloud Shell ein Verzeichnis und eine neue Datei in diesem Verzeichnis. Der Dateiname muss die Erweiterung .tf haben, z. B. main.tf. In dieser Anleitung wird die Datei als main.tf bezeichnet.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Wenn Sie einer Anleitung folgen, können Sie den Beispielcode in jedem Abschnitt oder Schritt kopieren.

    Kopieren Sie den Beispielcode in das neu erstellte main.tf.

    Kopieren Sie optional den Code aus GitHub. Dies wird empfohlen, wenn das Terraform-Snippet Teil einer End-to-End-Lösung ist.

  3. Prüfen und ändern Sie die Beispielparameter, die auf Ihre Umgebung angewendet werden sollen.
  4. Speichern Sie die Änderungen.
  5. Initialisieren Sie Terraform. Dies ist nur einmal für jedes Verzeichnis erforderlich.
    terraform init

    Fügen Sie optional die Option -upgrade ein, um die neueste Google-Anbieterversion zu verwenden:

    terraform init -upgrade

Änderungen anwenden

  1. Prüfen Sie die Konfiguration und prüfen Sie, ob die Ressourcen, die Terraform erstellen oder aktualisieren wird, Ihren Erwartungen entsprechen:
    terraform plan

    Korrigieren Sie die Konfiguration nach Bedarf.

  2. Wenden Sie die Terraform-Konfiguration an. Führen Sie dazu den folgenden Befehl aus und geben Sie yes an der Eingabeaufforderung ein:
    terraform apply

    Warten Sie, bis Terraform die Meldung „Apply complete“ anzeigt.

  3. Öffnen Sie Ihr Google Cloud-Projekt, um die Ergebnisse aufzurufen. Rufen Sie in der Google Cloud Console Ihre Ressourcen in der Benutzeroberfläche auf, um sicherzustellen, dass Terraform sie erstellt oder aktualisiert hat.

Änderungen löschen

So löschen Sie das Projekt:

  1. Um den Löschschutz zu deaktivieren, setzen Sie in der Terraform-Konfigurationsdatei das Argument deletion_protection auf false.
    deletion_protection =  "false"
  2. Wenden Sie die aktualisierte Terraform-Konfiguration an. Führen Sie dazu den folgenden Befehl aus und geben Sie yes an der Eingabeaufforderung ein:
    terraform apply
  1. Entfernen Sie Ressourcen, die zuvor mit Ihrer Terraform-Konfiguration angewendet wurden, indem Sie den folgenden Befehl ausführen und yes an der Eingabeaufforderung eingeben:

    terraform destroy

Zugriff auf Sicherungsvorgänge für Testinstanzen beschränken

Angenommen, die Topologie Ihres Dienstes ist so konfiguriert, dass alle Testinstanzen das Präfix test (z. B. test-instance-1) und alle Produktionsinstanzen das Präfix prod (z. B. prod-instance-1) haben.

Sie können den Zugriff auf Sicherungsvorgänge für Ihre Nutzer oder ein Dienstkonto auf Ihre Testinstanzen beschränken. Beschränken des Zugriffs umfasst das Einschränken von CREATE-, GET-, LIST- und DELETE-Vorgängen auf Sicherungen Ihrer Testinstanzen.

Console

  1. Öffnen Sie in der Google Cloud Console die Seite IAM.

    IAM aufrufen

  2. Klicken Sie auf den Tab PRINCIPALS.
  3. Suchen Sie die E-Mail-Adresse oder das Dienstkonto des Nutzers (Hauptkonto), auf das Sie den Zugriff beschränken möchten.
  4. Klicken Sie rechts neben dem Hauptkonto auf das Symbol Hauptkonto bearbeiten. Dieses Symbol wird als Stiftsymbol angezeigt.
  5. Klicken Sie im Dialogfeld Berechtigungen bearbeiten auf WEITERE ROLLE HINZUFÜGEN.
  6. Geben Sie im Feld Filter des nachfolgenden Dialogfelds Cloud SQL Admin ein. Wählen Sie dann die Rolle Cloud SQL-Administrator aus.

    Das Dialogfeld Berechtigungen bearbeiten ist aktiv und die Rolle Cloud SQL-Administrator wird jetzt im Dialogfeld angezeigt.

  7. Klicken Sie rechts neben der Rolle Cloud SQL-Administrator auf den Link Bedingung hinzufügen.
  8. Geben Sie im Dialogfeld Bedingung bearbeiten die folgenden Informationen an:
    1. Geben Sie im Feld Titel einen Namen für die Bedingung ein, die Sie hinzufügen, um den Zugriff auf Sicherungsvorgänge für Testinstanzen zu beschränken. Zum Beispiel können Sie Folgendes eingeben: Limit access to backup operations
    2. Klicken Sie auf den Tab BEDINGUNG BEARBEITEN und fügen Sie die folgende Bedingung hinzu:

      resource.type == "sqladmin.googleapis.com/BackupRun" &&
      resource.name.startsWith("projects/PROJECT_ID/instances/test")
          

  9. Klicken Sie auf SPEICHERN.
  10. Klicken Sie im Dialogfeld Berechtigungen bearbeiten auf SPEICHERN.

gcloud

In diesem Beispiel werden folgende Variablen verwendet:

  • PROJECT_ID: Ihr Google Cloud-Projekt.
  • USER_EMAIL: E-Mail-Adresse des Nutzers.
  • SERVICE_ACCOUNT_EMAIL: Die vollständige E-Mail-Adresse des Dienstkontos, dessen Zugriff Sie einschränken möchten.

  1. Schränken Sie den Bereich der Rolle cloudsql.admin für einen Nutzer mit der E-Mail-Adresse USER_EMAIL ein.

    Der Bereich der Rolle ist auf Ressourcen beschränkt, deren Ressourcennamen mit projects/PROJECT_ID/instances/test beginnen.

    gcloud projects add-iam-policy-binding PROJECT_ID \ --member=user:USER_EMAIL \
    --role=roles/cloudsql.admin \
    --condition=expression="resource.type == \"sqladmin.googleapis.com/BackupRun\" && resource.name.startsWith(\"projects/PROJECT_ID/instances/test-instance-1\")",title="test"
        
  2. OR

  3. Schränken Sie den Bereich der Rolle cloudsql.admin für einen Nutzer ein, der mit einem Dienstkonto von SERVICE_ACCOUNT_EMAIL angemeldet ist.

    gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
    --role=roles/cloudsql.admin \
    --condition=expression="resource.type == \"sqladmin.googleapis.com/BackupRun\" && resource.name.startsWith(\"projects/PROJECT_ID/instances/test-instance-1\")",title="test"
        

Nutzern erlauben, Testinstanzen zu löschen, jedoch keine Produktionsinstanzen

Angenommen, Sie möchten einem Dienstkonto das Löschen von Testinstanzen erlauben, jedoch keine Produktionsinstanzen. Dazu können Sie Tags verwenden und die folgenden beiden Richtlinienbindungen für das Dienstkonto hinzufügen:

  • Eine Cloud SQL-Bearbeiterrolle für die Ressource, der Sie die Rolle zugewiesen haben, und ihre Nachfolger. Wenn die Rolle für das Projekt zugewiesen ist, gilt sie für alle Instanzen im Projekt. Die Rolle „Cloud SQL-Bearbeiter“ enthält nicht die Berechtigung cloudsql.instances.delete.
  • Eine Cloud SQL-Administratorrolle für Instanzen mit dem Tag test.

Console

  1. Öffnen Sie in der Google Cloud Console die Seite IAM.

    IAM aufrufen

  2. Klicken Sie auf Add.
  3. Geben Sie im Feld Neue Mitglieder die E-Mail-Adresse des Dienstkontos ein.
  4. Klicken Sie auf die Drop-down-Liste Rolle und wählen Sie die Rolle Cloud SQL-Bearbeiter aus. Fügen Sie dieser Rolle nichts weiter hinzu.
  5. Klicken Sie auf Speichern, um die Bedingung zu speichern.
  6. Klicken Sie auf das Menü Rolle für dasselbe Konto und wählen Sie die Rolle Cloud Cloud SQL-Administrator aus.
  7. Klicken Sie auf Bedingung hinzufügen.
  8. Geben Sie einen Titel und eine Beschreibung ein.
  9. Wählen Sie den Tab Bedingungseditor.
  10. Im Abschnitt Bedingungserstellung:
    • Geben Sie als Bedingungstyp – Ressource – Name einen Namen für die Bedingung ein.
    • Wählen Sie für Bedingungstyp – Ressource – Dienst den Wert sqladmin.googleapis.com.
    • Geben Sie unter Bedingungstyp – Ressource – Tag den Namen des Tag-Schlüssel-Namespaces ein. In diesem Beispiel ist der Operator matches und der Wert 815471563813/env/test.
  11. Klicken Sie auf Speichern, um die Bedingung zu speichern.
  12. Klicken Sie auf Speichern, um die Richtlinie zu speichern.

gcloud

In diesem Beispiel werden folgende Variablen verwendet:

  • PROJECT_ID: Ihr Google Cloud-Projekt.
  • INSTANCE_ID: Ihre Cloud SQL-Instanz.
  • REGION: Die Region, in der sich Ihre Cloud SQL-Instanz befindet.
  • ORGANIZATION_ID: ID der Organisation, die die übergeordnete Ressource für diesen Tag-Schlüssel sein soll. Beispiel: 12345678901. Informationen zum Abrufen Ihrer Organisations-ID finden Sie unter Organisationen erstellen und verwalten.
  • SERVICE_ACCOUNT_EMAIL: Die vollständige E-Mail-Adresse des Dienstkontos, dessen Zugriff Sie bearbeiten möchten.

  1. Erstellen Sie einen Tag-Schlüssel mit dem Namen „env“ mit den Tag-Werten „prod“ und „test“. Weitere Informationen finden Sie unter Neues Tag erstellen und definieren.
    gcloud alpha resource-manager tags keys create env \
    --parent=organizations/ORGANIZATION_ID
    gcloud alpha resource-manager tags values create prod \
    --parent=env
    gcloud alpha resource-manager tags values create test \
    --parent=env
        
  2. Hängen Sie das Tag „env“ mit dem Wert „test“ an die Cloud SQL-Instanzen der Testumgebung an. Weitere Informationen finden Sie auf der Seite Cloud SQL-Tags.
  3. gcloud alpha resource-manager tags bindings create \
    --tag-value=test \
    --parent=//sqladmin.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID \
    --location=REGION
      
  4. Rufen Sie die vorhandenen IAM-Richtlinienbindungen ab und geben Sie sie in die Datei bindings.json aus:
    gcloud projects get-iam-policy PROJECT_ID --format=json >> bindings.json
    
  5. Fügen Sie der Datei bindings.json die folgenden bedingten Bindungen hinzu:
    {
      "bindings": [
        {
          "role": "roles/cloudsql.editor",
          "members": [
              "serviceAccount:SERVICE_ACCOUNT_EMAIL"
            ]
        },
        {
          "role": "roles/cloudsql.admin",
          "members": [
              "serviceAccount:SERVICE_ACCOUNT_EMAIL"
            ],
          "condition": {
            "expression": "resource.matchTag('ORGANIZATION_ID/env', 'test')"
          }
        }
      ],
      "etag": "BwWKmjvelug="
      "version": 3
    }
    
  6. Aktualisieren Sie die IAM-Richtlinienbindungen mit der neuen bindings.json-Datei.
    gcloud projects set-iam-policy PROJECT_ID bindings.json