Belajar Envoy Proxy - Filters for Security Enforcement
Episode 14 of 23

Belajar Envoy Proxy - Filters for Security Enforcement

Episode ini membahas filter keamanan Envoy: external authentication dengan ext_authz, JWT authentication filter, filter otorisasi HTTP, serta content-based routing dan request inspection.

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

Pendahuluan

Episode 12 dan 13 menyentuh keamanan secara umum. Episode 14 memfokuskan pada filter keamanan: alat konkret yang dipasang di pipeline Envoy untuk menegakkan autentikasi dan otorisasi — ext_authz untuk keputusan eksternal, filter JWT untuk verifikasi token native, filter otorisasi HTTP, serta request inspection dan content-based routing.

External Authentication dengan ext_authz

Mendelegasikan Keputusan ke Layanan Eksternal

ext_authz mengirimkan metadata request ke layanan autentikasi gRPC dan menunggu keputusan:

Filter ext_authz dengan gRPC
http_filters:
  - name: envoy.filters.http.ext_authz
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz
      transport_api_version: V3
      grpc_service:
        envoy_grpc:
          cluster_name: auth_service
      failure_mode_allow: false
      clear_route_cache: true
      allowed_headers:
        patterns:
          - exact: authorization
          - exact: cookie
      buffer_limits:
        max_request_bytes: 8192
  - name: envoy.filters.http.router
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

Dengan failure_mode_allow: false, jika layanan auth tidak bisa dijangkau, request ditolak — kebijakan fail-closed yang tepat. allowed_headers membatasi header yang boleh dilihat layanan auth, meminimalkan data sensitif yang keluar.

Membangun Layanan Auth Sederhana

Layanan ext_authz mengikuti kontrak gRPC Check. Contoh minimal dengan bahasa Go:

Server ext_authz minimal
func (s *server) Check(ctx context.Context, req *envoyservice.CheckRequest) (*envoyservice.CheckResponse, error) {
	token := req.GetAttributes().GetRequest().GetHttp().GetHeaders()["authorization"]
	if !validToken(token) {
		return denied(), nil
	}
	return allowed(), nil
}

Fungsi Check menerima metadata request dan mengembalikan allowed atau denied. Kode ini adalah kerangka yang bisa dikembangkan menjadi kebijakan apa pun.

JWT Authentication Filter

Memverifikasi Token Secara Native

Filter JWT memverifikasi token langsung di Envoy tanpa layanan eksternal:

Filter JWT dengan provider OIDC
http_filters:
  - name: envoy.filters.http.jwt_authn
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.jwt_authn.v3.JwtAuthentication
      providers:
        oidc_provider:
          issuer: https://auth.example.com/
          audiences:
            - orders-api
          remote_jwks:
            http_uri:
              uri: https://auth.example.com/.well-known/jwks.json
              cluster: auth_jwks
              timeout: 5s
            cache_duration: 300s
          forward_payload_header: x-jwt-payload
      rules:
        - match:
            prefix: "/orders"
          requires:
            provider_name: oidc_provider
  - name: envoy.filters.http.router
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

Provider oidc_provider mendefinisikan issuer, audience, dan sumber JWKS. Filter mengambil kunci publik dari remote_jwks, memverifikasi tanda tangan token, dan menolak token dengan issuer yang tidak dikenal.

Rules per Path

Aturan JWT diterapkan per path: semua path /orders wajib memiliki token valid dari oidc_provider. Path lain bebas. Pola ini memungkinkan API campuran: sebagian endpoint publik, sebagian dilindungi JWT.

Token Payload untuk Service Internal

Meneruskan klaim JWT
forward_payload_header: x-jwt-payload

Setelah verifikasi sukses, payload JWT diteruskan di header x-jwt-payload. Service internal membaca klaim seperti sub dan scope tanpa perlu memverifikasi token lagi.

Filter Otorisasi HTTP dan Header-Based Access

Kebijakan Berbasis Header

Otorisasi berbasis header cocok untuk aturan sederhana yang dievaluasi cepat:

Otorisasi berdasarkan role header
http_filters:
  - name: envoy.filters.http.rbac
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.rbac.v3.RBAC
      rules:
        action: ALLOW
        policies:
          admin_only:
            permissions:
              - any: true
            principals:
              - header:
                  name: X-User-Role
                  exact_match: admin
  - name: envoy.filters.http.router
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

Filter rbac memeriksa nilai header X-User-Role. Hanya request dengan nilai admin yang diizinkan; sisanya mendapat 403. Kombinasi dengan JWT: token diverifikasi dulu, header role dihasilkan, lalu RBAC membacanya.

Content-Based Routing dan Request Inspection

Selain keamanan, filter bisa dipakai untuk menginspeksi isi request dan me-route berdasarkan konten:

Routing berdasarkan header dan query
routes:
  - match:
      prefix: "/api/"
      headers:
        - name: X-Tenant
          string_match:
            exact: tenant-a
    route:
      cluster: tenant_a_backend
  - match:
      prefix: "/api/"
      query_parameters:
        - name: beta
          string_match:
            exact: "1"
    route:
      cluster: beta_backend

Aturan match.headers dan match.query_parameters memungkinkan routing berdasarkan isi request. Ini disebut content-based routing — berguna untuk mengarahkan traffic berdasarkan konteks.

Menguji Rangkaian Filter

Untuk menguji seluruh rangkaian filter, kirim request dengan token valid dan tanpa token:

Uji JWT dan RBAC
curl -s -o /dev/null -w "%{http_code}\n" \
  -H "Host: api.example.com" http://localhost:10000/orders
curl -s -o /dev/null -w "%{http_code}\n" \
  -H "Host: api.example.com" -H "Authorization: Bearer <TOKEN>" \
  -H "X-User-Role: admin" http://localhost:10000/orders

Request pertama seharusnya ditolak (token hilang), request kedua diizinkan. Perintah curl -w "%{http_code}" tetap cara tercepat memverifikasi keputusan tiap filter.

Menyusun Urutan Filter Keamanan

Urutan yang Direkomendasikan

Untuk pipeline keamanan, urutan yang umum adalah:

  1. Filter CORS untuk preflight browser.
  2. Filter JWT untuk memverifikasi token.
  3. Filter ext_authz untuk keputusan otorisasi eksternal.
  4. Filter RBAC untuk kebijakan berbasis atribut.
  5. Router sebagai filter terakhir.

Setiap filter memperkecil permukaan yang dilihat filter berikutnya. JWT menghasilkan identitas, ext_authz dan RBAC mengonsumsi identitas itu untuk mengambil keputusan.

Verifikasi urutan filter aktif
curl -s localhost:9901/config_dump | grep -E '"name": "envoy.filters.http'

Grep envoy.filters.http pada config_dump menampilkan urutan filter yang sebenarnya dimuat — gunakan ini untuk memastikan urutan sesuai rencana.

Penutup

Episode 14 melengkapi toolkit keamanan Envoy: ext_authz untuk keputusan eksternal, filter JWT untuk verifikasi token native, RBAC berbasis header, dan content-based routing untuk inspeksi request.

Inti yang harus dibawa pulang:

  • ext_authz mendelegasikan keputusan auth ke layanan gRPC eksternal.
  • Filter JWT memverifikasi token dengan JWKS tanpa service tambahan.
  • forward_payload_header meneruskan klaim ke service internal.
  • RBAC HTTP menegakkan kebijakan berbasis header dan principal.
  • match.headers dan query_parameters memungkinkan content-based routing.
  • Urutan filter keamanan: CORS, JWT, ext_authz, RBAC, lalu router.

Di episode 15 selanjutnya kita akan membahas performance tuning dan resource management — threading model Envoy, worker threads, connection limits, buffer sizes, HTTP/2 pool tuning, serta optimasi CPU dan memori.

Belajar Envoy Proxy - Filters for Security Enforcement | Belajar Envoy Proxy