AKS-platform: security policy¶
Deze pagina beschrijft de guardrails die het cluster en de workloads erop beschermen: Azure Policy voor Kubernetes, de Kyverno- policies, network policies, namespacequota, imageregels en het uitzonderingsproces. Workload teams komen deze regels bij elke deployment tegen.
Referentieontwerp, jouw deployment kan afwijken
De toewijzingen aan de Azure-kant zijn uit Terraform gelezen. De policies in het cluster (Kyverno, network policies, quota) komen
uit de manifests die naar de GitOps-repository van het platform zijn gemigreerd; de kopieën die in de Terraform-repository zijn achtergebleven zijn
deprecated en worden hier gebruikt als referentie voor hun inhoud. Effecten (Audit of Enforce) veranderen per omgeving
en in de tijd. Vraag je platformteam naar de huidige stand.
Defence in depth¶
| Fase | Control |
|---|---|
| Azure | Azure Policy-toewijzingen op de resource group, Defender for Cloud (optioneel), diagnostic settings, alerts |
| Cluster | Private API server, alleen Entra ID, managed identities, geharde node pools, upgradestrategie |
| Admission | Azure Policy add-on (Gatekeeper) voor de ingebouwde initiatives van Microsoft, Kyverno voor door het platform gedefinieerde validatie en mutatie |
| Runtime | Network policies, workload identity, Key Vault, TLS op de gateway |
Azure Policy en Defender¶
De Azure Policy layer wijst deze ingebouwde definities toe aan een resource group (zie de opmerking over de policyscope in Architectuur):
| Toewijzing | Effect in de referentieconfiguratie |
|---|---|
| Kubernetes cluster pod security baseline standards for Linux workloads | Variabele azure_policy_baseline_effect, Audit in beide omgevingen. De opmerking zegt na een validatieperiode over te gaan op Deny. |
| Pod security restricted standards for Linux workloads (alleen productie) | Audit |
| Kubernetes clusters should not allow container privilege escalation | Deny |
| Kubernetes clusters should be accessible only over HTTPS | Deny |
| Containers should not share host process ID or IPC namespace | Deny |
| Eigen toewijzingen | Een map in de configuratie, standaard leeg (bijvoorbeeld "AKS must use a private API server") |
Namespaces die in de referentiebestanden van deze toewijzingen zijn uitgezonderd: kube-system, gatekeeper-system, azure-arc, kyverno,
gateway-system, monitoring.
Het ontwerp zegt dat de baseline in productie wordt afgedwongen en in niet-productie wordt geaudit. De configuratiebestanden stellen Audit in
voor beide, dus controleer het actuele effect voordat je erop vertrouwt.
Optionele switches van de layer, allemaal uit in de referentiebestanden:
| Switch | Wat hij doet |
|---|---|
deploy_defender |
Defender for Cloud-plannen Containers, KeyVaults en CloudPosture op subscriptionniveau, en een security contact |
deploy_diagnostic_settings |
Diagnostic settings voor de vermelde resources naar een Log Analytics workspace |
deploy_security_alerts |
Een action group met e-mailontvangers en scheduled query alert rules op Log Analytics |
Defender for Containers wordt beschreven als niet ondersteund op Azure Local (AKS op Azure Local).
Kyverno-policies¶
Kyverno is de aanbevolen policy engine voor admissionregels: YAML in plaats van Rego, validatie, mutatie en generatie in één tool, en policy reports als Kubernetes-resources. Hij wordt door de GitOps-repository uitgerold en is optioneel. Zolang hij niet is uitgerold, geeft Azure Policy de pod security-baseline.
De policylevenscyclus is: concept (pull request, gereviewd door platform en security), daarna audit in niet-productie, daarna afdwingen in niet-productie na 7 dagen zonder nieuwe overtredingen, daarna afdwingen in productie na 14 dagen stabiel. Alle promoties zijn pull requests.
Pod security en imagecontroles¶
| Control | Niet-productie | Productie | Engine |
|---|---|---|---|
| Privileged containers blokkeren | Enforce | Enforce | Azure Policy en Kyverno |
| hostPath, hostNetwork, hostPID, hostIPC blokkeren | Enforce | Enforce | Azure Policy en Kyverno |
| Privilege escalation blokkeren | Enforce | Enforce | Azure Policy en Kyverno |
| Resource requests en limits verplicht stellen | Enforce | Enforce | Kyverno |
| Goedgekeurde registries verplicht stellen | Enforce | Enforce | Kyverno |
runAsNonRoot verplicht stellen |
Audit | Enforce | Kyverno |
| Alle capabilities droppen | Audit | Enforce | Kyverno |
Seccomp RuntimeDefault verplicht stellen |
Audit | Enforce | Kyverno |
De tag latest blokkeren |
Audit | Enforce | Kyverno |
| Read-only root file system | Audit | Audit | Kyverno |
De tabel is het ontwerp. De Kyverno-manifests in de repository hebben allemaal validationFailureAction: Audit; het
verschil tussen productie en niet-productie is bedoeld om via omgevingswaarden in de GitOps-repository te worden ingesteld.
Goedgekeurde registries zijn de container registry van de organisatie (*.azurecr.io) en mcr.microsoft.com.
Kyverno kan pods ook muteren, zodat teams veilige defaults niet zelf hoeven in te stellen: runAsNonRoot, geen privilege escalation,
seccomp RuntimeDefault, alle capabilities droppen. De repository bevat mutatiepolicies voor non-root, gedropte capabilities
en seccomp.
Imageregels (ontwerp)¶
| Vereiste | Niet-productie | Productie |
|---|---|---|
| Images alleen uit goedgekeurde registries | Enforce | Enforce |
| Kwetsbaarheidsscan, critical en high | Waarschuwen | Blokkeren (high tenzij geaccepteerd) |
| Image signing en SBOM | Niet vereist | Aanbevolen, toekomstig |
Images worden door de kubelet-identiteit met de rol AcrPull opgehaald, dus er worden geen pull secrets in het cluster opgeslagen.
Network policies¶
Elke applicatienamespace krijgt default deny voor ingress en egress, en daarna expliciete allows uit de basisset:
| Policy | Effect |
|---|---|
default-deny-all |
Blokkeert alle ingress en egress |
allow-dns |
Egress naar kube-dns |
allow-ingress-from-gateway |
Ingress van de gateway-namespace naar applicatiepods |
allow-egress-to-private-endpoints |
Egress naar het private endpoint-subnet op poorten 443, 5432 en 6379 |
allow-prometheus-scrape |
Ingress van de Prometheus-pods in de monitoring-namespace op poorten 9090, 8080, 9394 |
Teams voegen eigen policies toe voor aanroepen tussen namespaces en voor specifieke egress. NetworkPolicy regelt east-west-verkeer binnen het cluster; een firewall (indien aanwezig) regelt north-south-verkeer en verkeer tussen spokes.
Opmerking
De private endpoint-policy bevat de CIDR van het private endpoint-subnet van het cluster, dus hij verschilt per omgeving.
De load test voegt eigen policies toe voor de namespace load-testing en voor de doelpoorten (Load testing).
Namespace-baseline¶
Elke teamnamespace krijgt een resource quota en een limit range uit de GitOps-repository.
| Instelling | Overlay niet-productie | Overlay productie |
|---|---|---|
| Requests CPU / geheugen | 8 / 16 GiB | 2 / 4 GiB |
| Limits CPU / geheugen | 16 / 32 GiB | 4 / 8 GiB |
| Pods | 100 | 30 |
| Basisdefaults | 4 CPU / 8 GiB requests, 8 CPU / 16 GiB limits, 50 pods, 10 services, 10 persistent volume claims, 20 secrets, 20 config maps |
Containerdefaults uit de limit range: request 100m CPU en 128 MiB, limit 500m CPU en 512 MiB; minimum 50m en 64 MiB, maximum 4 CPU en 8 GiB per container, 8 CPU en 16 GiB per pod.
Controleer de productie-overlay
In de deprecated overlays is het productiequotum kleiner dan het niet-productiequotum. Dat kan bedoeld zijn (kleine beginnamespaces) of een omgewisselde waarde. De waarden in de GitOps-repository gelden.
Namespaces worden alleen via GitOps aangemaakt; er een aanmaken met kubectl wordt door een admission policy geblokkeerd voor
niet-platformsubjects (ontwerp). Elke nieuwe namespace wordt ingericht met het quotum, de limit range, de default-deny network policy en
de role bindings. Het ontwerp maakt deze labels verplicht:
| Label | Doel |
|---|---|
<labelDomain>/team |
Eigenaarschap van het team |
<labelDomain>/environment |
dev, test, accp of prod |
<labelDomain>/type |
application of platform |
<labelDomain>/data-classification |
public, internal, confidential of restricted |
<labelDomain>/security-tier |
standard of high |
<labelDomain>/cost-center |
Kostenregistratie |
Een eigenaarscontact en de manier waarop de namespace is aangemaakt zijn verplichte annotaties. De Kyverno-policy in de repository controleert alleen de labels team en environment, dus de exacte verplichte set hangt af van de versie van de GitOps-repository.
Secrets in het cluster¶
| Regel | Afdwinging (ontwerp) |
|---|---|
| Geen plaintext secrets in Git | Pre-commit scanning en server-side push protection |
| Liever Key Vault dan Kubernetes Secrets | Richtlijn |
| Geen secrets in config maps | Kyverno, audit |
Alleen secrettypen Opaque en TLS |
Kyverno, audit |
Rotatie wordt afgehandeld door Key Vault-rotatiepolicies en de applicatie leest de laatste waarde met de SDK.
Policy-uitzonderingen¶
Een uitzondering stelt één workload voor beperkte tijd vrij van één policy.
- Het team opent een pull request in de GitOps-repository van het platform die een
PolicyExceptiontoevoegt (een lijst in de omgevings- waarden). De beschrijving geeft de motivatie. - Het securityteam reviewt en keurt goed. Het platformteam merget en Argo CD rolt het uit.
- Kwartaalreview: verleng met motivatie, of verwijder.
| Regel | Detail |
|---|---|
| Verloop | Elke uitzondering heeft een vervaldatum, maximaal 90 dagen, verlengbaar met nieuwe goedkeuring |
| Scope | Eén namespace en workload, nooit clusterbreed |
| Metadata | Eigenaar, goedkeurder, reden, risico, compenserende maatregelen, ticketreferentie |
| Bijhouden | Policy reports tonen welke workloads onder een uitzondering draaien |
Zie ook Policies en uitzonderingen voor de Azure Policy-uitzonderingen van het MCP- platform zelf.