MĂ€rk. tĂ”lge.: Esitame tĂ”lke Briti ettevĂ”tte ASOS.com vanema rakenduste turvainseneri artiklist. Sellega alustab ta veebisarja, mis on pĂŒhendatud Kuberneteseteabe turvalisuse tĂ”stmisele seccompi kasutamise kaudu. Kui sissetoomine meeldib lugejatele, jĂ€rgime autorit ja jĂ€tkame tema tulevaste materjalidega sellel teemal.

See artikkel on esimene osa sarjast, mis kÀsitleb seccompi profiilide loomist SecDevOps vaimus, vÀltides samas maagia ja nÔiduse kasutamist. Esimeses osas rÀÀgin seccompi pÔhialustest ja sisemistest detailidest Kubernetesis.
Kubernetesi ökosĂŒsteem pakub piisavalt erinevaid viise konteinerite turvamiseks ja isoleerimiseks. Artikkel on pĂŒhendatud Secure Computing Mode'ile, mida tuntakse ka kui , ja palju muud.. Selle olemus seisneb sĂŒsteemi kĂ”nede filtreerimises, millele konteinerid on juurdepÀÀsuga.
Miks see oluline on? Konteiner on lihtsalt protsess, mis on kĂ€ivitatud kindlas masinas. Ja ta kasutab tuuma koos teiste rakendustega. Kui konteinerid saaksid teha igasuguseid sĂŒsteemikĂ”nesid, kasutaksid seda peagi pahatahtlikud programmid, et mööda minna konteineri isolatsioonist ja mĂ”jutada teisi rakendusi: teavet pealt kuulata, sĂŒsteemi seadeid muutma jne.
Seccomp'i profilid mÀÀravad, millised sĂŒsteemikĂ”ned peavad olema lubatud vĂ”i keelatud. Konteineri töökeskkond aktiveerib need selle kĂ€ivitamisel, et tuum saaks jĂ€lgida nende tĂ€itmist. Selliste profiilide rakendamine vĂ”imaldab piirata rĂŒnnakueesmĂ€rke ja vĂ€hendada kahju, juhul kui mĂ”ni programm konteineri sees (st teie sĂ”ltuvused vĂ”i nende sĂ”ltuvused) hakkab tegema seda, mida tal lubatud ei ole.
Alustame pÔhialustega
Seccomp'i pÔhiprofiil sisaldab kolme elementi: defaultAction, architectures (vÔi archMap) ja syscalls:
{
"defaultAction": "SCMP_ACT_ERRNO",
"architectures": [
"SCMP_ARCH_X86_64",
"SCMP_ARCH_X86",
"SCMP_ARCH_X32"
],
"syscalls": [
{
"names": [
"arch_prctl",
"sched_yield",
"futex",
"write",
"mmap",
"exit_group",
"madvise",
"rt_sigprocmask",
"getpid",
"gettid",
"tgkill",
"rt_sigaction",
"read",
"getpgrp"
],
"action": "SCMP_ACT_ALLOW"
}
]
}()
defaultAction mÀÀrab vaikevÀÀrtuse mis tahes sĂŒsteemikĂ”ne puhul, mis ei ole loetletud syscalls. Ălesande lihtsustamiseks keskendume kahele peamisele tĂ€hendusele, mida hakatakse kasutama:
-
SCMP_ACT_ERRNOâ blokeerib sĂŒsteemikĂ”ne tĂ€itmise, -
SCMP_ACT_ALLOWâ lubab.
Jaotises architectures loetletakse sihtarhitektuurid. See on oluline, kuna filter, mida rakendatakse tuumatasemel, sĂ”ltub sĂŒsteemikĂ”nede identifikaatoritest, mitte nende nimedest, mis on mÀÀratud profiilis. Enne rakendamist vastab konteineri kĂ€ituskeskkond need identifikaatoritega. Idee on selles, et sĂŒsteemikĂ”ned vĂ”ivad oleneda sĂŒsteemi arhitektuurist, omades tĂ€iesti erinevaid ID-sid. NĂ€iteks sĂŒsteemikĂ”ne recvfrom kasutatakse teabe saamiseks socket'ilt) omab ID = 64 x64 sĂŒsteemides ja ID = 517 x86. leiate leida loetelu kĂ”ikidest sĂŒsteemikĂ”nedest x86-x64 arhitektuuride jaoks.
jaotises syscalls loetletakse kĂ”ik sĂŒsteemikĂ”ned ja antakse teada, mida nendega teha. NĂ€iteks saab luua valge nimekirja, seadistades defaultAction jĂ€rgnevaga SCMP_ACT_ERRNO, ning kĂ”nedele sektsioonis syscalls anda SCMP_ACT_ALLOW. Nii lubate ainult sektsioonis loetletud kĂ”ned ja keeldate kĂ”ik ĂŒlejÀÀnud. Musta nimekirja jaoks tuleks vahetada vÀÀrtused syscallsja tegevused vastupidiseks. defaultAction NĂŒĂŒd tasub öelda paar sĂ”na nĂŒanssidest, mis ei ole nii ilmsed. Pange tĂ€hele, et allpool olevad soovitused tulenevad sellest, et te arendate Kuberneteses Ă€rirakenduste seeriat ja teile on oluline, et need töötaksid vĂ€himate privileegidega.
1. AllowPrivilegeEscalation=false
konteineri jaoks on olemas parameeter
V securityContext AllowPrivilegeEscalation . Kui see on seadistatud, kÀivitatakse konteinerid seatud ( false) bitigaonno_new_priv Selle parameetri seadmine
Selle parameetri, mis on seatud, kĂ”rvaltoime on true (vaikevÀÀrtus) on see, et konteineri runtime rakendab seccomp profiili protsessi kĂ€ivitamise alguses. Seega peavad kĂ”ik sĂŒsteemi kutsed, mis on vajalikud jooksva keskkonna sisemistest protsessidest (nĂ€iteks kasutaja/grupi ID-de seadmine, teatud Ă”iguste mahalangetamine), profiilis lubatud olema.
Konteiner, mis kÀivitab lihtsa echo hi, vajab jÀrgmisi Ôigusi:
{
"defaultAction": "SCMP_ACT_ERRNO",
"architectures": [
"SCMP_ARCH_X86_64",
"SCMP_ARCH_X86",
"SCMP_ARCH_X32"
],
"syscalls": [
{
"names": [
"arch_prctl",
"brk",
"capget",
"capset",
"chdir",
"close",
"execve",
"exit_group",
"fstat",
"fstatfs",
"futex",
"getdents64",
"getppid",
"lstat",
"mprotect",
"nanosleep",
"newfstatat",
"openat",
"prctl",
"read",
"rt_sigaction",
"statfs",
"setgid",
"setgroups",
"setuid",
"stat",
"uname",
"write"
],
"action": "SCMP_ACT_ALLOW"
}
]
}()
⊠nende asemel:
{
"defaultAction": "SCMP_ACT_ERRNO",
"architectures": [
"SCMP_ARCH_X86_64",
"SCMP_ARCH_X86",
"SCMP_ARCH_X32"
],
"syscalls": [
{
"names": [
"arch_prctl",
"brk",
"close",
"execve",
"exit_group",
"futex",
"mprotect",
"nanosleep",
"stat",
"write"
],
"action": "SCMP_ACT_ALLOW"
}
]
}()
Aga jĂ€lle, miks see probleem on? Isiklikult vĂ€ltin ma jĂ€rgmiste sĂŒsteemikĂ”nede lisamist valgesse nimekirja (kui see pole tĂ”eliselt vajalik): capset, set_tid_address, setgid, setgroups ja setuid. Siiski seisneb tĂ”eline keerukus selles, et lubades protsesse, mida te absoluutselt ei kontrolli, seote te profiilid konteineri töökeskkonna rakendusega. TeisisĂ”nu, vĂ”ite ĂŒhel hetkel avastada, et pĂ€rast konteineri töökeskkonna vĂ€rskendamist (teie vĂ”i tĂ”enĂ€olisemalt pilveteenuse pakkuja poolt) lakuvad konteinerid Ă€kitselt töötamast.
NÔuanne nr 1: KÀivitage konteinerid koos AllowPrivilegeEscaltion=false. See vÀhendab seccomp-profiilide suurust ja muudab need konteineri töökeskkonna muutustele vÀhem tundlikeks.
2. Seccomp-profiilide seadmine konteineri tasemel
Seccomp-profiili saab mÀÀrata pod'i tasemel:
mÀrgid:
seccomp.security.alpha.kubernetes.io/pod: "localhost/profile.json"⊠vÔi konteineri tasandil:
mÀrgid:
container.security.alpha.kubernetes.io/<konteineri-nimi>: "localhost/profile.json"Pange tĂ€hele, et ĂŒlaltoodud sĂŒntaks muutub, kui Kubernetes seccomp (see sĂŒndmus on oodata juba jĂ€rgmises Kubernetesâi versioonis â 1.18 â tĂ”lkija mĂ€rkus).
Kuid vĂ€hesed teavad, et Kubernetesâis on alati olnud , mille tĂ”ttu seccomp profiile rakendati . KĂ€ituskeskkond kompenseerib osaliselt seda puudust, kuid see konteiner ei kao pod'idest kuhugi, kuna seda kasutatakse nende infrastruktuuri seadistamiseks.
KĂŒsimus on aga selles, et see konteiner kĂ€ivitatakse alati AllowPrivilegeEscalation=true, mis toob kaasa punktis 1 vĂ€lja toodud probleemid, ja seda ei saa muuta.
Rakendades seccomp profiile konteineri tasandil, vÀltite seda lÔksu ja saate luua profiili, mis on "kohandatud" konkreetse konteineri jaoks. Nii tuleb teha seni, kuni arendajad vea parandavad ja uus versioon (vÔib-olla 1.18?) on kÔigile huvilistele saadaval.
NÔuanne nr 2: MÀÀrake seccomp profiilid konteineri tasandil.
Praktilises mĂ”ttes on see reegel tavaliselt universaalne vastus kĂŒsimusele: âMiks minu seccomp-profiil töötab, kuid ei tööta pĂ€rast Kubernetese klastrisse juurutamist?" docker run, kuid ei toimi pĂ€rast Kubernetese klastri juurutamist?
3. Kasuta runtime/default vaid ÀÀrmise vajaduse korral
Kuberneteses on kaks sisseehitatud profiili: runtime/default ja docker/default. MÔlemad rakendatakse konteineri kÀituskeskkonna, mitte Kubernetese poolt. SeetÔttu vÔivad need varieeruda sÔltuvalt kasutatavast kÀituskeskkonnast ja selle versioonist.
TeisisĂ”nu, konteineri kĂ€ituskeskkonna muutumise tulemusena vĂ”ib konteiner pÀÀseda ligi teistsugusele sĂŒsteemi kutsumise kogumile, mida ta vĂ”ib kasutada vĂ”i mitte. Enamik kĂ€ituskeskkondi kasutab . Kui soovid seda profiili kasutada, veendu, et see sobib sulle.
Profiil docker/default on alates Kubernetes 1.11 vÀlja arvatud, seega vÀltige selle kasutamist.
Minu arvates on profiil runtime/default ideaalselt sobiv selleks, milleks see loodi: kasutajate kaitsmiseks kĂ€skude tĂ€itmisega seotud riskide eest. docker run Kuitenki, rÀÀkides Kubernetes'i klastrites töötavatest Ă€rrakendustest, julgen öelda, et selline profiil on liiga avatud ja arendajad peaksid keskenduma oma rakendustele (vĂ”i rakenduste tĂŒĂŒpidele) sobivate profiilide loomisele.
NĂ”uanne â3: Looge seccomp profiile konkreetsete rakenduste jaoks. Kui see ei ole vĂ”imalik, tegelege rakendustĂŒĂŒpide profiilidega, nĂ€iteks looge laiendatud profiil, mis hĂ”lmab kĂ”iki Golangi rakenduse veeb-API-sid. Kasutage runtime/default'i ainult viimase abinĂ”una.
Tulevastes postitustes rÀÀgin, kuidas luua seccomp profiile SecDevOps'i vaimus, automatiseerida ja testida neid töövoogudes. TeisisÔnu, teil ei jÀÀ enam vabandusi, et mitte liikuda konkreetsete rakenduste profiilide kasutamisele.
4. Unconfined â see EI OLE valik
Uusimad selgus, et vaikimisi . See tĂ€hendab, et kui te ei seadista PodSecurityPolicy, mis vĂ”imaldab seda klastris, töötavad kĂ”ik pod'id, mille jaoks ei ole seccomp profiili mÀÀratud, reĆŸiimis seccomp=unconfined.
Sellise reĆŸiimi kasutamine tĂ€hendab, et kaob terve isolatsiooni kiht, mis kaitseb klastreid. Sellist lĂ€henemist ei soovita turbeeksperdid.
NĂ”uanne nr 4: Ăkski konteiner klastris ei tohiks töötada reĆŸiimis seccomp=unconfined, eriti tootmiskeskkondades.
5. "AuditireĆŸiim"
See punkt ei ole unikaalne Kubernetes'e jaoks, kuid kuulub siiski kategooriasse "mille ĂŒle tasub juba enne alustamist mĂ”elda."
On teada, et seccomp profiilide loomine on alati olnud keeruline ja pÔhinenud suuresti katse-eksituse meetodil. Asi on selles, et kasutajatel ei ole lihtsalt vÔimalust neid tootmiskeskkondades testida, ilma et nad riskiksid rakenduse "maha kukutamise."
PĂ€rast Linuxi tuuma 4.14 ilmumist on vĂ”imalik kĂ€ivitada profiili osasid auditireĆŸiimis, salvestades syslog'i kĂ”ikide sĂŒsteemikĂ”nede kohta teavet, kuid neid mitte blokeerides. Selle reĆŸiimi aktiveerimiseks saab kasutada parameetrit SCMT_ACT_LOG:
SCMP_ACT_LOG: seccomp ei avalda mĂ”ju sĂŒsteemikĂ”net tegeva protsessi tööle, kui see ei allu ĂŒhele rikke reeglist, kuid teave sĂŒsteemikĂ”ne kohta kantakse logisse.
Siin on tĂŒĂŒpiline strateegia selle vĂ”imaluse kasutamiseks:
- Luba sĂŒsteemi kutseid, mis on vajalikud.
- Blokeeri sĂŒsteemi kutsed, mille ei ole teada, et need oleksid vajalikud.
- KÔikide teiste kutsete kohta teabe logimine.
Lihtne nÀide nÀeb vÀlja jÀrgmine:
{
"defaultAction": "SCMP_ACT_LOG",
"architectures": [
"SCMP_ARCH_X86_64",
"SCMP_ARCH_X86",
"SCMP_ARCH_X32"
],
"syscalls": [
{
"names": [
"arch_prctl",
"sched_yield",
"futex",
"write",
"mmap",
"exit_group",
"madvise",
"rt_sigprocmask",
"getpid",
"gettid",
"tgkill",
"rt_sigaction",
"read",
"getpgrp"
],
"action": "SCMP_ACT_ALLOW"
},
{
"names": [
"add_key",
"keyctl",
"ptrace"
],
"action": "SCMP_ACT_ERRNO"
}
]
}()
Aga pidage meeles, et tuleb blokeerida kĂ”ik kutsed, mille osas on teada, et neid ei kasutata ja mis vĂ”ivad potentsiaalselt klastrile kahju teha. Hea alus nimekirja koostamiseks on ametlik . See seletab ĂŒksikasjalikult, millised sĂŒsteemi kutseid on vaikeprofiilis blokeeritud ja miks.
Siiski on ĂŒks peenem koht. Kuigi SCMT_ACT_LOG Linuxi tuuma toetatakse alates 2017. aasta lĂ”pust, siis on see Kubernetes'i ökosĂŒsteemi jĂ”udnud alles hiljuti. SeetĂ”ttu on selle meetodi kasutamiseks vajalik Linuxi tuum versioon 4.14 ja runC versioon mitte madalam kui .
NĂ”uanne nr 5: Auditi reĆŸiimi profiili loomine tootmisjĂ€rgus vĂ”ib toimuda mustade ja valgete nimede kombinatsiooni kaudu, salvestades kĂ”ik erandid logisse.
6. Kasutage valgeid nimesid
Valgete nimede koostamine nÔuab lisatööd, kuna tuleb tuvastada iga koodikutsumine, mida rakendus vajada vÔiks, kuid see meetod suurendab oluliselt turvalisust:
Soovitatav on kasutada valgete nimede lĂ€henemist, kuna see on lihtsam ja usaldusvÀÀrsem. Musta nimekirja tuleb iga kord vĂ€rskendada potentsiaalselt ohtliku sĂŒsteemikutsumise (vĂ”i ohtliku lipu/valiku puhul, kui need on mustas nimekirjas) lisamisel. Lisaks on sageli vĂ”imalik muuta argumentide esitust, sĂ€ilitades samas nende sisu ja seelĂ€bi vĂ€ltida musta nimekirja piiranguid.
Go keeles rakenduste jaoks olen vÀlja töötanud spetsiaalse tööriista, mis jÀlgib rakendust ja kogub kÔik kÀikud, mis toimusid kÀitamise ajal. NÀiteks jÀrgmise rakenduse jaoks:
package main
import "fmt"
func main() {
fmt.Println("test")
} ⊠kÀivitame gosystract nii:
go install https://github.com/pjbgf/gosystract
gosystract --template='{{- range . }}{{printf "%s", .Name}}{{- end}}' application-path⊠ja saame jÀrgmise tulemuse:
"sched_yield",
"futex",
"write",
"mmap",
"exit_group",
"madvise",
"rt_sigprocmask",
"getpid",
"gettid",
"tgkill",
"rt_sigaction",
"read",
"getpgrp",
"arch_prctl",Praegu on see vaid nĂ€ide â tööriistade kohta on rohkem ĂŒksikasju hiljem.
NĂ”uanne â6: Lubage ainult need kutset, mis on teile tĂ”eliselt vajalikud, ja blokeerige kĂ”ik ĂŒlejÀÀnud.
7. Looge Ôiged alused (vÔi valmistuge ettearvamatuks kÀitumiseks)
Tuuma jÀlgib teie mÀÀratud profiili sÔltumata sellest, mida olete sinna kirjutanud. Isegi kui see pole pÀris see, mida soovisite. NÀiteks, kui blokeerida juurdepÀÀs kutsetele nagu exit vÔi exit_group, ei suuda konteiner korralikult lÔpetada, ja isegi lihtne kÀsk echo hi mÀÀramatuks ajaks. Tulemuseks on kÔrge CPU koormus klastris:

Nendel juhtudel vĂ”ib abiks olla utiliit strace â ta nĂ€itab, milles probleem vĂ”ib seisneda:

sudo strace -c -p 9331
Veenduge, et profiilid sisaldavad kĂ”iki sĂŒsteemi kĂ”nesid, mida rakendus vajab töö ajal.
NĂ”uanne #7: Olge detailide suhtes ettevaatlikud ja kontrollige, et kĂ”ik vajalikud sĂŒsteemi kĂ”ned on lubatud.
Selle artiklite seeria esimene osa seccomp'i kasutamisest Kuberneteses SecDevOps vaimus jÔuab lÔpule. JÀrgnevates osades rÀÀgime, miks see on oluline ja kuidas protsessi automatiseerida.
P.S. tÔlkija mÀrkused
Lugege ka meie blogist:
- «»;
- «»;
- «»;
- «».
Allikas: habr.com
