Přístup ke kontejnerům zabezpečení k prostředkům pomocí integrovaných funkcí zabezpečení Linuxu
V tomto článku se dozvíte, jak zabezpečit přístup ke kontejnerům k prostředkům pro úlohy Azure Kubernetes Service (AKS).
Přehled
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, která se mají spustit jako, možnosti Linuxu pro zveřejnění 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.
Pro ještě podrobnější kontrolu nad akcemi kontejneru můžete použít integrované funkce zabezpečení Linuxu, jako je AppArmor a seccomp.
- Definujte funkce zabezpečení Linuxu na úrovni uzlu.
- Implementujte funkce prostřednictvím manifestu podu.
Integrované funkce zabezpečení Linuxu jsou dostupné jenom na linuxových uzlech a podech.
Poznámka:
V současné době nejsou prostředí Kubernetes zcela bezpečná pro nepřátelské použití s více tenanty. Další funkce zabezpečení, jako je Microsoft Defender for Containers, AppArmor, seccomp, Pod Security Admission nebo Kubernetes 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.
App Armor
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 je ve výchozím nastavení povolená. Vytvoříte profily AppArmor, které omezují akce čtení, zápisu nebo provádění akcí nebo systémových funkcí, jako je připojení systému souborů. Výchozí profily AppArmor omezují přístup k různým /proc
umístěním a /sys
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.
Pokud chcete vidět AppArmor v akci, následující příklad vytvoří profil, který brání zápisu do souborů.
Připojení SSH k uzlu AKS
Vytvořte soubor s názvem deny-write.profile.
Zkopírujte 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, }
Profily AppArmor se přidávají pomocí apparmor_parser
příkazu.
Přidejte profil do AppArmoru.
Zadejte název profilu vytvořeného v předchozím kroku:
sudo apparmor_parser deny-write.profile
Pokud se profil správně parsuje a použije na AppArmor, nezobrazí se žádný výstup a vrátíte se do příkazového řádku.
Na místním počítači vytvořte manifest podu s názvem aks-apparmor.yaml. Tento manifest:
- Definuje poznámku pro
container.apparmor.security.beta.kubernetes
. - Odkazuje na profil odepření zápisu vytvořený v předchozích krocích.
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" ]
- Definuje poznámku pro
Po nasazení podu spusťte následující příkaz a ověřte, že pod hello-apparmor zobrazuje stav Spuštěno:
kubectl get pods NAME READY STATUS RESTARTS AGE aks-ssh 1/1 Running 0 4m2s hello-apparmor 0/1 Running 0 50s
Další informace o AppArmoru najdete v tématu Profily AppArmor v Kubernetes.
Secure computing (seccomp)
I když AppArmor funguje pro libovolnou linuxovou aplikaci, funguje seccomp (secure computing) na úrovni procesu. Seccomp je také modul zabezpečení jádra Linuxu a nativně ho containerd
podporuje modul runtime používaný uzly AKS. 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.
Konfigurace výchozího profilu seccomp (Preview)
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 dvě hodnoty: RuntimeDefault
a Unconfined
. Některé úlohy mohou vyžadovat nižší počet omezení syscall než jiné. To znamená, že během běhu můžou selhat s profilem RuntimeDefault. 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í
- SeccompDefault není podporovaný parametr pro fondy uzlů Windows.
- Od 9. 9. 2024 je k dispozici rozhraní API seccompDefault.
Důležité
Funkce AKS ve verzi Preview jsou k dispozici na samoobslužné bázi. Verze Preview jsou poskytovány "tak, jak jsou" a "dostupné", a jsou vyloučené ze smluv o úrovni služeb a omezené záruky. Verze Preview AKS jsou částečně pokryty zákaznickou podporou na základě maximálního úsilí. Proto tyto funkce nejsou určené pro produkční použití. Další informace najdete v následujících článcích podpory:
Registrace příznaku KubeletDefaultSeccompProfilePreview
funkce
KubeletDefaultSeccompProfilePreview
Pomocí příkazu zaregistrujte příznakaz feature register
funkce.az feature register --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"
Zobrazení stavu Zaregistrované trvá několik minut.
Pomocí příkazu ověřte stav
az feature show
registrace.az feature show --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"
Jakmile se stav projeví jako zaregistrovaný, aktualizujte registraci poskytovatele prostředků Microsoft.ContainerService pomocí
az provider register
příkazu.az provider register --namespace Microsoft.ContainerService
Omezení systémových volání kontejneru pomocí funkce seccomp
1. Postupujte podle kroků pro použití profilu seccomp v konfiguraci kubelet zadáním "seccompDefault": "RuntimeDefault"
.
RuntimeDefault
používá výchozí profil seccomp kontejneru, který omezuje určitá systémová volání pro zvýšení zabezpečení. Omezené volání syscalls selžou. Další informace naleznete v kontejnerU výchozí seccomp profil.
2. Zkontrolujte, zda byla použita konfigurace.
Nastavení se na uzly použijete tak, že se připojíte k hostiteli a ověříte, že se v systému souborů provedly změny konfigurace.
3. Řešení potíží se selháními úloh
Pokud je povolená funkce SeccompDefault, výchozí profil seccomp modulu runtime kontejneru se ve výchozím nastavení používá pro všechny úlohy naplánované na uzlu. To může způsobit selhání úloh kvůli blokovaným voláním syscall. Pokud došlo k selhání úlohy, může se zobrazit například následující chyba:
- Úloha existuje neočekávaně po povolení funkce s chybou "Oprávnění odepřeno".
- Chybové zprávy seccomp lze také zobrazit v auditovaném nebo syslogu nahrazením SCMP_ACT_ERRNO SCMP_ACT_LOG ve výchozím profilu.
Pokud dojde k výše uvedeným chybám, doporučujeme změnit profil seccomp na Unconfined
. Unconfined
neumožní žádné omezení pro syscalls, což umožňuje všechna systémová volání, což snižuje zabezpečení.
Konfigurace vlastního profilu seccomp
S vlastním profilem seccomp můžete mít podrobnější kontrolu nad omezenými syscalls. Srovnejte s osvědčeným postupem udělení minimálního oprávnění kontejneru pouze ke spuštění:
- Definování pomocí filtrů, které akce se mají povolit nebo odepřít
- Přidání poznámek v manifestu YAML podu pro přidružení k filtru 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.io
. - Odkazuje na filtr prevent-chmod vytvořený v předchozím kroku.
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
Ve 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: Never
- Definuje poznámku pro
Nasaďte ukázkový pod pomocí příkazu kubectl apply :
kubectl apply -f ./aks-seccomp.yaml
Pomocí příkazu kubectl get pods zobrazte stav podu .
- Pod hlásí chybu.
- Příkaz
chmod
není spuštěn filtrem seccomp, jak je znázorněno v příkladu výstupu:
kubectl get pods NAME READY STATUS RESTARTS AGE chmod-prevented 0/1 Error 0 7s
Možnosti profilu zabezpečení Seccomp
Profily zabezpečení Seccomp jsou sada definovaných volání syscall, které jsou povoleny nebo omezeny. Většinamodulůch Další informace o dostupnýchprofilech
AKS používá výchozí profil seccomp containerD pro modul RuntimeDefault při konfiguraci seccomp pomocí vlastní konfigurace uzlu.
Významné volání syscall blokované ve výchozím profilu
Docker i containerD udržují seznamy povolených volání bezpečných syscallů. Tato tabulka uvádí významné (ale ne všechny) volání syscall, které jsou efektivně blokované, protože nejsou na seznamu povolených. Pokud vaše úloha vyžaduje některý z blokovaných volání syscall, nepoužívejte RuntimeDefault
profil seccomp.
Když se v Dockeru a containerD provede 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.
Blokovaný systém syscall | Popis |
---|---|
acct |
Účetnický systém syscall, který by mohl umožnit kontejnerům zakázat vlastní limity prostředků nebo účetnický proces. Také vrátný CAP_SYS_PACCT . |
add_key |
Zabrání kontejnerům v používání klíčenky jádra, což není obor názvů. |
bpf |
Odepřít načítání potenciálně trvalých programů bpf do jádra, které jsou již brány CAP_SYS_ADMIN . |
clock_adjtime |
Čas a datum není obor názvů. Také vrátný CAP_SYS_TIME . |
clock_settime |
Čas a datum není obor názvů. Také vrátný CAP_SYS_TIME . |
clone |
Odepřít klonování nových oborů názvů. Také vyměněny CAP_SYS_ADMIN for CLONE_* vlajkami, s výjimkou CLONE_NEWUSER . |
create_module |
Odepřít manipulaci a funkce v modulech jádra. Zastaralé. Také vrátný CAP_SYS_MODULE . |
delete_module |
Odepřít manipulaci a funkce v modulech jádra. Také vrátný CAP_SYS_MODULE . |
finit_module |
Odepřít manipulaci a funkce v modulech jádra. Také vrátný 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ž vrátný CAP_SYS_NICE . |
init_module |
Odepřít manipulaci a funkce v modulech jádra. Také vrátný CAP_SYS_MODULE . |
ioperm |
Zabrání kontejnerům v úpravě úrovní oprávnění jádra vstupně-výstupních operací. Již vrátný CAP_SYS_RAWIO . |
iopl |
Zabrání kontejnerům v úpravě úrovní oprávnění jádra vstupně-výstupních operací. Již vrátný CAP_SYS_RAWIO . |
kcmp |
Omezit možnosti kontroly procesů, které jsou již blokovány vyřazením CAP_SYS_PTRACE . |
kexec_file_load |
Sestra syscall kexec_load, která dělá totéž, mírně odlišné argumenty. Také vrátný CAP_SYS_BOOT . |
kexec_load |
Odepřete načtení nového jádra pro pozdější spuštění. Také vrátný CAP_SYS_BOOT . |
keyctl |
Zabrání kontejnerům v používání klíčenky jádra, což není obor názvů. |
lookup_dcookie |
Trasování/profilace syscall, které by mohly uniknout informace na hostiteli. Také vrátný CAP_SYS_ADMIN . |
mbind |
Syscall, který upravuje paměť jádra a nastavení NUMA. Již vrátný CAP_SYS_NICE . |
mount |
Odepřít montáž, již vrátná CAP_SYS_ADMIN . |
move_pages |
Syscall, který upravuje paměť jádra a nastavení NUMA. |
nfsservctl |
Odepřít interakci s démonem nfs jádra. Zastaralé od Linuxu 3.1. |
open_by_handle_at |
Příčina přerušení starého kontejneru Také vrátný CAP_DAC_READ_SEARCH . |
perf_event_open |
Trasování/profilace syscall, které by mohly uniknout informace na hostiteli. |
personality |
Zabránit tomu, aby kontejner povolil emulaci BSD. Ne ze své podstaty nebezpečné, ale špatně testované, potenciál pro jádra vulny. |
pivot_root |
Odepřít pivot_root by měla být privilegovaná operace. |
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 syscall. 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ém syscall kvót, který by mohl umožnit kontejnerům zakázat vlastní limity prostředků nebo účtování procesů. Také vrátný CAP_SYS_ADMIN . |
reboot |
Nenechte kontejnery restartovat hostitele. Také vrátný CAP_SYS_BOOT . |
request_key |
Zabrání kontejnerům v používání klíčenky jádra, což není obor názvů. |
set_mempolicy |
Syscall, který upravuje paměť jádra a nastavení NUMA. Již vrátný CAP_SYS_NICE . |
setns |
Odepřít přidružení vlákna k oboru názvů. Také vrátný CAP_SYS_ADMIN . |
settimeofday |
Čas a datum není obor názvů. Také vrátný CAP_SYS_TIME . |
stime |
Čas a datum není obor názvů. Také vrátný CAP_SYS_TIME . |
swapon |
Odepřít spuštění/zastavit prohození na soubor nebo zařízení. Také vrátný CAP_SYS_ADMIN . |
swapoff |
Odepřít spuštění/zastavit prohození na soubor nebo zařízení. Také vrátný CAP_SYS_ADMIN . |
sysfs |
Zastaralé syscall. |
_sysctl |
Zastaralé, nahrazeno /proc/sys. |
umount |
Měla by to být privilegovaná operace. Také vrátný CAP_SYS_ADMIN . |
umount2 |
Měla by to být privilegovaná operace. Také vrátný CAP_SYS_ADMIN . |
unshare |
Odepřít klonování nových oborů názvů pro procesy. CAP_SYS_ADMIN Platí také , s výjimkou zrušení sdílení --user. |
uselib |
Starší syscall související se sdílenými knihovnami, nepoužívané po dlouhou dobu. |
userfaultfd |
Zpracování chyb stránky userspace, které je z velké části potřeba k migraci procesů. |
ustat |
Zastaralé syscall. |
vm86 |
V jádru x86 v reálném režimu virtuálního počítače. Také vrátný CAP_SYS_ADMIN . |
vm86old |
V jádru x86 v reálném režimu virtuálního počítače. Také vrátný CAP_SYS_ADMIN . |
Další kroky
Přidružené osvědčené postupy najdete v tématu Osvědčené postupy pro zabezpečení a upgrady clusteru v AKS a osvědčené postupy pro zabezpečení podů v AKS.
Azure Kubernetes Service