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.
- 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 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.
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 keert u terug 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 (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
Registreer de
KubeletDefaultSeccompProfilePreview
functievlag met behulp van deaz feature register
opdracht.az feature register --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"
Het duurt enkele minuten voordat de status Geregistreerd wordt weergegeven.
Controleer de registratiestatus met behulp van de
az feature show
opdracht.az feature show --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"
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.
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 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.
Azure Kubernetes Service