Belajar Multigress - Security Policies & Access Control
Episode 12 of 23

Belajar Multigress - Security Policies & Access Control

Episode ini membahas kontrol akses berbasis policy untuk gateway, autentikasi JWT dan integrasi external auth, serta mutual TLS dan validasi sertifikat untuk mengamankan route dari ujung ke ujung.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Seberapa ketat kalian mengontrol siapa yang boleh memanggil API kalian? Episode 12 membahas security policies dan access control di Multigress: membatasi akses dengan mekanisme authorization deklaratif, memvalidasi JWT dan mengintegrasikan external auth, serta mengamankan jalur gateway dengan mutual TLS dan validasi sertifikat. Route yang terbuka tanpa policy adalah undangan bagi siapa saja. Setelah episode ini, setiap endpoint akan punya jawaban yang jelas: siapa yang boleh masuk, bagaimana identitas dibuktikan, dan apakah komunikasinya terenkripsi dari gateway sampai backend.

Kontrol Akses dengan SecurityPolicy

Authorization Rules yang Deklaratif

Multigress menyediakan mekanisme authorization yang mirip AuthorizationPolicy di Istio, tetapi langsung menempel pada objek Gateway API. Polanya sederhana: deklarasi rules dalam SecurityPolicy, lalu lampirkan ke HTTPRoute melalui targetRefs.

SecurityPolicy untuk HTTPRoute
apiVersion: gateway.multigress.io/v1
kind: SecurityPolicy
metadata:
  name: api-authorization
  namespace: platform
spec:
  targetRefs:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute
      name: api-route
  authorization:
    rules:
      - when:
          - key: request.headers.authorization
            values: ["Bearer *"]
        action: ALLOW
      - action: DENY

Policy di atas menerapkan default deny: hanya request dengan header Authorization bertipe Bearer yang diizinkan, sisanya ditolak. Rule pertama action: ALLOW cocok dengan pola Bearer *, lalu rule terakhir action: DENY menutup semua yang tidak cocok.

Urutan Evaluasi dan Default Deny

Evaluasi rules dilakukan berurutan dari atas. Rule pertama yang cocok menentukan hasil akhir, jadi susun aturan dari yang paling spesifik ke yang paling umum. Menutup daftar dengan action: DENY menjadikan kesalahan konfigurasi tidak berarti celah keamanan.

Terapkan policy
kubectl apply -f security-policy.yaml
kubectl get securitypolicy -n platform

Perintah kubectl apply -f security-policy.yaml menerapkan policy, lalu kubectl get securitypolicy memverifikasinya tercatat. Saat header Authorization tidak cocok dengan rule mana pun, response yang keluar adalah 403 Forbidden.

Autentikasi JWT dan External Auth

Memvalidasi JWT di Gateway

Validasi JWT di gateway membuat token diperiksa sebelum request sampai ke aplikasi. Konfigurasi issuer dan JWKS dipasang dalam policy autentikasi.

JWT authentication
apiVersion: gateway.multigress.io/v1
kind: SecurityPolicy
metadata:
  name: api-jwt-policy
  namespace: platform
spec:
  targetRefs:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute
      name: api-route
  jwt:
    providers:
      - name: keycloak
        issuer: https://auth.example.com/realms/platform
        jwksUri: https://auth.example.com/realms/platform/protocol/openid-connect/certs
    defaultProvider: keycloak

Dengan konfigurasi di atas, setiap request wajib membawa JWT yang ditandatangani oleh realm Keycloak. Signature dan expiry diverifikasi di gateway, bukan di aplikasi, sehingga aplikasi tidak perlu mengimplementasikan validasi token.

Integrasi External Auth

Ada kalanya validasi JWT saja belum cukup, misalnya otorisasi harus memeriksa data bisnis. Multigress bisa mendelegasikan keputusan ke layanan eksternal melalui mekanisme external auth, contohnya server Open Policy Agent.

External auth endpoint
apiVersion: gateway.multigress.io/v1
kind: SecurityPolicy
metadata:
  name: api-ext-auth
  namespace: platform
spec:
  targetRefs:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute
      name: api-route
  extAuth:
    service: authz.opa.svc.cluster.local
    port: 8181
    path: /v1/data/platform/allow

Policy ini mengirim metadata request ke service OPA sebelum diteruskan ke backend. Jika service external auth menjawab dengan keputusan deny, request dibatalkan di gateway dan backend tidak pernah menerimanya.

Teruskan Claim ke Backend

Teruskan claim ke backend
apiVersion: gateway.multigress.io/v1
kind: SecurityPolicy
metadata:
  name: api-jwt-policy
  namespace: platform
spec:
  targetRefs:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute
      name: api-route
  jwt:
    providers:
      - name: keycloak
        issuer: https://auth.example.com/realms/platform
        jwksUri: https://auth.example.com/realms/platform/protocol/openid-connect/certs
        claimToHeaders:
          - claim: email
            header: X-User-Email

Claim email dipindahkan ke header X-User-Email, sehingga aplikasi cukup membaca header tanpa mem-parse token ulang. Pola ini juga menyembunyikan detail token dari service internal.

Mutual TLS dan Validasi Sertifikat

mTLS antara Gateway dan Backend

JWT melindungi sisi klien, sedangkan mutual TLS mengamankan jalur antara gateway dan backend. Kedua sisi menampilkan sertifikat, sehingga backend yakin hanya gateway yang bisa menghubunginya.

mTLS ke backend
apiVersion: gateway.multigress.io/v1
kind: BackendTrafficPolicy
metadata:
  name: backend-mtls
  namespace: platform
spec:
  targetRefs:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute
      name: api-route
  tls:
    mode: Mutate
    caCertificates:
      - name: ca-bundle
    clientCertificate:
      name: gateway-client-cert

Policy ini mengatur mutasi TLS: koneksi ke backend dienkripsi dan diverifikasi dengan CA bundle, sementara gateway menampilkan sertifikat klien miliknya. Mode Mutate berarti koneksi asli dari klien diteruskan sebagai koneksi TLS baru ke backend.

Validasi Sertifikat Klien

Pada listener tertentu, kalian bisa meminta sertifikat klien saat HTTPS termination. Klien yang tidak menyajikan sertifikat yang valid ditolak pada tahap handshake.

Uji sertifikat klien
openssl s_client -connect api.example.com:443 \
  -cert client.crt -key client.key \
  -CAfile ca.pem -state

Perintah openssl s_client -connect api.example.com:443 -cert client.crt menguji handshake TLS dengan sertifikat klien. Cari baris Verify return code: 0 pada output untuk memastikan sertifikat diterima CA.

Warning

Mutual TLS menambah beban manajemen sertifikat. Pastikan rotasi CA dan sertifikat klien berjalan terjadwal sebelum menerapkan mTLS secara luas.

Penutup

Episode 12 melengkapi sisi keamanan identitas dan akses: policy authorization menetapkan siapa yang boleh lewat, JWT dan external auth memvalidasi kredensial, serta mTLS mengamankan jalur ke backend dengan validasi sertifikat.

Inti yang harus dibawa pulang:

  • SecurityPolicy menerapkan default deny dengan rules deklaratif.
  • Evaluasi rules berurutan dari yang paling spesifik ke umum.
  • Validasi JWT di gateway memblokir token invalid sebelum ke aplikasi.
  • External auth mendelegasikan keputusan ke layanan seperti OPA.
  • mTLS memvalidasi identitas gateway dan backend secara mutual.
  • Validasi sertifikat klien menolak handshake tanpa kredensial yang sah.

Di episode 13 selanjutnya kita akan membahas egress & service-to-service routing — mengarahkan traffic keluar lewat egress gateway, mengelola akses layanan eksternal, dan menerapkan NetworkPolicy. Policy security yang kalian bangun akan diperluas ke arah keluar cluster.

Belajar Multigress - Security Policies & Access Control | Belajar Multigress