Arbeitslasten mithilfe von Dienstkonten authentifizieren


Auf dieser Seite wird beschrieben, wie Sie mit Dienstkonten Anwendungen, die auf VM-Instanzen ausgeführt werden, die Authentifizierung bei Google Cloud APIs ermöglichen und den Zugriff auf Ressourcen autorisieren können.

Weitere Informationen zur Verwendung von Dienstkonten durch Compute Engine finden Sie in der Übersicht zu Dienstkonten.

Hinweis

Neues Dienstkonto erstellen

Sie können ein neues Dienstkonto mit IAM erstellen und einrichten. Nachdem Sie ein Konto erstellt haben, weisen Sie dem Konto eine oder mehrere IAM-Rollen zu und autorisieren Sie dann, dass eine VM-Instanz als dieses Dienstkonto ausgeführt wird.

Console

Um ein neues Dienstkonto zu erstellen:

  1. Erstellen Sie ein neues Dienstkonto wie unter Dienstkonto erstellen beschrieben.

  2. Ermitteln Sie die E-Mail-Adresse für das Dienstkonto. Sie benötigen die E-Mail-Adresse, um eine Instanz einzurichten, die als dieses Dienstkonto ausgeführt wird. Prüfen Sie die E-Mail-Adresse für das Dienstkonto in der Console:

    1. Rufen Sie die Seite Dienstkonten auf.

      Zur Seite „Dienstkonten“

    2. Wenn Sie dazu aufgefordert werden, wählen Sie ein Projekt.

    3. Suchen Sie das neue Dienstkonto und notieren Sie sich die angegebene E-Mail-Adresse.

    Üblicherweise wird die E-Mail-Adresse für das Dienstkonto von der Dienstkonto-ID im folgenden Format abgeleitet:

    [SERVICE-ACCOUNT-NAME]@[PROJECT_ID].iam.gserviceaccount.com

  3. Weisen Sie dem Dienstkonto IAM-Rollen zu. Wenn Sie dem Dienstkonto keine Rollen zuweisen, hat es keinen Zugriff auf Dienste. Eine vollständige Liste von IAM-Rollen finden Sie in der IAM-Dokumentation unter Informationen zu Rollen.

  4. Als Nächstes erstellen Sie eine Instanz, die als ein Dienstkonto ausgeführt werden soll. Folgen Sie der Anleitung zum Erstellen einer Instanz, die als Dienstkonto ausgeführt werden soll.

Terraform

Sie können zum Erstellen eines Dienstkontos die Ressource google_service_account verwenden.

resource "google_service_account" "default" {
  account_id   = "service-account-id"
  display_name = "Service Account"
}

Ersetzen Sie die Platzhalterwerte für die Attribute account_id und display_name.

Informationen zum Anwenden oder Entfernen einer Terraform-Konfiguration finden Sie unter Grundlegende Terraform-Befehle.

Neue Instanz erstellen, die als Dienstkonto ausgeführt werden soll

Nachdem Sie ein neues Dienstkonto erstellt haben, können Sie neue Instanzen der virtuellen Maschine erstellen, die als das Dienstkonto ausgeführt werden sollen. Befindet sich das Dienstkonto in einem anderen Projekt als die Instanzen, müssen Sie das Dienstkonto für eine Ressource in einem anderen Projekt konfigurieren.

Wenn Sie ein Dienstkonto einer bestehenden Instanz zuweisen oder es ändern möchten, lesen Sie stattdessen Dienstkonto- und Zugriffsbereiche für eine Instanz ändern.

Sie können mehrere Instanzen der virtuellen Maschine aktivieren, um das gleiche Dienstkonto zu verwenden, aber die Instanz einer virtuellen Maschine kann nur eine Dienstkonto-ID haben. Wenn Sie das gleiche Dienstkonto mehreren Instanzen der virtuellen Maschine zuweisen, wird jede nachfolgende Änderung am Dienstkonto die Instanzen, die dieses Dienstkonto verwenden, beeinflussen. Dies schließt alle Änderungen an IAM-Rollen ein, die Sie dem Dienstkonto gewährt haben. Wenn Sie zum Beispiel eine Rolle entfernen, werden alle Instanzen, die das Dienstkonto verwenden, die durch diese Rolle gewährten Berechtigungen verlieren.

Im Allgemeinen legen Sie einfach den Zugriffsbereich cloud-platform fest, um den Zugriff auf die meisten Cloud APIs zuzulassen, und weisen dann dem Dienstkonto nur relevante IAM-Rollen zu. Die Kombination aus den Zugriffsbereichen, die der VM-Instanz zugewiesen wurden, und den dem Dienstkonto zugewiesenen IAM-Rollen bestimmt den Umfang des Zugriffs, den ein Dienstkonto auf diese Instanz hat. Das Dienstkonto kann API-Methoden nur dann ausführen, wenn diese sowohl vom Zugriffsbereich als auch von den IAM-Rollen zugelassen werden.

Alternativ können Sie bestimmte Bereiche festlegen, die den Zugriff auf die entsprechenden API-Methoden erlauben, die der Dienst aufrufen wird. Das Aufrufen der Methode instances.insert erfordert beispielsweise eine Autorisierung des Bereichs https://www.googleapis.com/auth/compute oder https://www.googleapis.com/auth/cloud-platform sowie eine IAM-Rolle, die Zugriff auf diese Methode gewährt. Sie könnten den Bereich compute anstelle des Bereichs cloud-platform festlegen, der dann dem Dienst Zugriff zum Aufruf von Methoden in Compute Engine, jedoch nicht von API-Methoden außerhalb von Compute Engine gibt.

Sie können eine neue Instanz so einrichten, dass sie als Dienstkonto ausgeführt wird. Verwenden Sie hierzu die Google Cloud Console, die Google Cloud CLI oder gehen Sie direkt über die API.

Console

  1. Gehen Sie zur Seite Instanz erstellen.

    Zur Seite „Instanz erstellen“

  2. Geben Sie die VM-Details an

  3. Wählen Sie im Abschnitt Identität und API-Zugriff aus der Drop-down-Liste das Dienstkonto aus, das Sie verwenden möchten.

  4. Fahren Sie mit dem VM-Erstellungsprozess fort.

gcloud

Wenn Sie eine neue Instanz erstellen und sie als benutzerdefiniertes Dienstkonto über die Google Cloud CLI autorisieren möchten, geben Sie die E-Mail des Dienstkontos und die gewünschten Zugriffsbereiche für die Instanz an.

gcloud compute instances create [INSTANCE_NAME] \
    --service-account [SERVICE_ACCOUNT_EMAIL] \
    --scopes [SCOPES,...]

wobei

  • [SERVICE_ACCOUNT_EMAIL] ist die E-Mail-Adresse für das Dienstkonto, das Sie verwenden möchten. Beispiel: my-sa-123@my-project-123.iam.gserviceaccount.com. Wenn Sie die E-Mail-Adresse nicht kennen, finden Sie entsprechende Informationen im Abschnitt zum Beziehen einer E-Mail-Adresse für das Dienstkonto.
  • [INSTANCE_NAME] ist der Name der Instanz.
  • [SCOPES] ist eine durch Kommas getrennte Liste aller vollständigen Bereichs-URIs oder Bereichsaliasse, wie in der Beschreibung für das Flag --scopes angegeben.

Beispiel:

gcloud compute instances create example-vm \
    --service-account 123-my-sa@my-project-123.iam.gserviceaccount.com \
    --scopes https://www.googleapis.com/auth/cloud-platform

Die gcloud CLI bietet auch Bereichsaliasse anstelle der längeren Bereichs-URIs. Zum Beispiel wird der volle Zugriff auf Cloud Storage durch den Bereich https://www.googleapis.com/auth/devstorage.full_control gewährt. Der Alias für diesen Bereich ist storage-full.

Eine Liste der Bereiche und Bereichsaliasse finden Sie auf der Seite zu instances create in der Beschreibung für das Flag --scopes. In der Hilfe zum Befehl instances create werden diese Bereiche und Aliasse ebenfalls aufgeführt:

gcloud compute instances create --help

Geben Sie den Alias auf die gleiche Weise an wie beim normalen Bereichs-URI. Beispiel:

gcloud compute instances create [INSTANCE_NAME] \
    --service-account [SERVICE_ACCOUNT_EMAIL] \
    --scopes cloud-platform

Terraform

Wenn Sie eine neue Instanz einrichten möchten, die als Dienstkonto ausgeführt werden soll, können Sie die Ressource google_compute_instance verwenden.

resource "google_compute_instance" "default" {
  name         = "my-test-vm"
  machine_type = "n1-standard-1"
  zone         = "us-central1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }

  // Local SSD disk
  scratch_disk {
    interface = "SCSI"
  }

  network_interface {
    network = "default"

    access_config {
      // Ephemeral public IP
    }
  }

  service_account {
    # Google recommends custom service accounts with `cloud-platform` scope with
    # specific permissions granted via IAM Roles.
    # This approach lets you avoid embedding secret keys or user credentials
    # in your instance, image, or app code
    email  = google_service_account.default.email
    scopes = ["cloud-platform"]
  }
}

API

Richten Sie in der API eine Standardanfrage ein, um eine Instanz zu erstellen, und geben Sie dabei das Attribut serviceAccounts an. Rufen Sie die E-Mail-Adresse für Ihr Dienstkonto ab und fügen Sie sie im Attribut email zusammen mit den gewünschten Zugriffsbereichen für die Instanz ein.

POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances

{
  "machineType": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/machineTypes/[MACHINE_TYPE]",
  "name": "[INSTANCE_NAME]",
  "serviceAccounts": [
   {
    "email": "[SERVICE_ACCOUNT_EMAIL]",
    "scopes": ["https://www.googleapis.com/auth/cloud-platform"]
   }
  ],
  ...
}

Nachdem Sie eine Instanz zur Ausführung als Dienstkonto eingerichtet haben, kann eine auf der Instanz ausgeführte Anwendung eine der folgenden Authentifizierungsmethoden verwenden:

Anwendungen mithilfe der Anmeldedaten des Dienstkontos authentifizieren

Nachdem Sie festgelegt haben, dass eine Instanz als Dienstkonto ausgeführt werden soll, können Sie die Anmeldedaten des Dienstkontos zum Authentifizieren von Anwendungen verwenden, die in dieser Instanz ausgeführt werden.

Anwendungen mit einer Clientbibliothek authentifizieren

Clientbibliotheken können Standardanmeldedaten für Anwendungen zum Authentifizieren bei Google APIs verwenden und Anforderungen an diese APIs senden. Mit Standardanmeldedaten für Anwendungen können Anwendungen Anmeldedaten aus mehreren Quellen erhalten, sodass Sie Ihre Anwendung lokal testen und danach einer Compute Engine-Instanz bereitstellen können, ohne den Anwendungscode ändern zu müssen.

Informationen zum Einrichten von Standardanmeldedaten für Anwendungen finden Sie unter Anmeldedaten für Standardanmeldedaten für Anwendungen bereitstellen.

In diesem Beispiel wird die Python-Clientbibliothek verwendet, um eine Anfrage zum Auflisten der Buckets in einem Projekt zu authentifizieren und an die Cloud Storage API zu senden. In diesem Beispiel wird das folgende Verfahren angewendet:

  1. Rufen Sie die erforderlichen Anmeldedaten zur Authentifizierung für die Cloud Storage API ab und initialisieren Sie den Cloud Storage-Dienst mit der Methode build() und den Anmeldedaten.
  2. Listen Sie Buckets in Cloud Storage auf.

Sie können dieses Beispiel auf einer Instanz ausführen, die die Berechtigung zum Verwalten von Buckets in Cloud Storage hat.

import argparse
from typing import List

from google.cloud import storage

def create_client() -> storage.Client:
    """
    Construct a client object for the Storage API using the
    application default credentials.

    Returns:
        Storage API client object.
    """
    # Construct the service object for interacting with the Cloud Storage API -
    # the 'storage' service, at version 'v1'.
    # Authentication is provided by application default credentials.
    # When running locally, these are available after running
    # `gcloud auth application-default login`. When running on Compute
    # Engine, these are available from the environment.
    return storage.Client()

def list_buckets(client: storage.Client, project_id: str) -> List[storage.Bucket]:
    """
    Retrieve bucket list of a project using provided client object.

    Args:
        client: Storage API client object.
        project_id: name of the project to list buckets from.

    Returns:
        List of Buckets found in the project.
    """
    buckets = client.list_buckets()
    return list(buckets)

def main(project_id: str) -> None:
    client = create_client()
    buckets = list_buckets(client, project_id)
    print(buckets)

if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument("project_id", help="Your Google Cloud Project ID.")

    args = parser.parse_args()

    main(args.project_id)

Anwendungen direkt mit Zugriffstoken authentifizieren

Bei den meisten Anwendungen können Sie sich mit den Standardanmeldedaten für Anwendungen authentifizieren. Dabei werden Anmeldedaten gesucht und Tokens für Sie verwaltet. Wenn Sie für Ihre Anwendung jedoch ein OAuth2-Zugriffstoken angeben müssen, können Sie in Compute Engine ein Zugriffstoken von seinem Metadatenserver zur Verwendung in Ihrer Anwendung abrufen.

Es gibt verschiedene Möglichkeiten, wie Sie Zugriffstokens zur Authentifizierung Ihrer Anwendungen erhalten und verwenden können. Zum Beispiel können Sie curl verwenden, um eine einfache Anfrage zu erstellen, oder für mehr Flexibilität eine Programmiersprache wie Python nutzen.

cURL

So verwenden Sie curl, um ein Zugriffstoken anzufordern und eine Anfrage an eine API zu senden:

  1. Rufen Sie in der Instanz, in der Ihre Anwendung ausgeführt wird, ein Zugriffstoken vom Metadatenserver ab. Führen Sie dazu folgenden Befehl aus:

    $ curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
    -H "Metadata-Flavor: Google"

    Die Anfrage liefert eine Antwort ähnlich wie hier:

    {
          "access_token":"ya29.AHES6ZRN3-HlhAPya30GnW_bHSb_QtAS08i85nHq39HE3C2LTrCARA",
          "expires_in":3599,
          "token_type":"Bearer"
     }

    Bei API-Anfragen müssen Sie den Wert access_token und nicht die gesamte Antwort angeben. Wenn Sie den jq-Befehlszeilen-JSON-Prozessor installiert haben, können Sie mit dem folgenden Befehl den Zugriffstokenwert aus der Antwort extrahieren:

    $ ACCESS_TOKEN=`curl \
    "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
    -H "Metadata-Flavor: Google" | jq -r '.access_token'`
    
  2. Kopieren Sie den Wert des Attributs access_token aus der Antwort und verwenden Sie ihn, um Anfragen an die API zu senden. Die folgende Anfrage gibt beispielsweise eine Liste der Instanzen aus einer bestimmten Zone in Ihrem Projekt zurück:

    $ curl https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances \
    -H "Authorization":"Bearer [ACCESS_TOKEN]"
    

    wobei

    • [PROJECT_ID] ist die Projekt-ID für diese Anfrage.
    • [ZONE] ist die Zone, aus der Instanzen aufgelistet werden sollen.
    • [ACCESS_TOKEN] ist der Wert des Zugriffstokens, den Sie in Schritt 1 erhalten haben.

    Weitere Informationen zu den Parametern, die Sie in Ihrer Anfrage festlegen können, finden Sie in der Dokumentation Parameter.

Python

Dieses Beispiel zeigt, wie Sie ein Token anfordern, um in einer Python-Anwendung Zugriff auf die Cloud Storage API zu erhalten. In diesem Beispiel wird das folgende Verfahren angewendet:

  1. Fordern Sie ein Zugriffstoken aus dem Metadatenserver an.
  2. Extrahieren Sie das Zugriffstoken aus der Antwort des Servers.
  3. Verwenden Sie das Zugriffstoken, um eine Anfrage an Cloud Storage zu senden.
  4. Wenn die Anfrage erfolgreich war, druckt das Skript die Antwort.

import argparse

import requests

METADATA_URL = "http://metadata.google.internal/computeMetadata/v1/"
METADATA_HEADERS = {"Metadata-Flavor": "Google"}
SERVICE_ACCOUNT = "default"

def get_access_token() -> str:
    """
    Retrieves access token from the metadata server.

    Returns:
        The access token.
    """
    url = f"{METADATA_URL}instance/service-accounts/{SERVICE_ACCOUNT}/token"

    # Request an access token from the metadata server.
    r = requests.get(url, headers=METADATA_HEADERS)
    r.raise_for_status()

    # Extract the access token from the response.
    access_token = r.json()["access_token"]

    return access_token

def list_buckets(project_id: str, access_token: str) -> dict:
    """
    Calls Storage API to retrieve a list of buckets.

    Args:
        project_id: name of the project to list buckets from.
        access_token: access token to authenticate with.

    Returns:
        Response from the API.
    """
    url = "https://www.googleapis.com/storage/v1/b"
    params = {"project": project_id}
    headers = {"Authorization": f"Bearer {access_token}"}

    r = requests.get(url, params=params, headers=headers)
    r.raise_for_status()

    return r.json()

def main(project_id: str) -> None:
    """
    Retrieves access token from metadata server and uses it to list
    buckets in a project.

    Args:
        project_id: name of the project to list buckets from.
    """
    access_token = get_access_token()
    buckets = list_buckets(project_id, access_token)
    print(buckets)

if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument("project_id", help="Your Google Cloud project ID.")

    args = parser.parse_args()

    main(args.project_id)

Zugriffstoken verfallen schon nach kurzer Zeit. Der Metadatenserver behält die Zugriffstoken so lange im Cache, bis sie 5 Minuten Restzeit haben, bevor sie ablaufen. Sie können neue Tokens so oft Sie wollen anfordern, aber Ihre Anwendungen müssen ein gültiges Zugriffstoken haben, damit ihre API-Aufrufe erfolgreich sind.

Tools in einer Instanz mithilfe eines Dienstkontos authentifizieren

Einige Anwendungen könnten Befehle der Tools gcloud und gsutil verwenden, die standardmäßig in den meisten Compute Engine-Images enthalten sind. Diese Tools erkennen automatisch das Dienstkonto einer Instanz und entsprechende Berechtigungen, die dem Dienstkonto zugewiesen wurden. Insbesondere dann, wenn Sie dem Dienstkonto die richtigen Rollen zugewiesen haben, können Sie die Tools gcloud und gsutil Ihrer Instanz verwenden, ohne gcloud auth login verwenden zu müssen.

Diese Erkennung des Dienstkontos erfolgt automatisch und gilt nur für die Tools gcloud und gsutil, die in der Instanz enthalten sind. Wenn Sie neue Tools erstellen oder benutzerdefinierte Tools hinzufügen, müssen Sie die Anwendung mithilfe einer Clientbibliothek oder mithilfe von Zugriffstokens direkt in der Anwendung authentifizieren.

Wenn Sie die Vorteile einer automatischen Erkennung des Dienstkontos nutzen möchten, können Sie dem Dienstkonto die entsprechenden IAM-Rollen zuweisen und eine Instanz erstellen, die als Dienstkonto ausgeführt werden soll. Wenn Sie zum Beispiel einem Dienstkonto die Rolle roles/storage.objectAdmin zuweisen, kann das gsutil-Tool automatisch Cloud Storage-Objekte verwalten und abrufen.

Analog kann das gcloud compute-Tool Instanzen automatisch verwalten, wenn Sie roles/compute.instanceAdmin.v1 für das Dienstkonto aktivieren.

Dienstkonto und Zugriffsbereiche für eine Instanz ändern

Wenn Sie die VM als eine andere Identität ausführen möchten oder wenn Sie feststellen, dass die Instanz andere Bereiche benötigt, um die erforderlichen APIs aufzurufen, können Sie das Dienstkonto und die Zugriffsbereiche einer bestehenden Instanz ändern. Beispiel: Sie können Zugriffsbereiche ändern, um den Zugriff auf eine neue API zu gewähren, Sie können das Dienstkonto und die Zugriffsbereiche entfernen, um zu verhindern, dass eine VM auf Google Cloud-Dienste zugreift. Sie können auch eine VM so ändern, dass sie als ein Dienstkonto ausgeführt wird, das Sie anstelle des Compute Engine-Standarddienstkontos erstellt haben. Google empfiehlt jedoch, den Ressourcenzugriff für das Dienstkonto mit detaillierten IAM-Richtlinien statt mit Zugriffsbereichen zu steuern.

Um das Dienstkonto und die Zugriffsbereiche einer Instanz zu ändern, muss die Instanz vorübergehend gestoppt werden. Um Ihre Instanz zu beenden, lesen Sie die Dokumentation zum Beenden einer Instanz (nur auf Englisch verfügbar). Nachdem Sie das Dienstkonto oder die Zugriffsbereiche geändert haben, denken Sie an den Neustart der Instanz. Verwenden Sie eine der folgenden Methoden, um das Dienstkonto oder die Zugriffsbereiche der gestoppten Instanz zu ändern.

Console

  1. Rufen Sie die Seite VM-Instanzen auf.

    Zu „VM-Instanzen“

  2. Klicken Sie auf den Namen der VM-Instanz, für die Sie das Dienstkonto ändern möchten.

  3. Wenn die Instanz nicht beendet ist, klicken Sie auf Beenden. Warten Sie, bis die Instanz angehalten wurde.

  4. Klicken Sie anschließend auf Bearbeiten.

  5. Scrollen Sie nach unten bis zum Abschnitt Dienstkonto.

  6. Wählen Sie aus der Drop-down-Liste das Dienstkonto aus, das der Instanz zugewiesen werden soll.

    • Wenn Sie das Standarddienstkonto wählen, können Sie die Zugriffsbereiche in der Cloud Console ändern.
      • Wählen Sie zum Ändern von Bereichen im Abschnitt Zugriffsbereiche die Option Zugriff der einzelnen APIs festlegen und legen Sie die entsprechenden Bereiche je nach Ihren Anforderungen fest.
      • Wenn Sie nicht sicher sind, welche Zugriffsbereiche benötigt werden, wählen Sie Uneingeschränkten Zugriff auf alle Cloud APIs zulassen und schränken Sie den Zugriff dann durch IAM-Rollen für das Dienstkonto ein.
    • Wenn Sie ein anderes Dienstkonto auswählen, entspricht der Zugriffsbereich der VM standardmäßig dem Bereich cloud-platform. Sie können den Bereich mit der gcloud CLI oder der Compute Engine API ändern.
    • Weitere Informationen zum Festlegen von Zugriffsbereichen finden Sie unter Best Practices.
  7. Klicken Sie auf Speichern, um die Änderungen zu speichern.

gcloud

Verwenden Sie den Befehl instances set-service-account und geben Sie den Instanznamen, die E-Mail-Adresse für das Dienstkonto und die gewünschten Bereiche an. Weitere Informationen zum Festlegen von Zugriffsbereichen finden Sie unter Best Practices.

gcloud compute instances set-service-account [INSTANCE_NAME] \
   [--service-account [SERVICE_ACCOUNT_EMAIL] | --no-service-account] \
   [--no-scopes | --scopes [SCOPES,...]]

wobei

  • [SERVICE_ACCOUNT_EMAIL] ist die E-Mail-Adresse für das Dienstkonto, das Sie verwenden möchten. Beispiel: my-sa-123@my-project-123.iam.gserviceaccount.com.
  • [INSTANCE_NAME] ist der Name der Instanz.
  • [SCOPES] ist eine durch Kommas getrennte Liste aller vollständigen Bereichs-URIs oder Bereichsaliasse, wie in der Beschreibung für das Flag --scopes angegeben. Wenn Sie alle Bereiche für die Instanz entfernen möchten, verwenden Sie stattdessen das Flag --no-scopes.

Der folgende Befehl weist zum Beispiel einer Instanz namens „example-instance“ das Dienstkonto my-sa-123@my-project-123.iam.gserviceaccount.com zu und legt Zugriffsbereiche in der Instanz fest, um Schreib- und Lesezugriff auf Compute Engine und Lesezugriff auf Cloud Storage zuzulassen:

gcloud compute instances set-service-account example-instance \
   --service-account my-sa-123@my-project-123.iam.gserviceaccount.com \
   --scopes compute-rw,storage-ro

API

Führen Sie in der API eine POST-Anfrage an die Methode setServiceAccount aus.

https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]/setServiceAccount

wobei

  • [PROJECT_ID] ist die Projekt-ID für diese Anfrage.
  • [ZONE] ist die Zone, zu der die Instanz gehört.
  • [INSTANCE_NAME] ist der Name der Instanz.

Geben Sie im Anfragetext die E-Mail-Adresse des Dienstkontos und die gewünschten Bereichs-URIs für die Instanz an. Weitere Informationen zum Festlegen von Zugriffsbereichen finden Sie unter Best Practices.

{
  "email": "[SERVICE_ACCOUNT_EMAIL]",
  "scopes": [
    "[SCOPE_URI]",
    "[SCOPE_URI]",
    ...
  ]
}

Die folgende Anfrage verwendet zum Beispiel die E-Mail-Adresse my-sa-123@my-project-123.iam.gserviceaccount.com für das Dienstkonto und legt als Bereiche Cloud Storage und BigQuery fest:

{
  "email": "my-sa-123@my-project-123.iam.gserviceaccount.com",
  "scopes": [
    "https://www.googleapis.com/auth/bigquery",
    "https://www.googleapis.com/auth/devstorage.read_only"
  ]
}

E-Mail-Adresse für das Dienstkonto beziehen

Um ein Dienstkonto zu identifizieren, benötigen Sie die E-Mail-Adresse für das Dienstkonto. Um eine E-Mail-Adresse für ein Dienstkonto zu erhalten, haben Sie folgende Optionen:

Console

  1. Rufen Sie die Seite Dienstkonten auf.

    Zur Seite „Dienstkonten“

  2. Wenn Sie dazu aufgefordert werden, wählen Sie ein Projekt. Auf der Seite der Dienstkonten sind alle Dienstkonten für das Projekt und deren E-Mail-Adressen aufgelistet.

gcloud

Verwenden Sie auf Ihrem lokalen Rechner den Befehl gcloud compute instances describe:

gcloud compute instances describe [INSTANCE_NAME] --format json
{
      ...
      "serviceAccounts":[
         {
            "email":"123845678986-compute@developer.gserviceaccount.com",
            "scopes":[
               "https://www.googleapis.com/auth/devstorage.full_control"
            ]
         }
      ]
      ...
   }

Wenn die Instanz kein Dienstkonto verwendet, erhalten Sie eine Antwort ohne das Attribut serviceAccounts.

Metadatenserver

Fragen Sie den Metadatenserver aus der Instanz selbst heraus ab. Stellen Sie eine Anfrage an http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/:

user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/" \
-H "Metadata-Flavor: Google"

Wenn Sie beim Erstellen der Instanz ein oder mehrere Dienstkonten aktiviert haben, gibt der Befehl curl eine Ausgabe wie diese hier zurück:

123845678986-compute@developer.gserviceaccount.com/
default/

Wenn die Instanz kein Dienstkonto verwendet, erhalten Sie eine leere Antwort.

API

Senden Sie eine Anfrage an die Dienstkonten-API.

Compute Engine-Standarddienstkonto verwenden

Wenn Sie mit dem Compute Engine-Standarddienstkonto vertraut sind und die Anmeldeinformationen vom Standarddienstkonto nutzen möchten, anstatt neue Dienstkonten zu erstellen, dann können Sie dem Standarddienstkonto IAM-Rollen zuweisen.

Alle Compute Engine-Instanzen können standardmäßig als das Standarddienstkonto ausgeführt werden. Wenn Sie eine Instanz mithilfe der Google Cloud CLI oder der Cloud Console erstellen und keine Dienstkontospezifikation angeben, wird der Instanz das Standarddienstkonto zugewiesen.

Bevor Sie dem Standarddienstkonto IAM-Rollen zuweisen, beachten Sie Folgendes:

  • Wenn Sie dem Standarddienstkonto eine IAM-Rolle zuweisen, dann betrifft dies alle Instanzen, die als Standarddienstkonto ausgeführt werden. Wenn Sie dem Standarddienstkonto zum Beispiel die Rolle roles/storage.objectAdmin zuweisen, erhalten alle Instanzen mit den erforderlichen Zugriffsbereichen, die als Standarddienstkonto ausgeführt werden, die durch die Rolle roles/storage.objectAdmin gewährten Berechtigungen. Auch wenn Sie den Zugriff durch das Weglassen von bestimmten Rollen einschränken, wirkt sich das auf alle Instanzen aus, die als Standarddienstkonto ausgeführt werden.

  • Sie müssen die Berechtigung „Projektbearbeiter“ für das Dienstkonto widerrufen. Das Standarddienstkonto wird den Projekten standardmäßig als Projektbearbeiter hinzugefügt. Zum Verwenden von IAM-Rollen müssen Sie die Berechtigung „Projektbearbeiter“ widerrufen.

Wenn Sie sich nicht sicher sind, ob Sie dem Standarddienstkonto IAM-Rollen zuweisen können, erstellen Sie stattdessen ein neues Dienstkonto.

Befolgen Sie diese Anleitungen, um dem Standarddienstkonto eine IAM-Rolle zuzuweisen:

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

    Seite „IAM“

  2. Wenn Sie dazu aufgefordert werden, wählen Sie ein Projekt.

  3. Suchen Sie nach dem Dienstkonto mit dem Namen Compute Engine-Standarddienstkonto.

  4. Maximieren Sie in der Spalte Rolle(n) das Drop-down-Menü für das Compute Engine-Standarddienstkonto.

  5. Entfernen Sie die Zugriffsrechte des Bearbeiters und speichern Sie Ihre Änderungen.

  6. Weisen Sie dann dem Dienstkonto IAM-Rollen zu.

Alle VM-Instanzen, die derzeit als Standarddienstkonto ausgeführt werden, haben nun entsprechend den IAM-Rollen, die Sie dem Konto zugewiesen haben, Zugriff auf andere Google Cloud APIs.

Wenn Sie eine neue Instanz einrichten möchten, die als Standarddienstkonto ausgeführt werden soll, gehen Sie so vor:

Console

  1. Gehen Sie zur Seite Instanz erstellen.

    Zur Seite „Instanz erstellen“

  2. Geben Sie die VM-Details an

  3. Wählen Sie im Abschnitt Identität und API-Zugriff die Option Compute Engine-Standarddienstkonto aus der Drop-down-Liste Dienstkonto.

  4. Fahren Sie mit dem VM-Erstellungsprozess fort.

gcloud

So erstellen Sie eine neue Instanz und autorisieren sie, sodass sie unter Verwendung des Standarddienstkontos vollen Zugriff auf alle Google Cloud-Dienste hat:

gcloud compute instances create [INSTANCE_NAME] \
     --scopes cloud-platform

API

Erstellen Sie in der API eine Standardanfrage, um eine Instanz zu erstellen, und geben Sie dabei das Attribut serviceAccounts an. Rufen Sie Ihre Standarddienstkonto-ID ab und fügen Sie sie als email des Dienstkontos ein. Danach legen Sie einen oder mehrere Bereiche im Attribut scopes fest.

POST https://compute.googleapis.com/compute/v1/projects/zones/[ZONE]/instances

{
  "machineType": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/machineTypes/[MACHINE_TYPE]",
  "name": "[INSTANCE_NAME]",
  "serviceAccounts": [
   {
    "email": "[DEFAULT_SERVICE_ACCOUNT_EMAIL]",
    "scopes": ["https://www.googleapis.com/auth/cloud-platform"]
   }
  ],
  ...
}

Best Practices

  • Google empfiehlt, dass jede VM-Instanz, die Google-APIs aufrufen muss, als ein Dienstkonto ausgeführt werden sollte, und zwar mit den Mindestberechtigungen zur Ausführung des Jobs dieser VM.
  • Folgen Sie dieser Anleitung, um Dienstkonten für Ihre VMs zu konfigurieren:

    1. Erstellen Sie ein neues Dienstkonto, anstatt das Compute Engine-Standarddienstkonto zu verwenden.
    2. Weisen Sie diesem Dienstkonto nur die IAM-Rollen für die Ressourcen zu, die es benötigt.
    3. Konfigurieren Sie die VM so, dass sie als das neue Dienstkonto ausgeführt wird, das Sie erstellt haben.
    4. Weisen Sie Ihrer VM den https://www.googleapis.com/auth/cloud-platform-Bereich zu, um den Zugriff auf die meisten Google Cloud APIs zu ermöglichen, sodass die IAM-Berechtigungen der VM vollständig durch die IAM-Rollen bestimmt werden, die Sie dem Dienstkonto der VM gewährt haben. Das Dienstkonto kann nur API-Methoden ausführen, die sowohl vom Zugriffsbereich als auch von den spezifischen IAM-Rollen des Dienstkontos zugelassen werden.
  • Beschränken Sie die Berechtigungen von Dienstkonten und prüfen Sie regelmäßig Ihre Dienstkontoberechtigungen, um sie aktuell zu halten.

  • Beim Löschen von Dienstkonten ist Vorsicht geboten. Achten Sie darauf, dass das Dienstkonto, das Sie löschen möchten, von Ihren kritischen Anwendungen nicht mehr verwendet wird. Wenn Sie unsicher sind, ob ein Dienstkonto verwendet wird, empfehlen wir Ihnen, das Dienstkonto zu deaktivieren, anstatt es zu löschen. Deaktivierte Dienstkonten lassen sich wieder aktivieren, wenn sie noch benötigt werden.

  • Reduzieren Sie die Sicherheitsrisiken für Ihr Dienstkonto. Weitere Informationen finden Sie unter Best Practices für die Arbeit mit Dienstkonten.

Nächste Schritte

Überzeugen Sie sich selbst

Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie einfach ein Konto, um die Leistungsfähigkeit von Compute Engine 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.

Compute Engine kostenlos testen