Menyiapkan kebijakan otorisasi pada sidecar di GKE
Halaman ini memberikan petunjuk untuk menyiapkan berbagai jenis kebijakan otorisasi pada sidecar Cloud Service Mesh di GKE.
Sebelum memulai
Anda harus memahami Gateway API dan Ekstensi Otorisasi.
Sebelum membuat kebijakan otorisasi, Anda harus melakukan langkah-langkah berikut:
- Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
-
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, if any are not already enabled.
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, if any are not already enabled.
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.
AuthzPolicy seluruh namespace
Jika Anda ingin menolak pola traffic yang diharapkan untuk seluruh namespace, konfigurasikan kebijakan otorisasi untuk menolak permintaan HTTP masuk ke semua workload dalam namespace:
cat >ns-authz-policy-deny.yaml <<EOF
apiVersion: networking.gke.io/v1
kind: GCPAuthzPolicy
metadata:
name: ns-authz
namespace: NAMESPACE
spec:
targetRefs:
- group: ""
kind: Pod
selector: {}
rules:
- to:
operations:
- paths:
- type: Prefix
value: "/bad_token"
action: DENY
enforcementLevel: L7
EOF
kubectl apply -f ns-authz-policy-deny.yaml
selector: {} kosong menargetkan semua Pod di namespace.
Jika Anda ingin mengizinkan pola traffic yang diharapkan untuk seluruh namespace, konfigurasikan kebijakan otorisasi untuk mengizinkan permintaan HTTP masuk ke semua workload dalam namespace:
cat >ns-authz-policy-allow.yaml <<EOF
apiVersion: networking.gke.io/v1
kind: GCPAuthzPolicy
metadata:
name: ns-authz
namespace: NAMESPACE
spec:
targetRefs:
- group: ""
kind: Pod
selector: {}
rules:
- to:
operations:
- paths:
- type: Prefix
value: "/headers"
methods: ["GET"]
action: ALLOW
enforcementLevel: L7
EOF
kubectl apply -f ns-authz-policy-allow.yaml
selector: {} kosong menargetkan semua Pod di namespace.
Menolak permintaan masuk ke workload
Jika Anda memiliki workload yang seharusnya hanya melakukan panggilan keluar, seperti cron job, konfigurasikan kebijakan otorisasi untuk menolak permintaan HTTP yang masuk ke workload:
cat >deny-path-authz-policy.yaml <<EOF
apiVersion: networking.gke.io/v1
kind: GCPAuthzPolicy
metadata:
name: my-workload-authz
namespace: NAMESPACE
spec:
targetRefs:
- group: ""
kind: Pod
selector:
matchLabels:
app: EXAMPLE_APP
rules:
- to:
operations:
- paths:
- type: Prefix
value: "/deny_path"
action: DENY
enforcementLevel: L7
EOF
kubectl apply -f deny-path-authz-policy.yaml
Outputnya mirip dengan:
gcpauthzpolicy.networking.gke.io/my-workload-authz created
Setelah kebijakan ini diterapkan, setiap permintaan HTTP yang masuk ke jalur /deny_path pada Pod yang cocok dengan aplikasi: EXAMPLE_APP akan ditolak dan pemanggil akan menerima kode respons HTTP 403 Forbidden.
Mengizinkan permintaan masuk tertentu ke workload
Anda juga dapat mengonfigurasi kebijakan ALLOW yang hanya mengizinkan permintaan yang cocok dengan kriteria tertentu sekaligus menolak permintaan lainnya.
Contoh berikut mengonfigurasi kebijakan otorisasi pada Deployment example-app untuk hanya mengizinkan permintaan mTLS dari Pod dengan identitas spiffe://cluster.local/NAMESPACE/pod1.
cat >allow-authz-policy.yaml <<EOF
apiVersion: networking.gke.io/v1
kind: GCPAuthzPolicy
metadata:
name: my-workload-authz
namespace: NAMESPACE
spec:
targetRefs:
- group: ""
kind: Pod
selector:
matchLabels:
app: EXAMPLE_APP
rules:
- from:
sources:
- principals:
- principal:
type: Exact
value: "spiffe://cluster.local/NAMESPACE/pod1"
action: ALLOW
enforcementLevel: L7
EOF
kubectl apply -f allow-authz-policy.yaml
Outputnya mirip dengan:
gcpauthzpolicy.networking.gke.io/my-workload-authz created
Hanya permintaan masuk yang diautentikasi menggunakan mTLS yang menampilkan identitas SPIFFE
spiffe://cluster.local/NAMESPACE/pod1 yang sama persis yang akan menerima HTTP
200 OK. Permintaan lainnya akan ditolak oleh proxy dengan HTTP 403 Forbidden.
Mendelegasikan ke mesin otorisasi eksternal
Anda dapat menggunakan mesin otorisasi Anda sendiri dan mengonfigurasi Cloud Service Mesh untuk mendelegasikan semua keputusan otorisasi untuk workload ke mesin yang dikonfigurasi.
Instal CRD
GCPAuthzExtensionjika belum diinstal:kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-gateway-api/main/config/crd/networking.gke.io_gcpauthzextensions.yamlDeploy workload ekstensi otorisasi berbasis info di Kubernetes yang mendukung protokol gRPC
ext_procdan konfigurasikan resource ekstensi otorisasi:cat >authz-extension.yaml <<EOF apiVersion: networking.gke.io/v1 kind: GCPAuthzExtension metadata: name: my-authz-ext namespace: NAMESPACE spec: backendRef: group: "" kind: Service name: authz-service port: PORT authority: "authz-service.NAMESPACE.svc.cluster.local" forwardHeaders: - Authorization failOpen: false timeout: "100ms" wireFormat: ExtProcGRPC EOF kubectl apply -f authz-extension.yamlGanti kode berikut:
NAMESPACE: namespace Serviceauthz-servicedan workload.PORT: port Layananauthz-serviceyang menyajikan gRPC APIext_proc.
Perintah ini membuat ekstensi otorisasi berbasis info yang berjalan sebagai layanan Kubernetes
authz-service.Outputnya mirip dengan:
gcpauthzextension.networking.gke.io/my-authz-ext createdSiapkan kebijakan otorisasi untuk mendelegasikan keputusan otorisasi untuk workload ke ekstensi otorisasi yang telah dikonfigurasi sebelumnya:
cat >authz-policy.yaml <<EOF apiVersion: networking.gke.io/v1 kind: GCPAuthzPolicy metadata: name: my-workload-authz namespace: NAMESPACE spec: targetRefs: - group: "" kind: Pod selector: matchLabels: app: EXAMPLE_APP rules: - from: sources: - principals: - principal: type: Exact value: "spiffe://cluster.local/NAMESPACE/pod1" to: operations: - paths: - type: Exact value: "/api/payments-schedule" action: CUSTOM enforcementLevel: L7 customProviders: extensionRefs: - group: networking.gke.io kind: GCPAuthzExtension name: my-authz-ext EOF kubectl apply -f authz-policy.yamlOutputnya mirip dengan:
gcpauthzpolicy.networking.gke.io/my-workload-authz createdProxy menunggu ekstensi otorisasi merespons sebelum meneruskan permintaan ke aplikasi. Jika ekstensi menolak permintaan dengan mengakhiri panggilan dengan error, atau jika panggilan gagal atau waktu tunggu habis saat
failOpenadalahfalse, pemanggil akan menerima respons HTTP 500. Jika ekstensi mengirimkan respons langsung, pemanggil akan menerima kode status dari respons tersebut.