Belajar GitOps - FluxCD - Securing Flux
Episode 19 of 36

Belajar GitOps - FluxCD - Securing Flux

Mengamankan FluxCD secara menyeluruh: autentikasi Git, registry, Helm repository, dan cluster, otorisasi berbasis RBAC, keamanan jaringan, hingga rantai pasok dengan Cosign dan admission controller.

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

Pendahuluan

Di episode 18 kalian sudah mengintegrasikan service mesh dengan FluxCD — instalasi Istio, Linkerd, dan AWS App Mesh lengkap dengan mTLS antar service. mTLS mengamankan trafik antar pod, tetapi masih ada satu pertanyaan besar: bagaimana mengamankan Flux itu sendiri, komponen yang justru memegang akses ke hampir seluruh cluster?

Flux adalah agen di dalam cluster dengan permission sangat luas: membaca Git, menarik image, memasang Helm chart, dan menerapkan manifest ke mana saja. Jika Flux disusupi, seluruh cluster ikut terancam. Episode ini membahas empat lapisan: authentication, authorization, network security, dan supply chain security.

Authentication

Authentication menjawab "siapa Flux dan bagaimana ia membuktikan identitasnya". Empat koneksi diamankan: Git, registry, Helm, dan API server cluster.

Autentikasi Git

Untuk repo privat, gunakan deploy key SSH read-only per repository — dibuat oleh flux bootstrap — atau token dengan scope minimal. Manifest GitRepository merujuk secret kredensial:

clusters/prod/flux-system/gitrepository.yaml
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: apps
  namespace: flux-system
spec:
  interval: 5m
  ref:
    branch: main
  url: git@github.com:devvnull/gitops-apps.git
  secretRef:
    name: git-credentials

Secret berisi kunci privat SSH disimpan di namespace flux-system — sebaiknya tidak mentah di Git, kita enkripsi dengan SOPS di episode 20. Jangan memberi kunci dengan hak tulis ke repositori yang dipantau Flux.

Autentikasi Registry dan Helm Repository

Registry privat memakai ImagePullSecret bertipe kubernetes.io/dockerconfigjson, dipakai deployment dan image-reflector-controller saat memindai image. Helm repository privat memakai secret basic-auth yang dirujuk HelmRepository:

clusters/prod/flux-system/helmrepository.yaml
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
  name: private-charts
  namespace: flux-system
spec:
  interval: 10m
  type: oci
  url: oci://ghcr.io/devvnull/charts
  secretRef:
    name: helm-credentials

Untuk registry, secret kubernetes.io/dockerconfigjson berisi struktur JSON auths hasil login registry, dan dirujuk lewat imagePullSecrets pada deployment. Kedua token ini idealnya dienkripsi SOPS seperti kunci Git.

Autentikasi Cluster

Flux mengautentikasi ke API server lewat ServiceAccount milik tiap kontroler; kredensial di-mount otomatis ke pod, dan apa yang boleh dilakukan diatur oleh RBAC di bagian berikut.

Authorization

Authorization menjawab "apa yang boleh dilakukan Flux dan siapa yang boleh mengubah konfigurasi Flux".

RBAC dan Service Account Flux

Tiap kontroler Flux berjalan dengan ServiceAccount dan ClusterRole sendiri. Terapkan least privilege: jangan beri cluster-admin ke manusia, dan batasi siapa yang bisa mengubah GitRepository, Kustomization, dan HelmRelease. Flux menyediakan ClusterRole siap pakai flux-viewer dan flux-edit yang dibatasi per namespace:

clusters/prod/rbac/flux-edit.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: flux-edit-apps
  namespace: apps
subjects:
  - kind: Group
    name: platform-team@devvnull.dev
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: flux-edit
  apiGroup: rbac.authorization.k8s.io

Pembatasan Namespace dan Resource

Simpan Flux di namespace khusus flux-system yang hanya bisa diubah tim platform. Verifikasi akses efektif sebuah identitas dengan kubectl auth can-i create kustomization.kustomize.toolkit.fluxcd.io pada namespace apps.

Network Security

Jaringan membatasi apa yang bisa dijangkau Flux dan bagaimana ia diakses:

  • TLS/SSL: gunakan URL HTTPS untuk GitRepository dan HelmRepository; Flux mendukung CA khusus lewat spec.secretRef.
  • Private Git repository: kombinasikan TLS dengan token atau deploy key; jangan pernah menaruh kredensial di URL.
  • Network policies: batasi ingress ke flux-system hanya dari kontrol plane dan dashboard yang sah.
  • Egress control: Flux harus keluar ke Git, registry, dan API Helm. Batasi egress ke endpoint yang dikenal:
clusters/prod/flux-system/networkpolicy-egress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: flux-egress
  namespace: flux-system
spec:
  podSelector:
    matchLabels:
      app.kubernetes.io/part-of: flux
  policyTypes:
    - Egress
  egress:
    - ports:
        - port: 443
        - port: 22

Jalankan flux check --pre untuk verifikasi, atau flux install --network-policy agar Flux membuat NetworkPolicy default saat instalasi.

Supply Chain Security

Lapisan terpenting: memastikan hanya artefak yang sah yang masuk cluster.

Verifikasi Sumber dan Tanda Tangan Image

Source controller memverifikasi tanda tangan Cosign pada artifact OCI sebelum menyediakannya; kunci publik disimpan sebagai secret yang dirujuk OCIRepository:

clusters/prod/apps/ocirepository.yaml
apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: OCIRepository
metadata:
  name: api
  namespace: apps
spec:
  interval: 5m
  url: oci://ghcr.io/devvnull/api
  verify:
    provider: cosign
    secretRef:
      name: cosign-public-key

Di CI, image ditandatangani sebelum di-push lalu diverifikasi dengan cosign sign --key cosign.key ghcr.io/devvnull/api:1.2.3 dan cosign verify --key cosign.pub ghcr.io/devvnull/api:1.2.3.

Admission Controller sebagai Gerbang Terakhir

Verifikasi di sumber tidak menjamin image tidak diubah saat dipakai; lapisi dengan admission controller — Kyverno atau OPA Gatekeeper — yang memaksa setiap Pod memenuhi kebijakan, misalnya image harus bertanda tangan:

clusters/prod/policies/require-signature.yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-image-signature
spec:
  validationFailureAction: Enforce
  rules:
    - name: verify-cosign
      match:
        any:
          - resources:
              kinds:
                - Pod
      verifyImages:
        - image: "*"
          key: |-

Kebijakan ini dan policy lain dideklarasikan di Git dan disinkronkan Flux — policy sebagai kode. Kyverno juga bisa memaksa resource limits, melarang container privileged, dan memastikan label keamanan ada.

Penutup

Episode ini membangun empat lapisan pertahanan untuk Flux: autentikasi untuk Git, registry, Helm, dan cluster; otorisasi berbasis RBAC dengan least privilege; network security lewat TLS dan NetworkPolicy; serta supply chain security dengan Cosign dan admission controller. Keamanan selalu berlapis — tidak ada satu lapisan yang cukup.

Inti yang harus dibawa pulang:

  • Least privilege di mana-mana: deploy key read-only untuk Git, token dengan scope minimal untuk registry dan Helm.
  • Flux tetap di namespace khusus: flux-system terisolasi dengan RBAC dan NetworkPolicy yang ketat.
  • Egress dikontrol: Flux hanya boleh keluar ke endpoint yang dikenal.
  • Tanda tangan sebagai bukti: Cosign memverifikasi sumber, Kyverno atau OPA memastikan hanya image sah yang berjalan.
  • Konfigurasi keamanan juga kode: semua policy dideklarasikan di Git agar bisa direview dan diaudit.

Keamanan Flux sudah kokoh, tetapi secret — kunci SSH, token, password — masih disimpan mentah di Git pada contoh di atas. Di episode 20 selanjutnya kita belajar Secrets Management dengan SOPS: enkripsi secret di repo, decryption otomatis Flux, hingga key rotation. Sampai jumpa di episode 20!

Belajar GitOps - FluxCD - Securing Flux | Belajar FluxCD & GitOps