Åtkomst till säkerhetscontainer till resurser med hjälp av inbyggda Linux-säkerhetsfunktioner
I den här artikeln får du lära dig hur du skyddar containeråtkomsten till resurser för dina Azure Kubernetes Service-arbetsbelastningar (AKS).
Översikt
På samma sätt som du bör ge användare eller grupper de minsta behörigheter som krävs bör du också begränsa containrar till endast nödvändiga åtgärder och processer. Undvik att konfigurera program och containrar som kräver eskalerade privilegier eller rotåtkomst för att minimera risken för angrepp.
Du kan använda inbyggda Kubernetes-poddsäkerhetskontexter för att definiera fler behörigheter, till exempel användaren eller gruppen som ska köras som, De Linux-funktioner som ska exponeras eller inställningen allowPrivilegeEscalation: false
i poddmanifestet. Mer metodtips finns i Säker poddåtkomst till resurser.
Om du vill ha ännu mer detaljerad kontroll över containeråtgärder kan du använda inbyggda Linux-säkerhetsfunktioner som AppArmor och seccomp.
- Definiera Linux-säkerhetsfunktioner på nodnivå.
- Implementera funktioner via ett poddmanifest.
Inbyggda Linux-säkerhetsfunktioner är endast tillgängliga på Linux-noder och poddar.
Kommentar
För närvarande är Kubernetes-miljöer inte helt säkra för fientlig användning av flera klientorganisationer. Ytterligare säkerhetsfunktioner, till exempel Microsoft Defender för containrar, AppArmor, seccomp, Pod Security Admission eller Kubernetes RBAC för noder, blockerar effektivt kryphål.
För sann säkerhet när du kör fientliga multitenantarbetsbelastningar litar du bara på ett hypervisor-program. Säkerhetsdomänen för Kubernetes blir hela klustret, inte en enskild nod.
För dessa typer av fientliga multitenantarbetsbelastningar bör du använda fysiskt isolerade kluster.
App Armor
Om du vill begränsa containeråtgärder kan du använda säkerhetsmodulen AppArmor Linux kernel. AppArmor är tillgängligt som en del av det underliggande AKS-nodoperativsystemet och är aktiverat som standard. Du skapar AppArmor-profiler som begränsar läs-, skriv- eller körningsåtgärder eller systemfunktioner som montering av filsystem. AppArmor-standardprofiler begränsar åtkomsten till olika /proc
platser och /sys
ger ett sätt att logiskt isolera containrar från den underliggande noden. AppArmor fungerar för alla program som körs på Linux, inte bara Kubernetes-poddar.
Om du vill se hur AppArmor fungerar skapar följande exempel en profil som förhindrar att filer skrivs.
SSH till en AKS-nod.
Skapa en fil med namnet deny-write.profile.
Kopiera och klistra in följande innehåll:
#include <tunables/global> profile k8s-apparmor-example-deny-write flags=(attach_disconnected) { #include <abstractions/base> file, # Deny all file writes. deny /** w, }
AppArmor-profiler läggs till med kommandot apparmor_parser
.
Lägg till profilen i AppArmor.
Ange namnet på profilen som skapades i föregående steg:
sudo apparmor_parser deny-write.profile
Om profilen parsas och tillämpas korrekt på AppArmor visas inga utdata och du återgår till kommandotolken.
Skapa ett poddmanifest med namnet aks-apparmor.yaml från den lokala datorn. Det här manifestet:
- Definierar en anteckning för
container.apparmor.security.beta.kubernetes
. - Refererar till den neka-skriv-profil som skapades i föregående steg.
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" ]
- Definierar en anteckning för
När podden har distribuerats kör du följande kommando och kontrollerar att hello-apparmor-podden visar statusen Körs :
kubectl get pods NAME READY STATUS RESTARTS AGE aks-ssh 1/1 Running 0 4m2s hello-apparmor 0/1 Running 0 50s
Mer information om AppArmor finns i AppArmor-profiler i Kubernetes.
Säker databehandling (sekcomp)
Medan AppArmor fungerar för alla Linux-program fungerar seccomp (secure computing) på processnivå. Seccomp är också en Säkerhetsmodul för Linux-kernel och stöds internt av den containerd
körning som används av AKS-noder. Med seccomp kan du begränsa en containers systemanrop. Seccomp etablerar ett extra skydd mot vanliga sårbarheter för systemanrop som utnyttjas av skadliga aktörer och gör att du kan ange en standardprofil för alla arbetsbelastningar i noden.
Konfigurera en standardprofil för seccomp (förhandsversion)
Du kan använda standardprofiler för seccomp med hjälp av anpassade nodkonfigurationer när du skapar en ny Linux-nodpool. Det finns två värden som stöds i AKS: RuntimeDefault
och Unconfined
. Vissa arbetsbelastningar kan kräva ett lägre antal syscall-begränsningar än andra. Det innebär att de kan misslyckas under körningen med profilen "RuntimeDefault". Om du vill undvika ett sådant fel kan du ange profilen Unconfined
. Om din arbetsbelastning kräver en anpassad profil kan du läsa Konfigurera en anpassad seccomp-profil.
Begränsningar
- SeccompDefault är inte en parameter som stöds för windows-nodpooler.
- SeccompDefault är tillgängligt från och med 2024-09-02-preview API.
Viktigt!
AKS-förhandsversionsfunktioner är tillgängliga via självbetjäning och anmäl dig. Förhandsversioner tillhandahålls "som är" och "som tillgängliga", och de undantas från serviceavtalen och den begränsade garantin. AKS-förhandsversioner omfattas delvis av kundsupport på bästa sätt. Därför är dessa funktioner inte avsedda för produktionsanvändning. Mer information finns i följande supportartiklar:
Registrera funktionsflaggan KubeletDefaultSeccompProfilePreview
Registrera funktionsflaggan
KubeletDefaultSeccompProfilePreview
az feature register
med kommandot .az feature register --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"
Det tar några minuter för statusen att visa Registrerad.
Kontrollera registreringsstatusen
az feature show
med kommandot .az feature show --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"
När statusen visar Registrerad uppdaterar du registreringen av resursprovidern Microsoft.ContainerService med hjälp av
az provider register
kommandot .az provider register --namespace Microsoft.ContainerService
Begränsa containerns systemanrop med seccomp
1. Följ stegen för att tillämpa en seccomp-profil i kubelet-konfigurationen genom att "seccompDefault": "RuntimeDefault"
ange .
RuntimeDefault
använder containerds standardprofil för seccomp, vilket begränsar vissa systemanrop för att förbättra säkerheten. Begränsade syscalls misslyckas. Mer information finns i standardprofilen för seccomp för containerD.
2. Kontrollera att konfigurationen har tillämpats.
Du kan bekräfta att inställningarna tillämpas på noderna genom att ansluta till värden och verifiera att konfigurationsändringar har gjorts i filsystemet.
3. Felsöka arbetsbelastningsfel.
När SeccompDefault är aktiverat används standardprofilen seccomp för containerkörning som standard för alla arbetsbelastningar som schemalagts på noden. Detta kan orsaka att arbetsbelastningar misslyckas på grund av blockerade syscalls. Om ett arbetsbelastningsfel har inträffat kan du se fel som:
- Arbetsbelastningen finns oväntat när funktionen har aktiverats, med felet "behörighet nekad".
- Seccomp-felmeddelanden kan också visas i gransknings- eller syslog genom att ersätta SCMP_ACT_ERRNO med SCMP_ACT_LOG i standardprofilen.
Om du får ovanstående fel rekommenderar vi att du ändrar seccomp-profilen till Unconfined
. Unconfined
ställer inga begränsningar för syscalls, vilket tillåter alla systemanrop, vilket minskar säkerheten.
Konfigurera en anpassad seccomp-profil
Med en anpassad seccomp-profil kan du ha mer detaljerad kontroll över begränsade syscalls. Anpassa till bästa praxis för att ge containern minimal behörighet att endast köras av:
- Definiera med filter vilka åtgärder som ska tillåtas eller nekas.
- Kommentera i ett YAML-poddmanifest som ska associeras med seccomp-filtret.
Om du vill se seccomp i praktiken skapar du ett filter som förhindrar att behörigheter ändras för en fil.
SSH till en AKS-nod.
Skapa ett seccomp-filter med namnet /var/lib/kubelet/seccomp/prevent-chmod.
Kopiera och klistra in följande innehåll:
{ "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [ { "name": "chmod", "action": "SCMP_ACT_ERRNO" }, { "name": "fchmodat", "action": "SCMP_ACT_ERRNO" }, { "name": "chmodat", "action": "SCMP_ACT_ERRNO" } ] }
I version 1.19 och senare måste du konfigurera:
{ "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [ { "names": ["chmod","fchmodat","chmodat"], "action": "SCMP_ACT_ERRNO" } ] }
Från den lokala datorn skapar du ett poddmanifest med namnet aks-seccomp.yaml och klistrar in följande innehåll. Det här manifestet:
- Definierar en anteckning för
seccomp.security.alpha.kubernetes.io
. - Refererar till filtret prevent-chmod som skapades i föregående steg.
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
I version 1.19 och senare måste du konfigurera:
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
- Definierar en anteckning för
Distribuera exempelpodden med kommandot kubectl apply :
kubectl apply -f ./aks-seccomp.yaml
Visa poddstatus med kommandot kubectl get pods .
- Podden rapporterar ett fel.
- Kommandot
chmod
hindras från att köras av seccomp-filtret, vilket visas i exempelutdata:
kubectl get pods NAME READY STATUS RESTARTS AGE chmod-prevented 0/1 Error 0 7s
Säkerhetsprofilalternativ för Seccomp
Seccomp-säkerhetsprofiler är en uppsättning definierade syscalls som är tillåtna eller begränsade. De flesta containerkörningar har en standardprofil för seccomp som är liknande om inte samma som den Som Docker använder. Mer information om tillgängliga profiler finns i Docker - eller containerD-standardprofiler för seccomp.
AKS använder standardprofilen för seccomp för containerD för vår RuntimeDefault när du konfigurerar seccomp med hjälp av anpassad nodkonfiguration.
Betydande syscalls blockerade som standardprofil
Både Docker och containerD underhåller tillåtna listor över säkra syscalls. Den här tabellen visar de betydande (men inte alla) syscalls som effektivt blockeras eftersom de inte finns på listan över tillåtna. Om någon av de blockerade syscalls krävs av din arbetsbelastning ska du inte använda RuntimeDefault
seccomp-profilen.
När ändringar görs i Docker och containerD uppdaterar AKS sin standardkonfiguration så att den matchar. Uppdateringar av den här listan kan orsaka arbetsbelastningsfel. Information om versionsuppdateringar finns i viktig information om AKS.
Blockerat syscall | beskrivning |
---|---|
acct |
Redovisning syscall som kan låta containrar inaktivera sina egna resursgränser eller bearbeta redovisning. Också gated av CAP_SYS_PACCT . |
add_key |
Förhindra att containrar använder kernelnyckelringen, som inte är namnrymd. |
bpf |
Neka inläsning av potentiellt beständiga bpf-program i kernel, som redan är gated av CAP_SYS_ADMIN . |
clock_adjtime |
Tid/datum är inte namnområde. Också gated av CAP_SYS_TIME . |
clock_settime |
Tid/datum är inte namnområde. Också gated av CAP_SYS_TIME . |
clone |
Neka kloning av nya namnområden. Också gated av CAP_SYS_ADMIN for CLONE_* flaggor, förutom CLONE_NEWUSER . |
create_module |
Neka manipulation och funktioner i kernelmoduler. Föråldrad. Också gated av CAP_SYS_MODULE . |
delete_module |
Neka manipulation och funktioner i kernelmoduler. Också gated av CAP_SYS_MODULE . |
finit_module |
Neka manipulation och funktioner i kernelmoduler. Också gated av CAP_SYS_MODULE . |
get_kernel_syms |
Neka hämtning av exporterade kernel- och modulsymboler. Föråldrad. |
get_mempolicy |
Syscall som ändrar kernelminne och NUMA-inställningar. Redan gated av CAP_SYS_NICE . |
init_module |
Neka manipulation och funktioner i kernelmoduler. Också gated av CAP_SYS_MODULE . |
ioperm |
Förhindra att containrar ändrar kernel-I/O-behörighetsnivåer. Redan gated av CAP_SYS_RAWIO . |
iopl |
Förhindra att containrar ändrar kernel-I/O-behörighetsnivåer. Redan gated av CAP_SYS_RAWIO . |
kcmp |
Begränsa funktionerna för processgranskning, som redan har blockerats genom att släppa CAP_SYS_PTRACE . |
kexec_file_load |
Syster syscall av kexec_load som gör samma sak, lite olika argument. Också gated av CAP_SYS_BOOT . |
kexec_load |
Neka inläsning av en ny kernel för senare körning. Också gated av CAP_SYS_BOOT . |
keyctl |
Förhindra att containrar använder kernelnyckelringen, som inte är namnrymd. |
lookup_dcookie |
Spårning/profilering av syscall, som kan läcka information på värden. Också gated av CAP_SYS_ADMIN . |
mbind |
Syscall som ändrar kernelminne och NUMA-inställningar. Redan gated av CAP_SYS_NICE . |
mount |
Neka montering, redan gated av CAP_SYS_ADMIN . |
move_pages |
Syscall som ändrar kernelminne och NUMA-inställningar. |
nfsservctl |
Neka interaktion med kerneln nfs daemon. Föråldrad sedan Linux 3.1. |
open_by_handle_at |
Orsak till ett gammalt containerutbrott. Också gated av CAP_DAC_READ_SEARCH . |
perf_event_open |
Spårning/profilering av syscall, som kan läcka information på värden. |
personality |
Förhindra att containern aktiverar BSD-emulering. Inte i sig farlig, men dåligt testad, potential för kernelvulner. |
pivot_root |
Neka pivot_root ska vara privilegierad åtgärd. |
process_vm_readv |
Begränsa funktionerna för processgranskning, som redan har blockerats genom att släppa CAP_SYS_PTRACE . |
process_vm_writev |
Begränsa funktionerna för processgranskning, som redan har blockerats genom att släppa CAP_SYS_PTRACE . |
ptrace |
Spårning/profilering av syscall. Blockerad i Linux-kernelversioner före 4.8 för att undvika seccomp bypass. Spårning/profilering av godtyckliga processer blockeras redan genom att CAP_SYS_PTRACE tas bort, eftersom det kan läcka information på värden. |
query_module |
Neka manipulation och funktioner i kernelmoduler. Föråldrad. |
quotactl |
Kvot-syscall som kan låta containrar inaktivera sina egna resursgränser eller bearbeta redovisning. Också gated av CAP_SYS_ADMIN . |
reboot |
Låt inte containrar starta om värden. Också gated av CAP_SYS_BOOT . |
request_key |
Förhindra att containrar använder kernelnyckelringen, som inte är namnrymd. |
set_mempolicy |
Syscall som ändrar kernelminne och NUMA-inställningar. Redan gated av CAP_SYS_NICE . |
setns |
Neka koppling av en tråd med ett namnområde. Också gated av CAP_SYS_ADMIN . |
settimeofday |
Tid/datum är inte namnområde. Också gated av CAP_SYS_TIME . |
stime |
Tid/datum är inte namnområde. Också gated av CAP_SYS_TIME . |
swapon |
Neka start/sluta växla till fil/enhet. Också gated av CAP_SYS_ADMIN . |
swapoff |
Neka start/sluta växla till fil/enhet. Också gated av CAP_SYS_ADMIN . |
sysfs |
Föråldrad syscall. |
_sysctl |
Föråldrad, ersatt av /proc/sys. |
umount |
Bör vara en privilegierad åtgärd. Också gated av CAP_SYS_ADMIN . |
umount2 |
Bör vara en privilegierad åtgärd. Också gated av CAP_SYS_ADMIN . |
unshare |
Neka kloning av nya namnområden för processer. Också gated av CAP_SYS_ADMIN , med undantag för att ta bort delningen --user. |
uselib |
Äldre syscall som rör delade bibliotek, som inte används under en längre tid. |
userfaultfd |
Felhantering av användarutrymmessidor, som till stor del behövs för processmigrering. |
ustat |
Föråldrad syscall. |
vm86 |
I kernel x86 verklig läge virtuell dator. Också gated av CAP_SYS_ADMIN . |
vm86old |
I kernel x86 verklig läge virtuell dator. Också gated av CAP_SYS_ADMIN . |
Nästa steg
För tillhörande metodtips, se Metodtips för klustersäkerhet och uppgraderingar i AKS och Metodtips för poddsäkerhet i AKS.
Azure Kubernetes Service