Belajar GitOps - FluxCD - Secrets Management dengan SOPS
Episode 20 of 36

Belajar GitOps - FluxCD - Secrets Management dengan SOPS

Mengelola secret di Git dengan Mozilla SOPS: enkripsi age, PGP, dan cloud KMS, konfigurasi .sops.yaml, integrasi decryption otomatis FluxCD, key rotation, serta praktik terbaik audit secret.

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

Pendahuluan

Di episode 19 kalian sudah mengamankan Flux: autentikasi, RBAC, network security, dan supply chain. Namun ada celah yang sengaja kita tinggalkan: secret seperti kunci SSH, password registry, dan token Helm masih ditulis mentah di manifest Git. Repo Git yang jadi sumber kebenaran GitOps berubah menjadi sumber kebocoran.

Episode ini membahas solusinya: Mozilla SOPS (Secrets OPerationS). SOPS mengenkripsi nilai-nilai sensitif di dalam file YAML atau JSON sehingga secret bisa di-commit ke Git tanpa membocorkan isinya, lalu Flux mendekripsinya secara otomatis saat menerapkan manifest.

Apa itu SOPS

SOPS adalah tool CLI untuk enkripsi file pada level field. Berbeda dengan Vault yang menyimpan secret terpusat, SOPS tidak punya server — ia murni memproses file. Ciri khasnya:

  • Encryption at rest: file terenkripsi saat disimpan, termasuk di Git dan disk.
  • Git-friendly: perubahan secret bisa di-diff, di-review lewat pull request, dan di-audit seperti perubahan kode biasa.
  • Fleksibel: bisa mengenkripsi seluruh nilai, field tertentu, atau bagian dalam struktur kompleks.
  • Multi-provider key: mendukung age, PGP, dan KMS cloud besar.

Prinsip dasarnya: Git menyimpan ciphertext, kunci privat tidak pernah masuk Git. Pada contoh episode 19, kita ganti password: ghp_xxxx menjadi blok terenkripsi ENC[AES256_GCM,data:...].

Kunci: age, PGP, atau Cloud KMS

SOPS memakai envelope encryption: kunci data file (data key) dienkripsi oleh satu atau lebih kunci utama (master key). Pilihan master key menentukan alur kerjanya.

Master keyKeuntunganCocok untuk
ageRingan, tanpa server, satu file keyTim kecil, on-premise
PGPStandar lama, dukungan luasOrganisasi yang sudah pakai GPG
AWS KMSIntegrasi IAM, audit CloudTrailTim di AWS
GCP KMSWorkload IdentityTim di GCP
Azure Key VaultManaged identityTim di Azure

Untuk lokal, age paling praktis. Buat kunci dengan age-keygen -o age.agekey, simpan kunci privat di tempat aman, dan hanya publikkan kunci publik ke .sops.yaml.

Tip

Umumkan kunci publik ke dalam .sops.yaml bukan rahasia — kunci publik memang untuk dibagikan. Yang harus dirahasiakan adalah file age.agekey atau kunci privat PGP.

Enkripsi Secret dengan SOPS

Konfigurasi .sops.yaml

Aturan enkripsi dideklarasikan di .sops.yaml di root repo. Aturan ini mencocokkan path file dan menentukan recipient atau KMS mana yang digunakan:

.sops.yaml
creation_rules:
  - path_regex: clusters/.*/secrets\.yaml$
    age: >-
      age1q2w3e4r5t6y7u8i9o0p1a2s3d4f5g6h7j8k9l0zxc1v
    encrypted_regex: "^(password|token|apiKey|secret)$"
  - path_regex: clusters/.*/\.env$
    age: >-
      age1q2w3e4r5t6y7u8i9o0p1a2s3d4f5g6h7j8k9l0zxc1v

encrypted_regex membatasi field mana yang dienkripsi, misalnya hanya password, token, apiKey, dan secret.

Mengenkripsi File

Dengan aturan di atas, enkripsi cukup satu perintah. Enkripsi semua field atau hanya field tertentu:

Enkripsi dengan sops
sops -e clusters/prod/secrets.yaml > clusters/prod/secrets.enc.yaml
sops --encrypt --encrypted-regex '^(password|token)$' \
  clusters/prod/env.yaml > clusters/prod/env.enc.yaml
sops --encrypt-edit clusters/prod/secrets.yaml

Versi lebih sederhana: beri nama file secrets.enc.yaml lalu jalankan sops --encrypt clusters/prod/secrets.enc.yaml — SOPS membaca .sops.yaml, memuat file, dan menulis ciphertext langsung ke file yang sama.

Enkripsi Field Spesifik

Bila hanya sebagian nilai yang rahasia, biarkan metadata lain terbaca agar diff tetap nyaman:

clusters/prod/secrets.enc.yaml
apiVersion: v1
kind: Secret
metadata:
  name: api-db
  namespace: apps
type: Opaque
stringData:
  DB_HOST: postgres.prod.svc.cluster.local
  DB_USER: app
  DB_PASSWORD: ENC[AES256_GCM,data:0Nv6Y8j...,iv:...,tag:...,type:str]
sops:
  kms: []
  age:
    - recipient: age1q2w3e4r5t6y7u8i9o0p1a2s3d4f5g6h7j8k9l0zxc1v
      enc: |
        -----BEGIN AGE ENCRYPTED FILE-----
        ...

Nilai non-rahasia seperti DB_HOST tetap terbaca; hanya DB_PASSWORD yang menjadi ciphertext. Blok sops: berisi metadata kunci untuk dekripsi dan audit.

File Terenkripsi di Git

Commit file terenkripsi seperti biasa; tim bisa melihat struktur tanpa melihat nilainya. Selalu verifikasi tidak ada plaintext yang lolos dengan memindai repo, misalnya memakai GitLeaks di CI, sebelum merge.

Integrasi SOPS dengan Flux

Flux mendekripsi secret secara otomatis. Kustomize controller memiliki dukungan SOPS bawaan; yang dibutuhkan hanyalah kunci privat yang tersedia sebagai Secret di cluster.

Kustomization Decryption Field

Pada Flux versi lama, dekripsi diaktifkan eksplisit lewat field decryption:

clusters/prod/flux-system/kustomization.yaml
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: apps
  namespace: flux-system
spec:
  interval: 5m
  sourceRef:
    kind: GitRepository
    name: apps
  path: ./clusters/prod/apps
  prune: true
  decryption:
    provider: sops
    secretRef:
      name: sops-age

Pada Flux 2.2 ke atas, decryption otomatis: cukup sediakan Secret sops-age (untuk age) atau sops-gpg (untuk PGP) di namespace flux-system, dan kustomize-controller mendekripsinya sendiri tanpa konfigurasi tambahan.

Service Account Keys (Cloud KMS)

Untuk AWS KMS, jangan menaruh kunci di cluster. Gunakan IAM Roles for Service Accounts: beri role akses ke KMS key, lalu pasang annotation di ServiceAccount kustomize-controller. Flux lalu mendekripsi langsung lewat KMS tanpa kunci privat lokal.

Important

Kunci privat age hanya ada di cluster, bukan di Git. Kalau repo ter-expose, attacker mendapat ciphertext tanpa kunci — secret tetap aman. Inilah esensi GitOps yang aman.

Key Rotation

Rotasi kunci membutuhkan enkripsi ulang semua file. SOPS menyediakan perintah khusus:

Rotasi kunci dan re-encrypt
sops updatekeys clusters/prod/secrets.enc.yaml
sops --rotate --in-place clusters/prod/secrets.enc.yaml

updatekeys mengganti recipient kunci; --rotate membuat data key baru. Keduanya harus dijalankan saat kunci bocor atau saat pergantian environment.

Best Practices

  • Jangan pernah commit secret mentah: semua nilai rahasia harus ciphertext. Aktifkan pemindaian secret di CI sebagai pengaman ganda.
  • Kunci terpisah per environment: gunakan age key atau KMS key berbeda untuk prod dan staging. Kebocoran kunci staging tidak membuka prod.
  • Prosedur key management: simpan backup kunci di tempat aman, batasi akses ke file kunci, dan dokumentasikan siapa yang berhak memegangnya.
  • Audit logging: kombinasi KMS cloud dengan riwayat commit Git memberikan jejak siapa mengenkripsi, kapan, dan perubahan apa yang terjadi.
  • Kunci tidak pernah di Git: termasuk file age.agekey — tambahkan ke .gitignore dan jangan pernah di-commit.

Penutup

Episode ini menutup celah dari episode 19: secret kini bisa hidup di Git sebagai ciphertext. SOPS mengenkripsi file secara field-level, Flux mendekripsinya otomatis di cluster, dan kunci privat tidak pernah menyentuh repo. Kombinasi ini membuat secret dapat di-review, di-diff, dan diaudit seperti kode biasa.

Inti yang harus dibawa pulang:

  • SOPS adalah tool enkripsi file, bukan server: secret tetap di Git dalam bentuk terenkripsi.
  • Kunci terpisah dari data: kunci privat hanya di cluster atau KMS, kunci publik di .sops.yaml.
  • Flux dekripsi otomatis: sediakan secret sops-age atau sops-gpg, atau pakai IAM dan Workload Identity untuk KMS.
  • Rotasi itu enkripsi ulang: sops updatekeys dan sops --rotate menjaga secret tetap aman.
  • Per-env key: pisahkan kunci staging dan produksi untuk mempersempit dampak kebocoran.

SOPS menjaga secret di dalam Git, tapi masih mengharuskan kunci ada di tiap cluster. Di episode 21 selanjutnya kita belajar External Secrets Operator: secret disimpan di sistem eksternal seperti AWS Secrets Manager, Vault, atau 1Password, dan Flux hanya mengelola referensinya. Sampai jumpa di episode 21!

Belajar GitOps - FluxCD - Secrets Management dengan SOPS | Belajar FluxCD & GitOps