Seccomp in Kubernetes: 7 lietas, kas jums jÄzina no paÅ”a sÄkuma
PiezÄ«me. tulk.: JÅ«su uzmanÄ«bai piedÄvÄjam LielbritÄnijas uzÅÄmuma ASOS.com vecÄkÄ lietojumprogrammu droŔības inženiera raksta tulkojumu. Ar to viÅÅ” sÄk publikÄciju sÄriju, kas veltÄ«ta Kubernetes droŔības uzlaboÅ”anai, izmantojot seccomp. Ja lasÄ«tÄjiem patiks ievads, mÄs sekosim autoram un turpinÄsim ar viÅa turpmÄkajiem materiÄliem par Å”o tÄmu.
Å is raksts ir pirmais no ziÅu sÄrijas par to, kÄ izveidot seccomp profilus SecDevOps garÄ, neizmantojot maÄ£iju un burvestÄ«bas. XNUMX. daÄ¼Ä es apskatÄ«Å”u pamatus un iekÅ”Äjo informÄciju par seccomp ievieÅ”anu Kubernetes.
Kubernetes ekosistÄma piedÄvÄ dažÄdus veidus, kÄ nostiprinÄt un izolÄt konteinerus. Raksts ir par droÅ”o skaitļoÅ”anas režīmu, kas pazÄ«stams arÄ« kÄ seccomp. TÄs bÅ«tÄ«ba ir filtrÄt izpildei pieejamos sistÄmas zvanus pÄc konteineriem.
KÄpÄc tas ir svarÄ«gi? Konteiners ir tikai process, kas darbojas noteiktÄ maŔīnÄ. Un tas izmanto kodolu tÄpat kÄ citas lietojumprogrammas. Ja konteineri varÄtu veikt jebkÄdus sistÄmas izsaukumus, ļoti drÄ«z ļaunprÄtÄ«ga programmatÅ«ra to izmantotu, lai apietu konteineru izolÄciju un ietekmÄtu citas lietojumprogrammas: pÄrtvertu informÄciju, mainÄ«tu sistÄmas iestatÄ«jumus utt.
seccomp profili nosaka, kuri sistÄmas izsaukumi ir jÄatļauj vai jÄatspÄjo. Konteinera izpildlaiks tos aktivizÄ, kad tas sÄkas, lai kodols varÄtu pÄrraudzÄ«t to izpildi. Izmantojot Å”Ädus profilus, varat ierobežot uzbrukuma vektoru un samazinÄt bojÄjumus, ja kÄda programma konteinerÄ (tas ir, jÅ«su atkarÄ«bas vai to atkarÄ«bas) sÄk darÄ«t kaut ko tÄdu, kas tai nav atļauts.
Pamatu izpratne
Pamata seccomp profils ietver trīs elementus: defaultAction, architectures (Vai archMap) Un syscalls:
defaultAction nosaka jebkura sistÄmas izsaukuma noklusÄjuma likteni, kas nav norÄdÄ«ts sadaÄ¼Ä syscalls. Lai lietas bÅ«tu vieglÄkas, pievÄrsÄ«simies divÄm galvenajÄm vÄrtÄ«bÄm, kas tiks izmantotas:
IedaÄ¼Ä architectures ir norÄdÄ«tas mÄrÄ·a arhitektÅ«ras. Tas ir svarÄ«gi, jo pats filtrs, kas tiek lietots kodola lÄ«menÄ«, ir atkarÄ«gs no sistÄmas izsaukuma identifikatoriem, nevis no profilÄ norÄdÄ«tajiem to nosaukumiem. Pirms lietoÅ”anas konteinera izpildlaiks tos saskaÅos ar identifikatoriem. Ideja ir tÄda, ka sistÄmas zvaniem var bÅ«t pilnÄ«gi atŔķirÄ«gi ID atkarÄ«bÄ no sistÄmas arhitektÅ«ras. PiemÄram, sistÄmas izsaukums recvfrom (izmanto, lai saÅemtu informÄciju no ligzdas) ir ID = 64 x64 sistÄmÄs un ID = 517 x86. Å eit jÅ«s varat atrast sarakstu ar visiem sistÄmas izsaukumiem x86-x64 arhitektÅ«rÄm.
SadaÄ¼Ä syscalls uzskaita visus sistÄmas zvanus un norÄda, ko ar tiem darÄ«t. PiemÄram, iestatot, varat izveidot balto sarakstu defaultAction par SCMP_ACT_ERRNO, un zvani sadaÄ¼Ä syscalls pieŔķirt SCMP_ACT_ALLOW. TÄdÄjÄdi jÅ«s atļaujat tikai sadaÄ¼Ä norÄdÄ«tos zvanus syscalls, un aizliegt visus citus. MelnajÄ sarakstÄ ir jÄmaina vÄrtÄ«bas defaultAction un darbÄ«bas uz pretÄjo.
Tagad mums vajadzÄtu teikt dažus vÄrdus par niansÄm, kas nav tik acÄ«mredzamas. LÅ«dzu, Åemiet vÄrÄ, ka tÄlÄk sniegtajos ieteikumos tiek pieÅemts, ka vietnÄ Kubernetes izvietojat biznesa lietojumprogrammu lÄ«niju un vÄlaties, lai tÄs darbotos ar iespÄjami mazÄkÄm privilÄÄ£ijÄm.
1. AllowPrivilegeEscalation=false
Š securityContext konteineram ir parametrs AllowPrivilegeEscalation. Ja tas ir instalÄts false, konteineri sÄksies ar (on) mazliet no_new_priv. Å Ä« parametra nozÄ«me ir acÄ«mredzama no nosaukuma: tas neļauj konteineram palaist jaunus procesus ar vairÄk privilÄÄ£ijÄm, nekÄ tas pats ir.
Å Ä«s opcijas iestatÄ«Å”anas blakusefekts true (noklusÄjums) ir tas, ka konteinera izpildlaiks lieto seccomp profilu startÄÅ”anas procesa paÅ”Ä sÄkumÄ. TÄdÄjÄdi profilÄ ir jÄiespÄjo visi sistÄmas izsaukumi, kas nepiecieÅ”ami iekÅ”Äjo izpildlaika procesu palaiÅ”anai (piemÄram, lietotÄja/grupas ID iestatÄ«Å”ana, noteiktu iespÄju atmeÅ”ana).
Uz konteineru, kas dara sÄ«kas lietas echo hi, bÅ«s nepiecieÅ”amas Å”Ädas atļaujas:
Bet atkal, kÄpÄc tÄ ir problÄma? PersonÄ«gi es izvairÄ«tos no Å”Ädu sistÄmas izsaukumu iekļauÅ”anas baltajÄ sarakstÄ (ja vien tie nav reÄlas vajadzÄ«bas): capset, set_tid_address, setgid, setgroups Šø setuid. TomÄr patiesais izaicinÄjums ir tÄds, ka, atļaujot procesus, kurus jÅ«s absolÅ«ti nevarat kontrolÄt, jÅ«s saistÄt profilus ar konteinera izpildlaika ievieÅ”anu. Citiem vÄrdiem sakot, kÄdu dienu jÅ«s varat atklÄt, ka pÄc konteinera izpildlaika vides atjauninÄÅ”anas (jÅ«s vai, visticamÄk, mÄkoÅpakalpojuma sniedzÄjs), konteineri pÄkÅ”Åi pÄrstÄj darboties.
Padoms # 1: Palaist konteinerus ar AllowPrivilegeEscaltion=false. Tas samazinÄs seccomp profilu lielumu un padarÄ«s tos mazÄk jutÄ«gus pret izmaiÅÄm konteinera izpildlaika vidÄ.
LÅ«dzu, Åemiet vÄrÄ, ka iepriekÅ” minÄtÄ sintakse mainÄ«sies, kad Kubernetes seccomp kļūs par GA (Å”is notikums gaidÄms nÄkamajÄ Kubernetes izlaidumÄ - 1.18 - apm. tulk.).
Tikai daži cilvÄki zina, ka Kubernetes vienmÄr ir bijis kļūdakas izraisÄ«ja seccomp profilu lietoÅ”anu pauzes konteiners. Izpildlaika vide daļÄji kompensÄ Å”o trÅ«kumu, taÄu Å”is konteiners nepazÅ«d no podiem, jo āātiek izmantots to infrastruktÅ«ras konfigurÄÅ”anai.
ProblÄma ir tÄ, ka Å”is konteiners vienmÄr sÄkas ar AllowPrivilegeEscalation=true, kas rada 1. punktÄ minÄtÄs problÄmas, un to nevar mainÄ«t.
Izmantojot seccomp profilus konteinera lÄ«menÄ«, jÅ«s izvairÄ«sities no Ŕīs kļūmes un varat izveidot profilu, kas ir pielÄgots konkrÄtam konteineram. Tas bÅ«s jÄdara, lÄ«dz izstrÄdÄtÄji novÄrsÄ«s kļūdu un jaunÄ versija (varbÅ«t 1.18?) kļūs pieejama visiem.
PraktiskÄ nozÄ«mÄ Å”is noteikums parasti kalpo kÄ universÄla atbilde uz jautÄjumu: āKÄpÄc mans seccomp profils darbojas ar docker runbet nedarbojas pÄc izvietoÅ”anas Kubernetes klasterÄ«?
3. Izmantojiet izpildlaiku/noklusÄjumu tikai kÄ pÄdÄjo lÄ«dzekli
Kubernetes ir divas iespÄjas iebÅ«vÄtajiem profiliem: runtime/default Šø docker/default. Abus ievieÅ” konteinera izpildlaiks, nevis Kubernetes. TÄpÄc tie var atŔķirties atkarÄ«bÄ no izmantotÄs izpildlaika vides un tÄs versijas.
Citiem vÄrdiem sakot, izpildlaika maiÅas rezultÄtÄ konteineram var bÅ«t piekļuve citai sistÄmas zvanu kopai, ko tas var izmantot vai neizmantot. LielÄkÄ daļa izpildlaiku izmanto Docker ievieÅ”ana. Ja vÄlaties izmantot Å”o profilu, lÅ«dzu, pÄrliecinieties, ka tas jums ir piemÄrots.
profils docker/default ir novecojis kopÅ” Kubernetes 1.11, tÄpÄc izvairieties to izmantot.
ManuprÄt, profils runtime/default lieliski piemÄrots mÄrÄ·im, kuram tÄ tika izveidota: lietotÄju aizsardzÄ«bai no riskiem, kas saistÄ«ti ar komandas izpildi docker run uz viÅu automaŔīnÄm. TomÄr, runÄjot par biznesa lietojumprogrammÄm, kas darbojas Kubernetes klasteros, es uzdroÅ”inos iebilst, ka Å”Äds profils ir pÄrÄk atvÄrts un izstrÄdÄtÄjiem vajadzÄtu koncentrÄties uz profilu izveidi savÄm lietojumprogrammÄm (vai lietojumprogrammu veidiem).
Padoms # 3: izveidojiet seccomp profilus noteiktÄm lietojumprogrammÄm. Ja tas nav iespÄjams, izveidojiet profilus lietojumprogrammu veidiem, piemÄram, izveidojiet papildu profilu, kas ietver visas Golang lietojumprogrammas tÄ«mekļa API. Izmantojiet izpildlaiku/noklusÄjumu tikai kÄ pÄdÄjo lÄ«dzekli.
NÄkamajos rakstos es apskatÄ«Å”u, kÄ izveidot SecDevOps iedvesmotus seccomp profilus, automatizÄt tos un pÄrbaudÄ«t tos konveijerÄ. Citiem vÄrdiem sakot, jums nebÅ«s attaisnojuma nejauninÄt uz lietojumprogrammu profiliem.
4. Neierobežots NAV risinÄjums.
No pirmais Kubernetes droŔības audits izrÄdÄ«jÄs, ka pÄc noklusÄjuma seccomp atspÄjota. Tas nozÄ«mÄ, ka, ja neesat iestatÄ«jis PodSecurityPolicy, kas to iespÄjos klasterÄ«, darbosies visi podi, kuriem seccomp profils nav definÄts seccomp=unconfined.
DarboÅ”anÄs Å”ajÄ režīmÄ nozÄ«mÄ, ka tiek zaudÄts viss izolÄcijas slÄnis, kas aizsargÄ kopu. Å o pieeju droŔības speciÄlisti neiesaka.
Å is punkts nav unikÄls Kubernetes, taÄu joprojÄm ietilpst kategorijÄ ālietas, kas jÄzina pirms darba sÄkÅ”anasā.
KÄ tas notiek, seccomp profilu izveide vienmÄr ir bijusi sarežģīta un lielÄ mÄrÄ ir atkarÄ«ga no izmÄÄ£inÄjumiem un kļūdÄm. Fakts ir tÄds, ka lietotÄjiem vienkÄrÅ”i nav iespÄjas tos pÄrbaudÄ«t ražoÅ”anas vidÄs, neriskÄjot ānomestā lietojumprogrammu.
PÄc Linux kodola 4.14 izlaiÅ”anas kļuva iespÄjams palaist profila daļas audita režīmÄ, ierakstot informÄciju par visiem sistÄmas izsaukumiem syslog, bet nebloÄ·Äjot tos. Å o režīmu var aktivizÄt, izmantojot parametru SCMT_ACT_LOG:
SCMP_ACT_LOG: seccomp neietekmÄs pavedienu, kas veic sistÄmas izsaukumu, ja tas neatbilst nevienam filtra noteikumam, taÄu informÄcija par sistÄmas zvanu tiks reÄ£istrÄta.
Å eit ir tipiska Ŕīs funkcijas izmantoÅ”anas stratÄÄ£ija:
Atļaut sistÄmas zvanus, kas nepiecieÅ”ami.
BloÄ·Äjiet zvanus no sistÄmas, par kuriem jÅ«s zinÄt, ka tie nebÅ«s noderÄ«gi.
ReÄ£istrÄt informÄciju par visiem citiem zvaniem žurnÄlÄ.
TaÄu atcerieties, ka jums ir jÄbloÄ·Ä visi zvani, par kuriem jÅ«s zinÄt, ka tie netiks izmantoti un kas varÄtu kaitÄt klasterim. Labs pamats saraksta sastÄdÄ«Å”anai ir oficiÄlais Docker dokumentÄcija. TajÄ ir detalizÄti paskaidrots, kuri sistÄmas zvani noklusÄjuma profilÄ ir bloÄ·Äti un kÄpÄc.
TomÄr ir viens ÄÄ·is. Lai gan SCMT_ACT_LOG KopÅ” 2017. gada beigÄm to atbalsta Linux kodols, tas Kubernetes ekosistÄmÄ ienÄca tikai salÄ«dzinoÅ”i nesen. TÄpÄc, lai izmantotu Å”o metodi, jums bÅ«s nepiecieÅ”ams Linux kodols 4.14 un runC versija, kas nav zemÄka v1.0.0-rc9.
Padoms # 5: Audita režīma profilu testÄÅ”anai ražoÅ”anÄ var izveidot, apvienojot melnos un baltos sarakstus, un visus izÅÄmumus var reÄ£istrÄt.
6. Izmantojiet baltos sarakstus
BaltÄ saraksta izveide prasa papildu pÅ«les, jo jums ir jÄidentificÄ katrs lietojumprogrammai nepiecieÅ”amais zvans, taÄu Ŕī pieeja ievÄrojami uzlabo droŔību:
Ir ļoti ieteicams izmantot baltÄ saraksta pieeju, jo tÄ ir vienkÄrÅ”Äka un uzticamÄka. Melnais saraksts bÅ«s jÄatjaunina ikreiz, kad tiek pievienots potenciÄli bÄ«stams sistÄmas izsaukums (vai bÄ«stams karodziÅÅ”/opcija, ja tas ir melnajÄ sarakstÄ). TurklÄt bieži vien ir iespÄjams mainÄ«t parametra attÄlojumu, nemainot tÄ bÅ«tÄ«bu un tÄdÄjÄdi apiet melnÄ saraksta ierobežojumus.
Go lietojumprogrammÄm es izstrÄdÄju Ä«paÅ”u rÄ«ku, kas tiek pievienots lietojumprogrammai un apkopo visus izpildes laikÄ veiktos zvanus. PiemÄram, Å”Ädai lietojumprogrammai:
package main
import "fmt"
func main() {
fmt.Println("test")
}
... sÄksim gosystract tÄ:
go install https://github.com/pjbgf/gosystract
gosystract --template='{{- range . }}{{printf ""%s",n" .Name}}{{- end}}' application-path
PagaidÄm Å”is ir tikai piemÄrs ā sÄ«kÄka informÄcija par rÄ«kiem sekos.
Padoms # 6: Atļaujiet tikai tos zvanus, kas jums patieÅ”Äm ir nepiecieÅ”ami, un bloÄ·Äjiet visus pÄrÄjos.
7. Ielieciet pareizos pamatus (vai sagatavojieties negaidītai uzvedībai)
Kodols ieviesÄ«s profilu neatkarÄ«gi no tÄ, ko jÅ«s tajÄ ierakstÄt. Pat ja tas nav tieÅ”i tas, ko jÅ«s gribÄjÄt. PiemÄram, ja bloÄ·Äjat piekļuvi tÄdiem zvaniem kÄ exit vai exit_group, konteiners nevarÄs pareizi izslÄgties un pat vienkÄrÅ”a komanda, piemÄram, echo hipakÄrt viÅuo uz nenoteiktu laiku. RezultÄtÄ jÅ«s saÅemsit lielu CPU lietojumu klasterÄ«:
Å Ädos gadÄ«jumos palÄ«gÄ var nÄkt utilÄ«ta strace - tas parÄdÄ«s, kÄda varÄtu bÅ«t problÄma:
sudo strace -c -p 9331
PÄrliecinieties, vai profilos ir visi sistÄmas izsaukumi, kas lietojumprogrammai ir nepiecieÅ”ami izpildlaikÄ.
Padoms # 7: pievÄrsiet uzmanÄ«bu detaļÄm un pÄrliecinieties, vai visi nepiecieÅ”amie sistÄmas zvani ir iekļauti baltajÄ sarakstÄ.
Ar Å”o tiek noslÄgta pirmÄ daļa rakstu sÄrijai par seccomp izmantoÅ”anu programmÄ Kubernetes SecDevOps garÄ. NÄkamajÄs daļÄs mÄs runÄsim par to, kÄpÄc tas ir svarÄ«gi un kÄ automatizÄt procesu.