Dienstkonten für Instanzen erstellen und aktivieren

Anwendungen, die auf Ihren Instanzen ausgeführt werden, können Google Cloud Platform APIs über ein Dienstkonto autorisieren und mit diesen interagieren. Dienstkonten mit den erforderlichen IAM-Rollen (Identity and Access Management) ermöglichen Ihrem Anwendungscode, bestimmte API-Anfragen auszuführen.

In der Dokumentation zu Dienstkonten erfahren Sie mehr darüber.

Vorbereitung

Neues Dienstkonto erstellen

Sie können ein neues Dienstkonto mithilfe von Google Cloud Identity and Access Management (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.

So erstellen Sie ein neues Dienstkonto:

  1. Erstellen Sie ein neues Dienstkonto, wie in der Dokumentation für IAM-Dienstkonten 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. Überprüfen Sie die E-Mail-Adresse für das Dienstkonto in der Console:

    1. Rufen Sie in der GCP Console die Seite "Dienstkonten" auf.

      Zur Seite "Dienstkonten"

    2. Wenn Sie dazu aufgefordert werden, wählen Sie ein Projekt aus.
    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.

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. 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.

Sie können eine neue Instanz so einrichten, dass sie als Dienstkonto ausgeführt wird. Verwenden Sie hierzu die Google Cloud Platform Console, das gcloud-Befehlszeilentool oder die API.

Console

  1. Wechseln Sie in der GCP Console zur Seite VM-Instanzen.

    Die Seite VM-Instanzen aufrufen

  2. Klicken Sie auf Instanz erstellen.
  3. Füllen Sie auf der Seite Neue Instanz erstellen die Eigenschaften für Ihre Instanz aus.
  4. Im Abschnitt Identität und API-Zugriff wählen Sie aus der Drop-down-Liste das Dienstkonto aus, das Sie verwenden möchten.
  5. Klicken Sie auf Erstellen, um die Instanz zu erstellen.

gcloud

Wenn Sie mit dem gcloud-Befehlszeilentool eine neue Instanz erstellen und autorisieren möchten, die als benutzerdefiniertes Dienstkonto ausgeführt wird, geben Sie die E-Mail-Adresse für das Dienstkonto und die gewünschten Zugriffsbereiche für diese Instanz an. Im Allgemeinen legen Sie einfach den Zugriffsbereich der cloud-platform fest. 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 der IAM-Rolle zugelassen werden.

Alternativ können Sie auch bestimmte Bereiche festlegen, die den Zugriff auf die jeweiligen 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 den Dienst autorisiert, Methoden in Compute Engine aufzurufen, jedoch nicht API-Methoden außerhalb von Compute Engine.

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

Dabei gilt:

  • [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

Das gcloud-Tool bietet auch Bereichsaliasse anstelle der längeren Bereichs-URIs. Zum Beispiel wird der volle Zugriff auf Google 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

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. Im Allgemeinen legen Sie einfach den Zugriffsbereich der cloud-platform fest. Die Kombination aus den Zugriffsbereichen und den dem Dienstkonto zugewiesenen IAM-Rollen bestimmt, wie viel Zugriff ein Dienstkonto auf diese Instanz hat. Das Dienstkonto kann API-Methoden nur dann ausführen, wenn diese sowohl vom Zugriffsbereich als auch von der IAM-Rolle zugelassen werden.

Alternativ können Sie bestimmte Bereiche festlegen, die den Zugriff auf die entsprechenden API-Methoden erlauben, die der Dienst aufrufen wird. Zum Beispiel erfordert der Aufruf der Methode instances.insert die Autorisierung des Bereichs https://www.googleapis.com/auth/compute oder https://www.googleapis.com/auth/cloud-platform. Sie könnten den Bereich compute anstelle des Bereichs cloud-platform festlegen, der den Dienst autorisiert, Methoden in Compute Engine aufzurufen, jedoch nicht API-Methoden außerhalb von Compute Engine.

POST https://www.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": "[SERVICE_ACCOUNT_EMAIL]",
    "scopes": ["https://www.googleapis.com/auth/cloud-platform"]
   }
  ],
  ...
}

Nachdem Sie eine Instanz zur Ausführung als Dienstkonto eingerichtet haben, können Sie die Anmeldedaten des Dienstkontos innerhalb einer Instanz auf verschiedene Arten 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 der Anwendung zum Authentifizieren mit Google APIs verwenden und Anforderungen an diese APIs senden. Die Standardanmeldedaten der Anwendung gestatten es Anwendungen, die Anmeldedaten aus mehreren Quellen zu erhalten, sodass Sie Ihre Anwendung lokal testen und sie danach einer Compute Engine-Instanz bereitstellen können, ohne dass der Anwendungscode geändert werden muss. Während Sie Ihre Anwendung lokal entwickeln, kann sich die Anwendung über eine Umgebungsvariable oder die Google Cloud SDK authentifizieren. Wenn Ihre Anwendung in einer Instanz ausgeführt wird, kann sie zum Authentifizieren das Dienstkonto verwenden, das in der Instanz aktiviert wurde.

In diesem Beispiel wird die Python-Clientbibliothek zum Authentifizieren und zum Stellen einer Anfrage an die Cloud Storage API verwendet, um die Buckets in einem Projekt aufzulisten. 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 in einer Instanz ausführen, die die Berechtigung zum Verwalten von Buckets in Google Cloud Storage hat.


import argparse

import googleapiclient.discovery

def create_service():
    # 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 googleapiclient.discovery.build('storage', 'v1')

def list_buckets(service, project_id):
    buckets = service.buckets().list(project=project_id).execute()
    return buckets

def main(project_id):
    service = create_service()
    buckets = list_buckets(service, 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

Für einige Anwendungen müssen Sie möglicherweise einen OAuth2-Zugriffstoken anfordern und ihn direkt verwenden, ohne eine Clientbibliothek zu nutzen oder die Tools gcloud oder gsutil zu verwenden. Es gibt verschiedene Möglichkeiten, wie Sie Zugriffstoken zur Authentifizierung Ihrer Anwendung erhalten und verwenden können. Zum Beispiel können Sie curl verwenden, um eine einfache Anfrage zu erstellen oder eine Programmiersprache wie Python für mehr Flexibilität zu 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"
     }
  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://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances \
    -H "Authorization":"Bearer [ACCESS_TOKEN]"
    

    Dabei gilt:

    • [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 nach 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 Zugriff auf die Google Cloud Storage API in einer Python-Anwendung 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 bei Google Cloud Storage zu starten.
  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():
    url = '{}instance/service-accounts/{}/token'.format(
        METADATA_URL, SERVICE_ACCOUNT)

    # 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, access_token):
    url = 'https://www.googleapis.com/storage/v1/b'
    params = {
        'project': project_id
    }
    headers = {
        'Authorization': 'Bearer {}'.format(access_token)
    }

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

    return r.json()

def main(project_id):
    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 60 Sekunden 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 aus den 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 anwenden 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, dann kann das gsutil-Tool automatisch Google Cloud Storage-Objekte verwalten und abrufen.

Wenn Sie roles/compute.instanceAdmin.v1 für das Dienstkonto aktivieren, kann das gcloud compute-Tool auf ähnliche Art Instanzen automatisch verwalten.

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 einen anderen Satz von Bereichen für die erforderlichen APIs aufrufen muss, können Sie das Dienstkonto und die Zugriffsbereiche einer bestehenden Instanz ändern. Sie können zum Beispiel die Zugriffsbereiche ändern, um den Zugriff auf eine neue API zu gewähren, oder eine Instanz ändern, sodass sie anstelle des Compute Engine-Standarddienstkontos als ein Dienstkonto läuft, das Sie erstellt haben.

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 (nur auf Englisch verfügbar). Verwenden Sie eine der folgenden Methoden, um das Dienstkonto oder die Zugriffsbereiche der gestoppten Instanz zu ändern.

Console

  1. Rufen Sie in Compute Engine die Seite "VM-Instanzen" auf.

    Zur Seite "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 im Drop-down-Menü das gewünschte Dienstkonto aus.
  7. Zum Ändern von Bereichen legen Sie im Abschnitt Zugriffsbereiche die entsprechenden Bereiche für Ihre Anforderungen fest. Geben Sie als Best Practice nur die Zugriffsbereiche an, die die VM-Instanz benötigt. 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 ein.
  8. 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. Sie können auch das Dienstkonto und die Zugriffsbereiche aus einer Instanz entfernen und damit effektiv die Instanz daran hindern, auf alle Dienste der Google Cloud Platform zuzugreifen:

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

Dabei gilt:

  • [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 einen Schreib-Lese-Zugriff auf Compute Engine und einen Nur-Lese-Zugriff auf Google 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

Stellen Sie in der API eine POST-Anfrage an die Methode setServiceAccount:

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

Dabei gilt:

  • [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.

{
  "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 des Dienstkontos und legt als Bereiche Google Cloud Storage und Google 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"
  ]
}

Eine 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 in der GCP Console die Seite "Dienstkonten" auf.

    Zur Seite "Dienstkonten"

  2. Wenn Sie dazu aufgefordert werden, wählen Sie ein Projekt aus. 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 die Property serviceAccounts.

Metadatenserver

Stellen Sie eine Suchanfrage an den Metadatenserver aus der Instanz selbst heraus. 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 eine oder mehrere Dienstkonten aktiviert haben, dann liefert der Befehl curl eine Ausgabe wie diese hier:

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 mit dem gcloud-Befehlszeilentool oder der GCP 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, dann erhalten allen Instanzen, die als Standarddienstkonto mit den erforderlichen Zugriffsbereichen ausgeführt werden, ihre Berechtigungen über die Rolle roles/storage.objectAdmin. 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. Um IAM-Rollen verwenden zu können, müssen Sie die Berechtigung "Projektbearbeiter" widerrufen.

Wenn Sie nicht sicher sind, ob Sie dem Standarddienstkonto IAM-Rollen zuweisen möchten, dann sollten Sie stattdessen ein neues Dienstkonto erstellen.

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

  1. Wechseln Sie in der GCP Console zur IAM-Seite.

    Zur Seite "IAM"

  2. Wenn Sie dazu aufgefordert werden, wählen Sie ein Projekt aus.
  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 Platform APIs.

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

Console

  1. Wechseln Sie in der GCP Console zur Seite VM-Instanzen.

    Die Seite VM-Instanzen aufrufen

  2. Klicken Sie auf Instanz erstellen.
  3. Füllen Sie auf der Seite Neue Instanz erstellen die Eigenschaften für Ihre Instanz aus.
  4. Im Abschnitt Identität und API-Zugriff wählen Sie das Compute Engine-Standarddienstkonto aus der Drop-down-Liste aus.
  5. Klicken Sie auf Erstellen, um die Instanz zu erstellen.

gcloud

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

gcloud compute instances create [INSTANCE_NAME] \
     --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 Ihre Standarddienstkonto-ID ab und fügen Sie sie als email des Dienstkontos ein. Danach legen Sie einen oder mehrere Bereiche in der scopes-Property fest.

POST https://www.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

Im Allgemeinen empfiehlt Google, dass jede Instanz, die eine Google-API aufrufen muss, als ein Dienstkonto ausgeführt werden sollte, und zwar mit den Mindestberechtigungen, die erforderlich sind, damit diese Instanz ihren Job erledigt. In der Praxis bedeutet dies, dass Sie die Dienstkonten für Ihre Instanzen mit dem folgenden Verfahren konfigurieren sollten:

  1. Erstellen Sie ein neues Dienstkonto, anstatt das Compute Engine-Standarddienstkonto zu verwenden.
  2. Weisen Sie diesem Dienstkonto nur IAM-Rollen für die Ressourcen zu, die es benötigt.
  3. Konfigurieren Sie die Instanz zur Ausführung als Dienstkonto.
  4. Weisen Sie der Instanz den Bereich https://www.googleapis.com/auth/cloud-platform zu, um vollständigen Zugriff auf alle Google Cloud APIs zu ermöglichen, sodass die IAM-Berechtigungen der Instanz vollständig durch die IAM-Rollen des Dienstkontos festgelegt werden.

Gewähren Sie nicht mehr Zugriffsberechtigungen als notwendig und überprüfen Sie regelmäßig Ihre Dienstkontoberechtigungen, um sicherzustellen, dass sie aktuell sind.

Weitere Informationen

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...

Compute Engine-Dokumentation