Seccom ao amin'ny Kubernetes: zavatra 7 tokony ho fantatrao hatrany am-boalohany

Fanamarihana. transl.: Atolotray ho anareo ny fandikana lahatsoratra iray nataon'ny injeniera ambony momba ny fiarovana amin'ny fampiharana ao amin'ny orinasa britanika ASOS.com. Miaraka amin'izany izy dia manomboka andian-dahatsoratra natokana ho fanatsarana ny fiarovana ao amin'ny Kubernetes amin'ny alàlan'ny fampiasana seccom. Raha tian'ny mpamaky ny teny fampidirana dia hanaraka ny mpanoratra izahay ary hanohy ny fitaovany ho avy momba ity lohahevitra ity.

Seccom ao amin'ny Kubernetes: zavatra 7 tokony ho fantatrao hatrany am-boalohany

Ity lahatsoratra ity no voalohany amin'ny andian-dahatsoratra momba ny fomba hamoronana mombamomba ny seccom amin'ny toe-tsain'ny SecDevOps, tsy mampiasa ody sy ody. Ao amin'ny Fizarana XNUMX, hojereko ny fototra sy ny antsipiriany anatiny amin'ny fampiharana ny seccom ao amin'ny Kubernetes.

Ny ekôsistema Kubernetes dia manolotra fomba isan-karazany amin'ny fiarovana sy fanokanana kaontenera. Ny lahatsoratra dia momba ny Secure Computing Mode, antsoina koa hoe seccom. Ny votoatiny dia ny manivana ny antson'ny rafitra azo tanterahina amin'ny alalan'ny kaontenera.

Nahoana no zava-dehibe izany? Ny kaontenera dia dingana iray mandeha amin'ny milina iray manokana. Ary mampiasa ny kernel toy ny fampiharana hafa. Raha afaka manao antso an-tariby ny container, tsy ho ela dia hanararaotra izany ny malware mba hialana amin'ny fitokanana kaontenera ary hisy fiantraikany amin'ny rindranasa hafa: fampahalalam-baovao manakana, manova ny fikandrana rafitra, sns.

Ny mombamomba ny seccom dia mamaritra hoe iza amin'ireo antso an-tariby no tokony avela na tsy ho kilemaina. Ny fampandehanana ny container dia manetsika azy ireo rehefa manomboka izany mba ahafahan'ny kernel manara-maso ny famonoana azy. Ny fampiasana ny mombamomba anao toy izany dia ahafahanao mametra ny vector fanafihana ary mampihena ny fahasimbana raha toa ka misy programa ao anatin'ny fitoeran-javatra (izany hoe, miankina aminao, na miankina aminy) manomboka manao zavatra tsy azo atao.

Fahatakarana ny fototra

Ny mombamomba ny seccom fototra dia misy singa telo: defaultAction, architectures (na archMap) ary 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-seccom.json)

defaultAction mamaritra ny fiafaran'ny fiantsoana rafitra rehetra tsy voafaritra ao amin'ny fizarana syscalls. Mba hanamora ny zavatra, andao hifantoka amin'ireo soatoavina roa lehibe hampiasaina:

  • SCMP_ACT_ERRNO - manakana ny fanatanterahana antso an-tariby,
  • SCMP_ACT_ALLOW - mamela.

fizarana architectures voatanisa ny maritrano kendrena. Zava-dehibe izany satria ny sivana mihitsy, ampiharina amin'ny ambaratonga kernel, dia miankina amin'ny famantarana ny antso an-tariby, fa tsy amin'ny anarany voatondro ao amin'ny mombamomba azy. Ny fotoana fampandehanana kaontenera dia hampifanaraka azy ireo amin'ny famantarana alohan'ny hampiasana azy. Ny hevitra dia ny antson'ny rafitra dia afaka manana ID samy hafa tanteraka arakaraka ny rafitra rafitra. Ohatra, antso an-tariby recvfrom (ampiasaina handraisana vaovao avy amin'ny socket) dia manana ID = 64 amin'ny rafitra x64 ary ID = 517 amin'ny x86. izany afaka mahita lisitry ny antso rehetra momba ny rafitra x86-x64 ianao.

Ao amin'ny fizarana syscalls mitanisa ny antson'ny rafitra rehetra ary mamaritra izay tokony hatao amin'izy ireo. Ohatra, azonao atao ny mamorona lisitra fotsy amin'ny fametrahana defaultAction amin'ny SCMP_ACT_ERRNO, ary miantso ao amin'ny fizarana syscalls Manome SCMP_ACT_ALLOW. Noho izany, ny antso voatondro ao amin'ny fizarana ihany no avelanao syscalls, ary mandrara ny hafa rehetra. Ho an'ny lisitra mainty dia tokony hanova ny soatoavina ianao defaultAction ary ny fihetsika mifanohitra amin’izany.

Ankehitriny dia tokony hilaza teny vitsivitsy momba ny nuances izay tsy dia mazava loatra. Mariho fa ny tolo-kevitra etsy ambany dia mihevitra fa mampiasa andiana rindranasa fandraharahana ao amin'ny Kubernetes ianao ary tianao ny handehanana miaraka amin'ny tombontsoa faran'izay kely indrindra.

1. AllowPrivilegeEscalation=diso

В securityContext manana paramètre ny container AllowPrivilegeEscalation. Raha apetraka ao false, manomboka amin'ny (on) bit no_new_priv. Ny dikan'ity mari-pamantarana ity dia miharihary amin'ny anarana: manakana ny kaontenera tsy handefa dingana vaovao manana tombontsoa bebe kokoa noho ny azy.

Ny voka-dratsin'ity safidy ity dia apetraka true (Default) dia ny fampandehanana ny kaontenera dia mampihatra ny mombamomba ny seccom amin'ny fiandohan'ny dingana fanombohana. Noho izany, ny antson'ny rafitra rehetra ilaina amin'ny fampandehanana ny fizotry ny fotoam-pivoriana anatiny (ohatra ny fametrahana ID mpampiasa/vondrona, fanalana ny fahaiza-manao sasany) dia tsy maintsy alefa ao amin'ny mombamomba azy.

Ho an'ny fitoeran-javatra manao zavatra tsy misy dikany echo hi, ireto fahazoan-dàlana manaraka ireto dia takiana:

{
    "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-seccom.json)

...fa tsy ireto:

{
    "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-seccom.json)

Saingy indray, nahoana no olana izany? Amiko manokana dia tsy ho voasokajy ho fotsy ireto antso an-tariby manaraka ireto aho (raha tsy hoe tena ilaina izany): capset, set_tid_address, setgid, setgroups и setuid. Na izany aza, ny tena fanamby dia amin'ny alàlan'ny famelana ireo dingana izay tsy azonao fehezina tanteraka, dia mamatotra ny mombamomba anao amin'ny fampiharana ny fotoana fandefasana container. Raha lazaina amin'ny teny hafa, indray andro any dia mety ho hitanao fa aorian'ny fanavaozana ny tontolon'ny kaontenera (na anao na, azo inoana kokoa, avy amin'ny mpamatsy serivisy rahona), dia mijanona tampoka ny kaontenera.

Soso-kevitra # 1: Fampandehanana kaontenera misy AllowPrivilegeEscaltion=false. Izany dia hampihena ny haben'ny mombamomba ny seccom ary hahatonga azy ireo ho tsy dia saro-pady loatra amin'ny fiovana eo amin'ny tontolo iainan'ny kaontenera.

2. Fametrahana ny mombamomba ny seccom eo amin'ny haavon'ny kaontenera

Ny mombamomba ny seccom dia azo apetraka amin'ny haavon'ny pod:

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

...na amin'ny haavon'ny kaontenera:

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

Mariho fa hiova ny fehezanteny etsy ambony rehefa Kubernetes seccom ho lasa GA (ity hetsika ity dia andrasana amin'ny famoahana manaraka ny Kubernetes - 1.18 - eo ho eo transl.).

Vitsy ny olona mahafantatra fa efa nananan'i Kubernetes hatramin'izay bibikelyizay nahatonga ny mombamomba ny seccom hampiharina fitotoana fiatoana. Ny tontolon'ny runtime dia manonitra amin'ny ampahany amin'ity lesoka ity, saingy ity kaontenera ity dia tsy manjavona amin'ny pods, satria ampiasaina hanamboarana ny fotodrafitrasany.

Ny olana dia ity kaontenera ity dia manomboka hatrany AllowPrivilegeEscalation=true, mitarika ho amin’ireo olana voalaza ao amin’ny fehintsoratra 1, ary tsy azo ovaina izany.

Amin'ny fampiasana ny mombamomba ny seccomp amin'ny haavon'ny kaontenera, dia misoroka io fandrika io ianao ary afaka mamorona mombamomba izay mifanaraka amin'ny kaontenera manokana. Tsy maintsy atao izany mandra-pahavitan'ny mpamorona ilay bug ary ny dikan-teny vaovao (angamba 1.18?) dia ho azon'ny rehetra.

Soso-kevitra # 2: Mametraka ny mombamomba ny seccom amin'ny haavon'ny kaontenera.

Amin'ny heviny azo ampiharina, io fitsipika io dia matetika no valin'ny fanontaniana hoe: "Nahoana no miasa miaraka amin'ny mombamomba ahy seccom. docker runfa tsy mandeha aorian'ny fametrahana amin'ny cluster Kubernetes?

3. Mampiasà runtime/default ho fomba farany ihany

Kubernetes dia manana safidy roa ho an'ny mombamomba azy: runtime/default и docker/default. Izy ireo dia ampiharina amin'ny alàlan'ny fampandehanana kaontenera fa tsy Kubernetes. Noho izany, mety tsy hitovy izy ireo arakaraka ny tontolo iainana ampiasaina sy ny dikan-teny.

Raha lazaina amin'ny teny hafa, vokatry ny fiovan'ny fotoam-pivoriana, ny fitoeran-javatra dia mety manana fidirana amin'ny andiana antso an-tariby hafa, izay mety hampiasaina na tsy ampiasaina. Ny ankamaroan'ny runtimes dia ampiasaina Fampiharana Docker. Raha te hampiasa an'ity profil ity ianao dia ataovy izay hahazoana antoka fa mety aminao izany.

piraofilina docker/default dia tsy ampiasaina intsony nanomboka tamin'ny Kubernetes 1.11, koa aza mampiasa azy io.

Raha ny hevitro, profil runtime/default mifanentana tsara amin'ny tanjona namoronana azy: miaro ny mpampiasa amin'ny loza mety hitranga amin'ny fanatanterahana baiko docker run amin’ny fiarany. Na izany aza, raha ny momba ny rindranasa fandraharahana mandeha amin'ny kluster Kubernetes, dia sahiko ny milaza fa misokatra loatra ny mombamomba toy izany ary tokony hifantoka amin'ny famoronana mombamomba ny rindranasany (na karazana rindranasa) ny mpamorona.

Soso-kevitra # 3: Mamorona mombamomba ny seccom ho an'ny fampiharana manokana. Raha tsy azo atao izany dia mamorona mombamomba ho an'ny karazana fampiharana, ohatra, mamorona mombamomba efa mandroso izay ahitana ny API amin'ny tranonkala rehetra an'ny fampiharana Golang. Ampiasao fotsiny ny runtime/default ho fomba farany.

Ao amin'ny lahatsoratra ho avy, hojereko ny fomba hamoronana mombamomba ny seccomp aingam-panahy avy amin'ny SecDevOps, manamboatra azy ireo ho azy, ary manandrana azy ireo amin'ny fantsona. Raha lazaina amin'ny teny hafa dia tsy hanana fialan-tsiny ianao tsy hanavao ny mombamomba manokana amin'ny fampiharana.

4. TSY safidy ny Unconfined.

avy amin'ny Ny fanaraha-maso fiarovana Kubernetes voalohany dia hita fa amin'ny alàlan'ny default seccom kilemaina. Midika izany fa raha tsy mametraka ianao PodSecurityPolicy, izay ahafahanao miditra ao amin'ny cluster, ny pods rehetra izay tsy voafaritra ny mombamomba ny seccom dia hiasa ao seccomp=unconfined.

Ny fiasana amin'ity fomba ity dia midika fa very ny sosona insulation iray manontolo izay miaro ny cluster. Ity fomba fiasa ity dia tsy atolotry ny manam-pahaizana momba ny fiarovana.

Soso-kevitra # 4: Tsy tokony hiditra ao anaty kaontenera ao amin'ny cluster seccomp=unconfined, indrindra amin'ny tontolo famokarana.

5. "Modeau audit"

Tsy ho an'ny Kubernetes irery io teboka io, fa mbola tafiditra ao anatin'ny sokajy “zavatra ho fantatra alohan'ny hanombohanao”.

Raha ny zava-mitranga dia sarotra foana ny famoronana mombamomba ny seccom ary miankina betsaka amin'ny fitsapana sy ny fahadisoana. Ny zava-misy dia ny mpampiasa dia tsy manana fahafahana hizaha toetra azy ireo amin'ny tontolon'ny famokarana nefa tsy atahorana "handroaka" ny fampiharana.

Taorian'ny famoahana ny kernel Linux 4.14 dia azo atao ny mampandeha ampahany amin'ny mombamomba amin'ny fomba fanaraha-maso, mirakitra fampahalalana momba ny antson'ny rafitra rehetra ao amin'ny syslog, saingy tsy nanakana azy ireo. Azonao atao ny manetsika ity fomba ity amin'ny alàlan'ny parameter SCMT_ACT_LOG:

SCMP_ACT_LOG: Ny seccom dia tsy hisy fiantraikany amin'ny kofehy manao ny antson'ny rafitra raha toa ka tsy mifanaraka amin'ny fitsipika ao amin'ny sivana izany, fa ny fampahalalana momba ny antso an-tariby dia hosoratana.

Ity misy paikady mahazatra amin'ny fampiasana ity endri-javatra ity:

  1. Avelao ny antson'ny rafitra izay ilaina.
  2. Sakanana ny antso avy amin'ny rafitra izay fantatrao fa tsy ilaina.
  3. Raketo an-tsoratra ny fampahalalana momba ny antso hafa rehetra ao anaty log.

Ohatra notsorina toy izao:

{
    "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-seccom.json)

Saingy tadidio fa mila manakana ny antso rehetra fantatrao fa tsy hampiasaina ianao ary mety hanimba ny cluster. Ny fototra tsara amin'ny fanangonana lisitra dia ny ofisialy Docker documentation. Hazavainy amin'ny antsipiriany hoe inona ny antson'ny rafitra voasakana ao amin'ny mombamomba azy ary nahoana.

Na izany aza, misy ny tratra. NA SCMT_ACT_LOG tohanan'ny kernel Linux hatramin'ny faran'ny taona 2017, vao haingana ihany no niditra tao amin'ny tontolo iainana Kubernetes. Noho izany, raha hampiasa an'io fomba io ianao dia mila Linux kernel 4.14 sy runC version tsy ambany v1.0.0-rc9.

Soso-kevitra # 5: Ny mombamomba ny fomba fanaraha-maso ho an'ny fitsapana amin'ny famokarana dia azo noforonina amin'ny fampifangaroana lisitra mainty sy fotsy, ary azo alaina ao anatin'ny logiciel ny fanavahana rehetra.

6. Mampiasà lisitra fotsy

Mitaky ezaka fanampiny ny fanaovana lisitra fotsy satria tsy maintsy fantarinao ny antso rehetra mety ilain'ny fampiharana, saingy io fomba fiasa io dia manatsara ny fiarovana:

Tena soso-kevitra ny hampiasa ny fomba fiasa whitelist satria tsotra sy azo antoka kokoa. Mila havaozina ny lisitra mainty isaky ny misy antson'ny rafitra mety hampidi-doza (na saina/safidy mampidi-doza raha ao anaty lisitra mainty izany). Ankoatra izany, dia matetika azo atao ny manova ny fanehoana ny mari-pamantarana nefa tsy manova ny maha-izy azy ary noho izany dia mandalo ny famerana ny lisitra mainty.

Ho an'ny fampiharana Go dia namolavola fitaovana manokana miaraka amin'ny fampiharana aho ary manangona ny antso rehetra natao nandritra ny famonoana. Ohatra, ho an'ny fampiharana manaraka:

package main

import "fmt"

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

... andao hanomboka gosystract toy izao manaraka izao:

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

... ary mahazo izao vokatra manaraka izao isika:

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

Amin'izao fotoana izao dia ohatra fotsiny izany—misy antsipiriany bebe kokoa momba ireo fitaovana ho avy.

Soso-kevitra # 6: Ireo antso izay tena ilainao ihany no avela ary sakanana ny hafa rehetra.

7. Mametraha fototra tsara (na miomana amin'ny fihetsika tsy ampoizina)

Ny kernel dia hampihatra ny mombamomba azy na inona na inona soratanao ao. Na dia tsy araka izay tadiavinao aza. Ohatra, raha manakana ny fidirana amin'ny antso toy ny exit na exit_group, tsy ho afaka hikatona tsara ny container ary na dia baiko tsotra toy ny echo hi ahantony izyo mandritra ny fe-potoana tsy voafaritra. Vokatr'izany dia hahazo fampiasana CPU avo lenta amin'ny cluster ianao:

Seccom ao amin'ny Kubernetes: zavatra 7 tokony ho fantatrao hatrany am-boalohany

Amin'ny toe-javatra toy izany, ny fitaovana iray dia afaka tonga hamonjy strace - Hasehony izay mety ho olana:

Seccom ao amin'ny Kubernetes: zavatra 7 tokony ho fantatrao hatrany am-boalohany
sudo strace -c -p 9331

Ataovy azo antoka fa ao amin'ny profil dia misy ny antson'ny rafitra rehetra ilain'ny fampiharana mandritra ny fotoana fiasana.

Soso-kevitra # 7: Tandremo ny antsipiriany ary ataovy azo antoka fa voafantina ao anaty lisitra fotsy ny antso rehetra ilaina.

Ity no mamarana ny ampahany voalohany amin'ny andian-dahatsoratra momba ny fampiasana seccom ao amin'ny Kubernetes amin'ny fanahin'ny SecDevOps. Amin'ireto ampahany manaraka ireto dia hiresaka momba ny antony maha-zava-dehibe izany sy ny fomba automatique ny dingana.

PS avy amin'ny mpandika teny

Vakio ihany koa ao amin'ny bilaoginay:

Source: www.habr.com

Add a comment