Seccomp ann an Kubernetes: 7 rudan a dh’ fheumas tu a bhith eòlach bhon fhìor thoiseach

Thoir an aire. eadar-theangachadh.: Bidh sinn a’ toirt d’ aire eadar-theangachadh artaigil le àrd innleadair tèarainteachd tagraidh aig a’ chompanaidh Breatannach ASOS.com. Leis, tha e a’ tòiseachadh sreath de fhoillseachaidhean a tha coisrigte ri bhith a’ leasachadh tèarainteachd ann an Kubernetes tro bhith a’ cleachdadh seccomp. Mas toil le luchd-leughaidh an ro-ràdh, leanaidh sinn an t-ùghdar agus leanaidh sinn air adhart leis na stuthan aige san àm ri teachd air a’ chuspair seo.

Seccomp ann an Kubernetes: 7 rudan a dh’ fheumas tu a bhith eòlach bhon fhìor thoiseach

Is e an artaigil seo a’ chiad fhear ann an sreath de phuist air mar a chruthaicheas tu pròifilean seccomp ann an spiorad SecDevOps, gun a bhith a’ cleachdadh draoidheachd is buidseachd. Ann am Pàirt XNUMX, còmhdaichidh mi na bunaitean agus mion-fhiosrachadh taobh a-staigh buileachadh seccomp ann an Kubernetes.

Tha eag-shiostam Kubernetes a’ tabhann measgachadh farsaing de dhòighean air soithichean a dhìon agus a sgaradh. Tha an artaigil mu dheidhinn Modh Coimpiutaireachd Tèarainte, ris an canar cuideachd seccomp. Is e a bhunait a bhith a’ sìoladh fiosan an t-siostaim a tha rim faighinn airson an coileanadh le soithichean.

Carson a tha e cudromach? Chan eil ann an soitheach ach pròiseas a tha a’ ruith air inneal sònraichte. Agus bidh e a’ cleachdadh an kernel dìreach mar thagraidhean eile. Nam b’ urrainn do shoithichean fiosan siostam sam bith a dhèanamh, cha b’ fhada gus an gabhadh malware brath air seo gus a dhol seachad air aonaranachd shoithichean agus buaidh a thoirt air tagraidhean eile: fiosrachadh eadar-ghearradh, atharraich suidheachadh an t-siostaim, msaa.

Bidh pròifilean seccomp a’ mìneachadh dè na gairmean siostam a bu chòir a cheadachadh no a chiorramachadh. Bidh ùine ruith an t-soithich gan cur an gnìomh nuair a thòisicheas e gus an urrainn don kernel sùil a chumail air an coileanadh. Le bhith a’ cleachdadh a leithid de phròifil leigidh sin leat an vectar ionnsaigh a chuingealachadh agus milleadh a lughdachadh ma thòisicheas prògram sam bith taobh a-staigh an t-soithich (is e sin, do eisimeileachd, no an eisimeileachd) a’ dèanamh rudeigin nach eil ceadaichte a dhèanamh.

A 'faighinn gu na bunaitean

Tha trì eileamaidean anns a’ phròifil seccomp bunaiteach: defaultAction, architectures (no archMap) agus 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"
        }
    ]
}

(meadhanach-bunaiteach-seccomp.json)

defaultAction a’ dearbhadh dè an dàn do ghairm siostam sam bith nach eil air a shònrachadh san earrann syscalls. Gus cùisean a dhèanamh nas fhasa, leig dhuinn fòcas a chuir air an dà phrìomh luach a thèid a chleachdadh:

  • SCMP_ACT_ERRNO - a’ cur bacadh air cur an gnìomh gairm siostam,
  • SCMP_ACT_ALLOW - a 'ceadachadh.

earrann architectures Tha ailtireachd targaid air an liostadh. Tha seo cudromach leis gu bheil an sìoltachan fhèin, air a chuir an sàs aig ìre kernel, an urra ri aithnichearan gairm siostam, agus chan ann air na h-ainmean a tha air an sònrachadh sa phròifil. Bidh ùine ruith an t-soithich a’ maidseadh iad ri aithnichearan mus cleachdar iad. Is e am beachd gum faod IDan gu tur eadar-dhealaichte a bhith aig fiosan siostaim a rèir ailtireachd an t-siostaim. Mar eisimpleir, siostam gairm recvfrom (air a chleachdadh gus fiosrachadh fhaighinn bhon t-socaid) tha ID = 64 air siostaman x64 agus ID = 517 air x86. tha e gheibh thu liosta de na gairmean siostam gu lèir airson ailtireachd x86-x64.

Anns an earrainn syscalls a’ liostadh a h-uile gairm siostam agus a’ sònrachadh dè a nì thu leotha. Mar eisimpleir, faodaidh tu liosta geal a chruthachadh le bhith a’ suidheachadh defaultAction air SCMP_ACT_ERRNO, agus gairmean anns an earrainn syscalls sònraich SCMP_ACT_ALLOW. Mar sin, cha leig thu ach fiosan a tha air an sònrachadh san roinn syscalls, agus na h-uile eile a thoirmeasg. Airson an liosta dhubh bu chòir dhut na luachan atharrachadh defaultAction agus gnìomhan an aghaidh a chèile.

A-nis bu chòir dhuinn beagan fhaclan a ràdh mu nuances nach eil cho follaiseach. Thoir an aire gu bheil na molaidhean gu h-ìosal a’ gabhail ris gu bheil thu a’ cleachdadh sreath de thagraidhean gnìomhachais air Kubernetes agus gu bheil thu airson gun ruith iad leis an ìre as lugha de shochairean a tha comasach.

1. CeadaichPrivilegeEscalation=meallta

В securityContext tha paramadair aig container AllowPrivilegeEscalation. Ma tha e air a stàladh ann an false, tòisichidh soithichean le (on) bit no_new_priv. Tha brìgh a’ pharamadair seo follaiseach bhon ainm: tha e a’ cur casg air an t-soitheach pròiseasan ùra a chuir air bhog le barrachd shochairean na tha aige fhèin.

Taobh-buaidh den roghainn seo ga shuidheachadh true (àbhaisteach) gu bheil ùine ruith an t-soithich a’ cur a’ phròifil seccomp an sàs aig fìor thoiseach a’ phròiseas tòiseachaidh. Mar sin, feumar a h-uile gairm siostam a dh’ fheumar gus pròiseasan ùine ruith a-staigh a ruith (me suidheachadh IDan cleachdaiche/buidhne, leigeil às cuid de chomasan) a bhith air an comasachadh sa phròifil.

Gu soitheach a nì rudan beaga echo hi, bidh feum air na ceadan a leanas:

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

...an àite seo:

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

Ach a-rithist, carson a tha seo na dhuilgheadas? Gu pearsanta, bhithinn a’ seachnadh liosta geal de na fiosan siostam a leanas (mura h-eil fìor fheum orra): capset, set_tid_address, setgid, setgroups и setuid. Ach, is e an fhìor dhùbhlan, le bhith a’ ceadachadh pròiseasan air nach eil smachd sam bith agad, gu bheil thu a’ ceangal phròifilean ri buileachadh ùine ruith nan soithichean. Ann am faclan eile, aon latha is dòcha gum faigh thu a-mach às deidh dhut àrainneachd ùine ruith nan soithichean ùrachadh (leat fhèin no, nas coltaiche, leis an t-solaraiche seirbheis sgòthan), gu h-obann stadaidh na soithichean a’ ruith.

Tip # 1: Ruith soithichean le AllowPrivilegeEscaltion=false. Lùghdaichidh seo meud pròifilean seccomp agus nì iad iad cho mothachail air atharrachaidhean ann an àrainneachd ùine ruith nan soithichean.

2. A 'suidheachadh seccomp profiles aig an container ìre

Faodar am pròifil seccomp a shuidheachadh aig ìre pod:

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

... no aig ìre an t-soithich:

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

Thoir an aire gun atharraich an co-chòrdadh gu h-àrd nuair a bhios Kubernetes seccomp bithidh GA (tha dùil ris an tachartas seo anns an ath fhoillseachadh de Kubernetes - 1.18 - approx. transl.).

Is e glè bheag de dhaoine a tha fios gu robh Kubernetes a-riamh bugaa thug air pròifilean seccomp a chuir an sàs cuir stad air soitheach. Tha an àrainneachd runtime gu ìre a’ dèanamh dìoladh airson an easbhaidh seo, ach chan eil an soitheach seo a’ dol à sealladh bho na pods, leis gu bheil e air a chleachdadh gus am bun-structar aca a rèiteachadh.

Is e an duilgheadas a th 'ann gu bheil an soitheach seo an-còmhnaidh a' tòiseachadh AllowPrivilegeEscalation=true, a’ leantainn gu na duilgheadasan a chaidh an cur an cèill ann am paragraf 1, agus chan urrainnear seo atharrachadh.

Le bhith a’ cleachdadh pròifilean seccomp aig ìre an t-soithich, bidh thu a’ seachnadh an t-sloc seo agus is urrainn dhut pròifil a chruthachadh a tha freagarrach do shoitheach sònraichte. Feumar seo a dhèanamh gus an socraich an luchd-leasachaidh am biast agus gum bi an dreach ùr (is dòcha 1.18?) ri fhaighinn leis a h-uile duine.

Tip # 2: Suidhich pròifilean seccomp aig ìre an t-soithich.

Ann an seagh practaigeach, mar as trice bidh an riaghailt seo mar fhreagairt uile-choitcheann don cheist: “Carson a tha mo phròifil seccomp ag obair le docker runach nach obraich e às deidh a chuir gu buidheann Kubernetes?

3. Cleachd ùine ruith/bunaiteach a-mhàin mar an roghainn mu dheireadh

Tha dà roghainn aig Kubernetes airson pròifilean togte: runtime/default и docker/default. Tha an dà chuid air an cur an gnìomh le ùine ruith nan soithichean, chan e Kubernetes. Mar sin, faodaidh iad a bhith eadar-dhealaichte a rèir na h-àrainneachd runtime a thathar a’ cleachdadh agus an dreach a th’ ann.

Ann am faclan eile, mar thoradh air an ùine ruith ag atharrachadh, is dòcha gum bi cothrom aig a’ ghobhar air seata eadar-dhealaichte de ghlaodhan siostaim, a dh’ fhaodadh no nach cleachd e. Bidh a’ mhòr-chuid de amannan ruith a’ cleachdadh Cur an gnìomh docker. Ma tha thu airson a’ phròifil seo a chleachdadh, dèan cinnteach gu bheil e freagarrach dhut.

profile docker/default air a bhith air a mholadh bho Kubernetes 1.11, mar sin seachain a chleachdadh.

Nam bheachd-sa, pròifil runtime/default gu math freagarrach airson an adhbhar airson an deach a chruthachadh: a’ dìon luchd-cleachdaidh bho na cunnartan co-cheangailte ri bhith a’ cur an gnìomh àithne docker run air na càraichean aca. Ach, nuair a thig e gu tagraidhean gnìomhachais a tha a’ ruith air cruinneachaidhean Kubernetes, bhithinn ag argamaid gu bheil a leithid de phròifil ro fhosgailte agus bu chòir do luchd-leasachaidh fòcas a chuir air cruthachadh phròifilean airson na tagraidhean aca (no seòrsa de thagraidhean).

Tip # 3: Cruthaich pròifilean seccomp airson tagraidhean sònraichte. Mura h-eil seo comasach, cruthaich pròifilean airson seòrsaichean tagraidh, mar eisimpleir, cruthaich pròifil adhartach a tha a’ toirt a-steach a h-uile API lìn den tagradh Golang. Na cleachd ach runtime/default mar an roghainn mu dheireadh.

Ann am puist san àm ri teachd, còmhdaichidh mi mar a chruthaicheas tu pròifilean seccomp air am brosnachadh le SecDevOps, gan fèin-ghluasad, agus gan deuchainn ann an loidhnichean-phìoban. Ann am faclan eile, cha bhith leisgeul sam bith agad gun a bhith ag ùrachadh gu pròifilean a tha sònraichte do thagraidhean.

4. Chan eil neo-chrìochnach na roghainn.

Bho a’ chiad sgrùdadh tèarainteachd Kubernetes thionndaidh e a-mach sin gu bunaiteach seccomp à comas. Tha seo a 'ciallachadh mura dèan thu suidheachadh PodSecurityPolicy, a bheir comas dha sa bhuidheann, obraichidh a h-uile pod air nach eil am pròifil seccomp air a mhìneachadh ann an seccomp=unconfined.

Tha obrachadh sa mhodh seo a 'ciallachadh gu bheilear a' call sreath iomlan de insulation a dhìonas an cruinneachadh. Chan eil an dòigh seo air a mholadh le eòlaichean tèarainteachd.

Tip # 4: Cha bu chòir soitheach sam bith sa bhuidheann a bhith a’ ruith a-steach seccomp=unconfined, gu sònraichte ann an àrainneachdan toraidh.

5. "Modh sgrùdaidh"

Chan eil a’ phuing seo sònraichte do Kubernetes, ach tha e fhathast a’ tuiteam a-steach don roinn “rudan air am bi fios agad mus tòisich thu”.

Mar a thachras, tha cruthachadh pròifilean seccom air a bhith dùbhlanach a-riamh agus tha e gu mòr an urra ri deuchainn is mearachd. Is e an fhìrinn nach eil cothrom aig luchd-cleachdaidh an deuchainn a dhèanamh ann an àrainneachdan cinneasachaidh gun a bhith ann an cunnart “a’ leigeil às ”an tagradh.

Às deidh an Linux kernel 4.14 a leigeil ma sgaoil, bha e comasach pàirtean de phròifil a ruith ann am modh sgrùdaidh, a ’clàradh fiosrachadh mu gach gairm siostam ann an syslog, ach gun a bhith gam bacadh. Faodaidh tu am modh seo a chuir an gnìomh a’ cleachdadh am paramadair SCMT_ACT_LOG:

SCMP_ACT_LOG: cha toir seccomp buaidh air an t-snàthainn a tha a’ dèanamh gairm an t-siostaim mura h-eil e a’ freagairt ri riaghailt sam bith anns a’ chriathrag, ach thèid fiosrachadh mu ghairm an t-siostaim a chlàradh.

Seo ro-innleachd àbhaisteach airson am feart seo a chleachdadh:

  1. Ceadaich gairmean siostam a tha a dhìth.
  2. Cuir casg air fiosan bhon t-siostam air a bheil fios agad nach bi e feumail.
  3. Clàraich fiosrachadh mu gach fios eile sa log.

Tha eisimpleir nas sìmplidh a 'coimhead mar seo:

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

(meadhanach-measgaichte-seccomp.json)

Ach cuimhnich gum feum thu casg a chuir air a h-uile gairm a tha fios agad nach tèid a chleachdadh agus a dh ’fhaodadh cron a dhèanamh air a’ bhuidheann. Tha an t-oifigeach na bhunait mhath airson liosta a chur ri chèile Sgrìobhainnean docker. Tha e a’ mìneachadh gu mionaideach dè na fiosan siostam a tha air am bacadh sa phròifil bunaiteach agus carson.

Ach, tha aon ghlacadh ann. Ged a SCMT_ACT_LOG le taic bhon kernel Linux bho dheireadh 2017, chaidh e a-steach do eag-shiostam Kubernetes dìreach o chionn ghoirid. Mar sin, gus an dòigh seo a chleachdadh bidh feum agad air tionndadh Linux kernel 4.14 agus runC gun a bhith nas ìsle v1.0.0-rc9.

Tip # 5: Faodar pròifil modh sgrùdaidh airson deuchainn ann an cinneasachadh a chruthachadh le bhith a’ cothlamadh liostaichean dubh is geal, agus faodar a h-uile eisgeachd a chlàradh.

6. Cleachd whitelists

Feumaidh Whitelisting oidhirp a bharrachd oir feumaidh tu a h-uile gairm a dh ’fhaodadh a bhith a dhìth air an tagradh a chomharrachadh, ach tha an dòigh-obrach seo a’ leasachadh tèarainteachd gu mòr:

Thathas a’ moladh gu mòr an dòigh-obrach whitelist a chleachdadh oir tha e nas sìmplidh agus nas earbsaiche. Feumar an liosta dhubh ùrachadh nuair a thèid gairm siostam a dh’ fhaodadh a bhith cunnartach (no bratach / roghainn cunnartach ma tha e air an liosta dhubh) a chuir ris. A bharrachd air an sin, gu tric bidh e comasach riochdachadh paramadair atharrachadh gun a bhith ag atharrachadh a bhrìgh agus mar sin a dhol seachad air cuingealachaidhean an liosta dhubh.

Airson tagraidhean Go, leasaich mi inneal sònraichte a bhios an cois an tagraidh agus a chruinnicheas a h-uile fios a chaidh a dhèanamh aig àm cur gu bàs. Mar eisimpleir, airson an tagradh a leanas:

package main

import "fmt"

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

... cuir air bhog gosystract mar seo:

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

... agus gheibh sinn an toradh a leanas:

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

Airson a-nis, chan eil an seo ach eisimpleir - leanaidh barrachd fiosrachaidh mu na h-innealan.

Tip # 6: Na ceadaich ach na gairmean sin a tha a dhìth ort agus na cuir stad air a h-uile càil eile.

7. Suidhich na bunaitean ceart (no ullaich airson giùlan ris nach robh dùil)

Cuiridh an kernel am pròifil an gnìomh ge bith dè a sgrìobhas tu ann. Fiù mura h-e dìreach na bha thu ag iarraidh. Mar eisimpleir, ma chuireas tu bacadh air ruigsinneachd air gairmean mar exit no exit_group, cha bhith e comasach don ghobhar dùnadh gu ceart agus eadhon òrdugh sìmplidh mar echo hi croch suas eo airson ùine neo-chinnteach. Mar thoradh air an sin, gheibh thu cleachdadh àrd CPU anns a’ bhuidheann:

Seccomp ann an Kubernetes: 7 rudan a dh’ fheumas tu a bhith eòlach bhon fhìor thoiseach

Ann an leithid de shuidheachaidhean, faodaidh goireas tighinn gu teasairginn strace - seallaidh e dè an duilgheadas a dh’ fhaodadh a bhith ann:

Seccomp ann an Kubernetes: 7 rudan a dh’ fheumas tu a bhith eòlach bhon fhìor thoiseach
sudo strace -c -p 9331

Dèan cinnteach gu bheil a h-uile gairm siostam a dh’ fheumas an aplacaid aig àm ruith anns na pròifilean.

Tip # 7: Thoir aire gu mion-fhiosrachadh agus dèan cinnteach gu bheil a h-uile gairm siostam riatanach air an liosta geal.

Tha seo a’ crìochnachadh a’ chiad phàirt de shreath artaigilean mu bhith a’ cleachdadh seccomp ann an Kubernetes ann an spiorad SecDevOps. Anns na pàirtean a leanas bruidhnidh sinn mu carson a tha seo cudromach agus mar as urrainn dhut am pròiseas a dhèanamh fèin-ghluasadach.

PS bhon eadar-theangair

Leugh cuideachd air ar blog:

Source: www.habr.com

Cuir beachd ann