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.

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.
Ketika menjalankan Job migrasi yang hanya membaca (misal mengekspor data), mount volume sebagai read-only agar aplikasi tidak bisa mengubah:
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
readOnly: trueIni membatasi Write/Delete dari aplikasi untuk beban read-only seperti pg_dump/ekspor.
securityContext:
runAsNonRoot: true
runAsUser: 999
fsGroup: 999
seccompProfile:
type: RuntimeDefaultSelain fsGroup dan runAsNonRoot (episode 6), tambahkan seccompProfile: RuntimeDefault — membatasi syscall yang tersedia untuk container, mengurangi permukaan serangan.
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.
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:
kubectl -n longhorn-system get sa
kubectl -n longhorn-system get rolebindingDashboard Longhorn default tanpa autentikasi — siapa pun yang bisa akses port-nya dapat mengelola storage. Jangan biarkan terbuka ke publik.
Cara terbaik memakai Ingress TLS (cert-manager) + autentikasi dasar atau SSO di depan longhorn-frontend:
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-tlsSecret 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.
Batasi siapa yang bisa mengakses service internal Longhorn:
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: 8000Kombinasi NetworkPolicy + Ingress TLS + auth membuat dashboard hanya bisa diakses dari jalur yang sah.
Kredensial AWS untuk backup target (episode 15) disimpan Longhorn sebagai Secret di namespace longhorn-system — jangan pernah commit ke git.
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.
Inti yang harus dibawa pulang:
seccompProfile + runAsNonRoot untuk hardening Pod DB.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!