Seccomp nan Kubernetes: 7 bagay ou bezwen konnen depi nan kòmansman an

Remak. trad.: Nou prezante nan atansyon ou tradiksyon an nan yon atik pa yon enjenyè sekirite aplikasyon ansyen nan konpayi an Britanik ASOS.com. Avèk li, li kòmanse yon seri piblikasyon dedye a amelyore sekirite nan Kubernetes atravè itilizasyon seccomp. Si lektè yo renmen entwodiksyon an, nou pral swiv otè a epi kontinye ak materyèl lavni li sou sijè sa a.

Seccomp nan Kubernetes: 7 bagay ou bezwen konnen depi nan kòmansman an

Atik sa a se premye nan yon seri pòs sou kòman yo kreye pwofil seccomp nan lespri SecDevOps, san yo pa itilize maji ak maji. Nan Pati XNUMX, mwen pral kouvri Basics yo ak detay entèn nan aplikasyon seccomp nan Kubernetes.

Ekosistèm Kubernetes la ofri yon pakèt fason pou sekirize ak izole veso yo. Atik la se sou Secure Computing Mode, ke yo rele tou seccomp. Sans li se filtre apèl sistèm ki disponib pou ekzekisyon pa kontenè.

Poukisa li enpòtan? Yon veso se jis yon pwosesis k ap kouri sou yon machin espesifik. Epi li sèvi ak nwayo a menm jan ak lòt aplikasyon. Si veso yo ta ka fè nenpòt apèl sistèm, trè byento malveyan ta pwofite sa a pou kontoune izolasyon veso a epi afekte lòt aplikasyon: entèsepte enfòmasyon, chanje paramèt sistèm, elatriye.

Des seccomp defini ki apèl sistèm yo ta dwe pèmèt oswa enfim. Ègzekutabl veso a aktive yo lè li kòmanse pou ke nwayo a ka kontwole ekzekisyon yo. Sèvi ak pwofil sa yo pèmèt ou limite vektè atak la epi redwi domaj si nenpòt pwogram andedan veso a (ki vle di, depandans ou, oswa depandans yo) kòmanse fè yon bagay ke li pa gen dwa fè.

Lè w rive nan debaz yo

Pwofil debaz seccomp gen ladan twa eleman: defaultAction, architectures (Oswa archMap) ak 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"
        }
    ]
}

(mwayen-debaz-seccomp.json)

defaultAction detèmine sò default nenpòt apèl sistèm ki pa espesifye nan seksyon an syscalls. Pou fè bagay sa yo pi fasil, ann konsantre sou de valè prensipal yo ke yo pral itilize:

  • SCMP_ACT_ERRNO - bloke ekzekisyon yon apèl sistèm,
  • SCMP_ACT_ALLOW - pèmèt.

Nan seksyon architectures achitekti sib yo ki nan lis. Sa a enpòtan paske filtè a li menm, aplike nan nivo nwayo a, depann sou idantifyan apèl sistèm yo, epi yo pa sou non yo espesifye nan pwofil la. Ègzekutabl veso a pral matche yo ak idantifyan anvan ou itilize yo. Lide a se ke apèl sistèm yo ka gen ID konplètman diferan depann sou achitekti sistèm nan. Pou egzanp, apèl sistèm recvfrom (itilize pou resevwa enfòmasyon ki soti nan priz la) gen ID = 64 sou sistèm x64 ak ID = 517 sou x86. Isit la ou ka jwenn yon lis tout apèl sistèm pou achitekti x86-x64.

Nan seksyon an syscalls lis tout apèl sistèm epi presize sa pou fè ak yo. Pou egzanp, ou ka kreye yon lis blan pa mete defaultAction sou SCMP_ACT_ERRNO, ak apèl nan seksyon an syscalls plase SCMP_ACT_ALLOW. Kidonk, ou sèlman pèmèt apèl ki espesifye nan seksyon an syscalls, epi entèdi tout lòt moun. Pou lis nwa a ou ta dwe chanje valè yo defaultAction ak aksyon opoze a.

Koulye a, nou ta dwe di kèk mo sou nuans ki pa tèlman evidan. Tanpri sonje ke rekòmandasyon ki anba yo sipoze ke w ap deplwaye yon liy aplikasyon pou biznis sou Kubernetes epi ou vle yo kouri ak pi piti kantite privilèj posib.

1. AllowPrivilegeEscalation=fo

В securityContext veso a gen yon paramèt AllowPrivilegeEscalation. Si li enstale nan false, veso yo ap kòmanse ak (on) ti jan no_new_priv. Siyifikasyon paramèt sa a evidan nan non an: li anpeche veso a lanse nouvo pwosesis ki gen plis privilèj pase li menm li genyen.

Yon efè segondè nan opsyon sa a ke yo te mete nan true (default) se ke ègzekutabl veso a aplike pwofil la seccomp nan kòmansman an anpil nan pwosesis la demaraj. Kidonk, tout apèl sistèm ki nesesè pou kouri entèn pwosesis ègzekutabl (egzanp mete idantite itilizatè/gwoup, jete sèten kapasite) dwe pèmèt nan pwofil la.

Nan yon veso ki fè bagay trivial echo hi, yo pral mande otorizasyon sa yo:

{
    "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)

... olye de sa yo:

{
    "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)

Men ankò, poukisa se yon pwoblèm? Pèsonèlman, mwen ta evite mete lis apèl sistèm sa yo (sòf si gen yon bezwen reyèl pou yo): capset, set_tid_address, setgid, setgroups и setuid. Sepandan, defi reyèl la se ke lè w pèmèt pwosesis ke ou pa gen absoliman okenn kontwòl sou, w ap mare pwofil nan aplikasyon an egzekisyon veso. Nan lòt mo, yon jou ou ka jwenn ke apre mete ajou anviwònman an egzekite veso (swa pa oumenm oswa, plis chans, pa founisè sèvis nwaj la), resipyan yo toudenkou sispann kouri.

Ide # 1: Kouri kontenè ak AllowPrivilegeEscaltion=false. Sa a pral redwi gwosè a nan pwofil seccomp epi fè yo mwens sansib a chanjman nan anviwònman an egzekite veso.

2. Mete pwofil seccomp nan nivo veso

Pwofil seccomp a ka mete nan nivo gous:

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

...oswa nan nivo veso:

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

Tanpri sonje ke sentaks ki anwo a pral chanje lè Kubernetes seccomp ap vin GA (Evènman sa a espere nan pwochen lage Kubernetes - 1.18 - approx. Transl.).

Gen kèk moun ki konnen ke Kubernetes te toujou genyen pinèzki te lakòz seccomp pwofil yo dwe aplike nan poz veso. Anviwònman exécuter la pasyèlman konpanse pou enpèfeksyon sa a, men veso sa a pa disparèt nan gous yo, paske li itilize pou konfigirasyon enfrastrikti yo.

Pwoblèm lan se ke veso sa a toujou kòmanse ak AllowPrivilegeEscalation=true, ki mennen nan pwoblèm yo vwa nan paragraf 1, epi sa a pa ka chanje.

Lè w itilize pwofil seccomp nan nivo veso a, ou evite enkonvenyans sa a epi ou ka kreye yon pwofil ki adapte a yon veso espesifik. Sa a pral oblije fè jiskaske devlopè yo ranje ensèk la ak nouvo vèsyon an (petèt 1.18?) vin disponib pou tout moun.

Ide # 2: Mete pwofil seccomp nan nivo veso.

Nan yon sans pratik, règ sa a anjeneral sèvi kòm yon repons inivèsèl nan kesyon an: "Poukisa pwofil seccomp mwen an travay ak docker runmen li pa travay apre deplwaye nan yon gwoup Kubernetes?

3. Sèvi ak runtime/default sèlman kòm yon dènye rekou

Kubernetes gen de opsyon pou pwofil entegre: runtime/default и docker/default. Tou de yo aplike pa ègzekutabl veso a, pa Kubernetes. Se poutèt sa, yo ka diferan depann sou anviwònman an ègzekutabl itilize ak vèsyon li yo.

Nan lòt mo, kòm yon rezilta chanje tan an, veso a ka gen aksè a yon seri apèl sistèm diferan, ke li ka oswa pa ka itilize. Pifò runtimes itilize Docker aplikasyon. Si ou vle sèvi ak pwofil sa a, tanpri asire ke li apwopriye pou ou.

Profile docker/default te depreche depi Kubernetes 1.11, kidonk evite itilize li.

Dapre mwen, pwofil runtime/default parfe adapte pou objektif li te kreye: pwoteje itilizatè yo kont risk ki asosye ak egzekite yon lòd docker run sou machin yo. Sepandan, lè li rive aplikasyon pou biznis kouri sou grap Kubernetes, mwen ta oze diskite ke yon pwofil sa a twò louvri epi devlopè yo ta dwe konsantre sou kreye pwofil pou aplikasyon yo (oswa kalite aplikasyon yo).

Ide # 3: Kreye pwofil seccomp pou aplikasyon espesifik. Si sa pa posib, kreye pwofil pou kalite aplikasyon, pou egzanp, kreye yon pwofil avanse ki gen ladan tout API entènèt aplikasyon Golang. Sèlman itilize runtime/default kòm yon dènye rekou.

Nan pwochen posts, mwen pral kouvri ki jan yo kreye pwofil seccomp ki enspire SecDevOps, otomatize yo, epi teste yo nan tiyo. Nan lòt mo, ou pral pa gen okenn eskiz pa ajou nan pwofil aplikasyon-espesifik.

4. Unconfined se PA yon opsyon.

Nan premye kontwòl kontab sekirite Kubernetes li te tounen soti ke pa default seccomp andikape. Sa vle di ke si ou pa mete PodSecurityPolicy, ki pral pèmèt li nan gwoup la, tout gous pou ki pwofil la seccomp pa defini pral travay nan seccomp=unconfined.

Opere nan mòd sa a vle di ke yon kouch antye nan izolasyon pèdi ki pwoteje gwoup la. Apwòch sa a pa rekòmande pa ekspè sekirite.

Ide # 4: Pa gen okenn veso nan gwoup la ta dwe kouri nan seccomp=unconfined, espesyalman nan anviwònman pwodiksyon.

5. "Odit mòd"

Pwen sa a pa inik nan Kubernetes, men li toujou tonbe nan kategori "bagay ou dwe konnen anvan ou kòmanse".

Kòm sa rive, kreye pwofil seccomp te toujou difisil epi li depann anpil sou esè ak erè. Reyalite a se ke itilizatè tou senpleman pa gen opòtinite pou teste yo nan anviwònman pwodiksyon san yo pa riske "depoze" aplikasyon an.

Apre liberasyon kernel Linux 4.14 la, li te vin posib pou kouri pati nan yon pwofil nan mòd odit, anrejistreman enfòmasyon sou tout apèl sistèm nan syslog, men san yo pa bloke yo. Ou ka aktive mòd sa a lè l sèvi avèk paramèt la SCMT_ACT_LOG:

SCMP_ACT_LOG: seccomp p ap afekte fil fè apèl sistèm lan si li pa matche ak okenn règ nan filtè a, men enfòmasyon sou apèl sistèm lan pral konekte.

Men yon estrateji tipik pou itilize karakteristik sa a:

  1. Pèmèt apèl sistèm ki nesesè.
  2. Bloke apèl ki soti nan sistèm nan ke ou konnen pa pral itil.
  3. Ekri enfòmasyon sou tout lòt apèl nan jounal la.

Yon egzanp senplifye sanble sa a:

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

(medyòm-mixed-seccomp.json)

Men, sonje ke ou bezwen bloke tout apèl ke ou konnen yo pa pral itilize epi ki ka potansyèlman mal gwoup la. Yon bon baz pou konpile yon lis se ofisyèl la Docker dokiman. Li eksplike an detay ki apèl sistèm yo bloke nan pwofil la default ak poukisa.

Sepandan, gen yon sèl trape. Malgre ke SCMT_ACT_LOG sipòte pa nwayo Linux la depi nan fen 2017, li te antre nan ekosistèm Kubernetes sèlman relativman dènyèman. Se poutèt sa, pou itilize metòd sa a ou pral bezwen yon nwayo Linux 4.14 ak vèsyon runC pa pi ba v1.0.0-rc9.

Ide # 5: Yo ka kreye yon pwofil mòd odit pou tès nan pwodiksyon lè w konbine lis nwa ak blan, epi yo ka anrejistre tout eksepsyon yo.

6. Sèvi ak lis blan

Mete lis blan mande plis efò paske ou dwe idantifye chak apèl ke aplikasyon an ta ka bezwen, men apwòch sa a amelyore sekirite anpil:

Li trè rekòmande yo sèvi ak apwòch la whitelist paske li se pi senp ak plis serye. Lis nwa a ap bezwen mete ajou chak fwa yo ajoute yon apèl sistèm ki kapab danjere (oswa yon drapo/opsyon danjere si li sou lis nwa a). Anplis de sa, li se souvan posib chanje reprezantasyon an nan yon paramèt san yo pa chanje sans li yo ak kidonk kontoune restriksyon yo nan lis nwa a.

Pou aplikasyon Go, mwen devlope yon zouti espesyal ki akonpaye aplikasyon an epi kolekte tout apèl yo te fè pandan ekzekisyon an. Pou egzanp, pou aplikasyon sa a:

package main

import "fmt"

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

... ann lanse gosystract konsa:

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

... epi nou jwenn rezilta sa a:

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

Pou kounye a, sa a se jis yon egzanp-plis detay sou zouti yo pral swiv.

Ide # 6: Pèmèt sèlman apèl sa yo ke ou reyèlman bezwen epi bloke tout lòt moun.

7. Mete bon fondasyon yo (oswa prepare pou konpòtman inatandi)

Kernel la ap ranfòse pwofil la kèlkeswa sa ou ekri ladan l. Menm si se pa egzakteman sa ou te vle. Pou egzanp, si ou bloke aksè a apèl tankou exit oswa exit_group, veso a pa yo pral kapab fèmen kòrèkteman e menm yon kòmandman senp tankou echo hi rakwoche lo pou yon peryòd endefini. Kòm yon rezilta, ou pral jwenn gwo itilizasyon CPU nan gwoup la:

Seccomp nan Kubernetes: 7 bagay ou bezwen konnen depi nan kòmansman an

Nan ka sa yo, yon sèvis piblik ka vin sekou strace - li pral montre ki pwoblèm nan ka:

Seccomp nan Kubernetes: 7 bagay ou bezwen konnen depi nan kòmansman an
sudo strace -c -p 9331

Asire w ke pwofil yo genyen tout apèl sistèm ke aplikasyon an bezwen nan ègzekutabl.

Ide # 7: Peye atansyon sou detay epi asire w ke tout apèl sistèm nesesè yo nan lis blan.

Sa a konkli premye pati nan yon seri atik sou itilizasyon seccomp nan Kubernetes nan lespri SecDevOps. Nan pati sa yo nou pral pale sou poukisa sa a enpòtan ak ki jan yo otomatize pwosesis la.

PS soti nan tradiktè

Li tou sou blog nou an:

Sous: www.habr.com

Add nouvo kòmantè