Delen via


Toegang tot resources met behulp van ingebouwde Linux-beveiligingsfuncties

In dit artikel leert u hoe u containertoegang tot resources voor uw AKS-workloads (Azure Kubernetes Service) kunt beveiligen.

Overzicht

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.

U kunt ingebouwde Kubernetes-beveiligingscontexten voor pods gebruiken om meer machtigingen te definiëren, zoals de gebruiker of groep die moet worden uitgevoerd als, de Linux-mogelijkheden voor het beschikbaar maken of instellen allowPrivilegeEscalation: false in het podmanifest. Zie Beveiligde podtoegang tot resources voor meer aanbevolen procedures.

Voor nog gedetailleerdere controle over containeracties kunt u ingebouwde Linux-beveiligingsfuncties zoals AppArmor en seccomp gebruiken.

  1. Definieer Linux-beveiligingsfuncties op knooppuntniveau.
  2. 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 multitenant gebruik. Aanvullende beveiligingsfuncties, zoals Microsoft Defender for Containers, AppArmor, seccomp, Pod Security Admission of Kubernetes RBAC voor knooppunten, blokkeren aanvallen efficiënt.

Voor echte beveiliging bij het uitvoeren van vijandige multitenant-workloads vertrouwt u alleen een hypervisor. Het beveiligingsdomein voor Kubernetes wordt het hele cluster, niet een afzonderlijk knooppunt.

Voor deze typen vijandige multitenant-workloads 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.

AppArmor-profielen die worden gebruikt in een AKS-cluster om containeracties te beperken

Als u AppArmor in actie wilt zien, wordt in het volgende voorbeeld een profiel gemaakt dat het schrijven naar bestanden voorkomt.

  1. SSH naar een AKS-knooppunt.

  2. Maak een bestand met de naam deny-write.profile.

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

  1. Voeg het profiel toe aan AppArmor.

  2. 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 keert u terug naar de opdrachtprompt.

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

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 containerd runtime die wordt gebruikt door AKS-knooppunten. Met seccomp kunt u de systeemaanroepen van een container beperken. Seccomp brengt een extra beveiligingslaag tot stand tegen veelvoorkomende beveiligingsproblemen van systeemaanroepen die worden misbruikt door kwaadwillende actoren en stelt u in staat om een standaardprofiel op te geven voor alle workloads in het knooppunt.

Een standaardprofiel voor seccomp configureren (preview)

U kunt standaardprofielen voor seccomp toepassen met behulp van aangepaste knooppuntconfiguraties bij het maken van een nieuwe Linux-knooppuntgroep. Er worden twee waarden ondersteund op AKS: RuntimeDefault en Unconfined. Voor sommige workloads is mogelijk een lager aantal syscall-beperkingen vereist dan andere. Dit betekent dat ze kunnen mislukken tijdens runtime met het runtimeprofiel RuntimeDefault. Als u een dergelijke fout wilt verhelpen, kunt u het Unconfined profiel opgeven. Als uw workload een aangepast profiel vereist, raadpleegt u Een aangepast seccomp-profiel configureren.

Beperkingen

  • SeccompDefault is geen ondersteunde parameter voor Windows-knooppuntgroepen.
  • SeccompDefault is beschikbaar vanaf 2024-09-02-preview-API.

Belangrijk

AKS preview-functies zijn beschikbaar op selfservice, opt-in basis. Previews worden geleverd 'zoals is' en 'als beschikbaar' en ze worden uitgesloten van de serviceovereenkomsten en beperkte garantie. AKS-previews worden gedeeltelijk gedekt door klantondersteuning op basis van best effort. Daarom zijn deze functies niet bedoeld voor productiegebruik. Zie de volgende ondersteuningsartikelen voor meer informatie:

KubeletDefaultSeccompProfilePreview De functievlag registreren

  1. Registreer de KubeletDefaultSeccompProfilePreview functievlag met behulp van de az feature register opdracht.

    az feature register --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"
    

    Het duurt enkele minuten voordat de status Geregistreerd wordt weergegeven.

  2. Controleer de registratiestatus met behulp van de az feature show opdracht.

    az feature show --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"
    
  3. Wanneer de status Geregistreerd weergeeft, vernieuwt u de registratie van de Microsoft.ContainerService-resourceprovider met behulp van de az provider register opdracht.

    az provider register --namespace Microsoft.ContainerService
    

Systeemaanroepen van uw container beperken met seccomp

1. Volg de stappen om een seccomp-profiel toe te passen in uw kubelet-configuratie door op te "seccompDefault": "RuntimeDefault"geven.

RuntimeDefault maakt gebruik van het standaard seccomp-profiel van containerd, waardoor bepaalde systeemaanroepen worden beperkt om de beveiliging te verbeteren. Beperkte syscalls mislukken. Zie het standaard seccomp-profiel voor containerD voor meer informatie.

2. Controleer of de configuratie is toegepast.

U kunt controleren of de instellingen worden toegepast op de knooppunten door verbinding te maken met de host en te controleren of er configuratiewijzigingen zijn aangebracht in het bestandssysteem.

3. Problemen met workloadfouten oplossen.

Wanneer SeccompDefault is ingeschakeld, wordt het standaard seccomp-profiel van de containerruntime standaard gebruikt voor alle workloads die op het knooppunt zijn gepland. Dit kan ertoe leiden dat werkbelastingen mislukken vanwege geblokkeerde syscalls. Als er een workloadfout is opgetreden, ziet u mogelijk fouten zoals:

  • De workload is onverwacht aanwezig nadat de functie is ingeschakeld, met de fout 'machtiging geweigerd'.
  • Seccomp-foutberichten kunnen ook worden weergegeven in gecontroleerd of syslog door SCMP_ACT_ERRNO te vervangen door SCMP_ACT_LOG in het standaardprofiel.

Als u de bovenstaande fouten ondervindt, wordt u aangeraden uw seccomp-profiel te wijzigen in Unconfined. Unconfined plaatst geen beperkingen op syscalls, waardoor alle systeemoproepen worden toegestaan, waardoor de beveiliging wordt verminderd.

Een aangepast seccomp-profiel configureren

Met een aangepast seccomp-profiel kunt u meer gedetailleerde controle hebben over beperkte syscalls. 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.

  1. SSH naar een AKS-knooppunt.

  2. Maak een seccomp-filter met de naam /var/lib/kubelet/seccomp/prevent-chmod.

  3. 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"
        }
      ]
    }
    
  4. 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
    
  5. Implementeer de voorbeeldpod met behulp van de opdracht kubectl apply :

    kubectl apply -f ./aks-seccomp.yaml
    
  6. Bekijk de podstatus met behulp van de opdracht kubectl get pods .

    • De pod rapporteert een fout.
    • De chmod opdracht kan niet worden uitgevoerd met het seccomp-filter, zoals wordt weergegeven in de voorbeelduitvoer:
    kubectl get pods
    
    NAME                      READY     STATUS    RESTARTS   AGE
    chmod-prevented           0/1       Error     0          7s
    

Beveiligingsprofielopties voor seccomp

Seccomp-beveiligingsprofielen zijn een set gedefinieerde syscalls die zijn toegestaan of beperkt. De meeste containerruntimes hebben een standaard seccomp-profiel dat vergelijkbaar is als niet hetzelfde als het profiel dat door Docker wordt gebruikt. Zie Docker - of containerD-standaard seccomp-profielen voor meer informatie over beschikbare profielen.

AKS gebruikt het standaard seccomp-profiel voor containerD voor onze RuntimeDefault wanneer u seccomp configureert met behulp van aangepaste knooppuntconfiguratie.

Belangrijke syscalls geblokkeerd standaardprofiel

Zowel Docker als containerD onderhouden acceptatielijsten van veilige syscalls. Deze tabel bevat de significante (maar niet alle) syscalls die effectief worden geblokkeerd omdat ze niet op de acceptatielijst staan. Als een van de geblokkeerde syscalls is vereist voor uw workload, gebruikt RuntimeDefault u het seccomp-profiel niet.

Wanneer er wijzigingen worden aangebracht in Docker en containerD, werkt AKS de standaardconfiguratie bij zodat deze overeenkomt. Updates voor deze lijst kunnen leiden tot een fout in de werkbelasting. Zie opmerkingen bij de release van AKS voor release-updates.

Geblokkeerde syscall Beschrijving
acct Accounting syscall waarmee containers hun eigen resourcelimieten of procesboekhouding kunnen uitschakelen. Ook gated door CAP_SYS_PACCT.
add_key Voorkom dat containers gebruikmaken van de kernelsleutelring, die geen naamruimte heeft.
bpf Het laden van potentieel permanente bpf-programma's in kernel weigeren, al door gated door CAP_SYS_ADMIN.
clock_adjtime Tijd/datum is geen naamruimte. Ook gated door CAP_SYS_TIME.
clock_settime Tijd/datum is geen naamruimte. Ook gated door CAP_SYS_TIME.
clone Het klonen van nieuwe naamruimten weigeren. Ook gated by CAP_SYS_ADMIN for CLONE_* flags, behalve CLONE_NEWUSER.
create_module Manipulatie en functies op kernelmodules weigeren. Verouderd. Ook gated door CAP_SYS_MODULE.
delete_module Manipulatie en functies op kernelmodules weigeren. Ook gated door CAP_SYS_MODULE.
finit_module Manipulatie en functies op kernelmodules weigeren. Ook gated door CAP_SYS_MODULE.
get_kernel_syms Het ophalen van geëxporteerde kernel- en modulesymbolen weigeren. Verouderd.
get_mempolicy Syscall waarmee kernelgeheugen en NUMA-instellingen worden gewijzigd. Al inge gated door CAP_SYS_NICE.
init_module Manipulatie en functies op kernelmodules weigeren. Ook gated door CAP_SYS_MODULE.
ioperm Voorkomen dat containers de I/O-bevoegdheidsniveaus van de kernel wijzigen. Al inge gated door CAP_SYS_RAWIO.
iopl Voorkomen dat containers de I/O-bevoegdheidsniveaus van de kernel wijzigen. Al inge gated door CAP_SYS_RAWIO.
kcmp Beperk de mogelijkheden voor procesinspectie, die al zijn geblokkeerd door te verwijderen CAP_SYS_PTRACE.
kexec_file_load Zuster syscall van kexec_load die hetzelfde doet, iets verschillende argumenten. Ook gated door CAP_SYS_BOOT.
kexec_load Het laden van een nieuwe kernel weigeren voor latere uitvoering. Ook gated door CAP_SYS_BOOT.
keyctl Voorkom dat containers gebruikmaken van de kernelsleutelring, die geen naamruimte heeft.
lookup_dcookie Syscall traceren/profileren, waardoor informatie over de host kan worden gelekt. Ook gated door CAP_SYS_ADMIN.
mbind Syscall waarmee kernelgeheugen en NUMA-instellingen worden gewijzigd. Al inge gated door CAP_SYS_NICE.
mount Weigeren koppelen, al door gated door CAP_SYS_ADMIN.
move_pages Syscall waarmee kernelgeheugen en NUMA-instellingen worden gewijzigd.
nfsservctl Interactie met de kernel-nfs-daemon weigeren. Verouderd sinds Linux 3.1.
open_by_handle_at Oorzaak van een oude containeronderbreking. Ook gated door CAP_DAC_READ_SEARCH.
perf_event_open Syscall traceren/profileren, waardoor informatie over de host kan worden gelekt.
personality Voorkom dat container BSD-emulatie inschakelt. Niet inherent gevaarlijk, maar slecht getest, potentieel voor kernel vulns.
pivot_root Weigeren pivot_root moet een bevoegde bewerking zijn.
process_vm_readv Beperk de mogelijkheden voor procesinspectie, die al zijn geblokkeerd door te verwijderen CAP_SYS_PTRACE.
process_vm_writev Beperk de mogelijkheden voor procesinspectie, die al zijn geblokkeerd door te verwijderen CAP_SYS_PTRACE.
ptrace Syscall traceren/profileren. Geblokkeerd in Linux-kernelversies vóór 4.8 om seccomp bypass te voorkomen. Het traceren/profileren van willekeurige processen wordt al geblokkeerd door CAP_SYS_PTRACE te verwijderen, omdat er informatie over de host kan worden gelekt.
query_module Manipulatie en functies op kernelmodules weigeren. Verouderd.
quotactl Quota syscall waarmee containers hun eigen resourcelimieten of procesboekhouding kunnen uitschakelen. Ook gated door CAP_SYS_ADMIN.
reboot Laat containers de host niet opnieuw opstarten. Ook gated door CAP_SYS_BOOT.
request_key Voorkom dat containers gebruikmaken van de kernelsleutelring, die geen naamruimte heeft.
set_mempolicy Syscall waarmee kernelgeheugen en NUMA-instellingen worden gewijzigd. Al inge gated door CAP_SYS_NICE.
setns Het koppelen van een thread aan een naamruimte weigeren. Ook gated door CAP_SYS_ADMIN.
settimeofday Tijd/datum is geen naamruimte. Ook gated door CAP_SYS_TIME.
stime Tijd/datum is geen naamruimte. Ook gated door CAP_SYS_TIME.
swapon Start/stop wisselen naar bestand/apparaat weigeren. Ook gated door CAP_SYS_ADMIN.
swapoff Start/stop wisselen naar bestand/apparaat weigeren. Ook gated door CAP_SYS_ADMIN.
sysfs Verouderde syscall.
_sysctl Verouderd, vervangen door /proc/sys.
umount Moet een bevoegde bewerking zijn. Ook gated door CAP_SYS_ADMIN.
umount2 Moet een bevoegde bewerking zijn. Ook gated door CAP_SYS_ADMIN.
unshare Het klonen van nieuwe naamruimten voor processen weigeren. Ook gated by CAP_SYS_ADMIN, met uitzondering van het ongedaan maken van delen --gebruiker.
uselib Oudere syscall met betrekking tot gedeelde bibliotheken, die gedurende lange tijd niet worden gebruikt.
userfaultfd Foutafhandeling van gebruikersruimtepagina's, grotendeels nodig voor procesmigratie.
ustat Verouderde syscall.
vm86 In kernel x86 real mode virtuele machine. Ook gated door CAP_SYS_ADMIN.
vm86old In kernel x86 real mode virtuele machine. Ook gated door CAP_SYS_ADMIN.

Volgende stappen

Zie Best practices voor clusterbeveiliging en -upgrades in AKS en aanbevolen procedures voor podbeveiliging in AKS voor gekoppelde aanbevolen procedures.