Autorisierungsrichtlinien für Sidecars in GKE einrichten
Auf dieser Seite finden Sie eine Anleitung zum Einrichten verschiedener Arten von Autorisierungsrichtlinien für Cloud Service Mesh-Sidecars in GKE.
Hinweis
Sie sollten sich mit der Gateway API und Autorisierungserweiterungen auskennen.
Bevor Sie eine Autorisierungsrichtlinie erstellen, müssen Sie die folgenden Schritte ausführen:
- Melden Sie sich in Ihrem Google Cloud -Konto an. Wenn Sie mit Google Cloudnoch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Network Security, Network Services APIs.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Network Security, Network Services APIs.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.
Namespace-weite AuthzPolicy
Wenn Sie ein erwartetes Traffic-Muster für den gesamten Namespace ablehnen möchten, konfigurieren Sie eine Autorisierungsrichtlinie, um alle eingehenden HTTP-Anfragen an alle Arbeitslasten in einem Namespace abzulehnen:
cat >ns-authz-policy-deny.yaml <<EOF
apiVersion: networking.gke.io/v1
kind: GCPAuthzPolicy
metadata:
name: ns-authz
namespace: NAMESPACE
spec:
targetRefs:
- kind: Pod
selector: {}
rules:
- to:
operations:
- paths:
- type: Prefix
value: "/bad_token"
action: DENY
EOF
kubectl apply -f ns-authz-policy-deny.yaml
Beachten Sie, dass mit dem leeren selector: {} alle Pods im Namespace angesprochen werden.
Wenn Sie ein erwartetes Trafficmuster für den gesamten Namespace zulassen möchten, konfigurieren Sie eine Autorisierungsrichtlinie, um alle eingehenden HTTP-Anfragen an alle Arbeitslasten in einem Namespace zuzulassen:
cat >ns-authz-policy-allow.yaml <<EOF
apiVersion: networking.gke.io/v1
kind: GCPAuthzPolicy
metadata:
name: ns-authz
namespace: NAMESPACE
spec:
targetRefs:
- kind: Pod
selector: {}
rules:
- to:
operations:
- paths:
- type: Prefix
value: "/headers"
methods: ["GET"]
action: ALLOW
EOF
kubectl apply -f ns-authz-policy-allow.yaml
Beachten Sie, dass mit dem leeren selector: {} alle Pods im Namespace angesprochen werden.
Eingehende Anfragen an eine Arbeitslast ablehnen
Wenn Sie eine Arbeitslast haben, die nur ausgehende Aufrufe ausführen soll, z. B. ein Cron-Job, konfigurieren Sie eine Autorisierungsrichtlinie, um alle eingehenden HTTP-Anfragen an die Arbeitslast abzulehnen:
cat >deny-path-authz-policy.yaml <<EOF
apiVersion: networking.gke.io/v1
kind: GCPAuthzPolicy
metadata:
name: my-workload-authz
namespace: NAMESPACE
spec:
targetRefs:
- kind: Pod
selector:
matchLabels:
app: EXAMPLE_APP
rules:
- to:
operations:
- paths:
- type: Prefix
value: "/deny_path"
action: DENY
EOF
kubectl apply -f deny-path-authz-policy.yaml
Die Ausgabe sieht etwa so aus:
gcpauthzpolicy.networking.gke.io/my-workload-authz created
Nachdem diese Richtlinie angewendet wurde, wird jede eingehende HTTP-Anfrage an den Pfad „/deny_path“ in der übereinstimmenden App für die Pods EXAMPLE_APP abgelehnt und der Aufrufer erhält den HTTP-Antwortcode 403 Forbidden.
Bestimmte eingehende Anfragen an eine Arbeitslast zulassen
Sie können auch eine ALLOW-Richtlinie konfigurieren, die nur Anfragen zulässt, die bestimmten Kriterien entsprechen, und alle anderen Anfragen ablehnt.
Im folgenden Beispiel wird eine Autorisierungsrichtlinie für die Beispiel-App-Bereitstellung konfiguriert, um nur mTLS-Anfragen von Pods mit der Identität spiffe://cluster.local/namespace/pod1 zuzulassen.
cat >allow-authz-policy.yaml <<EOF
apiVersion: networking.gke.io/v1
kind: GCPAuthzPolicy
metadata:
name: my-workload-authz
namespace: NAMESPACE
spec:
targetRefs:
- kind: Pod
selector:
matchLabels:
app: EXAMPLE_APP
rules:
- from:
sources:
- principals:
- principal:
exact: "spiffe://cluster.local/NAMESPACE/pod1"
action: ALLOW
EOF
kubectl apply -f allow-authz-policy.yaml
Die Ausgabe sieht etwa so aus:
gcpauthzpolicy.networking.gke.io/my-workload-authz created
Nur eingehende Anfragen, die mit mTLS authentifiziert werden und die genaue SPIFFE-Identität spiffe://cluster.local/NAMESPACE/pod1 präsentieren, erhalten eine HTTP-Antwort „200 OK“. Alle anderen Anfragen werden vom Proxy mit dem HTTP-Fehler 403 Forbidden abgelehnt.
An eine externe Autorisierungs-Engine delegieren
Sie können Ihre eigene Autorisierungs-Engine verwenden und Cloud Service Mesh so konfigurieren, dass alle Autorisierungsentscheidungen für eine Arbeitslast an die konfigurierte Engine delegiert werden.
Installieren Sie die
GCPAuthzExtension-CRD, falls noch nicht geschehen:kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-gateway-api/main/config/crd/networking.gke.io_gcpauthzextensions.yamlStellen Sie eine Callout-basierte Autorisierungserweiterungs-Arbeitslast in Kubernetes bereit, die das
ext_proc gRPC-Protokoll unterstützt, und konfigurieren Sie eine Autorisierungserweiterungs-Ressource:cat >authz-extension.yaml <<EOF apiVersion: networking.gke.io/v1 kind: GCPAuthzExtension metadata: name: my-authz-ext namespace: ns1 spec: backendRef: kind: Service name: authz-service loadBalancingScheme: INTERNAL_SELF_MANAGED forwardHeaders: - Authorization failOpen: false timeout: "0.1s" wireFormat: EXT_PROC_GRPC EOF kubectl apply -f authz-extension.yamlMit diesem Befehl wird eine auf Callouts basierende Autorisierungserweiterung erstellt, die als Kubernetes-Dienst
authz-serviceausgeführt wird.Die Ausgabe sieht etwa so aus:
gcpauthzextension.networking.gke.io/my-authz-ext createdRichten Sie die Autorisierungsrichtlinie so ein, dass Autorisierungsentscheidungen für den Arbeitslast an die zuvor konfigurierte Autorisierungserweiterung delegiert werden:
cat >authz-policy.yaml <<EOF apiVersion: networking.gke.io/v1 kind: GCPAuthzPolicy metadata: name: my-workload-authz namespace: NAMESPACE spec: targetRefs: - kind: Pod selector: matchLabels: app: EXAMPLE_APP rules: - from: sources: - principals: - principal: exact: "spiffe://cluster.local/NAMESPACE/pod1" to: operations: - paths: - type: Exact value: "/api/payments-schedule" action: CUSTOM customProvider: authzExtension: targetRefs: - kind: GCPAuthzExtension name: my-authz-ext EOF kubectl apply -f authz-policy.yamlDie Ausgabe sieht etwa so aus:
gcpauthzpolicy.networking.gke.io/my-workload-authz createdDer Proxy wartet, bis Ihr benutzerdefinierter Dienst eine Antwort vom Typ
OKoderDENYzurückgibt, bevor er die Anfrage an die Anwendung weiterleitet oder einen HTTP-Fehler 403 an den Aufrufer zurückgibt.