Dela via


Å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.

  1. Definiera Linux-säkerhetsfunktioner på nodnivå.
  2. 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.

AppArmor-profiler som används i ett AKS-kluster för att begränsa containeråtgärder

Om du vill se hur AppArmor fungerar skapar följande exempel en profil som förhindrar att filer skrivs.

  1. SSH till en AKS-nod.

  2. Skapa en fil med namnet deny-write.profile.

  3. 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 .

  1. Lägg till profilen i AppArmor.

  2. 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.

  3. 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" ]
    
  4. 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

  1. 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.

  2. Kontrollera registreringsstatusen az feature show med kommandot .

    az feature show --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"
    
  3. 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.

  1. SSH till en AKS-nod.

  2. Skapa ett seccomp-filter med namnet /var/lib/kubelet/seccomp/prevent-chmod.

  3. 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"
        }
      ]
    }
    
  4. 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
    
  5. Distribuera exempelpodden med kommandot kubectl apply :

    kubectl apply -f ./aks-seccomp.yaml
    
  6. 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.