Seccomp in Kubernetes: 7 cose chì avete bisognu di sapè da u principiu

Nota. transl.: Presentemu à a vostra attenzione a traduzzione di un articulu da un ingegnere senior di sicurezza di l'applicazioni in a cumpagnia britannica ASOS.com. Cun ella, principia una seria di publicazioni dedicate à migliurà a sicurità in Kubernetes per mezu di l'usu di seccomp. Se i lettori piace l'intruduzione, seguiteremu l'autore è cuntinuemu cù i so futuri materiali nantu à questu tema.

Seccomp in Kubernetes: 7 cose chì avete bisognu di sapè da u principiu

Questu articulu hè u primu in una seria di posti nantu à cumu creà profili seccomp in u spiritu di SecDevOps, senza ricorrere à a magia è a stregoneria. In a Parte 1, copreraghju i principii è i dettagli interni di l'implementazione di seccomp in Kubernetes.

L'ecosistema Kubernetes offre una larga varietà di modi per assicurà è isolà i cuntenituri. L'articulu hè nantu à u Modu Secure Computing, cunnisciutu ancu seccomp. A so essenza hè di filtrà e chjama di u sistema dispunibuli per l'esekzione da cuntenituri.

Perchè hè impurtante? Un containeru hè solu un prucessu in esecuzione nantu à una macchina specifica. È usa u kernel cum'è altre applicazioni. Se i cuntenituri puderanu eseguisce qualsiasi chjama di u sistema, assai prestu u malware apprufittassi di questu per scaccià l'isolamentu di u containeru è affettà altre applicazioni: intercepte l'infurmazioni, cambià i paràmetri di u sistema, etc.

I profili seccomp definenu quale chjama di u sistema deve esse permessa o disattivata. U cuntainer runtime li attiva quandu principia per chì u kernel pò monitorà a so esecuzione. Utilizà tali profili permette di limità u vettore d'attaccu è riduce u dannu se qualsiasi prugramma in u cuntinuu (vale à dì, e vostre dipendenze, o e so dipendenze) cumencia à fà qualcosa chì ùn hè micca permessu di fà.

Arrivà à i principii

U prufilu di basa di seccomp include trè elementi: defaultAction, architectures (o archMap) è 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 determina u destinu predeterminatu di qualsiasi chjama di u sistema micca specificatu in a sezione syscalls. Per fà e cose più faciule, fighjemu nantu à i dui valori principali chì seranu utilizati:

  • SCMP_ACT_ERRNO - blucca l'esekzione di una chjama di u sistema,
  • SCMP_ACT_ALLOW - permette.

rùbbrica architectures architetture di destinazione sò listate. Questu hè impurtante perchè u filtru stessu, appiicatu à u nivellu di u kernel, dipende di l'identificatori di u sistema, è micca di i so nomi specificati in u prufilu. U runtime di u containeru li currisponde à l'identificatori prima di l'usu. L'idea hè chì e chjama di u sistema ponu avè ID completamente differenti secondu l'architettura di u sistema. Per esempiu, u sistema chjamatu recvfrom (adupratu per riceve infurmazioni da u socket) hà ID = 64 in sistemi x64 è ID = 517 in x86. pudete truvà una lista di tutte e chjama di u sistema per l'architettura x86-x64.

In a rùbbrica syscalls elenca tutte e chjama di u sistema è specifica ciò chì deve fà cun elli. Per esempiu, pudete creà una lista bianca da mette defaultAction nantu SCMP_ACT_ERRNO, è chjama in a rùbbrica syscalls assignà SCMP_ACT_ALLOW. Cusì, permette solu chjamati specificati in a sezione syscalls, è pruibisce tutti l'altri. Per a lista negra, duvete cambià i valori defaultAction è azzione à u cuntrariu.

Avà duvemu dì uni pochi di parolle nantu à sfumature chì ùn sò micca cusì evidenti. Per piacè nutate chì i cunsiglii quì sottu assumenu chì site implementà una linea di applicazioni di cummerciale nantu à Kubernetes è vulete ch'elli vanu cù u minimu quantità di privilegi pussibule.

1. AllowPrivilegeEscalation=false

В securityContext cuntainer hà un paràmetru AllowPrivilegeEscalation. S'ellu hè stallatu in false, i cuntenituri cumincianu cù (on) pocu no_new_priv. U significatu di stu paràmetru hè ovviamente da u nome: impedisce à u cuntinuu di lancià novi prucessi cù più privilegii di quellu stessu.

Un effettu secundariu di sta opzione hè stata stabilita true (default) hè chì u cuntainer runtime applicà u prufilu seccomp à u principiu di u prucessu di startup. Cusì, tutte e chjama di u sistema necessariu per eseguisce i prucessi di runtime internu (per esempiu, stabilisce l'ID d'utilizatori / gruppu, abbandunà certe capacità) deve esse attivatu in u prufilu.

À un cuntainer chì faci cose triviali echo hi, i seguenti permessi seranu richiesti:

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

... invece di questi:

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

Ma dinò, perchè hè questu un prublema? In modu persunale, eviteraghju a lista bianca di e seguenti chjamate di u sistema (a menu chì ùn ci hè un veru bisognu di elli): capset, set_tid_address, setgid, setgroups и setuid. Tuttavia, u veru sfida hè chì, permettendu prucessi chì ùn avete assolutamente micca cuntrollu, vi liganu i profili à l'implementazione di u cuntainer runtime. In altri palori, un ghjornu pudete truvà chì dopu avè aghjurnatu l'ambiente di runtime di u containeru (sia da voi, sia, più prubabilmente, da u fornitore di servizii di nuvola), i cuntenituri si fermanu di colpu.

Cunsigliu # 1: Run containers cun AllowPrivilegeEscaltion=false. Questu riducerà a dimensione di i profili seccomp è li rende menu sensibili à i cambiamenti in l'ambiente di runtime di u containeru.

2. Stabbilimentu di profili seccomp à u livellu di u containeru

U prufilu seccomp pò esse stabilitu à u nivellu di pod:

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

... o à u livellu di u containeru :

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

Per piacè nutate chì a sintassi sopra cambierà quandu Kubernetes seccomp diventerà GA (Stu avvenimentu hè previstu in a prossima versione di Kubernetes - 1.18 - approx. transl.).

Pocu persone sanu chì Kubernetes hà sempre avutu bugchì hà causatu i profili seccomp per esse applicati pausa cuntainer. L'ambiente di runtime cumpensu parzialmente per questa mancanza, ma questu cuntinuu ùn sparisce micca da i podi, postu chì hè utilizatu per cunfigurà a so infrastruttura.

U prublema hè chì stu cuntinuu sempre principia cù AllowPrivilegeEscalation=true, chì porta à i prublemi espressi in u paràgrafu 1, è questu ùn pò micca esse cambiatu.

Utilizendu i profili seccomp à u livellu di u cuntinuu, eviterete questa trappula è pudete creà un prufilu adattatu à un containeru specificu. Questu duverà esse fattu finu à chì i sviluppatori risolvenu u bug è a nova versione (forse 1.18?) diventa dispunibule per tutti.

Cunsigliu # 2: Definite i profili seccomp à u livellu di u containeru.

In un sensu praticu, sta regula generalmente serve cum'è una risposta universale à a quistione: "Perchè u mo prufilu seccomp funziona cù docker runma ùn funziona micca dopu a distribuzione in un cluster Kubernetes?

3. Aduprate runtime/default solu cum'è l'ultimu risorsu

Kubernetes hà duie opzioni per i profili integrati: runtime/default и docker/default. Tutti dui sò implementati da u cuntainer runtime, micca Kubernetes. Dunque, ponu differisce secondu l'ambiente runtime utilizatu è a so versione.

In altri palori, in u risultatu di u cambiamentu di runtime, u cuntinuu pò avè accessu à un altru settore di chjama di u sistema, chì pò esse o ùn pò micca aduprà. A maiò parte di i runtimes usanu Implementazione di Docker. Se vulete usà stu prufilu, assicuratevi chì hè adattatu per voi.

Profile docker/default hè stata obsoleta da Kubernetes 1.11, cusì evite micca aduprà.

In u mo parè, prufilu runtime/default perfettamente adattatu per u scopu per quale hè statu creatu: prutezzione di l'utilizatori da i risichi assuciati à l'esecuzione di un cumandamentu docker run nantu à e so vitture. In ogni casu, quandu si tratta di l'applicazioni cummerciale in esecuzione nantu à i clusters Kubernetes, mi piacerebbe argumentà chì un tali prufilu hè troppu apertu è i sviluppatori anu da fucalizza nantu à creà profili per e so applicazioni (o tippi d'applicazioni).

Cunsigliu # 3: Crea profili seccomp per applicazioni specifiche. Se ùn hè micca pussibule, create profili per i tipi di applicazione, per esempiu, creanu un prufilu avanzatu chì include tutte l'API web di l'applicazione Golang. Aduprate solu runtime/default cum'è l'ultimu risorsu.

In i posti futuri, copreraghju cumu creà profili seccomp inspirati da SecDevOps, automatizàli è pruvà in pipeline. In altre parolle, ùn avete micca scusa per ùn aghjurnà à profili specifichi di l'applicazione.

4. Unconfined ùn hè micca una opzione.

Da primu auditu di sicurezza Kubernetes hè risultatu chì per difettu seccomp disattivatu. Questu significa chì sè ùn avete micca stabilitu PodSecurityPolicy, chì permetterà in u cluster, tutti i podi per i quali u prufilu seccomp ùn hè micca definitu travaglià seccomp=unconfined.

Operatu in questu modu significa chì una capa sana d'insulazione hè persa chì prutegge u cluster. Stu approcciu ùn hè micca cunsigliatu da i sperti di sicurità.

Cunsigliu # 4: Nisun cuntainer in u cluster ùn deve esse in esecuzione seccomp=unconfined, in particulare in ambienti di pruduzzione.

5. "Mode Audit"

Stu puntu ùn hè micca unicu à Kubernetes, ma hè sempre in a categuria "cose ​​da sapè prima di principià".

Cum'è succede, a creazione di profili seccomp hè sempre stata sfida è si basa assai in prova è errore. U fattu hè chì l'utilizatori simpricimenti ùn anu micca l'uppurtunità di pruvà in l'ambienti di produzzione senza risicà "lascià" l'applicazione.

Dopu à a liberazione di u kernel Linux 4.14, hè diventatu pussibule di eseguisce parti di un prufilu in modu di auditu, registrandu l'infurmazioni nantu à tutte e chjama di u sistema in syslog, ma senza bluccà. Pudete attivà stu modu cù u paràmetru SCMT_ACT_LOG:

SCMP_ACT_LOG: seccomp ùn affetterà micca u filu chì face a chjama di u sistema s'ellu ùn currisponde à alcuna regula in u filtru, ma l'infurmazione nantu à a chjama di u sistema serà registrata.

Eccu una strategia tipica per aduprà sta funzione:

  1. Permette e chjama di u sistema chì sò necessarii.
  2. Block calls da u sistema chì sapete ùn serà micca utile.
  3. Registra infurmazione nantu à tutte e altre chjama in u log.

Un esempiu simplificatu pare cusì:

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

Ma ricordate chì avete bisognu di bluccà tutte e chjama chì sapete chì ùn saranu micca aduprate è chì puderanu dannà u cluster. Una bona basa per a compilazione di una lista hè l'ufficiale Documentazione Docker. Spiega in dettagliu chì e chjama di u sistema sò bluccati in u prufilu predeterminatu è perchè.

Tuttavia, ci hè una cattura. Eppuru SCMT_ACT_LOG supportatu da u kernel Linux da a fine di u 2017, hè intrutu in l'ecosistema Kubernetes solu pocu pocu tempu. Per quessa, per utilizà stu metudu avete bisognu di un kernel Linux 4.14 è di una versione runC micca più bassa v1.0.0-rc9.

Cunsigliu # 5: Un prufilu di modu di auditu per a prova in a produzzione pò esse creatu cumminendu listi neri è bianchi, è tutte l'eccezzioni ponu esse registrate.

6. Aduprà whitelists

A lista bianca richiede un sforzu supplementu perchè duvete identificà ogni chjama chì l'applicazione puderia avè bisognu, ma questu approcciu migliurà assai a sicurità:

Hè assai ricumandemu di utilizà l'approcciu di lista bianca perchè hè più simplice è affidabile. A lista nera deve esse aghjurnata ogni volta chì una chjama di u sistema potenzialmente periculosa (o una bandiera / opzione periculosa si hè in a lista negra) hè aghjuntu. Inoltre, hè spessu pussibule di cambià a rapprisintazioni di un paràmetru senza cambià a so essenza, è cusì sguassate e restrizioni di a lista negra.

Per l'applicazioni Go, aghju sviluppatu un strumentu speciale chì accumpagna l'applicazione è raccoglie tutte e chjamate durante l'esekzione. Per esempiu, per l'applicazione seguente:

package main

import "fmt"

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

... lanciamu gosystract cum'è questa:

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

... è avemu u risultatu seguente:

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

Per avà, questu hè solu un esempiu - più dettagli nantu à l'arnesi seguitaranu.

Cunsigliu # 6: Permette solu quelli chjamati chì avete veramente bisognu è bluccà tutti l'altri.

7. Pone i fundamenti ghjusti (o preparate per un cumpurtamentu inespettatu)

U kernel rinfurzà u prufilu indipendentemente da ciò chì scrive in ellu. Ancu s'ellu ùn hè micca esattamente ciò chì vulete. Per esempiu, s'è vo bluccà accessu à chiama cum'è exit o exit_group, u cuntinuu ùn serà micca capaci di chjude currettamente è ancu un cumandamentu simplice cum'è echo hi impicca luo per un periodu indefinitu. In u risultatu, uttene un altu usu di CPU in u cluster:

Seccomp in Kubernetes: 7 cose chì avete bisognu di sapè da u principiu

In tali casi, una utilità pò vene à u salvamentu strace - mostrarà ciò chì u prublema pò esse:

Seccomp in Kubernetes: 7 cose chì avete bisognu di sapè da u principiu
sudo strace -c -p 9331

Assicuratevi chì i profili cuntenenu tutte e chjama di u sistema chì l'applicazione necessita in runtime.

Cunsigliu # 7: Prestate attenzione à i dettagli è assicuratevi chì tutte e chjama di u sistema necessariu sò in lista bianca.

Questu cuncludi a prima parte di una seria d'articuli nantu à l'usu di seccomp in Kubernetes in u spiritu di SecDevOps. In i seguenti parti avemu da parlà perchè questu hè impurtante è cumu per automatizà u prucessu.

PS da u traduttore

Leghjite puru nant'à u nostru blog:

Source: www.habr.com

Add a comment