Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V tomto článku se dozvíte, jak pomocí uživatelských oborů jmen, AppArmor a seccomp vestavěných bezpečnostních funkcí Linuxu zabezpečit přístup kontejnerů k prostředkům pro úlohy v Azure Kubernetes Service (AKS).
Přehled zabezpečení přístupu ke kontejnerům
Stejně jako byste uživatelům nebo skupinám měli udělit minimální požadovaná oprávnění, měli byste také omezit kontejnery jenom na nezbytné akce a procesy. Abyste minimalizovali riziko útoku, vyhněte se konfiguraci aplikací a kontejnerů, které vyžadují eskalovaná oprávnění nebo kořenový přístup.
Pomocí integrovaných kontextů zabezpečení podů Kubernetes můžete definovat další oprávnění, jako je uživatel nebo skupina, pod kterými se mají spouštět, linuxové možnosti, které bude k dispozici, nebo nastavení allowPrivilegeEscalation: false v manifestu podu. Další osvědčené postupy najdete v tématu Zabezpečení přístupu podů k prostředkům.
Pokud chcete zlepšit izolaci hostitele a snížit laterální přesun v Linuxu, můžete použít obory názvů uživatelů. Pro ještě podrobnější kontrolu nad akcemi kontejneru můžete použít integrované funkce zabezpečení Linuxu, jako je AppArmor a seccomp. Tyto funkce pomáhají omezit akce, které kontejnery můžou provádět definováním funkcí zabezpečení Linuxu na úrovni uzlu a jejich implementací prostřednictvím manifestu podu.
Integrované funkce zabezpečení Linuxu jsou dostupné jenom na linuxových uzlech a podech.
Poznámka:
Prostředí Kubernetes v současné době nejsou bezpečná pro nepřátelské použití s více tenanty. Další funkce zabezpečení, jako je Microsoft Defender for Containers, AppArmor, seccomp, uživatelské obory názvů, Pod Security Admission nebo Kubernetes Role-Based Access Control (RBAC) pro uzly, efektivně blokují zneužití.
Pro skutečné zabezpečení při spouštění nepřátelských víceklientských úloh důvěřujte pouze hypervisoru. Doména zabezpečení pro Kubernetes se stává celým clusterem, nikoli z jednotlivých uzlů.
U těchto typů nepřátelských víceklientských úloh byste měli používat fyzicky izolované clustery.
Požadavky na uživatelské jmenné obory
- Existující cluster AKS. Pokud nemáte klastr, vytvořte si ho pomocí Azure CLI, Azure PowerShell nebo portálu Azure.
- Minimální verze Kubernetes 1.33 pro řídicí rovinu a pracovní uzly. Pokud nepoužíváte Kubernetes verze 1.33 nebo vyšší, musíte upgradovat verzi Kubernetes.
- Pracovní uzly se systémem Azure Linux 3.0 nebo Ubuntu 24.04 k zajištění splnění minimálních požadavků na stack, abyste mohli povolit obory názvů uživatelů. Pokud potřebujete upgradovat verzi operačního systému (OS), přečtěte si článek o upgradu verze operačního systému.
Omezení uživatelských jmenných prostorů
- Funkcionalita uživatelských jmenných prostorů je určená pro jádro Linuxu a není podporována pro fondy uzlů Windows.
- Projděte si dokumentaci Kubernetes pro obory názvů uživatelů a zkontrolujte případná další omezení.
Přehled uživatelských jmenných prostorů
Linuxové pody běží ve výchozím nastavení pomocí několika oborů názvů: síťové obory názvů pro izolaci síťové identity a oboru názvů PID za účelem izolace procesů. Obor názvů uživatele (user_namespace) izoluje uživatele uvnitř kontejneru od uživatelů na hostiteli. Omezuje také rozsah funkcí a interakcí podů se zbytkem systému.
Identifikátory UID a IDENTIFIKÁTORy GID uvnitř kontejneru jsou mapovány na neprivilegované uživatele na hostiteli, takže veškerá interakce se zbytkem hostitele probíhá jako neprivilegované UID a GID. Například root uvnitř kontejneru (UID 0) je možné mapovat na uživatele 65536 na hostiteli. Kubernetes vytvoří mapování, které zaručuje, že se nepřekrývá s jinými pody používajícími obory názvů uživatelů v systému.
Implementace Kubernetes má některé klíčové výhody. Další informace najdete v dokumentaci k oborům názvů uživatelů Kubernetes.
Povolit uživatelské obory názvů
Vytvořte soubor s názvem
mypod.yamla zkopírujte ho v následujícím manifestu. Aby bylo možné používat obory názvů uživatelů, musí mít YAML polehostUsers: false.apiVersion: v1 kind: Pod metadata: name: userns spec: hostUsers: false containers: - name: shell command: ["sleep", "infinity"] image: debianNasaďte aplikaci pomocí
kubectl applypříkazu a zadejte název manifestu YAML.kubectl apply -f mypod.yamlPomocí příkazu zkontrolujte stav nasazených podů
kubectl get pods.kubectl get podsPomocí příkazu
kubectl execse přihlaste do podu.kubectl exec -ti userns -- bashV podu zkontrolujte
/proc/self/uid_mappomocí následujícího příkazu:cat /proc/self/uid_mapVýstup by měl mít v posledním sloupci 65536 . Například:
0 833617920 65536Tento výstup označuje, že root uvnitř kontejneru (UID 0) je mapován na uživatele 65536 na hostiteli.
Běžné zranitelnosti a expozice (CVE) zmírněné pomocí uživatelských oborů názvů
Následující tabulka uvádí některé běžné zranitelnosti a vystavení (CVE), která jsou částečně nebo plně zmírněná pomocí user_namespaces:
| CVE | Skóre závažnosti | Úroveň závažnosti |
|---|---|---|
| CVE-2019-5736 | 8.6 | High |
| CVE 2024-21262 | 8.6 | High |
| CVE 2022-0492 | 7,8 | High |
| CVE-2021-25741 | 8.1 / 8.8 | Vysoká / Vysoká |
| CVE-2017-1002101 | 9.6 / 8.8 | Kritické / vysoké |
Mějte na paměti, že tento seznam není vyčerpávající. Další informace najdete v tématu Kubernetes verze 1.33: Obory názvů uživatelů jsou ve výchozím nastavení povolené.
Požadavky appArmor
- Existující cluster AKS. Pokud nemáte klastr, vytvořte si ho pomocí Azure CLI, Azure PowerShell nebo portálu Azure.
Poznámka:
Azure Linux 3.0 podporuje AppArmor od vydání VHD z 7. listopadu 2025.
Přehled AppArmoru
Pokud chcete omezit akce kontejneru, můžete použít modul zabezpečení jádra AppArmor Pro Linux. AppArmor je k dispozici jako součást základního operačního systému uzlu AKS a ve výchozím nastavení je povolený. Můžete vytvářet profily AppArmor, které omezují akce čtení, zápisu nebo provádění akcí nebo systémových funkcí, jako je připojení systémů souborů. Výchozí profily AppArmor omezují přístup k různým /proc a /sys místům a poskytují prostředky k logické izolaci kontejnerů od základního uzlu. AppArmor funguje pro všechny aplikace, které běží na Linuxu, nejen pro pody Kubernetes.
Poznámka:
Před Kubernetes v1.30 byl AppArmor zadán prostřednictvím poznámek. Od verze 1.30 je AppArmor zadaný prostřednictvím securityContext pole ve specifikaci podu. Další informace najdete v dokumentaci k Kubernetes AppArmor.
Zabezpečení podů pomocí AppArmoru
Profily AppArmor můžete zadat na úrovni podu nebo kontejneru. Profil AppArmor kontejneru má přednost před profilem AppArmor podu. Pokud není zadáno ani jedno, kontejner se spustí bez omezení. Další informace o profilech AppArmor najdete v dokumentaci k zabezpečení podu s využitím AppArmor Kubernetes.
Konfigurace vlastního profilu AppArmor
Následující příklad vytvoří profil, který brání zápisu do souborů v kontejneru.
Připojení SSH k uzlu AKS
Vytvořte soubor s názvem deny-write.profile a vložte následující obsah:
#include <tunables/global> profile k8s-apparmor-example-deny-write flags=(attach_disconnected) { #include <abstractions/base> file, # Deny all file writes. deny /** w, }Načtěte profil AppArmor do uzlu.
# This example assumes that node names match host names, and are reachable via SSH. NODES=($( kubectl get node -o jsonpath='{.items[*].status.addresses[?(.type == "Hostname")].address}' )) for NODE in ${NODES[*]}; do ssh $NODE 'sudo apparmor_parser -q <<EOF #include <tunables/global> profile k8s-apparmor-example-deny-write flags=(attach_disconnected) { #include <abstractions/base> file, # Deny all file writes. deny /** w, } EOF' done
Nasazení podu s vlastním profilem AppArmor
Nasadit pod "Hello AppArmor" s profilem odepření zápisu.
apiVersion: v1 kind: Pod metadata: name: hello-apparmor spec: securityContext: appArmorProfile: type: Localhost localhostProfile: k8s-apparmor-example-deny-write containers: - name: hello image: busybox:1.28 command: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 1h" ]Použijte manifest podu
kubectl applypomocí příkazu.kubectl apply -f hello-apparmor.yamlPřipojte se do prostředí podu a ověřte, že kontejner běží s profilem AppArmor.
kubectl exec hello-apparmor -- cat /proc/1/attr/currentVýstup by měl zobrazit profil AppArmor, který se používá. Například:
k8s-apparmor-example-deny-write (enforce)
Požadavky na seccomp
- Existující cluster AKS. Pokud nemáte klastr, vytvořte si ho pomocí Azure CLI, Azure PowerShell nebo portálu Azure.
- Pokud chcete ve fondech uzlů používat výchozí profily seccomp, musíte zaregistrovat
KubeletDefaultSeccompProfilePreviewpříznak funkce.
Zaregistruj příznak funkce KubeletDefaultSeccompProfilePreview
Důležité
Funkce AKS ve verzi Preview jsou k dispozici na bázi samoobsluhy a dobrovolného přihlášení. Ukázky jsou poskytovány "jak jsou" a "podle aktuální dostupnosti" a jsou vyloučené ze smluv o úrovni služeb a omezené záruky. Předběžné verze AKS jsou částečně pokryty zákaznickou podporou podle možností. Proto tyto funkce nejsou určené pro produkční použití. Další informace najdete v následujících článcích podpory:
Příznak funkce
KubeletDefaultSeccompProfilePreviewzaregistrujte pomocí příkazuaz feature register.az feature register --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"Zobrazení stavu Zaregistrované trvá několik minut.
Pomocí příkazu ověřte stav
az feature showregistrace.az feature show --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"Jakmile se stav projeví jako zaregistrovaný, aktualizujte registraci poskytovatele prostředků Microsoft.ContainerService pomocí
az provider registerpříkazu.az provider register --namespace Microsoft.ContainerService
Omezení seccomp
- AKS podporuje pouze výchozí profily seccomp (
RuntimeDefaultaUnconfined). Vlastní profily seccomp nejsou podporovány. -
SeccompDefaultnení podporovaný parametr pro fondy uzlů Windows.
Přehled výchozích profilů seccomp (Preview)
I když AppArmor funguje pro libovolnou linuxovou aplikaci, funguje seccomp (nebo secure computing) na úrovni procesu. Seccomp je také modul zabezpečení jádra Linuxu. Modul containerd runtime používaný uzly AKS poskytuje nativní podporu pro seccomp. S funkcí seccomp můžete omezit systémová volání kontejneru. Seccomp vytvoří další vrstvu ochrany před běžnými ohroženími zabezpečení volání systému zneužitými škodlivými aktéry a umožňuje určit výchozí profil pro všechny úlohy v uzlu.
Při vytváření nového fondu uzlů s Linuxem můžete použít výchozí profily seccomp pomocí vlastních konfigurací uzlů . AKS podporuje RuntimeDefault hodnoty a Unconfined hodnoty. Některé úlohy mohou vyžadovat nižší počet omezení syscall než jiné. To znamená, že během běhu s profilem RuntimeDefault můžou selhat. Pokud chcete takové selhání zmírnit, můžete určit Unconfined profil. Pokud vaše úloha vyžaduje vlastní profil, přečtěte si téma Konfigurace vlastního profilu seccomp.
Omezení volání systému kontejnerů pomocí seccomp
-
Postupujte podle kroků pro použití profilu seccomp v konfiguraci kubelet zadáním
"seccompDefault": "RuntimeDefault". - Připojte se k hostiteli.
- Ověřte, že se na uzly použila konfigurace.
Řešení selhání úloh pomocí seccomp
Pokud je SeccompDefault povoleno, výchozí seccomp profil modulu runtime kontejneru se používá pro všechny úlohy naplánované na uzlu, což může způsobit selhání úloh kvůli blokovaným voláním syscall. Pokud dojde k selhání úlohy, můžou se zobrazit chyby, například:
- Úloha se po povolení funkce neočekávaně ukončí s chybou "Oprávnění odepřeno".
- Chybové zprávy seccomp lze také zobrazit v auditd nebo syslogu tím, že ve výchozím profilu nahradíte SCMP_ACT_ERRNO za SCMP_ACT_LOG.
Pokud dojde k těmto chybám, doporučujeme změnit profil seccomp na Unconfined.
Unconfined nepřidává žádná omezení na systémová volání, umožňuje provádění všech systémových volání.
Přehled vlastních profilů seccomp
S vlastním profilem seccomp máte podrobnější kontrolu nad omezenými voláními syscall pro vaše kontejnery. Vlastní profily seccomp můžete vytvořit pomocí:
- Pomocí filtrů můžete určit, jaké akce se mají povolit nebo zamítnout.
- Přidání poznámek v manifestu YAML podu pro přidružení k filtru seccomp.
Poznámka:
Nápovědu k řešení potíží s vaším profilem seccomp najdete v tématu Řešení potíží s konfigurací seccomp profilu ve službě Azure Kubernetes Service (AKS).
Konfigurace vlastního profilu seccomp
Pokud chcete zobrazit sekcomp v akci, vytvořte filtr, který brání změně oprávnění v souboru.
Připojení SSH k uzlu AKS
Vytvořte filtr seccomp s názvem /var/lib/kubelet/seccomp/prevent-chmod.
Zkopírujte a vložte následující obsah:
{ "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [ { "name": "chmod", "action": "SCMP_ACT_ERRNO" }, { "name": "fchmodat", "action": "SCMP_ACT_ERRNO" }, { "name": "chmodat", "action": "SCMP_ACT_ERRNO" } ] }Ve verzi 1.19 a novější je potřeba nakonfigurovat:
{ "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [ { "names": ["chmod","fchmodat","chmodat"], "action": "SCMP_ACT_ERRNO" } ] }Na místním počítači vytvořte manifest podu s názvem aks-seccomp.yaml a vložte následující obsah. Tento manifest definuje poznámku pro
seccomp.security.alpha.kubernetes.ioa odkazuje na existující filtr prevent-chmod.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: NeverVe verzi 1.19 a novější je potřeba nakonfigurovat:
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: NeverNasazení ukázkového podu pomocí příkazu
kubectl apply:kubectl apply -f ./aks-seccomp.yamlPomocí příkazu zobrazte stav podu
kubectl get pods.kubectl get podsVe výstupu byste měli vidět, že pod hlásí chybu. Příkaz
chmodnení spuštěn filtrem seccomp, jak je znázorněno v příkladu výstupu:NAME READY STATUS RESTARTS AGE chmod-prevented 0/1 Error 0 7s
Možnosti profilu zabezpečení Seccomp
Profily zabezpečení Seccomp jsou sadou definovaných systémových volání, která jsou povolena nebo omezena. Většina runtime kontejnerů má výchozí profil seccomp, který je podobný, ne-li stejný, jako ten, který používá Docker. Další informace o dostupných profilech najdete v dockeru nebo kontejnerových výchozích profilech seccomp.
AKS používá kontejnerový výchozí profil seccomp pro RuntimeDefault při konfiguraci seccomp pomocí vlastní konfigurace uzlu.
Významná systémová volání blokována ve výchozím profilu
Docker i containerd udržují seznamy povolených systémových volání. Když v Dockeru a kontejneru provedete změny, AKS aktualizuje výchozí konfiguraci tak, aby odpovídala. Aktualizace tohoto seznamu můžou způsobit selhání úloh. Informace o aktualizacích verzí najdete v poznámkách k verzi AKS.
Následující tabulka uvádí významná systémová volání, která jsou účinně blokována, protože nejsou v povoleném seznamu. Tento seznam není vyčerpávající. Pokud vaše úloha vyžaduje některé z blokovaných systémových volání, nepoužívejte RuntimeDefault profil seccomp.
| Blokovaný syscall | Popis |
|---|---|
acct |
Účetnický systém syscall, který by mohl umožnit kontejnerům zakázat vlastní limity prostředků nebo účetnický proces. Také řízeno CAP_SYS_PACCT. |
add_key |
Zabraňte kontejnerům v používání klíčenky jádra, která není oddělena názvovým prostorem. |
bpf |
Zabránit načítání potenciálně trvalých BPF programů do jádra, již omezených CAP_SYS_ADMIN. |
clock_adjtime |
Čas/datum není zapsán v žádném jmenném prostoru. Také řízeno CAP_SYS_TIME. |
clock_settime |
Čas/datum není zapsán v žádném jmenném prostoru. Také řízeno CAP_SYS_TIME. |
clone |
Odepřít klonování nových jmenných prostorů. Také řízeno CAP_SYS_ADMIN for CLONE_* flagy, s výjimkou CLONE_NEWUSER. |
create_module |
Odepřít manipulaci a funkce v modulech jádra. Zastaralý. Také řízeno CAP_SYS_MODULE. |
delete_module |
Odepřít manipulaci a funkce v modulech jádra. Také řízeno CAP_SYS_MODULE. |
finit_module |
Odepřít manipulaci a funkce v modulech jádra. Také řízeno CAP_SYS_MODULE. |
get_kernel_syms |
Odepřít načítání exportovaných symbolů jádra a modulů. Zastaralý. |
get_mempolicy |
Syscall, který upravuje paměť jádra a nastavení NUMA. Již ovládáno CAP_SYS_NICE. |
init_module |
Odepřít manipulaci a funkce v modulech jádra. Také řízeno CAP_SYS_MODULE. |
ioperm |
Zabránit kontejnerům při změně úrovní privilegovaných oprávnění jádra pro vstupně-výstupní operace. Již ovládáno CAP_SYS_RAWIO. |
iopl |
Zabránit kontejnerům při změně úrovní privilegovaných oprávnění jádra pro vstupně-výstupní operace. Již ovládáno CAP_SYS_RAWIO. |
kcmp |
Omezit možnosti kontroly procesů, které jsou již blokovány vyřazením CAP_SYS_PTRACE. |
kexec_file_load |
Sesterský syscall kexec_load, který dělá totéž, ale s mírně odlišnými argumenty. Také řízeno CAP_SYS_BOOT. |
kexec_load |
Zakažte načtení nového jádra pro pozdější spuštění. Také řízeno CAP_SYS_BOOT. |
keyctl |
Zabraňte kontejnerům v používání klíčenky jádra, která není oddělena názvovým prostorem. |
lookup_dcookie |
Trasování/profilování systémových volání, kterým by mohly uniknout informace hostiteli. Také řízeno CAP_SYS_ADMIN. |
mbind |
Syscall, který upravuje paměť jádra a nastavení NUMA. Již ovládáno CAP_SYS_NICE. |
mount |
Zakázat montáž, již je omezeno CAP_SYS_ADMIN. |
move_pages |
Syscall, který upravuje paměť jádra a nastavení NUMA. |
nfsservctl |
Odepřít interakci s démonem NFS jádra operačního systému. Zastaralé od Linuxu 3.1. |
open_by_handle_at |
Příčina úniku ze starého kontejneru Také řízeno CAP_DAC_READ_SEARCH. |
perf_event_open |
Trasování/profilování systémových volání, kterým by mohly uniknout informace hostiteli. |
personality |
Zabránit tomu, aby kontejner povolil emulaci BSD. Není inherentně nebezpečné, ale nedostatečně testované, s potenciálem pro zranitelnosti jádra. |
pivot_root |
Odepření operace pivot_root by mělo být privilegovanou činností. |
process_vm_readv |
Omezit možnosti kontroly procesů, které jsou již blokovány vyřazením CAP_SYS_PTRACE. |
process_vm_writev |
Omezit možnosti kontroly procesů, které jsou již blokovány vyřazením CAP_SYS_PTRACE. |
ptrace |
Trasování/profilace systémového volání. Blokované ve verzích jádra Linuxu před verzí 4.8, aby se zabránilo obejití seccomp. Trasování/profilace libovolných procesů je již blokováno vyřazením CAP_SYS_PTRACE, protože by mohlo dojít k úniku informací na hostiteli. |
query_module |
Odepřít manipulaci a funkce v modulech jádra. Zastaralý. |
quotactl |
Systémové volání kvóty, které by mohlo umožnit kontejnerům vypnout jejich vlastní limity prostředků nebo sledování procesů. Také řízeno CAP_SYS_ADMIN. |
reboot |
Nenechte kontejnery restartovat hostitele. Také řízeno CAP_SYS_BOOT. |
request_key |
Zabraňte kontejnerům v používání klíčenky jádra, která není oddělena názvovým prostorem. |
set_mempolicy |
Syscall, který upravuje paměť jádra a nastavení NUMA. Již ovládáno CAP_SYS_NICE. |
setns |
Odepřít přidružení vlákna k oboru názvů. Také řízeno CAP_SYS_ADMIN. |
settimeofday |
Čas/datum není zapsán v žádném jmenném prostoru. Také řízeno CAP_SYS_TIME. |
stime |
Čas/datum není zapsán v žádném jmenném prostoru. Také řízeno CAP_SYS_TIME. |
swapon |
Odepřít spuštění/zastavit prohození na soubor nebo zařízení. Také řízeno CAP_SYS_ADMIN. |
swapoff |
Odepřít spuštění/zastavit prohození na soubor nebo zařízení. Také řízeno CAP_SYS_ADMIN. |
sysfs |
Syscall zastaralý. |
_sysctl |
Zastaralé, nahrazeno znakem /proc/sys. |
umount |
Měla by to být privilegovaná operace. Také řízeno CAP_SYS_ADMIN. |
umount2 |
Měla by to být privilegovaná operace. Také řízeno CAP_SYS_ADMIN. |
unshare |
Odepřít klonování nových oborů jmen pro procesy. Také řízeno CAP_SYS_ADMIN (kromě unshare --user). |
uselib |
Starší syscall související se sdílenými knihovnami, nepoužívaný po dlouhou dobu. |
userfaultfd |
Řešení chyb stránek v uživatelském prostoru, což je z velké části potřeba k migraci procesů. |
ustat |
Syscall zastaralý. |
vm86 |
V jádru x86 v reálném režimu virtuálního počítače. Také řízeno CAP_SYS_ADMIN. |
vm86old |
V jádru x86 v reálném režimu virtuálního počítače. Také řízeno CAP_SYS_ADMIN. |
Související obsah
Další informace o zabezpečení clusteru AKS najdete v následujících článcích: