Verstehen von Servicekonten

Jun 8, 2021
admin

Hintergrund

Ein Servicekonto ist ein spezieller Typ eines Google-Kontos, das einen nicht-menschlichen Nutzer repräsentiert, der sich authentifizieren und für den Zugriff auf Daten in Google-APIs autorisiert werden muss.

Typischerweise werden Servicekonten in folgenden Szenarien verwendet:

  • Ausführen von Arbeitslasten auf virtuellen Maschinen (VMs).
  • Ausführen von Arbeitslasten auf lokalen Workstations oder Rechenzentren, dieGoogle APIs aufrufen.
  • Ausführen von Workloads, die nicht an den Lebenszyklus eines menschlichen Nutzers gebunden sind.

Ihre Anwendung übernimmt die Identität des Servicekontos, um Google-APIs aufzurufen, sodass die Nutzer nicht direkt involviert sind.

Verwalten von Dienstkonten

Wenn Sie sich entschieden haben, dass Sie ein Dienstkonto benötigen, können Sie sich die folgenden Fragen stellen, um zu verstehen, wie Sie das Dienstkonto verwenden werden:

  • Auf welche Ressourcen kann das Dienstkonto zugreifen?
  • Welche Berechtigungen benötigt das Servicekonto?
  • Wo wird der Code, der die Identität des Servicekontos annimmt, ausgeführt – in der Google Cloud oder vor Ort?

Verwenden Sie das folgende Flussdiagramm, um die Antworten auf die obigen Fragen herauszufinden:

Flussdiagramm für Dienstkonten

Beachten Sie, dass Dienstkonten sowohl als Quelle als auch als Identität betrachtet werden können.

Wenn Sie das Dienstkonto als Identität betrachten, können Sie dem Dienstkonto eine Rolle gewähren, die ihm den Zugriff auf eine Ressource (z. B. ein Projekt) ermöglicht.

Wenn Sie das Dienstkonto als Ressource betrachten, können Sie anderen Benutzern Rollen gewähren, um auf das Dienstkonto zuzugreifen oder es zu verwalten.

Zugriff auf Dienstkonten gewähren

Die Gewährung des Zugriffs auf ein Dienstkonto für den Zugriff auf eine Ressource ist ähnlich wie die Gewährung des Zugriffs auf jede andere Identität. Wenn Sie zum Beispiel eine Anwendung auf der Compute Engine laufen lassen und möchten, dass die Anwendung nur Zugriff auf das Erstellen von Objekten im Cloud-Speicher hat. Sie können ein Dienstkonto für die Anwendung erstellen und ihm die Rolle „Storage Object Creator“ zuweisen.

Flussdiagramm für Dienstkonten

Erfahren Sie mehr über das Zuweisen von Rollen an alle Arten von Mitgliedern, einschließlich Dienstkonten.

Dienstkonten im Auge behalten

Wenn Sie im Laufe der Zeit immer mehr Dienstkonten erstellen, verlieren Sie möglicherweise den Überblick darüber, welches Dienstkonto für welchen Zweck verwendet wird.

Der Anzeigename eines Dienstkontos ist eine gute Möglichkeit, zusätzliche Informationen über das Dienstkonto zu erfassen, z. B. den Zweck des Dienstkontos oder eine Kontaktperson für das Konto. Bei neuen Servicekonten können Sie den Anzeigenamen beim Anlegen des Servicekontos eingeben. Für bestehende Dienstkonten verwenden Sie die Methode serviceAccounts.update(), um den Anzeigenamen zu ändern.

Identifizierung nicht verwendeter Dienstkonten

Nicht verwendete Dienstkonten stellen ein unnötiges Sicherheitsrisiko dar, daher empfehlen wir, nicht verwendete Dienstkonten zu deaktivieren und dann zu löschen, wenn Sie sicher sind, dass Sie sie nicht mehr benötigen. Sie können die folgenden Methoden verwenden, um ungenutzte Dienstkonten zu identifizieren:

  • Einblicke in Dienstkonten zeigen Ihnen, welche Dienstkonten in Ihrem Projekt in den letzten 90 Tagen nicht authentifiziert wurden.
  • Metriken zur Nutzung von Dienstkonten ermöglichen es Ihnen zu überprüfen, wann ein Dienstkonto zuletzt verwendet wurde.

Löschen und Neuanlegen von Dienstkonten

Es ist möglich, ein Dienstkonto zu löschen und anschließend ein neues Dienstkonto mit demselben Namen zu erstellen.

Wenn Sie ein Dienstkonto löschen, werden seine Rollenbindungen nicht sofort gelöscht. Stattdessen wird in den Rollenbindungen das Dienstkonto mit dem Präfixdeleted: aufgeführt. Ein Beispiel finden Sie unter Richtlinien mit gelöschten Mitgliedern.

Wenn Sie ein neues Dienstkonto mit dem gleichen Namen wie ein kürzlich gelöschtes Dienstkonto erstellen, können die alten Bindungen noch vorhanden sein; sie gelten jedoch nicht für das neue Dienstkonto, obwohl beide Konten die gleiche E-Mail-Adresse haben. Dieses Verhalten tritt auf, weil Dienstkonten bei der Erstellung eine eindeutige ID in der Identitäts- und Zugriffsverwaltung (IAM) erhalten. Intern werden alle Rollenbindungen über diese IDs und nicht über die E-Mail-Adresse des Dienstkontos zugewiesen. Daher gelten alle Rollenbindungen, die für ein gelöschtes Dienstkonto bestanden, nicht für ein neues Dienstkonto, das dieselbe E-Mail-Adresse verwendet.

Wenn Sie ein Dienstkonto mit einer Ressource verknüpfen, dann das Dienstkonto löschen und ein neues Dienstkonto mit demselben Namen erstellen, wird das neue Dienstkonto nicht mit der Ressource verknüpft.

Um dieses unerwartete Verhalten zu vermeiden, sollten Sie einen neuen, eindeutigen Namen für jedes Dienstkonto verwenden. Wenn Sie versehentlich ein Dienstkonto löschen, können Sie auch versuchen, das Dienstkonto wiederherzustellen, anstatt ein neues Dienstkonto zu erstellen.

Wenn Sie das ursprüngliche Dienstkonto nicht wiederherstellen können und ein neues Dienstkonto mit demselben Namen und denselben Rollen erstellen müssen, müssen Sie dem neuen Dienstkonto diese Rollen zuweisen. Weitere Informationen finden Sie unter Richtlinien mit gelöschten Mitgliedern.

Wenn das neue Dienstkonto mit denselben Ressourcen wie das ursprüngliche Dienstkonto verknüpft sein soll, führen Sie einen der folgenden Schritte aus:

  • Für Compute Engine-Instanzen können Sie das Dienstkonto, das mit der Instanz verknüpft ist, ändern, um das ursprüngliche Dienstkonto durch das neue Dienstkonto zu ersetzen.
  • Für alle anderen Ressourcen müssen Sie die vorhandene Ressource löschen, dann eine neue Ressource desselben Typs erstellen und das neue Dienstkonto zuordnen.

Berechtigungen für Dienstkonten

Dieser Abschnitt beschreibt häufige Szenarien für Berechtigungen, die Dienstkonten oder Benutzerkonten gewährt werden, die die Berechtigung haben, Dienstkonten zu verkörpern:

  • Dienstkonten ein Mindestmaß an Berechtigungen gewähren
  • Dienstkontenberechtigungen für häufige Szenarien

Dienstkonten ein Mindestmaß an Berechtigungen gewähren

Wie bei allen Arten von Mitgliedern sollten Sie dem Dienstkonto nur die Mindestmenge an Berechtigungen gewähren, die zum Erreichen seines Ziels erforderlich sind. Erfahren Sie mehr über das Gewähren von Rollen für alle Arten von Mitgliedern, einschließlich Dienstkonten.

Wenn Sie Benutzern Zugriffsrechte auf ein Dienstkonto gewähren, denken Sie daran, dass der Benutzer auf alle Ressourcen zugreifen kann, für die das Dienstkonto Berechtigungen hat. Daher ist es wichtig, die Berechtigungen Ihrer Dienstkonten sorgfältig zu konfigurieren, d. h. Sie müssen genau festlegen, wer in Ihrem Team als Dienstkonto agieren (oder sich als solches ausgeben) darf. Seien Sie besonders vorsichtig, wenn Sie Benutzern erlauben, sich als hochprivilegierte Servicekonten auszugeben, wie z. B. die Compute Engine- und App Engine-Standard-Servicekonten.

Benutzer mit IAM-Rollen zum Aktualisieren der App Engine- und Compute Engine-Instanzen (z. B. App Engine Deployer oder Compute Instance Admin) können effektiv Code als die Servicekonten ausführen, die zum Ausführen dieser Instanzen verwendet werden, und erhalten indirekt Zugriff auf alle Ressourcen, für die die Servicekonten Zugriff haben. In ähnlicher Weise kann der SSH-Zugriff auf eine Compute Engine-Instanz auch die Möglichkeit bieten, Code als diese Instanz auszuführen.

Dienstkontenberechtigungen für gängige Szenarien

Dienstkonten können in vielen verschiedenen Szenarien verwendet werden, und für jedes davon sind bestimmte Berechtigungen erforderlich. In diesem Abschnitt werden gängige Szenarien und die erforderlichen Berechtigungen beschrieben.

Dienstkonten an Ressourcen anhängen

Wenn Sie einen lang laufenden Auftrag starten möchten, der sich als Dienstkonto authentifiziert, müssen Sie ein Dienstkonto an die Ressource anhängen, die den Auftrag ausführen wird.

Berechtigungen:

  • Berechtigungen zum Erstellen der Ressource
  • iam.serviceAccounts.actAs

Um Rollen zu finden, die diese Berechtigungen enthalten, suchen Sie in der Rollenliste nach den Berechtigungen.

Es gibt mehrere verschiedene Google Cloud-Ressourcen, die langlaufende Jobs als Dienstkonto ausführen können. Einige Beispiele für diese Ressourcen sind:

  • Compute Engine VMs
  • App Engine Apps
  • Cloud Functions

Wenn Sie diese Ressourcen erstellen, haben Sie die Möglichkeit, ein Servicekonto anzuhängen. Dieses Dienstkonto fungiert als Identität der Ressource.

Um eine Ressource zu erstellen und ein Dienstkonto anzuhängen, benötigen Sie die Berechtigung, diese Ressource zu erstellen, und die Berechtigung, das Dienstkonto zu verkörpern, das Sie der Ressource zuordnen werden. Die Berechtigung, das Dienstkonto zu verkörpern, wird von jeder Rolle erteilt, die die Berechtigung iam.serviceAccounts.actAs enthält.

Nachdem Sie die Ressource erstellt und ihr ein Dienstkonto zugewiesen haben, können Sie einen lang laufenden Auftrag für die Ressource starten. Der Auftrag wird als das Dienstkonto ausgeführt, das der Ressource zugeordnet ist, und verwendet dieses Dienstkonto, um Anforderungen an Google Cloud-APIs zu autorisieren.

Weitere Informationen zum Anhängen von Dienstkonten an Ressourcen finden Sie unterAnhängen eines Dienstkontos an eine Ressource.

Direktes Impersonieren eines Servicekontos

Berechtigungen:

  • iam.serviceAccounts.getAccessToken
  • iam.serviceAccounts.signBlob
  • iam.serviceAccounts.signJwt
  • iam.serviceAccounts.implicitDelegation

Rollen:

  • roles/iam.serviceAccountTokenCreator (Service Account Token Creator)

Wenn die erforderlichen Berechtigungen erteilt wurden, kann ein Benutzer (oder Dienst) die Identität eines Dienstkontos in einigen häufigen Szenarien direkt übernehmen (oder behaupten).

Erstens kann der Benutzer mit Hilfe deriam.serviceAccounts.getAccessTokenBerechtigung und durch Aufruf dergenerateAccessToken()Methode kurzfristige Anmeldeinformationen für das Dienstkonto erhalten. Durch die Verwendung von Kurzzeit-Anmeldeinformationen kann ein Benutzer Befehle anGoogle Cloud senden und auf alle Ressourcen zugreifen, auf die das Servicekonto Zugriff hat. Mit diesem Fluss kann ein Benutzer beispielsweise das Kennzeichengcloud --impersonate-service-account verwenden, um sich als das Servicekonto auszugeben, ohne dass ein heruntergeladener externer Servicekontorschlüssel erforderlich ist.

Zweitens kann der Benutzer Artefakte erhalten, die mit dem von Google verwalteten privaten Schlüssel des Servicekontos signiert sind, indem er die Berechtigung iam.serviceAccounts.signBlob verwendet und entweder die MethodesignBlob() odersignJwt() aufruft. Der von Google verwaltete private Schlüssel wird immer treuhänderisch verwaltet und wird niemals direkt offengelegt. signBlob() ermöglicht das Signieren beliebiger Nutzdaten (z. B. von Cloud-Storage-signierten URLs), während signJwt() nur das Signieren wohlgeformter JWTs erlaubt.

Schließlich kann sich der Nutzer für das Dienstkonto ausgeben (oder behaupten), ohne jemals ein Credential für das Dienstkonto abzurufen. Dies ist ein fortgeschrittener Anwendungsfall und wird nur für den programmatischen Zugriff mit dergenerateAccessToken()Methode unterstützt. In Szenarien mit mindestens 3 Dienstkonten, nämlich A, B und C: Dienstkonto A kann ein Zugriffstoken für Dienstkonto C erhalten, wenn Dienstkonto A dieiam.serviceAccounts.implicitDelegation-Berechtigung für B und B die iam.serviceAccounts.getAccessToken-Berechtigung für C gewährt wird.

Erzeugen von OpenID Connect (OIDC) ID-Token

Berechtigungen:

  • iam.serviceAccounts.getOpenIdToken

Rollen:

  • roles/iam.serviceAccountTokenCreator (Service Account Token Creator)

Ein Nutzer (oder Dienst) kann einen OpenID Connect (OIDC)-kompatiblen JWT-Token generieren, der vom Google OIDC Provider (accounts.google.com) signierte JWT-Token generieren, das die Identität des Dienstkontos mit der iam.serviceAccounts.getOpenIdTokenErlaubnis darstellt.

Diese Token werden von den meisten Google-APIs nicht direkt akzeptiert, ohne dass Ihre Organisation eine zusätzliche Identitätsföderation einsetzt, um den Zugriff aufGoogle zu ermöglichen. Es gibt einige wenige Ausnahmen, z. B. Identity-Aware Proxy, das einen OIDC-basierten Zugriff auf nutzergeführte Anwendungen ermöglicht.

Generieren externer privater Schlüssel

Berechtigungen:

  • iam.serviceAccountKeys.create

Rollen:

  • roles/editor (Editor)
  • roles/iam.serviceAccountAdmin (Service Account Admin)

Ein Nutzer oder Dienst kann externes privates Schlüsselmaterial (RSA) generieren, das zur direkten Authentifizierung bei Google als Service Account verwendet werden kann. Dieses Schlüsselmaterial kann dann mit ADC-Bibliotheken (Application Default Credentials) oder mit demgcloud auth activate-service-accountBefehl verwendet werden. Jede Person, die Zugriff auf das Schlüsselmaterial erhält, hat dann vollen Zugriff auf alle Ressourcen, auf die das Dienstkonto Zugriff hat. Derartiges privates Schlüsselmaterial sollte mit größter Vorsicht behandelt werden und als weniger sicher angesehen werden, je länger das Material existiert. Daher ist das Rotieren von privatem Schlüsselmaterial entscheidend für die Aufrechterhaltung einer hohen Sicherheit.

Verwaltung von Dienstkontenschlüsseln

Es gibt zwei Arten von Dienstkontenschlüsseln:

  • von der Google Cloud verwaltete Schlüssel. Diese Schlüssel werden von Google Cloudservices wie App Engine und Compute Engine verwendet. Sie können nicht heruntergeladen werden und werden automatisch rotiert und maximal zwei Wochen lang zum Signieren verwendet. Der Rotationsprozess ist probabilistisch; die Verwendung des neuen Schlüssels wird über die Lebensdauer des Schlüssels allmählich ansteigen und abfallen. Es wird empfohlen, den öffentlichen Schlüsselsatz für ein Dienstkonto für höchstens 24 Stunden zwischenzuspeichern, um sicherzustellen, dass Sie immer Zugriff auf den aktuellen Schlüsselsatz haben.

  • Benutzerverwaltete Schlüssel. Diese Schlüssel werden von Benutzern erstellt, können heruntergeladen und verwaltet werden. Nachdem Sie sie aus dem Dienstkonto gelöscht haben, können Sie sie nicht mehr zur Authentifizierung verwenden.

Für benutzerverwaltete Schlüssel müssen Sie sicherstellen, dass Sie über Prozesse verfügen, die die Anforderungen an die Schlüsselverwaltung erfüllen, wie z. B.:

  • Schlüsselspeicherung
  • Schlüsselverteilung
  • Schlüsselwiderruf
  • Schlüsselrotation
  • Schutz der Schlüssel vor unbefugten Benutzern
  • Schlüsselwiederherstellung

Jede Person, die Zugriff auf einen gültigen privaten Schlüssel für ein Dienstkonto hat, kann über das Dienstkonto auf Ressourcen zugreifen. Beachten Sie, dass der Lebenszyklus des Zugangs des Schlüssels zum Dienstkonto (und damit der Daten, auf die das Dienstkonto Zugriff hat) unabhängig vom Lebenszyklus des Benutzers ist, der den Schlüssel heruntergeladen hat.

Raten Sie Entwicklern immer davon ab, Schlüssel in den Quellcode einzuchecken oder sie im Download-Verzeichnis ihrer Workstation zu belassen.

Um die Sicherheit von Schlüsseln zu erhöhen, befolgen Sie die folgenden Anweisungen:

  • Verwenden Sie die IAM-Servicekonto-API, um Ihre Servicekontoschlüssel automatisch zu rotieren. Sie können einen Schlüssel rotieren, indem Sie einen neuen Schlüssel erstellen, Anwendungen zur Verwendung des neuen Schlüssels umstellen und dann den alten Schlüssel löschen. Verwenden Sie die Methoden serviceAccount.keys.create() und serviceAccount.keys.delete() zusammen, um die Rotation zu automatisieren. Die von Google Cloud verwalteten Schlüssel werden etwa einmal pro Woche rotiert.

    • Verwenden Sie die Methode serviceAccount.keys.list(), um Servicekonten und Schlüssel zu überprüfen.

Verwenden von Servicekonten mit Compute Engine

Compute Engine-Instanzen müssen als Servicekonten ausgeführt werden, um auf andere Google Cloud-Ressourcen zugreifen zu können. Um sicherzustellen, dass Ihre Compute Engine-Instanzen sicherer sind, sollten Sie Folgendes beachten:

  • Sie können VMs im selben Projekt mit verschiedenen Servicekonten erstellen. Um das Servicekonto einer VM nach ihrer Erstellung zu ändern, verwenden Sie die Methodeinstances.setServiceAccount.

  • Sie können Servicekonten IAM-Rollen zuweisen, um festzulegen, worauf sie zugreifen können. In vielen Fällen werden Sie sich nicht mehr auf Scopes verlassen müssen. Dies hat den Vorteil, dass Sie die Berechtigungen des Dienstkontos einer VM ändern können, ohne die Instanz neu zu erstellen.

  • Da die Instanzen auf ihre Dienstkonten angewiesen sind, um auf die Google Cloud-Ressourcen zugreifen zu können, sollten Sie vermeiden, Dienstkonten zu löschen, wenn sie noch von laufenden Instanzen verwendet werden. Wenn Sie die Servicekonten löschen, können die Instanzen anfangen, ihre Operationen nicht mehr auszuführen.

Best Practices

  • Legen Sie fest, wer als Servicekonten agieren kann. Benutzer, die als Dienstkonto-Benutzer für ein Dienstkonto fungieren, können indirekt auf alle Ressourcen zugreifen, auf die das Dienstkonto Zugriff hat. Seien Sie daher vorsichtig, wenn Sie einem Benutzer die Rolle „Service Account User“ zuweisen.

  • Gewähren Sie dem Service Account nur die minimalen Berechtigungen, die zum Erreichen seines Ziels erforderlich sind. Erfahren Sie mehr über die Zuweisung von Rollen an alle Arten von Mitgliedern, einschließlich Dienstkonten.

  • Erstellen Sie Dienstkonten für jeden Dienst mit nur den für diesen Dienst erforderlichen Berechtigungen.

  • Verwenden Sie den Anzeigenamen eines Dienstkontos, um die Dienstkonten zu verfolgen. Wenn Sie ein Dienstkonto erstellen, geben Sie in den Anzeigenamen den Zweck des Dienstkontos ein.

  • Definieren Sie eine Namenskonvention für Ihre Dienstkonten.

  • Implementieren Sie Prozesse zur Automatisierung der Rotation von benutzerverwalteten Dienstkontoschlüsseln.

  • Nutzen Sie die Vorteile derIAM-Dienstkonto-API zur Implementierung der Schlüsselrotation.

  • Überprüfen Sie Servicekonten und Schlüssel entweder mit der MethodeserviceAccount.keys.list() oder der SeiteLogs Viewer in der Konsole.

  • Löschen Sie keine Servicekonten, die von laufenden Instanzen aufApp Engine oder Compute Engine verwendet werden, es sei denn, Sie möchten, dass diese Anwendungen den Zugriff auf das Servicekonto verlieren.

Probieren Sie es selbst aus

Wenn Sie neu bei Google Cloud sind, erstellen Sie ein Konto, um zu testen, wie unsere Produkte in realen Szenarien funktionieren. Neue Kunden erhalten außerdem kostenloses Guthaben im Wert von 300 US-Dollar, um Workloads auszuführen, zu testen und bereitzustellen.

Starten Sie kostenlos

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.