Dienstkonten für Instanzen erstellen und aktivieren

Anwendungen, die auf Ihren Instanzen ausgeführt werden, können Google Cloud APIs über ein Dienstkonto autorisieren und mit ihnen interagieren. Über Dienstkonten mit den erforderlichen Compute Engine-IAM-Rollen kann Ihr Anwendungscode bestimmte API-Anfragen ausführen.

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

Hinweise

Neues Dienstkonto erstellen

Sie können ein neues Dienstkonto mithilfe von Cloud 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 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. Überprüfen Sie die E-Mail-Adresse für das Dienstkonto in der Console:

    1. Rufen Sie in der Cloud 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 abgeleitet und hat das folgende Format:

    [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 VM-Instanzen 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, verlieren alle Instanzen, die das Dienstkonto verwenden, die durch diese Rolle gewährten Berechtigungen.

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

Console

  1. Öffnen Sie in der Cloud Console die Seite VM-Instanzen.

    Zur Seite "VM-Instanzen"

  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, diese als benutzerdefiniertes Dienstkonto auszuführen, 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 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 dann 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 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 cloud-platform fest. Die Kombination aus den Zugriffsbereichen und den dem Dienstkonto zugewiesenen IAM-Rollen bestimmt, welchen 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. 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. Sie könnten den Bereich compute anstelle des Bereichs cloud-platform festlegen, der dann den Dienst autorisiert, Methoden in Compute Engine aufzurufen, jedoch nicht API-Methoden außerhalb von Compute Engine.

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

{
  "machineType": "https://compute.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 für Anwendungen zum Authentifizieren bei Google APIs und zum Senden von Anfragen an diese APIs verwenden. Über Standardanmeldedaten für Anwendungen können Anwendungen Anmeldedaten aus mehreren Quellen abrufen, sodass Sie Ihre Anwendung lokal testen und sie danach auf 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 das Cloud SDK authentifizieren. Wenn Ihre Anwendung auf 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 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

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 ein OAuth2-Zugriffstoken anfordern und es direkt verwenden, ohne eine Clientbibliothek zu nutzen oder das gcloud- oder das gsutil-Tool zu verwenden. 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, auf 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 gibt eine Antwort ähnlich wie hier zurück:

    {
          "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://compute.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 in Schritt 1 erhalten haben.

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

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, gibt das Skript die Antwort aus.

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://storage.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 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. 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 ausgeführt wird, 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. 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 aus 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 die Instanz effektiv daran hindern, auf irgendeinen Google Cloud-Dienst 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 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

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 für das Dienstkonto 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 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 in der Cloud 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 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 Service Accounts 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 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. Um IAM-Rollen verwenden zu können, 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. Rufen Sie in der Cloud Console die IAM-Seite auf.

    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 "Bearbeiter" 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. Öffnen Sie in der Cloud Console die Seite VM-Instanzen.

    Zur Seite "VM-Instanzen"

  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-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://compute.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 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.

Nächste Schritte