Belajar Cilium - L7 Policy & API-Aware Security
Episode 13 of 23

Belajar Cilium - L7 Policy & API-Aware Security

Episode ini membawa policy Cilium ke lapisan aplikasi: rule berbasis HTTP, gRPC, dan Kafka di dalam CNP, visibility L7 per endpoint, serta CiliumClusterwideNetworkPolicy untuk kebijakan lintas namespace. Kalian menulis policy yang memahami konten, bukan sekadar port.

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

Pendahuluan

Sejauh ini semua policy kita bekerja di level jaringan: label, port, dan protokol. Episode 13 mengubah level itu ke lapisan aplikasi (L7). Dengan L7 policy, Cilium memahami isi traffic — metode HTTP apa yang dipakai, path apa yang diakses, atau topik Kafka apa yang dikonsumsi — dan memutuskan izin berdasarkan konten tersebut.

Mengapa ini penting? Karena port saja tidak cukup. Sebuah aplikasi yang melayani HTTP di port 8080 mungkin harus diizinkan menerima GET /public tapi menolak POST /admin. Policy berbasis port tidak bisa membedakannya; L7 policy bisa. Episode ini juga memperkenalkan CiliumClusterwideNetworkPolicy untuk policy yang berlaku lintas namespace.

L7 Proxy dan Visibility

Untuk mengecek konten L7, Cilium memakai L7 proxy (berbasis Envoy) yang dipasang secara otomatis untuk endpoint dengan policy L7. Traffic yang masuk ke endpoint dengan L7 policy diarahkan ke proxy ini, diperiksa, dan diteruskan hanya jika sesuai aturan. Tanpa policy L7, L7 proxy tidak aktif dan traffic mengalir langsung di dataplane.

L7 proxy aktif secara default di Cilium modern. Verifikasi statusnya:

Cek status L7 proxy
cilium status | grep -i envoy

cilium status | grep -i envoy menampilkan status komponen Envoy yang mendukung L7 proxy. Jika belum aktif, aktifkan dengan --set l7Proxy=true saat install.

Rule HTTP, gRPC, dan Kafka

L7 rules ditulis dalam blok ingress atau egress dengan field rules. Untuk HTTP, tentukan metode dan path yang diizinkan:

Policy L7 untuk HTTP
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: l7-http
spec:
  endpointSelector:
    matchLabels:
      app: api-server
  ingress:
    - fromEndpoints:
        - matchLabels:
            app: web
      toPorts:
        - ports:
            - port: "8080"
              protocol: TCP
          rules:
            http:
              - method: GET
                path: "/public"

rules.http dengan method: GET dan path: /public berarti hanya request GET ke /public yang diterima dari pod berlabel web. Semua metode lain dan path lain akan ditolak oleh L7 proxy. Rule serupa tersedia untuk grpc (mencocokkan service dan method) dan kafka (mencocokkan topik dan produce/consume):

Rule gRPC dan Kafka
rules:
  grpc:
    - service: "/payment.PaymentService/"
      method: "/payment.PaymentService/Charge"
  kafka:
    - apiKey: produce
      topic: "orders"

rules.grpc membatasi panggilan gRPC ke service dan method tertentu, sedangkan rules.kafka membatasi operasi produce pada topik tertentu. Keduanya memakai konten protokol, bukan sekadar port.

CiliumClusterwideNetworkPolicy

Sejauh ini CNP selalu scoped ke satu namespace. Untuk policy yang berlaku lintas namespace, gunakan CiliumClusterwideNetworkPolicy (CCNP). Strukturnya identik, tapi spec.endpointSelector bisa memilih pod di semua namespace sekaligus. Contoh policy yang melarang semua pod kecuali monitor untuk mengakses port debug:

Policy lintas namespace
apiVersion: cilium.io/v2
kind: CiliumClusterwideNetworkPolicy
metadata:
  name: blokir-debug-port
spec:
  endpointSelector:
    matchLabels: {}
  ingress:
    - fromEndpoints:
        - matchLabels:
            app: monitor
      toPorts:
        - ports:
            - port: "9229"
              protocol: TCP

matchLabels: {} di sini memilih semua endpoint di seluruh cluster — dalam YAML, objek kosong adalah selector yang cocok dengan semuanya. Dengan policy ini, port 9229 hanya bisa diakses dari pod berlabel app=monitor, apa pun namespace-nya.

Praktik L7 Policy

Setelah menulis policy, terapkan dan amati hasilnya dengan Hubble, yang menampilkan detail L7 pada flow:

Terapkan policy dan amati flow L7
kubectl apply -f l7-http.yaml
hubble observe --protocol http

hubble observe --protocol http menampilkan flow HTTP lengkap dengan metode, path, dan kode status. Flow yang ditolak L7 akan muncul dengan verdict DROPPED dan drop reason terkait proxy. Ini cara paling langsung untuk memastikan rule GET /public bekerja dan POST /admin benar-benar diblokir.

Info

L7 policy menambah satu langkah pemrosesan per paket melalui proxy, sehingga ada overhead kecil pada latency dan throughput. Gunakan L7 policy hanya untuk endpoint yang benar-benar membutuhkannya; endpoint lain cukup memakai policy L3/L4 yang jauh lebih cepat.

Penutup

Inti yang harus dibawa pulang:

  • L7 policy bekerja lewat L7 proxy Envoy yang memahami konten aplikasi.
  • Rule http mencocokkan metode dan path; grpc mencocokkan service dan method.
  • Rule kafka membatasi topik dan operasi produce atau consume.
  • CCNP berlaku lintas namespace dengan apiVersion: cilium.io/v2.
  • hubble observe --protocol http menampilkan detail flow L7.
  • L7 policy punya overhead; gunakan selektif pada endpoint yang kritis.

Di episode 14 selanjutnya kita akan membahas encryption dan zero trust networking — WireGuard native yang transparan, IPsec sebagai alternatif, enkripsi antar node tanpa mengubah workload, serta verifikasi dengan Hubble dan cilium encrypt status. Ini menutup celah terbesar cluster multi-node: traffic antar node yang mengalir polos di jaringan.

Belajar Cilium - L7 Policy & API-Aware Security | Belajar Cilium