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:

  1. 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.
  2. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. 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.enable permission. 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.

    Enable the APIs

  5. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. 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.enable permission. 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.

    Enable the APIs

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.

  1. Instal CRD GCPAuthzExtension jika belum diinstal:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-gateway-api/main/config/crd/networking.gke.io_gcpauthzextensions.yaml
    
  2. Deploy workload ekstensi otorisasi berbasis info di Kubernetes yang mendukung protokol gRPC ext_proc dan 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.yaml
    

    Ganti kode berikut:

    • NAMESPACE: namespace Service authz-service dan workload.
    • PORT: port Layanan authz-service yang menyajikan gRPC API ext_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 created
    
  3. Siapkan 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.yaml
    

    Outputnya mirip dengan:

    gcpauthzpolicy.networking.gke.io/my-workload-authz created
    

    Proxy 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 failOpen adalah false, pemanggil akan menerima respons HTTP 500. Jika ekstensi mengirimkan respons langsung, pemanggil akan menerima kode status dari respons tersebut.