VPC Service Controls verwenden

VPC Service Controls ist ein Google Cloud-Feature, mit dem Sie einen sicheren Perimeter einrichten können, der vor Daten-Exfiltration schützt. In dieser Anleitung erfahren Sie, wie Sie VPC-Service Controls mit Cloud Functions verwenden können, um Ihre Funktionen noch sicherer zu machen.

Bekannte Einschränkungen bei dieser Einbindung finden Sie in der Dokumentation zu VPC Service Controls.

Einrichtung auf Organisationsebene

Um VPC Service Controls mit Cloud Functions zu verwenden, müssen Sie einen Dienstperimeter und Organisationsrichtlinien konfigurieren. Dies erfolgt auf Organisationsebene. Diese Einrichtung sorgt dafür, dass VPC Service Controls-Prüfungen erzwungen werden, wenn Cloud Functions verwendet wird. Außerdem können Entwickler so nur Funktionen bereitstellen, die VPC Service Controls entsprechen.

VPC Service Controls-Perimeter einrichten

Zum Einrichten eines Dienstperimeters benötigen Sie die Rollen Organisationsbetrachter (roles/resourcemanager.organizationViewer) und Access Context Manager-Bearbeiter (roles/accesscontextmanager.policyEditor).

In der Kurzanleitung zu VPC Service Controls sind folgende Schritte beschrieben:

  1. Dienstperimeter erstellen
  2. Dem Perimeter ein oder mehrere Projekte hinzufügen

  3. Beschränken Sie die Cloud Functions API.

Nach der Einrichtung Ihres Dienstperimeters werden alle Aufrufe der Cloud Functions API geprüft, um sicherzustellen, dass die Aufrufe aus dem gleichen Perimeter stammen.

Optional: Perimeterzugriff für Entwicklungsmaschinen aktivieren

Da VPC Service Controls-Prüfungen für die Cloud Functions API erzwungen werden, schlagen Aufrufe an die Cloud Functions API fehl, sofern sie nicht aus dem Dienstperimeter stammen. Wählen Sie eine der folgenden Optionen aus, um Funktionen mit der Cloud Functions API, mit der Cloud Functions-Benutzeroberfläche in der Cloud Console oder mit dem gcloud-Befehlszeilentool zu verwalten:

  • Einen Computer innerhalb des VPC Service Controls-Perimeters verwenden. Sie können beispielsweise eine Compute Engine-VM oder einen lokalen Computer verwenden, der per VPN mit Ihrem VPC-Netzwerk verbunden ist.

  • Funktionsentwicklern Zugriff auf den Perimeter gewähren. Sie können beispielsweise Zugriffsebenen erstellen, die den Perimeterzugriff anhand der IP-Adresse oder der Nutzeridentität ermöglichen. Weitere Informationen finden Sie unter Zugriff auf geschützte Ressourcen von außerhalb eines Perimeters zulassen.

Organisationsrichtlinien einrichten

Zum Verwalten von Organisationsrichtlinien müssen Sie die Rolle Administrator für Unternehmensrichtlinien (roles/orgpolicy.policyAdmin) haben.

Für Compliance mit VPC Service Controls und zum Schutz vor Daten-Exfiltration richten Sie die folgenden Organisationsrichtlinien ein, die die zulässigen Netzwerkeinstellungen für Cloud Functions im Dienstperimeter steuern.

Einstellungen für eingehenden Traffic beschränken

Die Organisationsrichtlinie cloudfunctions.allowedIngressSettings steuert die Einstellungen für eingehenden Traffic, die Entwickler für Cloud Functions verwenden dürfen. Legen Sie diese Organisationsrichtlinie so fest, dass Entwickler den Wert ALLOW_INTERNAL_ONLY verwenden müssen:

Console

  1. Rufen Sie in der Cloud Console die Richtlinienseite Einstellungen für eingehenden Traffic auf:

    Öffnen Sie die Seite „Organisationsrichtlinien“.

  2. Klicken Sie auf Bearbeiten.

  3. Wählen Sie auf der Seite Bearbeiten die Option Anpassen aus.

  4. Wählen Sie unter Richtlinienerzwingung die Option Ersetzen aus.

  5. Wählen Sie unter Richtlinienwerte die Option Benutzerdefiniert aus.

  6. Wählen Sie unter Richtlinientyp Zulassen aus.

  7. Geben Sie unter Benutzerdefinierte Werte ALLOW_INTERNAL_ONLY ein.

  8. Klicken Sie auf Speichern.

gcloud

Führen Sie den Befehl gcloud beta resource-manager org-policies allow aus:

gcloud beta resource-manager org-policies allow \
  cloudfunctions.allowedIngressSettings ALLOW_INTERNAL_ONLY \
  --organization ORGANIZATION_ID

ORGANIZATION_ID ist Ihre Organisations-ID.

Nach Einrichtung dieser Organisationsrichtlinie müssen alle Funktionen den Wert ALLOW_INTERNAL_ONLY für ihre Einstellungen für eingehenden Traffic verwenden. Dies bedeutet, dass HTTP-Funktionen nur Traffic entgegennehmen können, der von einem VPC-Netzwerk innerhalb des Dienstperimeters stammt. Funktionsbereitstellungen, die einen anderen Wert angeben, schlagen fehl.

VPC-Connector erforderlich

Die Organisationsrichtlinie cloudfunctions.requireVPCConnector legt fest, ob ein Connector für serverlosen VPC-Zugriff für Funktionen erforderlich ist. Legen Sie diese Organisationsrichtlinie so fest, dass diese Einschränkung erzwungen wird:

Console

  1. Rufen Sie in der Cloud Console die Richtlinienseite VPC-Connector erforderlich auf:

    Öffnen Sie die Seite „Organisationsrichtlinien“.

  2. Klicken Sie auf Bearbeiten.

  3. Wählen Sie auf der Seite Bearbeiten die Option Anpassen aus.

  4. Wählen Sie unter Erzwingung die Option An aus.

  5. Klicken Sie auf Speichern.

gcloud

Führen Sie den Befehl gcloud beta resource-manager org-policies enable-enforce aus:

gcloud beta resource-manager org-policies enable-enforce \
  cloudfunctions.requireVPCConnector \
  --organization ORGANIZATION_ID

ORGANIZATION_ID ist Ihre Organisations-ID.

Nach Einrichtung dieser Organisationsrichtlinie müssen alle Funktionen einen Connector für serverlosen VPC-Zugriff verwenden. Funktionsbereitstellungen, die keinen Connector angeben, schlagen fehl.

Einstellungen für ausgehenden Traffic des VPC-Connectors beschränken

Die Organisationsrichtlinie cloudfunctions.allowedVpcConnectorEgressSettings steuert die Einstellungen für ausgehenden Traffic, die Entwickler für Cloud Functions verwenden dürfen. Legen Sie diese Organisationsrichtlinie so fest, dass nur der Wert ALL_TRAFFIC zulässig ist:

Console

  1. Rufen Sie in der Cloud Console die Richtlinienseite Erlaubte Einstellungen für ausgehenden Traffic des VPC-Connectors auf:

    Öffnen Sie die Seite „Organisationsrichtlinien“.

  2. Klicken Sie auf Bearbeiten.

  3. Wählen Sie auf der Seite Bearbeiten die Option Anpassen aus.

  4. Wählen Sie unter Richtlinienerzwingung die Option Ersetzen aus.

  5. Wählen Sie unter Richtlinienwerte die Option Benutzerdefiniert aus.

  6. Wählen Sie unter Richtlinientyp Zulassen aus.

  7. Geben Sie unter Benutzerdefinierte Werte ALL_TRAFFIC ein.

  8. Klicken Sie auf Speichern.

gcloud

Führen Sie den Befehl gcloud beta resource-manager org-policies allow aus:

gcloud beta resource-manager org-policies allow \
  cloudfunctions.allowedVpcConnectorEgressSettings ALL_TRAFFIC \
  --organization ORGANIZATION_ID

ORGANIZATION_ID ist Ihre Organisations-ID.

Nach Einrichtung dieser Organisationsrichtlinie müssen alle Funktionen den Wert ALL_TRAFFIC für ihre Einstellungen für ausgehenden Traffic verwenden. Dies bedeutet, dass die Funktionen den gesamten ausgehenden Traffic über Ihr VPC-Netzwerk weiterleiten müssen. Funktionsbereitstellungen, die einen anderen Wert angeben, schlagen fehl.

Einrichtung auf Projektebene

Für einzelne Projekte innerhalb des Dienstperimeters müssen Sie zusätzliche Konfigurationen vornehmen, um VPC Service Controls verwenden zu können.

VPC-Netzwerke konfigurieren

Wenn Sie auf Google APIs und Google-Dienste zugreifen und gleichzeitig die Risiken der Daten-Exfiltration minimieren möchten, sollten Anfragen an den eingeschränkten virtuellen IP-Bereich (VIP) gesendet werden: 199.36.153.4/30 (restricted.googleapis.com).

Führen Sie für jedes VPC-Netzwerk in einem Projekt die folgenden Schritte aus, um den ausgehenden Traffic mit Ausnahme des Traffics für den eingeschränkten VIP-Bereich zu blockieren:

  1. Konfigurieren Sie Firewallregeln, um zu verhindern, dass Daten das VPC-Netzwerk verlassen:

    • Erstellen Sie eine Regel, die ausgehenden Traffic blockiert.

    • Erstellen Sie eine Regel, die ausgehenden Traffic auf 199.36.153.4/30 an TCP-Port 443 zulässt. Achten Sie darauf, dass die Regel Priorität vor der Regel zum Blockieren des ausgehenden Traffics hat, die Sie soeben erstellt haben. Dadurch wird ausgehender Traffic ausschließlich auf den eingeschränkten VIP-Bereich zugelassen.

  2. Konfigurieren Sie DNS, um *.googleapis.com bis restricted.googleapis.com aufzulösen.

  3. Konfigurieren Sie das DNS mit einer A-Eintragszuordnung *.cloudfunctions.net zum IP-Bereich 199.36.153.4/30. Sie können hierfür Cloud DNS verwenden.

    gcloud dns managed-zones create ZONE_NAME \
    --visibility=private \
    --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_NAME/global/networks/default \
    --description=none \
    --dns-name=cloudfunctions.net
    
    gcloud dns record-sets transaction start --zone=ZONE_NAME
    
    gcloud dns record-sets transaction add --name=*.cloudfunctions.net. \
    --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
    --zone=ZONE_NAME \
    --ttl=300
    
    gcloud dns record-sets transaction execute --zone=ZONE_NAME
    

Nun können Anfragen, die aus dem VPC-Netzwerk stammen:

  • Sie können das VPC-Netzwerk nicht verlassen und ausgehender Traffic außerhalb des Dienstperimeters wird verhindert.
  • Sie können nur Google APIs und Google-Dienste erreichen, die VPC Service Controls prüfen, wodurch eine Daten-Exfiltration über Google APIs verhindert wird.

Dem Cloud Build-Dienstkonto Zugriff auf den Perimeter der VPC Service Controls gewähren

Cloud Functions verwendet Cloud Build, um Ihren Quellcode in einem ausführbaren Container zu erstellen. Um Cloud Functions mit VPC Service Controls verwenden zu können, müssen Sie das Cloud Build-Dienstkonto so konfigurieren, dass es Zugriff auf Ihren Dienstperimeter hat:

Suchen Sie nach dem Namen des Dienstkontos.

Node 8 und Go 1.11

Da der Build im Mandantenprojekt ausgeführt wird, müssen Sie die folgende Problemumgehung verwenden:

  1. Stellen Sie eine Funktion in Ihrem Projekt bereit. Verwenden Sie die Standardeinstellung in der Google Cloud Console:

    Funktion erstellen

  2. Warten Sie, bis die Bereitstellung fehlschlägt. Klicken Sie dann in der Liste auf den Funktionsnamen, um zur Seite Funktionsdetails zu gelangen.

  3. Die Fehlermeldung "Bereitstellungsfehler" wird angezeigt. Sie beginnt mit Build failed: Unable to build your function due to VPC Service Controls. Die Fehlermeldung enthält eine E-Mail-Adresse mit dem Namen des Dienstkontos.

Sie können auch ein Skript wie das folgende verwenden, um die Adresse des Dienstkontos über die Befehlszeile zu ermitteln:

#!/bin/bash

REGION="us-central1" # Your region
CONNECTOR_NAME="test-connector" # Your VPC connector name

# Deploy and delete an HTTP-triggered function
gcloud functions deploy FUNCTION_NAME --trigger-http --runtime nodejs8 --region $REGION --ingress-settings=internal-only --egress-settings=all --vpc-connector $CONNECTOR_NAME -q
gcloud functions delete FUNCTION_NAME --region $REGION -q

# Search log entries for Cloud Build failures
LOG_ENTRIES=$(gcloud logging read "resource.type=\"audited_resource\" AND protoPayload.serviceName=\"containerregistry.googleapis.com\"" --freshness=10m)
SERVICE_ACCTS=$(echo "$LOG_ENTRIES" | grep -oE "\d+@\w+.gserviceaccount.com" | sort | uniq)

# Print out service account IDs
echo "$SERVICE_ACCTS"

Dabei kann FUNCTION_NAME eine beliebige HTTP-Funktion sein, z. B. eine einfache Hello World-Funktion.

Andere Laufzeiten

  1. Wenn Sie Java 11, Python 3.7 oder 3.8, Node 10 oder Go 1.13 verwenden, suchen Sie über die IAM-Seite in der Google Cloud Console nach dem Cloud Build-Dienstkonto.

    OpenIAM

  2. Prüfen Sie, ob im Drop-down-Menü des Projekts das richtige Projekt ausgewählt ist.

  3. Suchen Sie nach cloudbuild.gserviceaccount.com. Die E-Mail-Adresse im Format my-project-number@cloudbuild.gserviceaccount.com ist der Name des Dienstkontos.

Gewähren Sie dem Dienstkonto Zugriff auf den Dienstperimeter.

Sobald Sie den Namen des Dienstkontos haben, folgen Sie der Anleitung unter Zugriff nach Nutzern oder Dienstkonten beschränken, um eine Zugriffsebene zu erstellen. Folgen Sie der Anleitung unter Zugriffsebene zu einem vorhandenen Perimeter hinzufügen, um Ihrem Dienstperimeter eine Zugriffsebene hinzuzufügen.

Sobald Sie dem Cloud Build-Dienstkonto Zugriff auf den VPC Service Controls-Dienstperimeter gewährt haben, werden Funktionsbereitstellungen erfolgreich durchgeführt.

Funktionen bereitstellen, die mit VPC Service Controls kompatibel sind

Nachdem VPC Service Controls für Cloud Functions konfiguriert wurde, müssen Sie prüfen, ob alle innerhalb des Dienstperimeters bereitgestellten Funktionen den festgelegten Organisationsrichtlinien entsprechen. Dies bedeutet Folgendes:

Funktionsbereitstellungen, die die oben genannten Kriterien nicht erfüllen, schlagen fehl.

Vorhandene Funktionen auf Compliance mit VPC Service Controls überprüfen

Nach Einrichtung von VPC Service Controls werden neue Funktionen, die in Projekten innerhalb des Dienstperimeters erstellt wurden, automatisch auf Compliance geprüft. Damit bestehende Arbeitslasten nicht unterbrochen werden, funktionieren vorhandene Funktionen weiterhin. Sie entsprechen möglicherweise jedoch nicht den Organisationsrichtlinien.

Es wird empfohlen, vorhandene Funktionen zu prüfen und Funktionen nach Bedarf zu aktualisieren oder neu bereitzustellen. Zur Vereinfachung dieses Vorgangs können Sie ein Skript erstellen, das die Cloud Functions API verwendet, um Ihre Funktionen aufzulisten und diejenigen hervorzuheben, bei denen nicht die richtigen Netzwerkeinstellungen angegeben sind.