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.
- Linux biztonsági funkciók meghatározása csomópontszinten.
- 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 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.
SSH egy AKS-csomópontra.
Hozzon létre egy deny-write.profile nevű fájlt.
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.
Adja hozzá a profilt az AppArmorhoz.
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.
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" ]
- A egy széljegyzetet határoz meg a következőhöz
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
Regisztrálja a
KubeletDefaultSeccompProfilePreview
funkciójelzőt aaz 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.
Ellenőrizze a regisztrációs állapotot a
az feature show
paranccsal.az feature show --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"
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.
SSH egy AKS-csomópontra.
Hozzon létre egy /var/lib/kubelet/seccomp/prevent-chmod nevű seccomp szűrőt.
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" } ] }
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
- A egy széljegyzetet határoz meg a következőhöz
Telepítse a minta podot a kubectl apply paranccsal:
kubectl apply -f ./aks-seccomp.yaml
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_ADMIN má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.
Azure Kubernetes Service