9. december 2025

Kubernetes Secret kezelés: Gyakorlati megvalósítás

Szerző: Bene Marcell

A natív Kubernetes Secrets valójában csak base64-encodolva van, nem titkosítva, ami komoly biztonsági sebezhetőségeket okozhat GitOps workflow-k bevezetésekor. Érdemes tehát referenciaalapú megközelítést alkalmazni, amelyben a Git csak a secretre mutató hivatkozást tárolja, míg a tényleges secret a külső rendszerben marad. Ebben a cikkben konkrét implementációs példákon keresztül mutatok be három alternatívát a sebezhetőség elhárítására, beleértve a natív Kubernetes Secrets „megerősítését” (hardening) is.

1. megközelítés: Natív Kubernetes Secrets hardeninggel

2. megközelítés: Secrets Store CSI Driver

3. megközelítés: External Secrets Operator

A referencia-architektúra

A példákhoz egy meglehetősen standard architektúrát használunk:

  • Kubernetes cluster (AKS, EKS, GKE vagy self-managed)
  • PostgreSQL adatbázis
  • Webalkalmazás microservice-ekkel
  • Külső secret store

Ez az architektúra egy tipikus felépítés, ahol az alkalmazásoknak biztonságos hozzáférésre van szükségük külső erőforrásokhoz, miközben betartják a biztonsági best practice-eket.

1. megközelítés: Natív Kubernetes Secrets hardeninggel

A natív Kubernetes Secrets komoly korlátokat állít, mivel az értékek base64-encodolva (nem titkosítva) tárolódnak az etcd-ben. Megfelelő hardening lépésekkel azonban biztonságosabbá tehetők bizonyos use case-ek számára.

Encryption at rest engedélyezése az etcd számára

Az első kritikus hardening lépés az „encryption at rest” engedélyezése az etcd-hez. Titkosítás nélkül a secretek plaintext formában tárolódnak a cluster etcd adatbázisában.

A Kubernetes Secrets megfelelő védelméhez az encryption at rest engedélyezése kötelező. A hivatalos Kubernetes dokumentáció alapján így valósítható meg:

Erős titkosítási kulcs generálása

Az első lépés egy biztonságos 32-byte kulcs generálása és base64-enkódolása:

head -c 32 /dev/urandom | base64

EncryptionConfiguration fájl létrehozása

Ezután hozz létre egy EncryptionConfiguration Kubernetes erőforrást:

A részletekért lásd az alábbi dokumentációt:

https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data

A megfelelő encryption provider kiválasztása

A Kubernetes több encryption providert támogat, melyeknek mind megvannak az előnyei, hátrányai és korlátai. Bővebb részletekért lásd:

https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/#providers

Lokális vs. KMS titkosítás

Ha lokálisan kezelt kulcsot használsz titkosításra (ahogy a fenti példa mutatja), az csak az etcd kompromittálása ellen véd, a host kompromittálása ellen nem. Mivel az EncryptionConfiguration YAML fájl tartalmazza a titkosítási kulcsot, egy támadó, aki hozzáfér a control plane node-okhoz, ki tudja olvasni ezt – ne feledd: a base64 csak kódolás, nem titkosítás.

Nagyobb biztonság érdekében fontold meg a KMS provider használatát, amely az erőforrásokat egy data encryption key (DEK) segítségével, majd – ezt a data keyt – egy key encryption key (KEK) kulccsal titkosítja, amit egy külső key management service kezel. Ez az etcd és a harmadik féltől származó KMS provider együttes függőségét hozza létre, ami lényegesen biztonságosabbá teszi a megoldást.

API Server konfigurálása

A static pod manifest szerkesztésével mountold az encryption configurationt a kube-apiserverhez:

Az encryption működésének ellenőrzése

Az encryption at rest beállítása és az API server újraindítása után ellenőrizheted, hogy a secretek titkosítva vannak-e az etcd-ben.
Lépésről lépésre itt: https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/#verifying-that-data-is-encrypted

Meglévő secretek titkosítása

Fontos: a titkosítás bekapcsolása előtt létrehozott secretekhez további lépések szükségesek, hogy biztosan titkosítva legyenek. A Kubernetes dokumentáció átfogó útmutatót tartalmaz arról, hogyan gondoskodj róla, hogy minden releváns adat titkosítva legyen, beleértve azokat a parancsokat is, amelyek frissítik a meglévő secretek állapotát a tartalom megváltoztatása nélkül. Lásd az „Ensure all relevant data are encrypted” részt.

RBAC kontrollok megvalósítása

Kötelező korlátozni, ki férhet hozzá és ki kezelheti a secreteket. Itt egy példa RBAC konfigurációra a „least privilege” elv szerint:

Ezzel az RBAC konfigurációval biztosítjuk, hogy csak a myapp-service ServiceAccount olvashassa a db-credential secretjét, és csak a get műveletet hajthassa végre. Ez jelentősen csökkenti az illetéktelen hozzáférés kockázatát.

Fájlok titkosítása Git-ben

Ha Kubernetes manifesteket Git repositorykban tárolsz, az érzékeny adatok titkosítása kötelező. Olyan eszközök, mint a Mozilla SOPS, Sealed Secrets és git-crypt használhatók arra, hogy a titkosított secretek biztonságosan, az alkalmazáskód mellett legyenek tárolhatók.

Kommunikációk védelme TLS/SSL-lel

A Kubernetes-kommunikáció teljes körű TLS titkosítása alapvető az átfogó biztonsághoz. Ez érinti az API server, etcd és kubelet kommunikációját, valamint az alkalmazás szintjén is szükséges. A cert-managerhez hasonló certificate management eszközök segíthetnek az automatizálásban.

Mindkét téma elég összetett ahhoz, hogy önálló, dedikált útmutatót érdemeljen; javasolt a hivatalos Kubernetes dokumentáció tanulmányozása az adott környezethez igazítva.

2. megközelítés: Secrets Store CSI Driver

Ahogy az 1. részben bemutattam, a Secrets Store CSI Driver azzal kínál biztonságosabb megközelítést, hogy a secretek külső providerektől, közvetlenül volume-ként vannak a podokba mountolva, teljesen megkerülve az etcd tárolást (kivéve, ha a sync engedélyezve van).

Secrets Store CSI Driver telepítése

A legtöbb cloud provider kínál egyszerűsített telepítési módszert. Például AKS-en:

az aks enable-addons –addons azure-keyvault-secrets-provider –name         myAKSCluster –resource-group myResourceGroup

Más környezetekben jellemzően Helm-et használunk:

helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
helm install csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver \
–namespace kube-system \
–set syncSecret.enabled=true   # ONLY IF YOU WOULD LIKE TO ENABLE SYNC!

A SSCSI sikeres telepítése után (Helm Charttal vagy a cloud provider megoldásával) definiálnunk kell a resource-t. A SecretProviderClass egy custom resource, amely meghatározza, mely secretek legyenek mountolva a külső providerből.

Ez a konfiguráció két fontos dolgot csinál:

  • Meghatározza, mely secretek mountolódjanak az Azure Key Vaultból
  • Beállítja az opcionális sync funkciót, amely a mountolt secretekből Kubernetes Secreteket hoz létre

Ne feledd: ha a sync funkciót használod, a secretek az etcd-ben is tárolódnak, ezért ebben az esetben is engedélyezd az encryption at restet, ahogy az 1. megközelítésben!

Deployolás CSI Driverrel közvetlen mounttal

A legbiztonságosabb megközelítés, ha az alkalmazás közvetlenül a mountolt volume-ról olvassa a secreteket. Ezzel a konfigurációval az alkalmazás fájlokból olvas, nem environment variable-ökből — ez biztonságosabb, de alkalmazás-módosítást igényelhet. Azokhoz az alkalmazásokhoz, amelyek nem tudnak egyszerűen fájlból olvasni, használható a sync funkció Kubernetes Secret létrehozására.

Bal oldalt példák vannak Kubernetes Secret Sync nélkül, jobb oldalt pedig a syncelt megoldásra.

Megjegyzés: még ha environment variable-öket is használunk, a volume mountolása akkor is szükséges, mert a CSI Driver csak azután hozza létre a Kubernetes Secretet, miután sikeresen mountolta a secreteket a külső providerből.

3. megközelítés: External Secrets Operator

Az External Secrets Operator (ESO) más megközelítést alkalmaz. A secretek volume-ként történő mountolása helyett külső providerekből szinkronizálja azokat Kubernetes Secretekkel.

External Secrets Operator telepítése

Az ESO telepíthető Helmmel:

helm repo add external-secrets https://charts.external-secrets.io
helm install external-secrets external-secrets/external-secrets \
–namespace external-secrets \
–create-namespace

Azure autentikáció konfigurálása

Azure Key Vault integrációhoz az ESO több autentikációs módszert támogat. 2025. december állapot szerint AKS clustereknél a Workload Identity a javasolt megközelítés.

Azure autentikáció Workload Identityvel

Követelmények:

  • AKS cluster engedélyezett Workload Identityvel
  • Azure Key Vault releváns secrettel
  • Azure AD Application (Enterprise App), amely rendelkezik Key Vault hozzáféréssel, és a cluster ServiceAccountjához van federálva

Első lépésként annotálnod kell a Kubernetes ServiceAccountot, hogy társítsd az Azure AD Applicationhöz.

Ezután konfigurálnod kell a SecretStore erőforrást Workload Identityhez.

Hozd létre az ExternalSecret erőforrást.

Amint az ExternalSecret erőforrás létrejött és a sync lefutott, létrejön egy Kubernetes Secret erőforrás. Ellenőrizheted ezzel a paranccsal:

kubectl get secret myapp-azure-secret -n external-secrets -o yaml

Ha a sync nem sikerül, nézd meg az operator logokat:

kubectl logs deployment/external-secrets -n external-secrets

Összegzés

Ebben a bejegyzésben több implementációt és példát jártunk végig a Kubernetes secret management témájában, a következő kulcsmegközelítésekre fókuszálva:

  • 1. megközelítés: Natív Kubernetes Secrets hardeninggel – Könnyű használni, alap use case-ekhez megfelelő lehet, de production környezetben nem ajánlott.
  • 2. megközelítés: Secrets Store CSI Driver – Külső secret store-okat integrál CSI volume-okon keresztül, lehetővé téve a secretek dinamikus mountolását anélkül, hogy az etcd-ben maradnának; ugyanakkor az alkalmazásnak fájlokból kell olvasnia a secreteket, ami kódmódosítást igényelhet.
  • 3. megközelítés: External Secrets Operator (ESO) – Közvetlenül szinkronizál Azure Key Vaulthoz hasonló providerekből Kubernetes Secretekbe, támogatva a natív secret workflow-kat és az automatizálást. Általában ez a leginkább ajánlott.

A fenti példákat követve kiválaszthatod és implementálhatod azt a secret management mintát, amely a legjobban illeszkedik az igényeidhez. Ha lehetséges, használj olyan biztonságos módszert, mint az External Secrets Operator.

Források

https://kubernetes.io/docs/concepts/configuration/secret

https://kubernetes.io/docs/concepts/security/secrets-good-practices

https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data

https://secrets-store-csi-driver.sigs.k8s.io

https://external-secrets.io

Bejegyzés megosztása:

Témák és címkék:

Bejegyzés szerzője:

Bene Marcell

Bene Marcell egy tapasztalt Cloud / DevOps mérnök, aki széleskörű szakértelemmel rendelkezik a Google Cloud Platform (GCP) és a Kubernetes orkesztráció terén. Kiemelt jártassággal bír az Infrastructure-as-Code (IaC) megoldásokban Terraform használatával, valamint mélyreható ismeretekkel rendelkezik a GitOps alapú automatizált rendszerek üzemeltetésében olyan eszközökkel, mint a Flux CD.
Összes bejegyzés tőle: Bene Marcell

Kapcsolódó bejegyzések

Miként építettünk fel egy kiemelkedő szolgáltatást

Miként építettünk fel egy kiemelkedő szolgáltatást

Az informatikai szolgáltatások piacán egyre nagyobb a verseny. Sokan kínálnak hasonló megoldásokat, ezért a kulcs a kiemelkedő szolgáltatáshoz, egy nem csak az önmagunkra, hanem a piac többi résztvevőjére is reflektáló szemlélet, mely felfedi az általános...