Udostępnij za pośrednictwem


Dostęp kontenera zabezpieczeń do zasobów przy użyciu wbudowanych funkcji zabezpieczeń systemu Linux

Z tego artykułu dowiesz się, jak zabezpieczyć dostęp kontenera do zasobów dla obciążeń usługi Azure Kubernetes Service (AKS).

Omówienie

W taki sam sposób, jak należy przyznać użytkownikom lub grupom wymagane minimalne uprawnienia, należy również ograniczyć kontenery tylko do niezbędnych akcji i procesów. Aby zminimalizować ryzyko ataku, należy unikać konfigurowania aplikacji i kontenerów, które wymagają eskalowanych uprawnień lub dostępu głównego.

Możesz użyć wbudowanych kontekstów zabezpieczeń zasobnika Kubernetes, aby zdefiniować więcej uprawnień, takich jak użytkownik lub grupa do uruchomienia jako, możliwości systemu Linux do uwidocznienia lub ustawienia allowPrivilegeEscalation: false w manifeście zasobnika. Aby uzyskać więcej najlepszych rozwiązań, zobacz Bezpieczny dostęp zasobnika do zasobów.

Aby uzyskać jeszcze bardziej szczegółową kontrolę nad akcjami kontenera, możesz użyć wbudowanych funkcji zabezpieczeń systemu Linux, takich jak AppArmor i seccomp.

  1. Zdefiniuj funkcje zabezpieczeń systemu Linux na poziomie węzła.
  2. Implementowanie funkcji za pośrednictwem manifestu zasobnika.

Wbudowane funkcje zabezpieczeń systemu Linux są dostępne tylko w węzłach i zasobnikach systemu Linux.

Uwaga

Obecnie środowiska Kubernetes nie są całkowicie bezpieczne w przypadku wrogiego użycia wielodostępu. Dodatkowe funkcje zabezpieczeń, takie jak Microsoft Defender for Containers, AppArmor, seccomp, Pod Security Admission lub Kubernetes RBAC dla węzłów, skutecznie blokują luki w zabezpieczeniach.

W przypadku prawdziwych zabezpieczeń w przypadku uruchamiania wrogich obciążeń wielodostępnych ufaj tylko funkcji hypervisor. Domena zabezpieczeń dla platformy Kubernetes staje się całym klastrem, a nie pojedynczym węzłem.

W przypadku tych typów wrogich obciążeń wielodostępnych należy używać klastrów odizolowanych fizycznie.

Ochrona aplikacji

Aby ograniczyć akcje kontenera, możesz użyć modułu zabezpieczeń jądra systemu Linux AppArmor . Aplikacja AppArmor jest dostępna w ramach bazowego systemu operacyjnego węzła usługi AKS i jest domyślnie włączona. Tworzone są profile AppArmor, które ograniczają akcje odczytu, zapisu lub wykonywania albo funkcje systemowe, takie jak instalowanie systemów plików. Domyślne profile AppArmor ograniczają dostęp do różnych lokalizacji /proc i /sys zapewniają metodę logicznego izolowania kontenerów od węzła bazowego. Aplikacja AppArmor działa w przypadku każdej aplikacji działającej w systemie Linux, a nie tylko zasobników Kubernetes.

Profile AppArmor używane w klastrze usługi AKS w celu ograniczenia akcji kontenera

Aby zobaczyć działanie appArmor, poniższy przykład tworzy profil, który uniemożliwia zapisywanie w plikach.

  1. Połączenie SSH z węzłem usługi AKS.

  2. Utwórz plik o nazwie deny-write.profile.

  3. Skopiuj i wklej następującą zawartość:

    #include <tunables/global>
    profile k8s-apparmor-example-deny-write flags=(attach_disconnected) {
      #include <abstractions/base>
    
      file,
      # Deny all file writes.
      deny /** w,
    }
    

Profile AppArmor są dodawane przy użyciu apparmor_parser polecenia .

  1. Dodaj profil do aplikacji AppArmor.

  2. Określ nazwę profilu utworzonego w poprzednim kroku:

    sudo apparmor_parser deny-write.profile
    

    Jeśli profil został poprawnie przeanalizowany i zastosowany do aplikacji AppArmor, nie zobaczysz żadnych danych wyjściowych i wrócisz do wiersza polecenia.

  3. Na komputerze lokalnym utwórz manifest zasobnika o nazwie aks-apparmor.yaml. Ten manifest:

    • Definiuje adnotację dla elementu container.apparmor.security.beta.kubernetes.
    • Odwołuje się do profilu deny-write utworzonego w poprzednich krokach.
    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 wdrożeniu zasobnika uruchom następujące polecenie i sprawdź, czy zasobnik hello-apparmor ma stan Uruchomione :

    kubectl get pods
    
    NAME             READY   STATUS    RESTARTS   AGE
    aks-ssh          1/1     Running   0          4m2s
    hello-apparmor   0/1     Running   0          50s
    

Aby uzyskać więcej informacji na temat aplikacji AppArmor, zobacz Profile AppArmor na platformie Kubernetes.

Bezpieczne przetwarzanie (skompiluj)

Podczas gdy aplikacja AppArmor działa dla dowolnej aplikacji systemu Linux, seccomp (secure computing) działa na poziomie procesu. Seccomp jest również modułem zabezpieczeń jądra systemu Linux i jest natywnie obsługiwany przez środowisko uruchomieniowe używane przez containerd węzły usługi AKS. Dzięki seccomp można ograniczyć wywołania systemowe kontenera. Seccomp ustanawia dodatkową warstwę ochrony przed typowymi lukami w zabezpieczeniach wywołania systemu wykorzystywanymi przez złośliwych podmiotów i umożliwia określenie domyślnego profilu dla wszystkich obciążeń w węźle.

Konfigurowanie domyślnego profilu seccomp (wersja zapoznawcza)

Domyślne profile seccomp można stosować przy użyciu niestandardowych konfiguracji węzłów podczas tworzenia nowej puli węzłów systemu Linux. W usłudze AKS są obsługiwane dwie wartości: RuntimeDefault i Unconfined. Niektóre obciążenia mogą wymagać mniejszej liczby ograniczeń syscall niż inne. Oznacza to, że mogą one zakończyć się niepowodzeniem podczas wykonywania z profilem "RuntimeDefault". Aby wyeliminować taki błąd, możesz określić Unconfined profil. Jeśli obciążenie wymaga profilu niestandardowego, zobacz Konfigurowanie niestandardowego profilu seccomp.

Ograniczenia

  • SeccompDefault nie jest obsługiwanym parametrem dla pul węzłów systemu Windows.
  • Funkcja SeccompDefault jest dostępna od 2024-09-02-preview API.

Ważne

Funkcje usługi AKS w wersji zapoznawczej są dostępne na zasadzie samoobsługi. Wersje zapoznawcze są udostępniane w wersji "as is" i "jako dostępne" i są wykluczone z umów dotyczących poziomu usług i ograniczonej gwarancji. Wersje zapoznawcze usługi AKS są częściowo objęte pomocą techniczną dla klientów. W związku z tym te funkcje nie są przeznaczone do użytku produkcyjnego. Aby uzyskać więcej informacji, zobacz następujące artykuły pomocy technicznej:

Rejestrowanie flagi KubeletDefaultSeccompProfilePreview funkcji

  1. Zarejestruj flagę KubeletDefaultSeccompProfilePreview funkcji przy użyciu az feature register polecenia .

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

    Wyświetlenie stanu Zarejestrowane trwa kilka minut.

  2. Sprawdź stan rejestracji przy użyciu az feature show polecenia .

    az feature show --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"
    
  3. Gdy stan będzie odzwierciedlał wartość Zarejestrowano, odśwież rejestrację dostawcy zasobów Microsoft.ContainerService przy użyciu az provider register polecenia .

    az provider register --namespace Microsoft.ContainerService
    

Ograniczanie wywołań systemowych kontenera za pomocą polecenia seccomp

1. Wykonaj kroki, aby zastosować profil seccomp w konfiguracji narzędzia kubelet, określając wartość "seccompDefault": "RuntimeDefault".

RuntimeDefault używa domyślnego profilu seccomp kontenera, ograniczając niektóre wywołania systemowe w celu zwiększenia bezpieczeństwa. Ograniczone systemcalls zakończy się niepowodzeniem. Aby uzyskać więcej informacji, zobacz domyślny profil seccomp containerD.

2. Sprawdź, czy konfiguracja została zastosowana.

Możesz potwierdzić, że ustawienia są stosowane do węzłów, łącząc się z hostem i sprawdzając zmiany konfiguracji zostały wprowadzone w systemie plików.

3. Rozwiązywanie problemów z błędami obciążeń.

Gdy ustawienie SeccompDefault jest włączone, domyślny profil seccomp środowiska uruchomieniowego kontenera jest domyślnie używany dla wszystkich obciążeń zaplanowanych w węźle. Może to spowodować niepowodzenie obciążeń z powodu zablokowanych wywołań systemu. Jeśli wystąpił błąd obciążenia, mogą wystąpić błędy, takie jak:

  • Obciążenie jest nieoczekiwanie istniejące po włączeniu funkcji z powodu błędu "odmowa uprawnień".
  • Komunikaty o błędach seccomp można również zobaczyć w inspekcji lub dzienniku systemowym, zastępując SCMP_ACT_ERRNO SCMP_ACT_LOG w profilu domyślnym.

Jeśli wystąpią powyższe błędy, zalecamy zmianę profilu seccomp na Unconfined. Unconfined nie nakłada żadnych ograniczeń na systemcalls, zezwalając na wszystkie wywołania systemowe, co zmniejsza bezpieczeństwo.

Konfigurowanie niestandardowego profilu seccomp

W przypadku niestandardowego profilu seccomp możesz mieć bardziej szczegółową kontrolę nad ograniczonymi systemami syscall. Dopasuj do najlepszych rozwiązań w zakresie udzielania kontenerowi minimalnych uprawnień tylko do uruchamiania przez:

  • Definiowanie za pomocą filtrów, jakie akcje mają zezwalać lub odrzucać.
  • Dodawanie adnotacji w manifeście YAML zasobnika do skojarzenia z filtrem seccomp.

Aby wyświetlić skompilację w działaniu, utwórz filtr, który uniemożliwia zmianę uprawnień w pliku.

  1. Połączenie SSH z węzłem usługi AKS.

  2. Utwórz filtr seccomp o nazwie /var/lib/kubelet/seccomp/prevent-chmod.

  3. Skopiuj i wklej następującą zawartość:

    {
      "defaultAction": "SCMP_ACT_ALLOW",
      "syscalls": [
        {
          "name": "chmod",
          "action": "SCMP_ACT_ERRNO"
        },
        {
          "name": "fchmodat",
          "action": "SCMP_ACT_ERRNO"
        },
        {
          "name": "chmodat",
          "action": "SCMP_ACT_ERRNO"
        }
      ]
    }
    

    W wersji 1.19 lub nowszej należy skonfigurować:

    {
      "defaultAction": "SCMP_ACT_ALLOW",
      "syscalls": [
        {
          "names": ["chmod","fchmodat","chmodat"],
          "action": "SCMP_ACT_ERRNO"
        }
      ]
    }
    
  4. Na komputerze lokalnym utwórz manifest zasobnika o nazwie aks-seccomp.yaml i wklej następującą zawartość. Ten manifest:

    • Definiuje adnotację dla elementu seccomp.security.alpha.kubernetes.io.
    • Odwołuje się do filtru prevent-chmod utworzonego w poprzednim 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
    

    W wersji 1.19 lub nowszej należy skonfigurować:

    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. Wdróż przykładowy zasobnik przy użyciu polecenia kubectl apply :

    kubectl apply -f ./aks-seccomp.yaml
    
  6. Wyświetl stan zasobnika za pomocą polecenia kubectl get pods .

    • Zasobnik zgłasza błąd.
    • Polecenie chmod jest blokowane przez filtr seccomp, jak pokazano w przykładowych danych wyjściowych:
    kubectl get pods
    
    NAME                      READY     STATUS    RESTARTS   AGE
    chmod-prevented           0/1       Error     0          7s
    

Opcje profilu zabezpieczeń seccomp

Profile zabezpieczeń Seccomp to zestaw zdefiniowanych systemów syscall, które są dozwolone lub ograniczone. Większość środowisk uruchomieniowych kontenerów ma domyślny profil seccomp, który jest podobny, jeśli nie jest taki sam, jak używany przez platformę Docker. Aby uzyskać więcej informacji na temat dostępnych profilów, zobacz Domyślne profile seccomp platformy Docker lub containerD .

Usługa AKS używa domyślnego profilu seccomp containerD dla naszego środowiska RuntimeDefault podczas konfigurowania seccomp przy użyciu niestandardowej konfiguracji węzła.

Znaczące polecenia syscalls zablokowane domyślnie w profilu

Zarówno platforma Docker , jak i kontenerD utrzymują listy dozwolonych bezpiecznych systemów syscall. Ta tabela zawiera listę znaczących (ale nie wszystkich) poleceń syscall, które są skutecznie blokowane, ponieważ nie znajdują się na liście dozwolonych. Jeśli którekolwiek z zablokowanych poleceń syscall są wymagane przez obciążenie, nie używaj RuntimeDefault profilu seccomp.

Po wprowadzeniu zmian w usłudze Docker i containerD usługa AKS aktualizuje domyślną konfigurację tak, aby odpowiadała. Aktualizacje tej listy mogą spowodować niepowodzenie obciążenia. Aby uzyskać informacje o wersji, zobacz Informacje o wersji usługi AKS.

Zablokowane polecenie syscall opis
acct Księgowość syscall, która może pozwolić kontenerom wyłączyć własne limity zasobów lub ewidencjonowanie aktywności procesów. Również bramowane przez CAP_SYS_PACCT.
add_key Uniemożliwiaj kontenerom używanie klucza jądra, który nie jest przestrzenią nazw.
bpf Odmów ładowania potencjalnie trwałych programów bpf do jądra, już przez CAP_SYS_ADMINprogram .
clock_adjtime Data/godzina nie jest przestrzenią nazw. Również bramowane przez CAP_SYS_TIME.
clock_settime Data/godzina nie jest przestrzenią nazw. Również bramowane przez CAP_SYS_TIME.
clone Odmów klonowania nowych przestrzeni nazw. Również za pomocą CAP_SYS_ADMIN for CLONE_* flag, z wyjątkiem CLONE_NEWUSER.
create_module Odmów manipulowania i funkcji w modułach jądra. Nieaktualne. Również bramowane przez CAP_SYS_MODULE.
delete_module Odmów manipulowania i funkcji w modułach jądra. Również bramowane przez CAP_SYS_MODULE.
finit_module Odmów manipulowania i funkcji w modułach jądra. Również bramowane przez CAP_SYS_MODULE.
get_kernel_syms Odmów pobierania wyeksportowanych symboli jądra i modułu. Nieaktualne.
get_mempolicy Systemcall, który modyfikuje pamięć jądra i ustawienia NUMA. Już ogrodzony przez CAP_SYS_NICE.
init_module Odmów manipulowania i funkcji w modułach jądra. Również bramowane przez CAP_SYS_MODULE.
ioperm Uniemożliwiaj kontenerom modyfikowanie poziomów uprawnień we/wy jądra. Już ogrodzony przez CAP_SYS_RAWIO.
iopl Uniemożliwiaj kontenerom modyfikowanie poziomów uprawnień we/wy jądra. Już ogrodzony przez CAP_SYS_RAWIO.
kcmp Ogranicz możliwości inspekcji procesów, które są już zablokowane, upuszczając CAP_SYS_PTRACEpolecenie .
kexec_file_load Siostra syscall kexec_load, który robi to samo, nieco inne argumenty. Również bramowane przez CAP_SYS_BOOT.
kexec_load Odmów ładowania nowego jądra do późniejszego wykonania. Również bramowane przez CAP_SYS_BOOT.
keyctl Uniemożliwiaj kontenerom używanie klucza jądra, który nie jest przestrzenią nazw.
lookup_dcookie Śledzenie/profilowanie syscall, które może wyciekać informacji na hoście. Również bramowane przez CAP_SYS_ADMIN.
mbind Systemcall, który modyfikuje pamięć jądra i ustawienia NUMA. Już ogrodzony przez CAP_SYS_NICE.
mount Odmów instalowania, już ogrodzony przez CAP_SYS_ADMIN.
move_pages Systemcall, który modyfikuje pamięć jądra i ustawienia NUMA.
nfsservctl Odmów interakcji z demonem nfs jądra. Przestarzałe od systemu Linux 3.1.
open_by_handle_at Przyczyna starego przerwania kontenera. Również bramowane przez CAP_DAC_READ_SEARCH.
perf_event_open Śledzenie/profilowanie syscall, które może wyciekać informacji na hoście.
personality Zapobiegaj włączaniu emulacji BSD przez kontener. Nie z natury niebezpieczne, ale słabo przetestowane, potencjał vulns jądra.
pivot_root Odmowa pivot_root powinna być operacją uprzywilejowaną.
process_vm_readv Ogranicz możliwości inspekcji procesów, które są już zablokowane, upuszczając CAP_SYS_PTRACEpolecenie .
process_vm_writev Ogranicz możliwości inspekcji procesów, które są już zablokowane, upuszczając CAP_SYS_PTRACEpolecenie .
ptrace Śledzenie/profilowanie syscall. Zablokowane w wersjach jądra systemu Linux przed wersją 4.8, aby uniknąć obejścia seccomp. Śledzenie/profilowanie dowolnych procesów jest już blokowane przez usunięcie CAP_SYS_PTRACE, ponieważ może to spowodować wyciek informacji na hoście.
query_module Odmów manipulowania i funkcji w modułach jądra. Nieaktualne.
quotactl Syscall limit przydziału, który może pozwolić kontenerom wyłączyć własne limity zasobów lub ewidencjonowanie aktywności procesów. Również bramowane przez CAP_SYS_ADMIN.
reboot Nie zezwalaj kontenerom na ponowne uruchomienie hosta. Również bramowane przez CAP_SYS_BOOT.
request_key Uniemożliwiaj kontenerom używanie klucza jądra, który nie jest przestrzenią nazw.
set_mempolicy Systemcall, który modyfikuje pamięć jądra i ustawienia NUMA. Już ogrodzony przez CAP_SYS_NICE.
setns Odmów skojarzenia wątku z przestrzenią nazw. Również bramowane przez CAP_SYS_ADMIN.
settimeofday Data/godzina nie jest przestrzenią nazw. Również bramowane przez CAP_SYS_TIME.
stime Data/godzina nie jest przestrzenią nazw. Również bramowane przez CAP_SYS_TIME.
swapon Odmów zamiany na plik/urządzenie przed rozpoczęciem/zatrzymywaniem. Również bramowane przez CAP_SYS_ADMIN.
swapoff Odmów zamiany na plik/urządzenie przed rozpoczęciem/zatrzymywaniem. Również bramowane przez CAP_SYS_ADMIN.
sysfs Przestarzałe polecenie syscall.
_sysctl Przestarzałe, zastąpione przez /proc/sys.
umount Powinna być operacją uprzywilejowaną. Również bramowane przez CAP_SYS_ADMIN.
umount2 Powinna być operacją uprzywilejowaną. Również bramowane przez CAP_SYS_ADMIN.
unshare Odmów klonowania nowych przestrzeni nazw dla procesów. Ponadto brama przez CAP_SYS_ADMINelement z wyjątkiem unshare --user.
uselib Starsze systemcall związane z bibliotekami udostępnionymi, nieużywane przez długi czas.
userfaultfd Obsługa błędów strony w przestrzeni użytkownika, w dużej mierze potrzebna do migracji procesów.
ustat Przestarzałe polecenie syscall.
vm86 W maszynie wirtualnej w trybie rzeczywistym x86 jądra. Również bramowane przez CAP_SYS_ADMIN.
vm86old W maszynie wirtualnej w trybie rzeczywistym x86 jądra. Również bramowane przez CAP_SYS_ADMIN.

Następne kroki

Aby uzyskać informacje o skojarzonych najlepszych rozwiązaniach, zobacz Najlepsze rozwiązania dotyczące zabezpieczeń i uaktualnień klastra w usłudze AKS oraz Najlepsze rozwiązania dotyczące zabezpieczeń zasobników w usłudze AKS.