Aanbevolen procedures voor clusterbeveiliging en -upgrades in Azure Kubernetes Service (AKS)
Wanneer u clusters beheert in Azure Kubernetes Service (AKS), is workload- en gegevensbeveiliging een belangrijke overweging. Wanneer u clusters met meerdere tenants uitvoert met behulp van logische isolatie, moet u met name de toegang tot resources en werkbelastingen beveiligen. Minimaliseer het risico op aanvallen door de meest recente beveiligingsupdates voor Kubernetes en het knooppuntbesturingssysteem toe te passen.
Dit artikel is gericht op het beveiligen van uw AKS-cluster. U leert het volgende:
- Gebruik Microsoft Entra ID en Kubernetes op rollen gebaseerd toegangsbeheer (Kubernetes RBAC) om toegang tot API-servers te beveiligen.
- Beveilig containertoegang tot knooppuntbronnen.
- Een AKS-cluster upgraden naar de nieuwste Kubernetes-versie.
- Houd knooppunten up-to-date en pas automatisch beveiligingspatches toe.
U kunt ook de aanbevolen procedures voor containerinstallatiekopieën beheren en voor podbeveiliging lezen.
Bedreigingsbeveiliging inschakelen
Richtlijnen voor best practices
U kunt Defender for Containers inschakelen om uw containers te beveiligen. Defender for Containers kan clusterconfiguraties beoordelen en beveiligingsaanbevelingen bieden, beveiligingsscans uitvoeren en realtime bescherming en waarschuwingen bieden voor Kubernetes-knooppunten en -clusters.
Toegang tot de API-server en clusterknooppunten beveiligen
Richtlijnen voor best practices
Een van de belangrijkste manieren om uw cluster te beveiligen, is door de toegang tot de Kubernetes-API-server te beveiligen. Als u de toegang tot de API-server wilt beheren, integreert u Kubernetes RBAC met Microsoft Entra-id. Met deze besturingselementen beveiligt u AKS op dezelfde manier als u de toegang tot uw Azure-abonnementen beveiligt.
De Kubernetes-API-server biedt één verbindingspunt voor aanvragen voor het uitvoeren van acties binnen een cluster. Als u de toegang tot de API-server wilt beveiligen en controleren, beperkt u de toegang en geeft u de laagst mogelijke machtigingsniveaus op. Hoewel deze benadering niet uniek is voor Kubernetes, is het vooral belangrijk wanneer u uw AKS-cluster logisch hebt geïsoleerd voor gebruik met meerdere tenants.
Microsoft Entra ID biedt een oplossing voor identiteitsbeheer die gereed is voor ondernemingen die kan worden geïntegreerd met AKS-clusters. Omdat Kubernetes geen oplossing voor identiteitsbeheer biedt, is het mogelijk moeilijk om de toegang tot de API-server gedetailleerd te beperken. Met geïntegreerde Microsoft Entra-clusters in AKS gebruikt u uw bestaande gebruikers- en groepsaccounts om gebruikers te verifiëren bij de API-server.
Met Kubernetes RBAC en Microsoft Entra ID-integratie kunt u de API-server beveiligen en de minimale machtigingen opgeven die vereist zijn voor een scoped resourceset, zoals één naamruimte. U kunt verschillende Microsoft Entra-gebruikers of groepen verschillende Kubernetes-rollen verlenen. Met gedetailleerde machtigingen kunt u de toegang tot de API-server beperken en een duidelijk audittrail met uitgevoerde acties opgeven.
De aanbevolen best practice is om groepen te gebruiken om toegang te bieden tot bestanden en mappen in plaats van afzonderlijke identiteiten. Gebruik bijvoorbeeld een Microsoft Entra ID-groepslidmaatschap om gebruikers te binden aan Kubernetes-rollen in plaats van afzonderlijke gebruikers. Als het groepslidmaatschap van een gebruiker verandert, worden de toegangsmachtigingen voor het AKS-cluster dienovereenkomstig gewijzigd.
Laten we ondertussen zeggen dat u de afzonderlijke gebruiker rechtstreeks verbindt aan een rol en dat de functie van de gebruiker wordt gewijzigd. Hoewel de Microsoft Entra-groepslidmaatschappen worden bijgewerkt, zouden hun machtigingen voor het AKS-cluster niet worden bijgewerkt. In dit scenario heeft de gebruiker meer machtigingen dan ze nodig hebben.
Zie Best practices voor verificatie en autorisatie in AKS voor meer informatie over Microsoft Entra-integratie, Kubernetes RBAC en Azure RBAC.
Toegang tot de API voor exemplaarmetagegevens beperken
Richtlijnen voor best practices
Voeg een netwerkbeleid toe aan alle gebruikersnaamruimten om het uitgaand verkeer van pods te blokkeren naar het eindpunt van de metagegevens.
Notitie
Als u netwerkbeleid wilt implementeren, neemt u het kenmerk --network-policy azure
op bij het maken van het AKS-cluster. Gebruik de volgende opdracht om het cluster te maken: az aks create -g myResourceGroup -n myManagedCluster --enable-managed-identity --network-plugin azure --network-policy azure
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: restrict-instance-metadata
spec:
podSelector:
matchLabels: {}
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 10.10.0.0/0#example
except:
- 169.254.169.254/32
Toegang tot resources voor containers beveiligen
Richtlijnen voor best practices
Beperk de toegang tot acties die containers kunnen uitvoeren. Geef het minste aantal machtigingen op en vermijd het gebruik van hoofdtoegang of escalatie met bevoegdheden.
Op dezelfde manier dat u gebruikers of groepen de vereiste minimale bevoegdheden moet verlenen, moet u ook containers beperken tot alleen noodzakelijke acties en processen. Vermijd het configureren van toepassingen en containers waarvoor geëscaleerde bevoegdheden of toegang tot de hoofdmap zijn vereist om het risico op aanvallen te minimaliseren.
Stel bijvoorbeeld allowPrivilegeEscalation: false
in het podmanifest in. Met deze ingebouwde Kubernetes-beveiligingscontexten kunt u aanvullende machtigingen definiëren, zoals de gebruiker of groep die moet worden uitgevoerd als, of de Linux-mogelijkheden om beschikbaar te maken. Zie Beveiligde podtoegang tot resources voor meer aanbevolen procedures.
Voor nog gedetailleerdere controle over containeracties kunt u ook ingebouwde Linux-beveiligingsfuncties zoals AppArmor en seccomp gebruiken.
- Definieer Linux-beveiligingsfuncties op knooppuntniveau.
- Implementeer functies via een podmanifest.
Ingebouwde Linux-beveiligingsfuncties zijn alleen beschikbaar op Linux-knooppunten en -pods.
Notitie
Momenteel zijn Kubernetes-omgevingen niet volledig veilig voor vijandig gebruik met meerdere tenants. Aanvullende beveiligingsfuncties, zoals Microsoft Defender for ContainersAppArmor, seccomp, Pod Security Admission of Kubernetes RBAC voor knooppunten, blokkeren aanvallen efficiënt.
Voor echte beveiliging bij het uitvoeren van vijandige workloads met meerdere tenants vertrouwt u alleen een hypervisor. Het beveiligingsdomein voor Kubernetes wordt het hele cluster, niet een afzonderlijk knooppunt.
Voor deze typen vijandige workloads met meerdere tenants moet u fysiek geïsoleerde clusters gebruiken.
App Armor
Als u containeracties wilt beperken, kunt u de AppArmor Linux-kernelbeveiligingsmodule gebruiken. AppArmor is beschikbaar als onderdeel van het onderliggende AKS-knooppuntbesturingssysteem en is standaard ingeschakeld. U maakt AppArmor-profielen waarmee lees-, schrijf- of uitvoerbewerkingen of systeemfuncties, zoals het koppelen van bestandssysteem, worden beperkt. Standaard AppArmor-profielen beperken de toegang tot verschillende /proc
locaties en /sys
bieden een manier om containers logisch te isoleren van het onderliggende knooppunt. AppArmor werkt voor elke toepassing die wordt uitgevoerd op Linux, niet alleen Kubernetes-pods.
Als u AppArmor in actie wilt zien, wordt in het volgende voorbeeld een profiel gemaakt dat het schrijven naar bestanden voorkomt.
SSH naar een AKS-knooppunt.
Maak een bestand met de naam deny-write.profile.
Kopieer en plak de volgende inhoud:
#include <tunables/global> profile k8s-apparmor-example-deny-write flags=(attach_disconnected) { #include <abstractions/base> file, # Deny all file writes. deny /** w, }
AppArmor-profielen worden toegevoegd met behulp van de apparmor_parser
opdracht.
Voeg het profiel toe aan AppArmor.
Geef de naam op van het profiel dat u in de vorige stap hebt gemaakt:
sudo apparmor_parser deny-write.profile
Als het profiel correct wordt geparseerd en toegepast op AppArmor, ziet u geen uitvoer en wordt u teruggezet naar de opdrachtprompt.
Maak op uw lokale computer een podmanifest met de naam aks-apparmor.yaml. Dit manifest:
- Hiermee definieert u een aantekening voor
container.apparmor.security.beta.kubernetes
. - Verwijst naar het deny-write-profiel dat in de vorige stappen is gemaakt.
apiVersion: v1 kind: Pod metadata: name: hello-apparmor annotations: container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-apparmor-example-deny-write spec: containers: - name: hello image: mcr.microsoft.com/dotnet/runtime-deps:6.0 command: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 1h" ]
- Hiermee definieert u een aantekening voor
Wanneer de pod is geïmplementeerd, voert u de volgende opdracht uit en controleert u of de hello-apparmor-pod de status Actief heeft:
kubectl get pods NAME READY STATUS RESTARTS AGE aks-ssh 1/1 Running 0 4m2s hello-apparmor 0/1 Running 0 50s
Zie AppArmor-profielen in Kubernetes voor meer informatie over AppArmor.
Beveiligde computing
Hoewel AppArmor werkt voor elke Linux-toepassing, werkt seccomp (secure compting) op procesniveau. Seccomp is ook een Linux-kernelbeveiligingsmodule en wordt systeemeigen ondersteund door de Docker-runtime die wordt gebruikt door AKS-knooppunten. Met seccomp kunt u containerprocesaanroepen beperken. Uitlijnen op de aanbevolen procedure voor het verlenen van minimale machtigingen aan de container om alleen te worden uitgevoerd door:
- Definiëren met filters welke acties moeten worden toegestaan of geweigerd.
- Aantekeningen toevoegen in een YAML-manifest voor pods om te koppelen aan het seccomp-filter.
Als u seccomp in actie wilt zien, maakt u een filter waarmee het wijzigen van machtigingen voor een bestand wordt voorkomen.
SSH naar een AKS-knooppunt.
Maak een seccomp-filter met de naam /var/lib/kubelet/seccomp/prevent-chmod.
Kopieer en plak de volgende inhoud:
{ "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [ { "name": "chmod", "action": "SCMP_ACT_ERRNO" }, { "name": "fchmodat", "action": "SCMP_ACT_ERRNO" }, { "name": "chmodat", "action": "SCMP_ACT_ERRNO" } ] }
In versie 1.19 en hoger moet u het volgende configureren:
{ "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [ { "names": ["chmod","fchmodat","chmodat"], "action": "SCMP_ACT_ERRNO" } ] }
Maak op uw lokale computer een podmanifest met de naam aks-seccomp.yaml en plak de volgende inhoud. Dit manifest:
- Hiermee definieert u een aantekening voor
seccomp.security.alpha.kubernetes.io
. - Verwijst naar het filter prevent-chmod dat in de vorige stap is gemaakt.
apiVersion: v1 kind: Pod metadata: name: chmod-prevented annotations: seccomp.security.alpha.kubernetes.io/pod: localhost/prevent-chmod spec: containers: - name: chmod image: mcr.microsoft.com/dotnet/runtime-deps:6.0 command: - "chmod" args: - "777" - /etc/hostname restartPolicy: Never
In versie 1.19 en hoger moet u het volgende configureren:
apiVersion: v1 kind: Pod metadata: name: chmod-prevented spec: securityContext: seccompProfile: type: Localhost localhostProfile: prevent-chmod containers: - name: chmod image: mcr.microsoft.com/dotnet/runtime-deps:6.0 command: - "chmod" args: - "777" - /etc/hostname restartPolicy: Never
- Hiermee definieert u een aantekening voor
Implementeer de voorbeeldpod met behulp van de opdracht kubectl apply :
kubectl apply -f ./aks-seccomp.yaml
Bekijk de podstatus met behulp van de opdracht kubectl get pods .
- De pod rapporteert een fout.
- De
chmod
opdracht kan niet worden uitgevoerd door het seccomp-filter, zoals wordt weergegeven in de volgende voorbeelduitvoer:
kubectl get pods NAME READY STATUS RESTARTS AGE chmod-prevented 0/1 Error 0 7s
Zie Seccomp-beveiligingsprofielen voor Docker voor meer informatie over beschikbare filters.
Regelmatig bijwerken naar de nieuwste versie van Kubernetes
Richtlijnen voor best practices
Als u op de hoogte wilt blijven van nieuwe functies en oplossingen voor fouten, voert u regelmatig een upgrade uit van de Kubernetes-versie in uw AKS-cluster.
Kubernetes brengt nieuwe functies sneller uit dan meer traditionele infrastructuurplatforms. Kubernetes-updates zijn onder andere:
- Nieuwe functies
- Bug- of beveiligingsoplossingen
Nieuwe functies doorlopen doorgaans de alfa- en bètastatus voordat ze stabiel worden. Eenmaal stabiel, zijn algemeen beschikbaar en aanbevolen voor productiegebruik. Met de nieuwe releasecyclus van Kubernetes kunt u Kubernetes bijwerken zonder dat er regelmatig wijzigingen optreden die fouten veroorzaken of uw implementaties en sjablonen aanpassen.
AKS ondersteunt drie secundaire versies van Kubernetes. Zodra een nieuwe secundaire patchversie is geïntroduceerd, worden de oudste secundaire versie en patchreleases die worden ondersteund buiten gebruik gesteld. Kleine Kubernetes-updates worden periodiek uitgevoerd. Als u binnen de ondersteuning wilt blijven, moet u ervoor zorgen dat u een governanceproces hebt om te controleren op de benodigde upgrades. Zie Ondersteunde Kubernetes-versies AKS voor meer informatie.
Als u de versies wilt controleren die beschikbaar zijn voor uw cluster, gebruikt u de opdracht az aks get-upgrades , zoals wordt weergegeven in het volgende voorbeeld:
az aks get-upgrades --resource-group myResourceGroup --name myAKSCluster --output table
Vervolgens kunt u uw AKS-cluster upgraden met behulp van de opdracht az aks upgrade . Het upgradeproces veilig:
- Cordons en afvoert één knooppunt tegelijk.
- Hiermee worden pods op resterende knooppunten gepland.
- Hiermee wordt een nieuw knooppunt geïmplementeerd waarop de nieuwste versies van het besturingssysteem en Kubernetes worden uitgevoerd.
Belangrijk
Test nieuwe secundaire versies in een ontwikkeltestomgeving en controleer of uw workload in orde blijft met de nieuwe Kubernetes-versie.
Kubernetes kan API's (zoals in versie 1.16) waarvoor uw workloads afhankelijk zijn, verwijderen. Wanneer u nieuwe versies in productie neemt, kunt u overwegen om meerdere knooppuntgroepen te gebruiken in afzonderlijke versies en afzonderlijke pools één voor één bij te werken om de update geleidelijk over een cluster te rollen. Als u meerdere clusters uitvoert, moet u één cluster tegelijk upgraden om progressief te controleren op impact of wijzigingen.
az aks upgrade --resource-group myResourceGroup --name myAKSCluster --kubernetes-version KUBERNETES_VERSION
Zie Ondersteunde Kubernetes-versies in AKS en een AKS-cluster upgraden voor meer informatie over upgrades in AKS.
Updates voor Linux-knooppunten verwerken
Elke avond krijgen Linux-knooppunten in AKS beveiligingspatches via hun distributie-updatekanaal. Dit gedrag wordt automatisch geconfigureerd omdat de knooppunten worden geïmplementeerd in een AKS-cluster. Om onderbrekingen en mogelijke gevolgen voor actieve workloads te minimaliseren, worden knooppunten niet automatisch opnieuw opgestart als een beveiligingspatch of kernelupdate dit vereist. Zie Beveiligings- en kernelupdates toepassen op knooppunten in AKS voor meer informatie over het afhandelen van opnieuw opstarten van knooppunten.
Upgrades van knooppuntinstallatiekopieën
Bij upgrades zonder toezicht worden updates toegepast op het besturingssysteem van het Linux-knooppunt, maar de installatiekopieën die worden gebruikt om knooppunten voor uw cluster te maken, blijven ongewijzigd. Als er een nieuw Linux-knooppunt aan uw cluster wordt toegevoegd, wordt de oorspronkelijke installatiekopieën gebruikt om het knooppunt te maken. Dit nieuwe knooppunt ontvangt alle beveiligingsupdates en kernelupdates die elke nacht beschikbaar zijn tijdens de automatische controle, maar blijven niet gepatcht totdat alle controles en opnieuw opstarten zijn voltooid. U kunt de upgrade van de knooppuntinstallatiekopieën gebruiken om te controleren op knooppuntinstallatiekopieën die door uw cluster worden gebruikt en bij te werken. Zie voor meer informatie over upgrade van knooppuntinstallatiekopieën azure Kubernetes Service (AKS)-knooppuntinstallatiekopieën.
Windows Server-knooppuntupdates verwerken
Voor Windows Server-knooppunten voert u regelmatig een upgradebewerking voor knooppuntinstallatiekopieën uit om veilig cordon- en afvoerpods uit te voeren en bijgewerkte knooppunten te implementeren.