Sdílet prostřednictvím


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.

  1. Definujte funkce zabezpečení Linuxu na úrovni uzlu.
  2. 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.

Profily AppArmor používané v clusteru AKS k omezení akcí kontejneru

Pokud chcete vidět AppArmor v akci, následující příklad vytvoří profil, který brání zápisu do souborů.

  1. Připojení SSH k uzlu AKS

  2. Vytvořte soubor s názvem deny-write.profile.

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

  1. Přidejte profil do AppArmoru.

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

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

  1. KubeletDefaultSeccompProfilePreview Pomocí příkazu zaregistrujte příznak az feature register funkce.

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

    Zobrazení stavu Zaregistrované trvá několik minut.

  2. Pomocí příkazu ověřte stav az feature show registrace.

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

  1. Připojení SSH k uzlu AKS

  2. Vytvořte filtr seccomp s názvem /var/lib/kubelet/seccomp/prevent-chmod.

  3. 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"
        }
      ]
    }
    
  4. 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
    
  5. Nasaďte ukázkový pod pomocí příkazu kubectl apply :

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