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.

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.
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.
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: DENYPolicy 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.
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.
kubectl apply -f security-policy.yaml
kubectl get securitypolicy -n platformPerintah 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.
Validasi JWT di gateway membuat token diperiksa sebelum request sampai ke aplikasi. Konfigurasi issuer dan JWKS dipasang dalam policy autentikasi.
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: keycloakDengan 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.
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.
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/allowPolicy 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.
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-EmailClaim 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.
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.
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-certPolicy 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.
Pada listener tertentu, kalian bisa meminta sertifikat klien saat HTTPS termination. Klien yang tidak menyajikan sertifikat yang valid ditolak pada tahap handshake.
openssl s_client -connect api.example.com:443 \
-cert client.crt -key client.key \
-CAfile ca.pem -statePerintah 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.
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:
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.