Megosztás a következőn keresztül:


Biztonsági tároló hozzáférése az erőforrásokhoz beépített Linux biztonsági funkciókkal

Ebből a cikkből megtudhatja, hogyan védheti meg a tárolók hozzáférését az Azure Kubernetes Service (AKS) számítási feladataihoz tartozó erőforrásokhoz.

Áttekintés

Ugyanúgy, ahogyan a felhasználóknak vagy csoportoknak meg kell adnia a szükséges minimális jogosultságokat, a tárolókat is csak a szükséges műveletekre és folyamatokra kell korlátozni. A támadás kockázatának minimalizálása érdekében kerülje az eszkalált jogosultságokat vagy gyökérhozzáférést igénylő alkalmazások és tárolók konfigurálását.

A kubernetes-podok beépített biztonsági környezetei segítségével további engedélyeket határozhat meg, például a futtatandó felhasználót vagy csoportot, a közzéteendő Linux-képességeket vagy a podjegyzékben lévő beállításokat allowPrivilegeEscalation: false . További ajánlott eljárásokért tekintse meg az erőforrásokhoz való podhozzáférés biztonságossá tételét.

A tárolóműveletek még részletesebb szabályozásához olyan beépített Linux-biztonsági funkciókat használhat, mint az AppArmor és a seccomp.

  1. Linux biztonsági funkciók meghatározása csomópontszinten.
  2. Szolgáltatások implementálása podjegyzéken keresztül.

A beépített Linux biztonsági funkciók csak Linux-csomópontokon és podokon érhetők el.

Feljegyzés

A Kubernetes-környezetek jelenleg nem teljesen biztonságosak az ellenséges, több-bérlős használathoz. A további biztonsági funkciók, például a Microsoft Defender for Containers, az AppArmor, a seccomp, a Pod Security Admission vagy a Kubernetes RBAC a csomópontokhoz hatékonyan blokkolják a biztonsági réseket.

Az ellenséges több-bérlős számítási feladatok futtatásakor a valódi biztonság érdekében csak egy hipervizorban bízzon meg. A Kubernetes biztonsági tartománya a teljes fürt lesz, nem pedig egy egyedi csomópont.

Az ilyen típusú ellenséges több-bérlős számítási feladatokhoz fizikailag izolált fürtöket kell használnia.

App Armor

A tárolóműveletek korlátozásához használhatja az AppArmor Linux kernelbiztonsági modult. Az AppArmor a mögöttes AKS-csomópont operációs rendszerének részeként érhető el, és alapértelmezés szerint engedélyezve van. Olyan AppArmor-profilokat hozhat létre, amelyek korlátozzák az olvasási, írási és végrehajtási műveleteket, illetve olyan rendszerfunkciókat, mint a fájlrendszerek csatlakoztatása. Az alapértelmezett AppArmor-profilok korlátozzák a különböző /proc helyekhez /sys való hozzáférést, és lehetővé teszik a tárolók logikai elkülönítését a mögöttes csomóponttól. Az AppArmor minden Linuxon futó alkalmazáshoz működik, nem csak a Kubernetes-podokhoz.

Az AKS-fürtben használt AppArmor-profilok a tárolóműveletek korlátozásához

Az AppArmor működés közbeni megtekintéséhez az alábbi példa létrehoz egy profilt, amely megakadályozza a fájlokba való írást.

  1. SSH egy AKS-csomópontra.

  2. Hozzon létre egy deny-write.profile nevű fájlt.

  3. Másolja és illessze be a következő tartalmat:

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

Az AppArmor-profilok a apparmor_parser parancs használatával lesznek hozzáadva.

  1. Adja hozzá a profilt az AppArmorhoz.

  2. Adja meg az előző lépésben létrehozott profil nevét:

    sudo apparmor_parser deny-write.profile
    

    Ha a profil megfelelően van elemezve és alkalmazva az AppArmor-ra, nem fog semmilyen kimenetet látni, és vissza fog térni a parancssorba.

  3. A helyi gépről hozzon létre egy podjegyzéket aks-apparmor.yaml néven. Ez a jegyzék:

    • A egy széljegyzetet határoz meg a következőhöz container.apparmor.security.beta.kubernetes: .
    • Az előző lépésekben létrehozott megtagadási-írási profilra hivatkozik.
    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. A pod üzembe helyezésével futtassa a következő parancsot, és ellenőrizze, hogy a hello-apparmor pod futási állapotot mutat-e:

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

További információ az AppArmorról: AppArmor-profilok a Kubernetesben.

Biztonságos számítástechnika (seccomp)

Bár az AppArmor bármilyen Linux-alkalmazáshoz működik, a seccomp (secure computing) a folyamat szintjén működik. A Seccomp linuxos kernelbiztonsági modul is, és az AKS-csomópontok által használt futtatókörnyezet natív módon támogatja containerd . A seccomp használatával korlátozhatja a tároló rendszerhívásait. A Seccomp egy további védelmi réteget hoz létre a rosszindulatú szereplők által kihasznált gyakori rendszerhívási biztonsági rések ellen, és lehetővé teszi egy alapértelmezett profil megadását a csomópont összes számítási feladatához.

Alapértelmezett seccomp-profil konfigurálása (előzetes verzió)

Új Linux-csomópontkészlet létrehozásakor egyéni csomópontkonfigurációkkal alkalmazhat alapértelmezett seccomp-profilokat. Az AKS-ben két érték támogatott: RuntimeDefault és Unconfined. Egyes számítási feladatokhoz alacsonyabb számú syscall-korlátozásra lehet szükség, mint mások. Ez azt jelenti, hogy futásidőben a "RuntimeDefault" profillal meghiúsulhatnak. Az ilyen hibák elhárításához megadhatja a profilt Unconfined . Ha a számítási feladathoz egyéni profil szükséges, tekintse meg az egyéni seccomp-profil konfigurálását.

Korlátozások

  • A SeccompDefault nem támogatott paraméter a Windows-csomópontkészletekhez.
  • A SeccompDefault 2024-09-02-preview API-tól érhető el.

Fontos

Az AKS előzetes verziójú funkciói önkiszolgáló, opt-in alapon érhetők el. Az előzetes verziókat "ahogy van" és "rendelkezésre állóként" biztosítjuk, és a szolgáltatási szerződésekből és a korlátozott jótállásból kizárjuk őket. Az AKS előzetes verzióit részben az ügyfélszolgálat fedezi a legjobb munkamennyiség alapján. Ezért ezek a funkciók nem éles használatra vannak szánva. További információkért tekintse meg az alábbi támogatási cikkeket:

A funkciójelző regisztrálása KubeletDefaultSeccompProfilePreview

  1. Regisztrálja a KubeletDefaultSeccompProfilePreview funkciójelzőt a az feature register paranccsal.

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

    Néhány percig tart, amíg az állapot megjelenik a Regisztrált állapotban.

  2. Ellenőrizze a regisztrációs állapotot a az feature show paranccsal.

    az feature show --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"
    
  3. Ha az állapot a Regisztrált állapotot tükrözi, frissítse a Microsoft.ContainerService erőforrás-szolgáltató regisztrációját a az provider register paranccsal.

    az provider register --namespace Microsoft.ContainerService
    

Tároló rendszerhívásainak korlátozása seccomp használatával

1. Kövesse a lépéseket egy seccomp profil kubelet konfigurációban való alkalmazásához a beállítás megadásával "seccompDefault": "RuntimeDefault".

RuntimeDefault A tárolód alapértelmezett seccomp-profilját használja, amely korlátozza bizonyos rendszerhívásokat a biztonság növelése érdekében. A korlátozott syscalls sikertelen lesz. További információkért tekintse meg a containerD alapértelmezett seccomp profilt.

2. Ellenőrizze, hogy a konfiguráció alkalmazva lett-e.

A csomópontokra való alkalmazás megerősítéséhez csatlakozzon a gazdagéphez , és ellenőrizze, hogy a konfigurációs módosítások történtek-e a fájlrendszerben.

3. Számítási feladatok hibáinak elhárítása.

Ha a SeccompDefault engedélyezve van, a tároló futtatókörnyezetének alapértelmezett seccomp profilja alapértelmezés szerint a csomóponton ütemezett összes számítási feladathoz használható. Ez azt okozhatja, hogy a számítási feladatok meghiúsulnak a blokkolt syscallok miatt. Ha számítási feladat hibája történt, olyan hibákat láthat, mint például:

  • A számítási feladat váratlanul létezik a funkció engedélyezése után, "engedély megtagadva" hibaüzenettel.
  • A seccomp hibaüzenetek a naplóban vagy a syslogban is láthatók, ha az alapértelmezett profilban lecseréli SCMP_ACT_ERRNO SCMP_ACT_LOG.

Ha a fenti hibákat tapasztalja, javasoljuk, hogy módosítsa a seccomp profilt Unconfined. Unconfined nem korlátozza a syscalls szolgáltatást, lehetővé téve az összes rendszerhívást, ami csökkenti a biztonságot.

Egyéni seccomp-profil konfigurálása

Egyéni seccomp profillal részletesebben szabályozhatja a korlátozott syscallokat. Igazodjon ahhoz az ajánlott eljáráshoz, amely szerint a tárolónak csak a következő jogosultságokkal kell futnia:

  • Szűrőkkel definiálja, hogy milyen műveleteket engedélyezhet vagy tilthat le.
  • Megjegyzés a pod YAML-jegyzékében a seccomp szűrőhöz való társításhoz.

A seccomp működés közbeni megtekintéséhez hozzon létre egy szűrőt, amely megakadályozza a fájlok engedélyeinek módosítását.

  1. SSH egy AKS-csomópontra.

  2. Hozzon létre egy /var/lib/kubelet/seccomp/prevent-chmod nevű seccomp szűrőt.

  3. Másolja és illessze be a következő tartalmat:

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

    Az 1.19-es és újabb verziókban konfigurálnia kell a következőt:

    {
      "defaultAction": "SCMP_ACT_ALLOW",
      "syscalls": [
        {
          "names": ["chmod","fchmodat","chmodat"],
          "action": "SCMP_ACT_ERRNO"
        }
      ]
    }
    
  4. A helyi gépről hozzon létre egy podjegyzéket aks-seccomp.yaml néven, és illessze be a következő tartalmat. Ez a jegyzék:

    • A egy széljegyzetet határoz meg a következőhöz seccomp.security.alpha.kubernetes.io: .
    • Az előző lépésben létrehozott prevent-chmod szűrőre hivatkozik.
    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
    

    Az 1.19-es és újabb verziókban konfigurálnia kell a következőt:

    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. Telepítse a minta podot a kubectl apply paranccsal:

    kubectl apply -f ./aks-seccomp.yaml
    
  6. A pod állapotának megtekintése a kubectl get pods paranccsal.

    • A pod hibát jelez.
    • A chmod seccomp szűrő nem futtatja a parancsot, ahogy az a példakimenetben is látható:
    kubectl get pods
    
    NAME                      READY     STATUS    RESTARTS   AGE
    chmod-prevented           0/1       Error     0          7s
    

A Seccomp biztonsági profil beállításai

A Seccomp biztonsági profilok olyan meghatározott syscallok készletei, amelyek engedélyezettek vagy korlátozottak. A legtöbb tároló futtatókörnyezete rendelkezik egy alapértelmezett seccomp profillal, amely hasonló, ha nem ugyanaz, mint amit a Docker használ. Az elérhető profilokról további információt a Docker vagy a ContainerD alapértelmezett seccomp profiljaiban talál.

Az AKS a RuntimeDefault alapértelmezett seccomp profilját használja a seccomp egyéni csomópontkonfigurációval történő konfigurálásakor.

Az alapértelmezett profil által letiltott jelentős syscallok

A Docker és a containerD is fenntartja a biztonságos syscallok engedélyezési listáját. Ez a táblázat felsorolja azokat a jelentős (de nem az összes) syscallst, amelyek ténylegesen le vannak tiltva, mert nem szerepelnek az engedélyezési listán. Ha a számítási feladat megköveteli a letiltott syscallok bármelyikét, ne használja a RuntimeDefault seccomp profilt.

A Docker és a containerD módosításakor az AKS frissíti az alapértelmezett konfigurációt. A lista frissítései számítási feladatok meghibásodását okozhatják. A kiadási frissítésekről lásd az AKS kibocsátási megjegyzéseit.

Letiltott syscall Leírás
acct Könyvelési syscall, amely lehetővé teheti, hogy a tárolók letiltsák a saját erőforráskorlátjukat vagy feldolgozzák a könyvelést. Szintén kapuval.CAP_SYS_PACCT
add_key Megakadályozza, hogy a tárolók a nem névtérbe rendezett kernelkulcsot használják.
bpf Tiltsa le a potenciálisan állandó bpf-programok kernelbe való betöltését, amelyet CAP_SYS_ADMINmár a .
clock_adjtime Az idő/dátum nincs névtérben. Szintén kapuval.CAP_SYS_TIME
clock_settime Az idő/dátum nincs névtérben. Szintén kapuval.CAP_SYS_TIME
clone Új névterek klónozásának megtagadása. Azt is kapuval zászlók CAP_SYS_ADMIN for CLONE_* , kivéve CLONE_NEWUSER.
create_module Tiltsa le a kernelmodulok manipulációját és funkcióit. Elavult. Szintén kapuval.CAP_SYS_MODULE
delete_module Tiltsa le a kernelmodulok manipulációját és funkcióit. Szintén kapuval.CAP_SYS_MODULE
finit_module Tiltsa le a kernelmodulok manipulációját és funkcióit. Szintén kapuval.CAP_SYS_MODULE
get_kernel_syms Az exportált kernel és modulszimbólumok lekérésének megtagadása. Elavult.
get_mempolicy Syscall, amely módosítja a kernel memóriáját és a NUMA beállításait. Már be van állítva .CAP_SYS_NICE
init_module Tiltsa le a kernelmodulok manipulációját és funkcióit. Szintén kapuval.CAP_SYS_MODULE
ioperm Megakadályozza, hogy a tárolók módosítsák a kernel I/O jogosultsági szintjét. Már be van állítva .CAP_SYS_RAWIO
iopl Megakadályozza, hogy a tárolók módosítsák a kernel I/O jogosultsági szintjét. Már be van állítva .CAP_SYS_RAWIO
kcmp Korlátozza a folyamatvizsgálati képességeket, amelyeket már letiltott a ledobással CAP_SYS_PTRACE.
kexec_file_load Nővér syscall a kexec_load, hogy nem ugyanazt a dolgot, kissé eltérő argumentumokat. Szintén kapuval.CAP_SYS_BOOT
kexec_load Megtagadhatja az új kernel betöltését a későbbi végrehajtáshoz. Szintén kapuval.CAP_SYS_BOOT
keyctl Megakadályozza, hogy a tárolók a nem névtérbe rendezett kernelkulcsot használják.
lookup_dcookie Nyomkövetési/profilkészítési syscall, amely információkat szivárogtathat ki a gazdagépen. Szintén kapuval.CAP_SYS_ADMIN
mbind Syscall, amely módosítja a kernel memóriáját és a NUMA beállításait. Már be van állítva .CAP_SYS_NICE
mount Megtagadja a csatlakoztatást, már be van állítva.CAP_SYS_ADMIN
move_pages Syscall, amely módosítja a kernel memóriáját és a NUMA beállításait.
nfsservctl Megtagadja a kernel nfs démonnal való interakciót. Linux 3.1 óta elavult.
open_by_handle_at Egy régi tárolótörés oka. Szintén kapuval.CAP_DAC_READ_SEARCH
perf_event_open Nyomkövetési/profilkészítési syscall, amely információkat szivárogtathat ki a gazdagépen.
personality Megakadályozza, hogy a tároló engedélyezze a BSD-emulációt. Nem eredendően veszélyes, de rosszul tesztelt, kernelvulnok potenciálisan.
pivot_root A megtagadás pivot_root, jogosultsági szintű műveletnek kell lennie.
process_vm_readv Korlátozza a folyamatvizsgálati képességeket, amelyeket már letiltott a ledobással CAP_SYS_PTRACE.
process_vm_writev Korlátozza a folyamatvizsgálati képességeket, amelyeket már letiltott a ledobással CAP_SYS_PTRACE.
ptrace Nyomkövetési/profilkészítési syscall. A 4.8 előtti Linux kernelverziókban blokkolva van a seccomp megkerülésének elkerülése érdekében. A nyomkövetési/profilkészítési folyamatok már le vannak tiltva a CAP_SYS_PTRACE elvetésével, mert az információkat szivárogtathat a gazdagépen.
query_module Tiltsa le a kernelmodulok manipulációját és funkcióit. Elavult.
quotactl Kvóta syscall, amely lehetővé teheti, hogy a tárolók letiltsák a saját erőforráskorlátjukat vagy feldolgozzák a könyvelést. Szintén kapuval.CAP_SYS_ADMIN
reboot Ne hagyja, hogy a tárolók újraindítják a gazdagépet. Szintén kapuval.CAP_SYS_BOOT
request_key Megakadályozza, hogy a tárolók a nem névtérbe rendezett kernelkulcsot használják.
set_mempolicy Syscall, amely módosítja a kernel memóriáját és a NUMA beállításait. Már be van állítva .CAP_SYS_NICE
setns Megtagadhatja a szál névtérrel való társítását. Szintén kapuval.CAP_SYS_ADMIN
settimeofday Az idő/dátum nincs névtérben. Szintén kapuval.CAP_SYS_TIME
stime Az idő/dátum nincs névtérben. Szintén kapuval.CAP_SYS_TIME
swapon Tiltsa le a fájlra/eszközre való felcserélés indítását/leállítását. Szintén kapuval.CAP_SYS_ADMIN
swapoff Tiltsa le a fájlra/eszközre való felcserélés indítását/leállítását. Szintén kapuval.CAP_SYS_ADMIN
sysfs Elavult syscall.
_sysctl Elavult, helyébe a /proc/sys lép.
umount Kiemelt műveletnek kell lennie. Szintén kapuval.CAP_SYS_ADMIN
umount2 Kiemelt műveletnek kell lennie. Szintén kapuval.CAP_SYS_ADMIN
unshare A folyamatok új névtereinek klónozásának megtagadása. Szintén kapuval CAP_SYS_ADMIN, kivéve a nem megosztott --felhasználó.
uselib A megosztott kódtárakhoz kapcsolódó régebbi syscall hosszú ideig nem használt.
userfaultfd Felhasználóitér-oldal hibakezelése, amely nagyrészt a folyamatmigráláshoz szükséges.
ustat Elavult syscall.
vm86 Kernel x86-os valós módú virtuális gépen. Szintén kapuval.CAP_SYS_ADMIN
vm86old Kernel x86-os valós módú virtuális gépen. Szintén kapuval.CAP_SYS_ADMIN

Következő lépések

A kapcsolódó ajánlott eljárásokért tekintse meg a fürtbiztonságra és az AKS frissítésére vonatkozó ajánlott eljárásokat, valamint az AKS podbiztonságának ajánlott eljárásait.