MÀrkus tÔlke kohta.: Esitleme Briti firma ASOS.com'i vanema rakendusohutuse inseneri artikli tÔlget. Alustame sarja avaldusi, mis kÀsitlevad Kubernetes'e turvalisuse tÔstmiseks seccomp'i kasutamist. Kui sissejuhatus lugejatele meeldib, jÀrgime autorit ja jÀtkame tema tulevaste materjalidega selle teema kohta.

See artikkel on esimene osa seeriast, mis kÀsitleb seccomp'i profiilide loomise protsessi SecDevOps'i vaimus, ilma igasuguste nÔiduse ja vÔludeta. Esimeses osas rÀÀgin seccomp'i pÔhialustest ja rakendamise sisemistest detailidest Kubernetes'es.
Kubernetes'e ökosĂŒsteem pakub piisavat mitmekesisust konteinerite turvalisuse ja isoleerimise tagamiseks. Artikkel kĂ€sitleb Secure Computing Mode'i, tuntud ka kui seccomp. Selle olemus seisneb konteinerite teostamiseks lubatud sĂŒsteemikĂ”nede filtreerimises.
Miks see on oluline? Kood on lihtsalt protsess, mis töötab teatud masinas. Ja see jagab tuuma teiste rakendustega. Kui konteinerid saaksid teha igasuguseid sĂŒsteemikĂ”nesid, kasutaksid pahavara seda peagi Ă€ra, et mööda minna konteineri isoleerimisest ja mĂ”jutada teisi rakendusi: teavet hĂ”ivata, sĂŒsteemi seadeid muuta jne.
Seccomp'i profiilid mÀÀravad, milliseid sĂŒsteemikĂ”nesid tohib lubada vĂ”i keelata. Konteineri tĂ€itmisvĂ”ime aktiveerib need selle kĂ€ivitamise ajal, et tuum saaks nende tĂ€itmisprotsessi jĂ€lgida. Selliste profiilide rakendamine aitab piirata rĂŒndevektoreid ja vĂ€hendada kahjusid, kui mĂ”ni programm konteineris (st teie sĂ”ltuvused vĂ”i nende sĂ”ltuvused) hakkab tegema seda, mida talle ei lubata.
Tuleme pÔhialuste juurde
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 vaikimisi tegevuse iga sĂŒsteemikĂ”ne puhul, mis ei ole esitatud syscalls. Ette lihtsustada, keskendume kahele pĂ”hivÀÀrtusele, mida kasutatakse:
-
SCMP_ACT_ERRNOâ blokeerib sĂŒsteemikĂ”ne tĂ€itmise, -
SCMP_ACT_ALLOWâ lubab.
Jaotises architectures loetletakse sihtarchitectuurid. See on oluline, kuna ise filter, mida rakendatakse kerneli tasemel, sĂ”ltub sĂŒsteemikĂ”nede identifikaatoritest, mitte nende nimedest, mis on mÀÀratud profiilis. Enne rakendamist kaasvastav keskkond seondab need identifikaatoridega. TĂ€hendus on see, et sĂŒsteemikĂ”ned vĂ”ivad olla erinevate ID-dega sĂ”ltuvalt sĂŒsteemi arhitektuurist. NĂ€iteks sĂŒsteemikĂ”ne recvfrom (kasutatakse teabe saamiseks soketilt) on ID = 64 x64-sĂŒsteemides ja ID = 517 x86. saate leida kogu sĂŒsteemikĂ”nede nimekirja x86-x64 arhitektuuride jaoks.
Jaotises syscalls loetletakse kĂ”ik sĂŒsteemikĂ”ned ja nĂ€idatakse, mida nendega teha. NĂ€iteks saab luua lubatud nimekirja, seadistades defaultAction . Tundub, et SCMP_ACT_ERRNO, ja sĂŒsteemikĂ”nedele sektsioonis syscalls andma SCMP_ACT_ALLOW. Niimoodi lubate ainult kĂ”nesid, mis on mÀÀratud jaotises syscalls, ja keelate kĂ”ik ĂŒlejÀÀnud. Musta nimekirja jaoks tuleks vÀÀrtused defaultAction ja tegevused vahetada vastupidiseks.
NĂŒĂŒd tuleks öelda paar sĂ”na nĂŒanssidest, mis ei ole nii ilmsed. Pange tĂ€hele, et allpool toodud soovitused lĂ€htuvad sellest, et arendate Kuberneteses Ă€rianalĂŒĂŒse ja on oluline, et need töötaksid vĂ”imalikult madalate Ă”igustega.
1. AllowPrivilegeEscalation=false
Uues securityContext konteineril on parameeter AllowPrivilegeEscalation. Kui see on seatud false, kÀivituvad konteinerid seatud (on) bitiga . Selle parameetri tÀhendus on ilmselge tema nimest: see ei luba konteineril kÀivitada uusi protsesse Ôigustega, mis on suuremad kui tal endal.
Selle parameetri, mis on seatud true vaikimisi vÀÀrtusena, kĂ”rvalmĂ”juks on see, et konteineri kĂ€itusaeg rakendab seccomp profiili protsessi kĂ€ivitamise alguses. Seega peavad kĂ”ik sĂŒsteemikĂ”ned, mis on vajalikud keskkonna sisesĂŒsteemide kĂ€ivitamiseks (nt kasutaja/grupi identifikaatorite seadmine, mĂ”nede Ă”iguste eemaldamine), olema lubatud profiilis.
Konteiner, mis tÀidab lihtsat 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"
}
]
}()
⊠selle 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"
}
]
}()
Kuid miks see probleem on? Isiklikult vĂ€ltiksin jĂ€rgmiste sĂŒsteemikutsungite lubamist (kui need ei ole tĂ”eliselt vajalikud): capset, set_tid_address, setgid, setgroups ja setuid. Kuid tegelikult on raskus selles, et lubades protsesse, mida te absoluutselt ei kontrolli, seote te profiilid konteinerite tĂ€itmisvĂ”imekuse rakenduste implementeerimisega. TeisisĂ”nu, vĂ”ite ĂŒhel hetkel avastada, et pĂ€rast konteineri tĂ€itmisvĂ”imekuse vĂ€rskendamist (kas teie poolt vĂ”i, mis tĂ”enĂ€olisem, pilveteenuse pakkuja poolt) vĂ”ivad konteinerid ĂŒhel hetkel enam ei kĂ€ivituda.
NÔuanne nr 1: KÀivitage konteinerid vÀÀrtusega AllowPrivilegeEscalation=false. See vÀhendab seccomp'i profiilide suurust ja muudab need keskkonna muutustele vÀhem tundlikuks.
2. Seccomp'i profiilide mÀÀramine konteineri tasemel
Seccomp'i profiili saab mÀÀrata pod'i tasemel:
annotations:
seccomp.security.alpha.kubernetes.io/pod: "localhost/profile.json"⊠vÔi konteineri tasemel:
annotations:
container.security.alpha.kubernetes.io/<container-name>: "localhost/profile.json"Pange tĂ€hele, et ĂŒlaltoodud sĂŒntaks muutub, kui Kubernetes seccomp (see sĂŒndmus on oodata juba jĂ€rgmises Kubernetes'i vĂ€ljalaskes â 1.18 â tĂ”lkija mĂ€rkus).
VÀhe teada, et Kubernetes'is on alati olnud , mille tÔttu rakendati seccomp'i profiile Toimivuskeskkond osaliselt kompenseerib selle puuduse, kuid see konteiner ei kao pod'idest kuhugi, kuna seda kasutatakse nende infrastruktuuri seadistamiseks.
Probleem on selles, et see konteiner kÀivitatakse alati koos AllowPrivilegeEscalation=true, mis toob kaasa punkti 1-s nimetatud probleemid, ja seda ei saa muuta.
Kasutades seccomp-profiile konteineri tasemel, vĂ€ldite seda lĂ”kse ja saate luua profiili, mis on âjĂ”hkraltâ kohandatud konkreetse konteineri jaoks. Nii tuleb jĂ€tkata, kuni arendajad vead parandavad ja uus versioon (vĂ”ib-olla 1.18?) on kĂ”igile soovijatele saadaval.
NÔuanne nr 2: MÀÀrake seccomp-profiilid konteineri tasemel.
Praktilises mĂ”ttes on see reegel tavaliselt universaalne vastus kĂŒsimusele: âMiks minu seccomp-profiil töötab koos docker run, kuid ei toimi pĂ€rast Kubernetes'e klastrisse juurutamist?".
3. Kasutage runtime/default ainult ÀÀrmuslikel juhtudel
Kuberneteses on kaks sisseehitatud profiili varianti: runtime/default ja docker/default. MÔlemad rakendab konteineri tÀitmise keskkond, mitte Kubernetes. SeetÔttu vÔivad need erineda sÔltuvalt kasutatavast tÀitmise keskkonnast ja selle versioonist.
TeisisĂ”nu, konteineri tĂ€itmise keskkonna vahetamise tagajĂ€rjel vĂ”ib konteiner saada juurdepÀÀsu teisele komplektile sĂŒsteemikutsest, mida ta vĂ”ib kasutada vĂ”i mitte. Enamik tĂ€itmise keskkondi kasutab Kui soovite seda profiili kasutada, veenduge, et see sobib teile.
Profiil docker/default peetakse aegunuks alates Kubernetes 1.11-st, seetÔttu vÀltige selle kasutamist.
Minu arvates sobib profiil runtime/default ideaalselt neiteks, milleks see loodi: kaitsta kasutajaid kĂ€ivitamisega seotud riskide eest docker run oma masinates. Kuid kui rÀÀkida Ă€ri rakendustest, mis töötavad Kubernetes'e klastrites, siis julgeksin vĂ€ita, et selline profiil on liiga avatud ja arendajad peaksid keskenduma oma rakendustele (vĂ”i rakenduste tĂŒĂŒpidele) kohandatud profiilide loomisele.
NÔuanne nr 3: Looge seccomp-profiilid konkreetsete rakenduste jaoks. Kui see pole vÔimalik, tegelege rakenduste liikide profiilidega, nÀiteks looge ulatuslik profiil, mis hÔlmab kÔiki Golangi rakenduse veeb-API-sid. Kasutage runtime/default vaid viimase vÔimalusena.
Tulevastes publikatsioonides rÀÀgin, kuidas luua seccomp profiile SecDevOps vaimus, automatiseerida ja testida neid torustikes. TeisisÔnu, teil ei jÀÀ muud valikut, kui liikuda konkreetselt rakenduste jaoks mÔeldud profiilide kasutamisele.
4. Unconfined â see EI OLE valik
Kuna selgus, et vaikimisi . See tĂ€hendab, et kui te ei mÀÀra PodSecurityPolicy, mis aktiveerib selle klastris, töötavad kĂ”ik pod'id, millele seccomp profiili ei ole mÀÀratud, reĆŸiimis seccomp=unconfined.
Töötamine sellises reĆŸiimis tĂ€hendab, et kogu isoleerimise kiht, mis tagab klastrikaitse, kaob. Sellist lĂ€henemist ei soovita turbeeksperdid.
NĂ”uanne â4: Ăkski konteiner klastris ei tohiks töötada reĆŸiimis seccomp=unconfined, eriti tootmiskeskkondades.
5. âAuditireĆŸiimâ
See punkt ei ole unikaalne Kubernetesâile, kuid kuulub siiski kategooriasse âmida tuleks teada enne alustamistâ.
On kujunenud, et seccomp profiilide loomine on alati olnud keeruline tegevus ning selles on suures osas tuginedud katse-eksitusmeetodile. Asi on selles, et kasutajatel pole lihtsalt vĂ”imalust neid tootmis keskkondades testida, kartmata rakenduse âmaha kukutamistâ.
Linuxi 4.14 koodi ilmus vĂ”imalus kĂ€ivitada profiili osi auditi reĆŸiimis, salvestades syslog'i teavet kĂ”igi sĂŒsteemikutsude kohta, kuid neid ei blokeerita. Selle reĆŸiimi saab aktiveerida parameetriga SCMT_ACT_LOG:
SCMP_ACT_LOG: seccomp ei mĂ”juta sĂŒsteemikutsu ja tööd, kui see ei kuulu alla mingisse reegli filtrisse, kuid sĂŒsteemikutsumise teave kantakse ajaloosse.
Siin on tĂŒĂŒpiline strateegia selle vĂ”imaluse kasutamiseks:
- Luba vajalikud sĂŒsteemikutsed.
- Blokeeri sĂŒsteemikutsed, mille kohta on teada, et need ei ole vajalikud.
- Salvesta teave kÔigi teiste kutsude kohta ajaloos.
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"
}
]
}()
Kuidagi pidage meeles, et kĂ”ik kutsed, mille kohta on teada, et neid ei kasutata ja mis vĂ”ivad potentsiaalselt klastrile kahju teha, tuleb blokeerida. Hea alus nimekirja koostamiseks on ametlik . Seal selgitatakse ĂŒksikasjalikult, millised sĂŒsteemikutsed on vaikeprofiilis blokeeritud ja miks.
Siiski on ĂŒks nĂŒanss. Kuigi SCMT_ACT_LOG on Linuxi tuuma poolt toetatud alates 2017. aastast, on see Kubernetes'e ökosĂŒsteemi jĂ”udnud alles suhteliselt hiljuti. SeetĂ”ttu vajate selle meetodi kasutamiseks Linuxi tuuma versiooni 4.14 ja runC versiooni mitte madalamat kui .
NĂ”uanne nr 5: Audit reĆŸiimi profiil, et testida tootmises, saab luua mustade ja valgete loendite kombinatsiooni teel ning kĂ”ik erandid tuleks logida.
6. Kasutage valgeid loendeid
Valgete loendite koostamine nÔuab tÀiendavaid jÔupingutusi, kuna tuleb tuvastada iga kutsung, mis vÔib rakendusele vajalik olla, kuid see lÀhenemine suurendab oluliselt turvalisust:
Soovitatav on kasutada valgeliste lĂ€henemist, kuna see on lihtsam ja usaldusvÀÀrsem. Musta nimekirja tuleb vĂ€rskendada iga kord, kui lisatakse potentsiaalselt ohtlik sĂŒsteemikutsung (vĂ”i ohtlik lipp/valik, kui need on mustas nimekirjas). Lisaks saab sageli muuta parameetri esitusviisi, muutmata selle sisu ja seelĂ€bi ĂŒletada musta nimekirja piiranguid.
Go keeles rakenduste jaoks olen vÀlja töötanud spetsiaalse tööriista, mis jÀlgib rakendust ja kogub kÔik kutsed, mis teostati tÀitmise 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",n" .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 lihtsalt nĂ€ide â tööriistade ĂŒksikasjad tulevad hiljem.
NÔuanne nr 6: Luba ainult need kutsed, mis on tÔeliselt vajalikud, ja blokeeri kÔik teised.
7. Pane paika Ôiged alused (vÔi ole valmis ettearvamatuks kÀitumiseks)
Tuuma jÀlgib profiili jÀrgimist, sÔltumata sellest, mida sa seal mÀÀranud oled. Isegi kui see pole tÀpselt see, mida soovid. NÀiteks kui blokeerida ligipÀÀs sellistele kutsungitele nagu exit vÔi exit_group, ei suuda konteiner korralikult sulgeda ja isegi lihtne kÀsk nagu echo hi juhul mÀÀramatuks ajaks. Tulemuseks on kÔrge CPU koormus klastris:

Sellistel juhtudel vĂ”ib appi tulla utiliit strace â see nĂ€itab, milles vĂ”ib probleem olla:

sudo strace -c -p 9331
Veenduge, et profiilid sisaldavad kĂ”iki sĂŒsteemikutsungite, mida rakendus vajab töötamise ajal.
NĂ”uanne nr 7: Ole tĂ€helepanelik detailide suhtes ja kontrolli, et kĂ”ik vajalikud sĂŒsteemikutsungid on lubatud.
Selle esimene osa artiklite tsĂŒklist seccomp'i kasutamisest Kuberneteses, vaimus SecDevOps lĂ”peb. JĂ€rgmistes osades rÀÀgime, miks see on oluline ja kuidas automatiseerida protsessi.
P.S. tÔlkijalt
Lugege ka meie blogist:
- «»;
- «»;
- «»;
- «».
Allikas: habr.com
