Belajar Kubernetes Block Storage RWO - Security: CSI, RBAC & UI Access
Episode 12 of 28

Belajar Kubernetes Block Storage RWO - Security: CSI, RBAC & UI Access

Mengamankan Longhorn: securityContext untuk Pod database, akses volume readOnly saat migration job, prinsip least-privilege untuk ServiceAccount Longhorn, proteksi dashboard UI dengan Ingress TLS dan autentikasi, network policy, serta rotasi secret backup.

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

Pendahuluan

Setelah membahas placement & topology, episode 12 menutup celah yang sering dilupakan: keamanan. Longhorn memberikan akses penuh ke volume — dan siapa pun yang bisa memanipulasi CR Longhorn dapat membaca/menghapus data. Kita akan mengamankan dari tiga sisi: securityContext workload, RBAC Longhorn, dan akses UI.

Mengapa penting? Kelola storage yang aman berarti membatasi siapa yang bisa menyentuh data, baik dari sisi aplikasi (Pod) maupun operator (dashboard). Ini bukan fitur "nantilah" — DB production tanpa RBAC adalah serangan jarak jauh menunggu.

CSI & SecurityContext

VolumeMount ReadOnly untuk Migration Job

Ketika menjalankan Job migrasi yang hanya membaca (misal mengekspor data), mount volume sebagai read-only agar aplikasi tidak bisa mengubah:

yaml
volumeMounts:
  - name: data
    mountPath: /var/lib/postgresql/data
    readOnly: true

Ini membatasi Write/Delete dari aplikasi untuk beban read-only seperti pg_dump/ekspor.

SecurityContext Pod Database

yaml
securityContext:
  runAsNonRoot: true
  runAsUser: 999
  fsGroup: 999
  seccompProfile:
    type: RuntimeDefault

Selain fsGroup dan runAsNonRoot (episode 6), tambahkan seccompProfile: RuntimeDefault — membatasi syscall yang tersedia untuk container, mengurangi permukaan serangan.

RBAC Longhorn

Least Privilege untuk ServiceAccount

Longhorn menjalankan Pod dengan ServiceAccount bernama longhorn-service-account. Prinsip least-privilege: beri role hanya yang diperlukan — CRUD pada CRD Longhorn, baca ConfigMap, dan emit Event.

yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: longhorn-system
  name: longhorn-role
rules:
  - apiGroups: ["longhorn.io"]
    resources: ["volumes", "engines", "replicas", "nodes", "settings", "snapshots", "backups", "recurringjobs"]
    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "patch"]

Perhatikan: role utama beroperasi di namespace longhorn-system. Jangan pernah give cluster-admin ke SA Longhorn jika bukan kebutuhan nyata. Cek SA yang dipakai Pod:

Cek ServiceAccount Longhorn
kubectl -n longhorn-system get sa
kubectl -n longhorn-system get rolebinding

Akses UI

Dashboard Default Tanpa Login

Dashboard Longhorn default tanpa autentikasi — siapa pun yang bisa akses port-nya dapat mengelola storage. Jangan biarkan terbuka ke publik.

Proteksi dengan Ingress + Auth

Cara terbaik memakai Ingress TLS (cert-manager) + autentikasi dasar atau SSO di depan longhorn-frontend:

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: longhorn-ingress
  namespace: longhorn-system
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: longhorn-basic-auth
spec:
  rules:
    - host: longhorn.internal.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: longhorn-frontend
                port:
                  number: 80
  tls:
    - hosts: [longhorn.internal.example.com]
      secretName: longhorn-tls

Secret longhorn-basic-auth berisi auth:<hashed password> untuk basic auth.

Warning

Jangan pernah expose port-forward dashboard ke internet tanpa auth. Longhorn memegang kunci seluruh data — dashboard yang terbuka sama dengan memberi akses penuh ke volume DB kepada peretas.

Network Policy

Batasi siapa yang bisa mengakses service internal Longhorn:

yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: longhorn-ingress
  namespace: longhorn-system
spec:
  podSelector:
    matchLabels:
      app: longhorn-ui
  policyTypes: [Ingress]
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: ingress-nginx
      ports:
        - port: 8000

Kombinasi NetworkPolicy + Ingress TLS + auth membuat dashboard hanya bisa diakses dari jalur yang sah.

Secret Management

Backup Credential

Kredensial AWS untuk backup target (episode 15) disimpan Longhorn sebagai Secret di namespace longhorn-system — jangan pernah commit ke git.

Buat secret backup (contoh S3)
kubectl -n longhorn-system create secret generic aws-backup-secret \
  --from-literal=AWS_ACCESS_KEY_ID=... \
  --from-literal=AWS_SECRET_ACCESS_KEY=...

Roti (rotate) kredensial secara rutin — ganti di Secret lalu update BackupTarget di UI.

Tip

Gunakan External Secrets Operator atau Vault untuk mengelola secret backup dari provider — bukan menempelkannya sebagai literal di manifest. Ini mengurangi risiko key bocor ke git.

Penutup

Inti yang harus dibawa pulang:

  • Mount readOnly untuk job read-only; seccompProfile + runAsNonRoot untuk hardening Pod DB.
  • RBAC Longhorn berprinsip least-privilege — SA tidak perlu cluster-admin.
  • Dashboard default tanpa login → wajib Ingress TLS + auth (basic/SSO) + NetworkPolicy.
  • Secret backup disimpan di Kubernetes Secret; rotasi berkala; jangan commit.

Di episode 13 selanjutnya kita akan membahas enkripsi volume & data at rest — StorageClass encrypted: "true" berbasis LUKS2, pentingnya secret passphrase, snapshot/backup terenkripsi, dan pertimbangan enkripsi transit di jaringan iSCSI. Sampai jumpa di episode 13!

Belajar Kubernetes Block Storage RWO - Security: CSI, RBAC & UI Access | Belajar Kubernetes Block Storage RWO