Seccomp f'Kubernetes: 7 affarijiet li trid tkun taf mill-bidu nett

Nota. transl.: Aħna nippreżentaw għall-attenzjoni tiegħek it-traduzzjoni ta 'artiklu minn inġinier anzjan tas-sigurtà tal-applikazzjoni fil-kumpanija Brittanika ASOS.com. Magħha, jibda sensiela ta’ pubblikazzjonijiet iddedikati għat-titjib tas-sigurtà f’Kubernetes permezz tal-użu ta’ seccomp. Jekk il-qarrejja togħġbu l-introduzzjoni, aħna se nsegwu lill-awtur u nkomplu bil-materjali futuri tiegħu dwar dan is-suġġett.

Seccomp f'Kubernetes: 7 affarijiet li trid tkun taf mill-bidu nett

Dan l-artikolu huwa l-ewwel minn sensiela ta 'postijiet dwar kif jinħolqu profili seccomp fl-ispirtu ta' SecDevOps, mingħajr ma jirrikorru għall-maġija u s-sħaħar. Fil-Parti XNUMX, ser inkopri l-baŜi u d-dettalji interni tal-implimentazzjoni tas-seccomp f'Kubernetes.

L-ekosistema tal-Kubernetes toffri varjetà wiesgħa ta’ modi kif jiġu żgurati u iżolati l-kontenituri. L-artiklu huwa dwar Secure Computing Mode, magħruf ukoll bħala seccomp. L-essenza tagħha hija li tiffiltra s-sejħiet tas-sistema disponibbli għall-eżekuzzjoni mill-kontenituri.

Għaliex huwa importanti? Kontenitur huwa biss proċess li jaħdem fuq magna speċifika. U juża l-qalba bħal applikazzjonijiet oħra. Jekk il-kontejners jistgħu jwettqu xi sejħiet tas-sistema, malajr ħafna malware jieħu vantaġġ minn dan biex jevita l-iżolament tal-kontenitur u jaffettwa applikazzjonijiet oħra: jinterċetta informazzjoni, jibdel is-settings tas-sistema, eċċ.

Il-profili seccomp jiddefinixxu liema sejħiet tas-sistema għandhom ikunu permessi jew diżattivati. Ir-runtime tal-kontenitur jattivahom meta jibda sabiex il-qalba tkun tista' tissorvelja l-eżekuzzjoni tagħhom. L-użu ta 'profili bħal dawn jippermettilek tillimita l-vettur tal-attakk u tnaqqas il-ħsara jekk xi programm ġewwa l-kontenitur (jiġifieri, id-dipendenzi tiegħek, jew id-dipendenzi tagħhom) jibda jagħmel xi ħaġa li mhux permess li tagħmel.

Tasal għall-baŜi

Il-profil bażiku seccomp jinkludi tliet elementi: defaultAction, architectures (Jew archMap) U 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"
        }
    ]
}

(medium-basic-seccomp.json)

defaultAction jiddetermina d-destin default ta’ kwalunkwe sejħa tas-sistema mhux speċifikata fit-taqsima syscalls. Biex tagħmel l-affarijiet aktar faċli, ejja niffukaw fuq iż-żewġ valuri ewlenin li se jintużaw:

  • SCMP_ACT_ERRNO — jimblokka l-eżekuzzjoni ta’ sejħa tas-sistema,
  • SCMP_ACT_ALLOW - jippermetti.

Fit-taqsima architectures arkitetturi fil-mira huma elenkati. Dan huwa importanti għaliex il-filtru innifsu, applikat fil-livell tal-kernel, jiddependi fuq l-identifikaturi tas-sejħiet tas-sistema, u mhux fuq l-ismijiet tagħhom speċifikati fil-profil. Ir-runtime tal-kontenitur se jqabbelhom ma' identifikaturi qabel l-użu. L-idea hija li s-sejħiet tas-sistema jista 'jkollhom IDs kompletament differenti skont l-arkitettura tas-sistema. Per eżempju, sejħa tas-sistema recvfrom (użat biex tirċievi informazzjoni mis-socket) għandha ID = 64 fuq sistemi x64 u ID = 517 fuq x86. Hawnhekk tista' ssib lista tas-sejħiet kollha tas-sistema għall-arkitetturi x86-x64.

Fit-taqsima syscalls telenka s-sejħiet kollha tas-sistema u tispeċifika x'għandek tagħmel magħhom. Per eżempju, tista 'toħloq whitelist billi tistabbilixxi defaultAction fuq SCMP_ACT_ERRNO, u sejħiet fit-taqsima syscalls jassenja SCMP_ACT_ALLOW. Għalhekk, inti tippermetti biss sejħiet speċifikati fit-taqsima syscalls, u jipprojbixxu l-oħrajn kollha. Għal-lista sewda għandek tibdel il-valuri defaultAction u azzjonijiet għall-oppost.

Issa għandna ngħidu ftit kliem dwar sfumaturi li mhumiex daqshekk ovvji. Jekk jogħġbok innota li r-rakkomandazzjonijiet ta' hawn taħt jassumu li qed tuża linja ta' applikazzjonijiet tan-negozju fuq Kubernetes u trid li jaħdmu bl-inqas ammont ta' privileġġi possibbli.

1. AllowPrivilegeEscalation=falza

В securityContext kontenitur għandu parametru AllowPrivilegeEscalation. Jekk ikun installat fi false, il-kontenituri se jibdew bi (on) daqsxejn no_new_priv. It-tifsira ta 'dan il-parametru hija ovvja mill-isem: jipprevjeni lill-kontenitur milli jniedi proċessi ġodda b'aktar privileġġi milli għandu hu stess.

Effett sekondarju ta' din l-għażla li qed tiġi ssettjata għal true (default) huwa li r-runtime tal-kontenitur japplika l-profil seccomp fil-bidu nett tal-proċess tal-istartjar. Għalhekk, is-sejħiet kollha tas-sistema meħtieġa biex jitmexxew proċessi runtime interni (eż. l-issettjar tal-IDs tal-utent/grupp, it-twaqqigħ ta 'ċerti kapaċitajiet) għandhom ikunu attivati ​​fil-profil.

Għal kontenitur li jagħmel affarijiet trivjali echo hi, se jkunu meħtieġa l-permessi li ġejjin:

{
    "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"
        }
    ]
}

(hi-pod-seccomp.json)

...minflok dawn:

{
    "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"
        }
    ]
}

(hi-container-seccomp.json)

Iżda għal darb'oħra, għaliex din hija problema? Personalment, nevita li ndaħħal fil-lista s-sejħiet tas-sistema li ġejjin (sakemm ma jkunx hemm bżonn reali għalihom): capset, set_tid_address, setgid, setgroups и setuid. Madankollu, l-isfida reali hija li billi tippermetti proċessi li m'għandek assolutament l-ebda kontroll fuqhom, qed torbot il-profili mal-implimentazzjoni tar-runtime tal-kontenitur. Fi kliem ieħor, xi darba tista 'ssib li wara li taġġorna l-ambjent tar-runtime tal-kontejner (jew minnek jew, aktar probabbli, mill-fornitur tas-servizz tal-cloud), il-kontenituri jieqfu jaħdmu f'daqqa.

Tip # 1: Mexxi kontenituri bi AllowPrivilegeEscaltion=false. Dan inaqqas id-daqs tal-profili seccomp u jagħmilhom inqas sensittivi għal bidliet fl-ambjent tar-runtime tal-kontenitur.

2. L-issettjar tal-profili seccomp fil-livell tal-kontenitur

Il-profil seccomp jista’ jiġi ssettjat fil-livell tal-pod:

annotations:
  seccomp.security.alpha.kubernetes.io/pod: "localhost/profile.json"

...jew fil-livell tal-kontejner:

annotations:
  container.security.alpha.kubernetes.io/<container-name>: "localhost/profile.json"

Jekk jogħġbok innota li s-sintassi t'hawn fuq tinbidel meta Kubernetes seccomp se ssir GA (dan l-avveniment huwa mistenni fir-rilaxx li jmiss ta 'Kubernetes - 1.18 - approx. transl.).

Ftit nies jafu li Kubernetes dejjem kellu bugli kkawża profili seccomp biex jiġu applikati pawża kontenitur. L-ambjent runtime jikkumpensa parzjalment għal dan in-nuqqas, iżda dan il-kontenitur ma jisparixxix mill-imżiewed, peress li jintuża biex jiġi kkonfigurat l-infrastruttura tagħhom.

Il-problema hija li dan il-kontenitur dejjem jibda bil AllowPrivilegeEscalation=true, li jwassal għall-problemi espressi fil-paragrafu 1, u dan ma jistax jinbidel.

Billi tuża profili seccomp fil-livell tal-kontenitur, tevita dan it-tfixkil u tista 'toħloq profil li huwa mfassal għal kontenitur speċifiku. Dan se jkollu jsir sakemm l-iżviluppaturi jiffissaw il-bug u l-verżjoni l-ġdida (forsi 1.18?) issir disponibbli għal kulħadd.

Tip # 2: Issettja profili seccomp fil-livell tal-kontenitur.

F'sens prattiku, din ir-regola normalment isservi bħala tweġiba universali għall-mistoqsija: "Għaliex il-profil tiegħi seccomp jaħdem ma' docker runimma ma taħdimx wara l-iskjerament għal cluster Kubernetes?

3. Uża runtime/default biss bħala l-aħħar għażla

Kubernetes għandu żewġ għażliet għal profili integrati: runtime/default и docker/default. It-tnejn huma implimentati mir-runtime tal-kontenitur, mhux Kubernetes. Għalhekk, jistgħu jvarjaw skont l-ambjent tar-runtime użat u l-verżjoni tiegħu.

Fi kliem ieħor, bħala riżultat ta 'runtime li jinbidel, il-kontenitur jista' jkollu aċċess għal sett differenti ta 'sejħiet tas-sistema, li jista' juża jew le. Ħafna runtimes jużaw Implimentazzjoni Docker. Jekk tixtieq tuża dan il-profil, jekk jogħġbok kun żgur li huwa adattat għalik.

Profil docker/default ġie deprecated minn Kubernetes 1.11, għalhekk evita li tużah.

Fl-opinjoni tiegħi, profil runtime/default perfettament adattat għall-iskop li għalih inħoloq: il-protezzjoni tal-utenti mir-riskji assoċjati mal-eżekuzzjoni ta 'kmand docker run fuq il-karozzi tagħhom. Madankollu, meta niġu għall-applikazzjonijiet tan-negozju li jaħdmu fuq clusters Kubernetes, nixtieq nargumenta li profil bħal dan huwa miftuħ wisq u l-iżviluppaturi għandhom jiffokaw fuq il-ħolqien ta 'profili għall-applikazzjonijiet tagħhom (jew tipi ta' applikazzjonijiet).

Tip # 3: Oħloq profili seccomp għal applikazzjonijiet speċifiċi. Jekk dan ma jkunx possibbli, oħloq profili għat-tipi ta 'applikazzjoni, pereżempju, oħloq profil avvanzat li jinkludi l-APIs kollha tal-web tal-applikazzjoni Golang. Uża biss runtime/default bħala l-aħħar għażla.

F'postijiet futuri, ser inkopri kif toħloq profili seccomp ispirati minn SecDevOps, awtomathom, u tittestjahom f'pipelines. Fi kliem ieħor, ma jkollokx skuża biex ma taġġornax għal profili speċifiċi għall-applikazzjoni.

4. Mhux konfinat MHUX għażla.

Ta ' l-ewwel verifika tas-sigurtà tal-Kubernetes irriżulta li awtomatikament seccomp diżattivat. Dan ifisser li jekk ma tissettjax PodSecurityPolicy, li se jippermettilu fil-cluster, il-miżwed kollha li għalihom il-profil seccomp mhux definit se jaħdmu fihom seccomp=unconfined.

It-tħaddim f'dan il-mod ifisser li jintilef saff sħiħ ta 'insulazzjoni li jipproteġi l-cluster. Dan l-approċċ mhuwiex rakkomandat mill-esperti tas-sigurtà.

Tip # 4: L-ebda kontenitur fil-cluster m'għandu jkun għaddej seccomp=unconfined, speċjalment f'ambjenti ta 'produzzjoni.

5. "Modalità ta' verifika"

Dan il-punt mhuwiex uniku għal Kubernetes, iżda xorta jaqa 'fil-kategorija "affarijiet li għandek tkun taf qabel tibda".

Kif jiġri, il-ħolqien ta 'profili seccomp dejjem kien ta' sfida u jiddependi ħafna fuq prova u żball. Il-fatt hu li l-utenti sempliċement m'għandhomx l-opportunità li jittestjawhom f'ambjenti ta 'produzzjoni mingħajr ma jirriskjaw li "jwaqqa'" l-applikazzjoni.

Wara r-rilaxx tal-kernel Linux 4.14, sar possibbli li jitmexxew partijiet ta 'profil fil-modalità ta' verifika, reġistrazzjoni ta 'informazzjoni dwar is-sejħiet kollha tas-sistema fis-syslog, iżda mingħajr ma jimblokkahom. Tista' tattiva din il-modalità billi tuża l-parametru SCMT_ACT_LOG:

SCMP_ACT_LOG: seccomp mhux se jaffettwa l-ħajta li tagħmel is-sejħa tas-sistema jekk ma taqbilx ma' xi regola fil-filtru, iżda l-informazzjoni dwar is-sejħa tas-sistema tiġi illoggjata.

Hawnhekk hawn strateġija tipika biex tuża din il-karatteristika:

  1. Ippermetti sejħiet tas-sistema li huma meħtieġa.
  2. Imblokka sejħiet mis-sistema li taf li mhux se jkunu utli.
  3. Irrekordja l-informazzjoni dwar is-sejħiet l-oħra kollha fil-log.

Eżempju simplifikat jidher bħal dan:

{
    "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"
        }
    ]
}

(medium-mixed-seccomp.json)

Imma ftakar li għandek bżonn timblokka t-telefonati kollha li taf li mhux se jintużaw u li potenzjalment jistgħu jagħmlu ħsara lill-cluster. Bażi tajba għall-kompilazzjoni ta 'lista hija l-uffiċjal Dokumentazzjoni Docker. Jispjega fid-dettall liema sejħiet tas-sistema huma mblukkati fil-profil default u għaliex.

Madankollu, hemm qabda waħda. Għalkemm SCMT_ACT_LOG appoġġjat mill-kernel tal-Linux mill-aħħar tal-2017, daħal fl-ekosistema Kubernetes biss relattivament reċentement. Għalhekk, biex tuża dan il-metodu ser ikollok bżonn Linux kernel 4.14 u verżjoni runC mhux aktar baxxa v1.0.0-rc9.

Tip # 5: Profil tal-modalità tal-verifika għall-ittestjar fil-produzzjoni jista 'jinħoloq billi jiġu kkombinati listi suwed u bojod, u l-eċċezzjonijiet kollha jistgħu jiġu rreġistrati.

6. Uża whitelists

Whitelisting jeħtieġ sforz addizzjonali għaliex trid tidentifika kull sejħa li l-applikazzjoni jista 'jkollha bżonn, iżda dan l-approċċ itejjeb ħafna s-sigurtà:

Huwa rakkomandat ħafna li tuża l-approċċ tal-lista bajda peress li huwa aktar sempliċi u aktar affidabbli. Il-lista s-sewda trid tiġi aġġornata kull meta tiżdied sejħa tas-sistema potenzjalment perikoluża (jew bandiera/għażla perikoluża jekk tkun fuq il-lista s-sewda). Barra minn hekk, ħafna drabi huwa possibbli li tinbidel ir-rappreżentazzjoni ta 'parametru mingħajr ma tinbidel l-essenza tiegħu u b'hekk tevita r-restrizzjonijiet tal-lista s-sewda.

Għall-applikazzjonijiet Go, żviluppajt għodda speċjali li takkumpanja l-applikazzjoni u tiġbor is-sejħiet kollha li saru waqt l-eżekuzzjoni. Per eżempju, għall-applikazzjoni li ġejja:

package main

import "fmt"

func main() {
	fmt.Println("test")
}

... ejja tniedi gosystract allura:

go install https://github.com/pjbgf/gosystract
gosystract --template='{{- range . }}{{printf ""%s",n" .Name}}{{- end}}' application-path

... u nġibu r-riżultat li ġej:

"sched_yield",
"futex",
"write",
"mmap",
"exit_group",
"madvise",
"rt_sigprocmask",
"getpid",
"gettid",
"tgkill",
"rt_sigaction",
"read",
"getpgrp",
"arch_prctl",

Għalissa, dan huwa biss eżempju—aktar dettalji dwar l-għodod se jsegwu.

Tip # 6: Ħalli biss dawk is-sejħiet li verament għandek bżonn u jimblokka l-oħrajn kollha.

7. Poġġi l-pedamenti t-tajbin (jew ipprepara għal imġieba mhux mistennija)

Il-qalba se tinforza l-profil irrispettivament minn dak li tikteb fih. Anke jekk mhux eżattament dak li ridt. Per eżempju, jekk timblokka l-aċċess għal sejħiet bħal exit jew exit_group, il-kontenitur mhux se jkun jista 'jingħalaq b'mod korrett u anke kmand sempliċi bħal echo hi hang up liluo għal perjodu indefinit. Bħala riżultat, ikollok użu għoli tas-CPU fil-cluster:

Seccomp f'Kubernetes: 7 affarijiet li trid tkun taf mill-bidu nett

F'każijiet bħal dawn, utilità tista 'tiġi għas-salvataġġ strace - se turi x'tista' tkun il-problema:

Seccomp f'Kubernetes: 7 affarijiet li trid tkun taf mill-bidu nett
sudo strace -c -p 9331

Kun żgur li l-profili fihom is-sejħiet kollha tas-sistema li l-applikazzjoni teħtieġ waqt ir-runtime.

Tip # 7: Oqgħod attent għad-dettall u kun żgur li s-sejħiet kollha meħtieġa tas-sistema huma whitelisted.

Dan jikkonkludi l-ewwel parti ta 'serje ta' artikoli dwar l-użu ta 'seccomp f'Kubernetes fl-ispirtu ta' SecDevOps. Fil-partijiet li ġejjin se nitkellmu dwar għaliex dan huwa importanti u kif awtomat il-proċess.

PS minn traduttur

Aqra wkoll fuq il-blog tagħna:

Sors: www.habr.com

Żid kumment