
Kubernetes security: een cluster dat standaard dicht staat
Een vers Kubernetes-cluster is gebouwd om te werken, niet om veilig te zijn. Elke pod kan elke andere pod bereiken, Secrets zijn alleen base64-gecodeerd en een container draait als root tenzij jij iets anders zegt. Wij zetten dat dicht: secrets uit een kluis, rechten per rol, policies die afdwingen wat er mag draaien en images die gescand en gesigneerd zijn. Het vaste team bouwt het en houdt het bij.
- Secrets uit een kluis via External Secrets, nooit plat in Git
- Pod Security Standards en NetworkPolicies als standaard, niet als project
- Images gescand met Trivy en geverifieerd voordat ze draaien
Wat is Kubernetes security, en waarom is de standaardinstallatie niet genoeg?
Kubernetes security is het geheel aan maatregelen dat bepaalt wie iets in je cluster mag doen, wat een container mag, met wie die mag praten en welke code er überhaupt binnenkomt. Het gaat om vier lagen: toegang (RBAC), workloads (Pod Security Standards en policies), netwerk (NetworkPolicies) en de supply chain (images, dependencies en je pipeline). Secrets lopen dwars door alle vier heen.
De standaard staat bijna overal open. Een Kubernetes Secret is base64, geen versleuteling. Iedereen met leesrechten op Secrets in een namespace leest je databasewachtwoord. Zonder NetworkPolicy kan een gecompromitteerde pod rechtstreeks je database of Valkey benaderen. Zonder admission policy draait een image met de tag latest als root met schrijfrechten op het hele bestandssysteem.
Voor een webshop is dat geen theoretisch risico. Een Magento- of Laravel-platform heeft betaalintegraties, klantdata en API-sleutels voor ERP en verzenders. Op deze pagina leggen we uit hoe wij een cluster inrichten: secretsbeheer, rechten, podbeveiliging, netwerk, policies en de supply chain. Plus waar het ophoudt: Kubernetes-hardening vervangt geen applicatiesecurity. Een SQL-injectie in je eigen module komt dwars door elke NetworkPolicy.
De lagen van Kubernetes security en de tools die we gebruiken
Alles declaratief en in Git, zodat het met Argo CD mee-deployt en elke wijziging een review krijgt.
| Laag | Tool of mechanisme | Wat het oplost | Let op |
|---|---|---|---|
| Secrets | External Secrets Operator | Haalt secrets uit AWS Secrets Manager, Azure Key Vault, Google Secret Manager, Vault of 1Password en maakt er Kubernetes Secrets van | De kluis wordt je bron van waarheid; rotatie en toegang regel je daar |
| Secrets | Sealed Secrets | Versleutelt secrets met een clustersleutel, zodat de versleutelde versie veilig in Git kan | Back-up van de private key van de controller, anders ben je alles kwijt bij een nieuw cluster |
| Toegang | RBAC en ServiceAccounts | Bepaalt wie welke resources mag lezen of wijzigen, per namespace of clusterbreed | cluster-admin voor een pipeline of een collega die alleen logs leest, is de klassieker |
| Workloads | Pod Security Standards via Pod Security Admission | Ingebouwde profielen privileged, baseline en restricted, af te dwingen per namespace | PHP-images moeten non-root en zonder extra capabilities kunnen draaien |
| Netwerk | NetworkPolicies | Default deny, en daarna alleen het verkeer dat je expliciet toestaat | Werkt alleen als je CNI het afdwingt, zoals Cilium of Calico |
| Policies | Kyverno | Valideert, muteert en genereert resources: geen latest-tags, verplichte limits, gesigneerde images | Begin in Audit-modus, schakel pas naar Enforce als de meldingen op nul staan |
| Supply chain | Trivy, cosign en SBOM's | Scant images en dependencies op CVE's, signeert images en legt vast waaruit ze bestaan | Een scan zonder afspraak over wat je met de uitkomst doet, is ruis |
Plan een vrijblijvend gesprek over je project
Een half uur via video met de mensen die het werk ook echt doen. Kies hieronder een moment dat jou past.
- Direct met het vaste team, geen tussenlagen
- Concrete feedback op je huidige situatie of plannen
- Eerlijk advies, ook als het antwoord "niet doen" is
- Indicatie van kosten en tijdlijn
Plan een gratis Tech Check
Vrijblijvend jouw uitdagingen bespreken
Of bel direct: 0591-239 299
Secrets: External Secrets Operator of Sealed Secrets
Secrets horen niet plat in Git en niet in een values.yaml. Voor alles wat we deployen via GitOps kiezen we tussen twee routes. External Secrets Operator (ESO) leest secrets uit een externe kluis en schrijft ze als gewone Kubernetes Secret in de namespace. In Git staat dan alleen een ExternalSecret-resource met een verwijzing, geen waarde. Sealed Secrets doet het omgekeerde: je versleutelt een secret lokaal met kubeseal en zet de versleutelde SealedSecret in Git. Alleen de controller in het cluster kan hem ontsleutelen.
Onze voorkeur is ESO zodra er een kluis is, of zodra je meerdere clusters of omgevingen hebt. Rotatie gebeurt dan op één plek. Je kunt toegang per secret regelen in de kluis, met auditlog. Op AWS koppelen we ESO via IRSA of EKS Pod Identity, op Azure via Workload Identity, zodat er geen statische cloudsleutels in het cluster staan. Sealed Secrets past bij een klein platform zonder cloudkluis, bijvoorbeeld een k3s-cluster op eigen servers.
Eerlijk over het onderhoud. ESO pauzeerde in augustus 2025 alle releases omdat er te weinig maintainers waren. Daarna kwamen er nieuwe maintainers bij en verschijnen er weer releases in de 2.x-reeks, met external-secrets.io/v1 als API-versie. Sealed Secrets komt van Bitnami, dat bij Broadcom hoort. Broadcom verplaatste in 2025 een groot deel van de gratis Bitnami-images naar een legacy-repository zonder updates. Sealed Secrets bleef daar buiten, maar controleer welk image en welke tag je trekt. Een image uit bitnamilegacy krijgt geen patches meer.
Wat in de secrets zit, verdient net zoveel aandacht. Bij Magento is dat de encryptiesleutel uit env.php, waarmee betaalgegevens en tokens in de database zijn versleuteld. Bij Laravel is het APP_KEY. Raak je die kwijt of lekt die, dan heb je een ander probleem dan een gewijzigd wachtwoord. Zet daarnaast encryptie at rest voor Secrets in etcd aan. Bij de meeste managed aanbieders is dat een instelling, bij een zelfgebouwd cluster een EncryptionConfiguration.
RBAC: minimale rechten voor mensen, pipelines en pods
RBAC in Kubernetes werkt met Roles en ClusterRoles die rechten bundelen, en RoleBindings die ze aan een gebruiker, groep of ServiceAccount koppelen. Het principe is simpel: geef alleen wat nodig is, in de namespace waar het nodig is.
Wij werken met drie soorten identiteiten. Mensen loggen in via de identity provider van de cloud of via OIDC, met groepen die op Roles mappen: lezen in productie, schrijven in staging. Argo CD heeft de rechten om te deployen, maar per AppProject beperkt tot de namespaces en resourcetypes van dat project. De CI-pipeline heeft met GitOps helemaal geen toegang tot het cluster nodig. Die pusht een image en past Git aan. Meer daarover op onze pagina over CI/CD naar Kubernetes.
Pods krijgen standaard een ServiceAccount-token gemount. Een PHP-FPM-pod heeft geen reden om met de Kubernetes API te praten. We zetten automountServiceAccountToken op false, behalve voor workloads die het echt nodig hebben. Leest je applicatie wel iets uit de API, dan krijgt die een eigen ServiceAccount met een Role die precies dat ene recht geeft. Rechten op Secrets, pods/exec en het aanmaken van pods controleren we apart, want daarmee kom je via een omweg bij alles.
Pod Security Standards: PHP-containers die niet als root draaien
PodSecurityPolicy is in Kubernetes 1.25 verwijderd. De opvolger is Pod Security Admission, ingebouwd en in te stellen met labels per namespace.
De Pod Security Standards kennen drie profielen. Privileged mag alles. Baseline blokkeert de bekende escalaties, zoals hostPath-volumes, privileged containers en hostNetwork. Restricted gaat verder: non-root verplicht, geen privilege escalation, alle Linux capabilities weg en een seccomp-profiel. Je zet per namespace een label als pod-security.kubernetes.io/enforce: restricted, en daarnaast warn en audit om eerst te zien wat er zou breken.
Voor Magento en Laravel betekent restricted een paar aanpassingen in het image. PHP-FPM draait als vaste non-root user. Nginx luistert op 8080 in plaats van 80, want een poort onder 1024 vraagt een capability. Met readOnlyRootFilesystem moeten schrijfbare paden expliciet een volume krijgen: voor Magento var/ en generated alleen als je ze niet in het image bakt, voor Laravel storage/framework en bootstrap/cache.
Varnish, Valkey en OpenSearch krijgen hetzelfde profiel waar het kan. Waar een component echt meer nodig heeft, zoals een CNI-agent of een log-collector op de node, staat die in een eigen namespace met een ruimer profiel.
NetworkPolicies: default deny en dan alleen wat moet
Zonder NetworkPolicy is een Kubernetes-namespace een plat netwerk. Elke pod bereikt elke andere pod, ook in andere namespaces. We beginnen daarom per namespace met een default-deny-policy voor inkomend en uitgaand verkeer. Daarna staan we per pad toe wat de applicatie nodig heeft: de Gateway naar Varnish, Varnish naar de webserver, PHP naar Valkey, OpenSearch en de database, en DNS naar CoreDNS.
Uitgaand verkeer is het deel dat meestal vergeten wordt. Een webshop belt naar betaalproviders, verzenders, het ERP en mailservers. Malware belt naar een command-and-control-server of een cryptominer-pool. Met egress-policies beperk je uitgaand verkeer tot bekende bestemmingen. Standaard NetworkPolicies werken op IP-blokken. Met Cilium kun je ook op DNS-namen filteren, wat bij externe API's achter wisselende IP-adressen een stuk werkbaarder is.
Let op: NetworkPolicies zijn alleen tekst als je netwerkplugin ze niet afdwingt. Cilium en Calico doen dat. Bij de managed aanbieders moet je het soms expliciet aanzetten. We testen elke policy door vanuit een tijdelijke pod te proberen wat niet mag. Een policy die je nooit hebt zien blokkeren, is een aanname.
Kyverno: policies die afdwingen wat er in je cluster mag
Pod Security Admission dekt de podconfiguratie. Voor de rest gebruiken we Kyverno, een policy engine die als admission controller elke resource controleert voordat die het cluster in gaat. Kyverno is in maart 2026 CNCF graduated geworden, de hoogste volwassenheidsstatus van de CNCF. Policies schrijf je als Kubernetes-resources, dus ze staan in Git en deployen via Argo CD.
Onze standaardset: geen images met de tag latest of zonder tag, alleen images uit je eigen registry, verplichte resource requests en limits, verplichte labels voor eigenaar en omgeving, en geen Services van het type LoadBalancer of NodePort buiten de Gateway om. Kyverno kan ook muteren, bijvoorbeeld een standaard securityContext toevoegen, en genereren, zoals automatisch een default-deny NetworkPolicy in elke nieuwe namespace.
De belangrijkste policy voor de supply chain is verifyImages: Kyverno controleert de cosign-handtekening of attestatie van een image en weigert images die niet uit jouw pipeline komen. Elke nieuwe policy zetten we eerst in Audit-modus. Kyverno meldt dan overtredingen in policy reports zonder iets te blokkeren. Pas als die rapporten leeg zijn, gaat de policy naar Enforce. Wie direct op Enforce begint, blokkeert binnen een uur zijn eigen deploy.
Image scanning en supply chain: Trivy, signing en je pipeline
Trivy scant container-images, bestandssystemen en Kubernetes-manifests op bekende kwetsbaarheden en misconfiguraties. In de pipeline scannen we elk image na de build, met een afspraak over drempels: een kritieke CVE met beschikbare fix blokkeert de release, de rest komt in een rapport. In het cluster draait de Trivy Operator, die draaiende workloads periodiek opnieuw scant. Een image dat vorige maand schoon was, is dat na een nieuwe CVE niet meer.
De supply chain gaat verder dan het basisimage. Composer- en npm-pakketten, Magento-extensies en GitHub Actions komen allemaal in je build terecht. In maart 2026 kreeg Trivy zelf een supply chain-aanval te verwerken: aanvallers overschreven vrijwel alle versietags van aquasecurity/trivy-action met code die credentials uit CI-runners stal. Iedereen die de action op een tag als v0.x gebruikte, draaide die code. De les is breder dan Trivy: pin GitHub Actions op een volledige commit-SHA. Sinds augustus 2025 kan je dat als organisatie afdwingen in de Actions-policy van GitHub.
Daarna signeren we images met cosign, of we leggen build provenance vast met de attestaties van GitHub Actions. Een SBOM per image legt vast welke pakketten erin zitten, zodat je bij de volgende grote CVE in minuten weet welke shops geraakt zijn. Kyverno controleert bij elke deploy of de handtekening klopt. Ook het basisimage telt: wie op gratis Bitnami-images bouwde, merkte in 2025 dat veel daarvan naar een legacy-repository zonder updates verhuisden. Wij bouwen op officiële images die we zelf kiezen en bijhouden.
De baseline die we op elk cluster zetten
Geen losse adviezen, maar een vaste set die in Git staat en bij elk nieuw cluster of elke nieuwe namespace meekomt.
Secrets en toegang
- Geen secrets in Git, values-bestanden of image-layers
- External Secrets Operator met workload identity naar de kluis, of Sealed Secrets met back-up van de sleutel
- Encryptie at rest voor Secrets in etcd
- Mensen via SSO met groepen, geen gedeelde kubeconfig
- Geen cluster-admin voor pipelines; Argo CD beperkt per AppProject
- automountServiceAccountToken uit voor applicatiepods
Workloads
- Pod Security Admission op restricted voor applicatienamespaces
- Non-root user, geen privilege escalation, alle capabilities weg
- readOnlyRootFilesystem met expliciete schrijfbare volumes
- Resource requests en limits op elke container
- Seccomp-profiel RuntimeDefault
Netwerk
- Default deny voor ingress en egress per namespace
- Expliciete policies per pad: Gateway, Varnish, PHP, Valkey, OpenSearch, database
- Egress beperkt tot bekende externe API's
- Admin-routes van Magento en Filament afgeschermd op Gateway-niveau
- TLS overal via cert-manager
Supply chain
- Trivy-scan in de pipeline met afgesproken drempels
- Trivy Operator voor periodieke scans van draaiende workloads
- GitHub Actions gepind op commit-SHA
- Images gesigneerd of met provenance-attestatie, geverifieerd door Kyverno
- SBOM per image, bewaard bij de release
- Alleen images uit je eigen registry, met digest in productie
Waar Kubernetes security ophoudt
Applicatiesecurity blijft je eigen werk
Een kwetsbare extensie of een lek in een Filament-panel komt dwars door het cluster. Patchen, code-review en een security-audit van de applicatie blijven nodig.
Lees verder →Laravel-specifieke hardening
Debugmodus uit, signed URL's, rate limiting en veilige uploads regel je in de applicatie, niet in een NetworkPolicy.
Lees verder →Verkeer van buiten
TLS, de Gateway API en het afschermen van admin-routes horen bij de ingresslaag. ingress-nginx wordt niet meer onderhouden; plan de overstap.
Lees verder →Eén shop zonder Kubernetes
Draai je één Magento-shop, dan is goede managed hosting vaak veiliger en goedkoper dan een cluster dat je zelf moet harden en bijhouden.
Lees verder →Zo pakken we Kubernetes security aan
Zes stappen, met het vaste team dat het cluster daarna ook beheert.
- 1
Scan van het huidige cluster
We lezen RBAC-bindings, secrets, podconfiguratie en netwerk uit, en draaien Trivy en Kyverno in Audit-modus. Uitkomst: een lijst met wat open staat, op volgorde van risico.
- 2
Secrets uit Git en uit het zicht
Kluis kiezen of koppelen, External Secrets of Sealed Secrets inrichten, secrets roteren die ooit plat ergens stonden.
- 3
Rechten opschonen
SSO-groepen naar Roles, Argo CD-projecten afbakenen, pipeline-toegang tot het cluster weghalen, tokens uit pods die ze niet nodig hebben.
- 4
Workloads en netwerk dichtzetten
Images aanpassen voor non-root en read-only, Pod Security Admission per namespace, default-deny NetworkPolicies met expliciete uitzonderingen. Eerst in staging, met tests.
- 5
Policies en supply chain
Kyverno-policies van Audit naar Enforce, Trivy in de pipeline, signing en verificatie van images, SHA-pinning van Actions.
- 6
Bijhouden
Upgrades van cluster en operators, nieuwe CVE's opvolgen, policy reports bekijken en de baseline bijwerken als Kubernetes verandert.
Wat je opgeleverd krijgt
- Securityscan van je cluster met risico's op volgorde
- Secretsbeheer via External Secrets Operator of Sealed Secrets, inclusief rotatieafspraken
- RBAC-opzet met SSO-groepen, AppProjects en minimale ServiceAccounts
- Pod Security Admission per namespace en aangepaste images voor non-root
- NetworkPolicies per namespace, getest op wat ze blokkeren
- Kyverno-policyset in Git, met policy reports
- Trivy in de pipeline en de Trivy Operator in het cluster
- Image signing en verificatie, plus een SBOM per release
Waarom Coding.nl voor Kubernetes security
We kennen de applicatie onder het cluster
Magento, Hyvä en Laravel bouwen we dagelijks. Daardoor weten we welke paden schrijfbaar moeten zijn en welke uitgaande calls een shop echt doet.
Geen tussenlagen
Je spreekt direct met de mensen die het cluster inrichten en beheren. Geen ticket dat drie keer wordt doorgezet.
Security als code
Policies, RBAC en NetworkPolicies staan in Git en gaan via review. Je ziet wat er verandert en kunt het terugdraaien.
Eerlijk advies
Als een cluster voor jouw situatie meer risico dan winst oplevert, zeggen we dat. Hypernode Silver Partner, dus we kennen ook het alternatief goed.

Verder lezen
- ›Kubernetes secrets: External Secrets Operator vs Sealed Secrets
- ›Software supply chain: Composer, npm en CI als ingang naar je webshop
- ›Magento encryptiesleutel en env.php: secrets beheren
- ›Magento 2 op Kubernetes: de architectuur per component
- ›ingress-nginx stopt: zo migreer je naar de Gateway API
- ›Laravel security checklist voor productie
- ›Security misconfiguration: 12 instellingen die webshops openzetten
- ›Magento extensies veiligheid: het supply chain risico
- ›Security logging voor webshops: wat log je en wanneer gaat er een alarm af?
Veelgestelde vragen
Meer over Kubernetes
Weten hoe dicht jouw cluster echt zit?
Vraag een Kubernetes security-scan aan. We lezen je RBAC, secrets, podconfiguratie, netwerk en images uit en geven je een lijst met wat open staat, op volgorde van risico. Zonder verkooppraatje, met wat het kost om het dicht te zetten.