Seccomp ni Kubernetes: Awọn nkan 7 ti o nilo lati mọ lati ibẹrẹ akọkọ

Akiyesi. itumọ.: A ṣafihan si akiyesi rẹ itumọ ti nkan kan nipasẹ ẹlẹrọ aabo ohun elo oga ni ile-iṣẹ Gẹẹsi ASOS.com. Pẹlu rẹ, o bẹrẹ lẹsẹsẹ awọn atẹjade igbẹhin si imudarasi aabo ni Kubernetes nipasẹ lilo seccomp. Ti awọn onkawe ba fẹran ifihan, a yoo tẹle onkọwe ati tẹsiwaju pẹlu awọn ohun elo iwaju rẹ lori koko yii.

Seccomp ni Kubernetes: Awọn nkan 7 ti o nilo lati mọ lati ibẹrẹ akọkọ

Nkan yii jẹ akọkọ ninu lẹsẹsẹ awọn ifiweranṣẹ lori bii o ṣe le ṣẹda awọn profaili seccomp ni ẹmi ti SecDevOps, laisi lilo si idan ati ajẹ. Ni Apá XNUMX, Emi yoo bo awọn ipilẹ ati awọn alaye inu ti imuse seccomp ni Kubernetes.

Awọn ilolupo ilolupo Kubernetes nfunni ni ọpọlọpọ awọn ọna lati ni aabo ati sọtọ awọn apoti. Nkan naa jẹ nipa Ipo Iṣiro Ipamọ, ti a tun mọ si iṣẹju-aaya. Ohun pataki rẹ ni lati ṣe àlẹmọ awọn ipe eto ti o wa fun ipaniyan nipasẹ awọn apoti.

Kini idi ti o ṣe pataki? Apoti kan jẹ ilana ti nṣiṣẹ lori ẹrọ kan pato. Ati pe o nlo ekuro gẹgẹbi awọn ohun elo miiran. Ti awọn apoti ba le ṣe awọn ipe eto eyikeyi, laipẹ malware yoo lo anfani eyi lati fori ipinya eiyan ati ni ipa lori awọn ohun elo miiran: alaye idilọwọ, yi awọn eto eto pada, ati bẹbẹ lọ.

awọn profaili seccomp ṣalaye iru awọn ipe eto yẹ ki o gba laaye tabi alaabo. Akoko asiko eiyan naa mu wọn ṣiṣẹ nigbati o bẹrẹ ki ekuro le ṣe atẹle ipaniyan wọn. Lilo iru awọn profaili bẹẹ gba ọ laaye lati ṣe idinwo ikọlu ikọlu ati dinku ibajẹ ti eto eyikeyi ninu apo eiyan (iyẹn, awọn igbẹkẹle rẹ, tabi awọn igbẹkẹle wọn) bẹrẹ ṣiṣe nkan ti ko gba ọ laaye lati ṣe.

Ngba si awọn ipilẹ

Profaili seccomp ipilẹ pẹlu awọn eroja mẹta: defaultAction, architectures (tabi archMap) ati 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"
        }
    ]
}

(alabọde-ipilẹ-seccomp.json)

defaultAction ipinnu ayanmọ aiyipada ti eyikeyi ipe eto ko pato ni apakan syscalls. Lati jẹ ki awọn nkan rọrun, jẹ ki a dojukọ awọn iye akọkọ meji ti yoo ṣee lo:

  • SCMP_ACT_ERRNO - ṣe idiwọ ipaniyan ti ipe eto kan,
  • SCMP_ACT_ALLOW - faye gba.

Ninu ori iwe architectures afojusun architectures ti wa ni akojọ. Eyi ṣe pataki nitori àlẹmọ funrararẹ, ti a lo ni ipele kernel, da lori awọn idamọ ipe eto, kii ṣe lori awọn orukọ wọn pato ninu profaili. Akoko asiko eiyan yoo baramu wọn si awọn idamọ ṣaaju lilo. Ero naa ni pe awọn ipe eto le ni awọn ID ti o yatọ patapata ti o da lori faaji eto. Fun apẹẹrẹ, ipe eto recvfrom (ti a lo lati gba alaye lati iho) ni ID = 64 lori awọn ọna ṣiṣe x64 ati ID = 517 lori x86. o ti wa ni o le wa atokọ ti gbogbo awọn ipe eto fun awọn faaji x86-x64.

Ni apakan syscalls ṣe akojọ gbogbo awọn ipe eto ati pato kini lati ṣe pẹlu wọn. Fun apẹẹrẹ, o le ṣẹda akojọ funfun nipa tito defaultAction on SCMP_ACT_ERRNO, ati awọn ipe ni apakan syscalls sọtọ SCMP_ACT_ALLOW. Nitorinaa, o gba awọn ipe laaye nikan ni abala naa syscalls, ati ki o fàyègba gbogbo awọn miiran. Fun blacklist o yẹ ki o yi awọn iye defaultAction ati awọn iṣe si idakeji.

Bayi a yẹ ki o sọ awọn ọrọ diẹ nipa awọn nuances ti ko han gbangba. Jọwọ ṣe akiyesi pe awọn iṣeduro ti o wa ni isalẹ ro pe o nfi laini awọn ohun elo iṣowo sori Kubernetes ati pe o fẹ ki wọn ṣiṣẹ pẹlu iye ti o kere ju ti awọn anfani ti o ṣeeṣe.

1. AllowPrivilegeEscalation=èké

В securityContext eiyan ni o ni a paramita AllowPrivilegeEscalation. Ti o ba ti fi sori ẹrọ ni false, awọn apoti yoo bẹrẹ pẹlu (on) die no_new_priv. Itumọ paramita yii han gbangba lati orukọ naa: o ṣe idiwọ eiyan lati ṣe ifilọlẹ awọn ilana tuntun pẹlu awọn anfani diẹ sii ju tirẹ lọ.

Ipa ẹgbẹ ti aṣayan yii ti ṣeto si true (aiyipada) ni pe asiko asiko eiyan kan profaili seccomp ni ibẹrẹ ilana ibẹrẹ naa. Nitorinaa, gbogbo awọn ipe eto ti o nilo lati ṣiṣẹ awọn ilana asiko asiko inu (fun apẹẹrẹ eto olumulo/awọn ID ẹgbẹ, sisọ awọn agbara kan silẹ) gbọdọ ṣiṣẹ ni profaili.

Si eiyan ti o ṣe awọn nkan ti ko ni nkan echo hi, awọn igbanilaaye wọnyi yoo nilo:

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

...dipo awọn wọnyi:

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

Ṣugbọn lẹẹkansi, kilode ti eyi jẹ iṣoro? Tikalararẹ, Emi yoo yago fun kikojọ awọn ipe eto atẹle wọnyi (ayafi ti iwulo gidi ba wa fun wọn): capset, set_tid_address, setgid, setgroups и setuid. Bibẹẹkọ, ipenija gidi ni pe nipa gbigba awọn ilana ti o ko ni iṣakoso rara, o n so awọn profaili pọ si imuse asiko asiko eiyan. Ni awọn ọrọ miiran, ni ọjọ kan o le rii pe lẹhin mimu dojuiwọn agbegbe asiko asiko eiyan (boya nipasẹ rẹ tabi, diẹ sii, nipasẹ olupese iṣẹ awọsanma), awọn apoti naa da duro lojiji.

Akọran # 1: Ṣiṣe awọn apoti pẹlu AllowPrivilegeEscaltion=false. Eyi yoo dinku iwọn awọn profaili seccomp ati jẹ ki wọn kere si awọn iyipada ninu agbegbe asiko asiko eiyan.

2. Ṣiṣeto awọn profaili seccomp ni ipele eiyan

Profaili seccomp le ṣeto ni ipele podu:

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

... tabi ni ipele eiyan:

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

Jọwọ ṣe akiyesi pe sintasi loke yoo yipada nigbati Kubernetes seccomp yoo di GA (iṣẹlẹ yii ni a nireti ni itusilẹ atẹle ti Kubernetes - 1.18 - isunmọ. transl.).

Diẹ eniyan mọ pe Kubernetes ti nigbagbogbo ni kokoroeyiti o fa ki a lo awọn profaili seccomp si idaduro eiyan. Ayika asiko asiko ni isanpada fun aipe yii, ṣugbọn eiyan yii ko parẹ lati awọn adarọ-ese, nitori o ti lo lati tunto awọn amayederun wọn.

Iṣoro naa ni pe eiyan yii nigbagbogbo bẹrẹ pẹlu AllowPrivilegeEscalation=true, tí ń yọrí sí àwọn ìṣòro tí a sọ ní ìpínrọ̀ 1, èyí kò sì lè yí padà.

Nipa lilo awọn profaili seccomp ni ipele eiyan, o yago fun ọfin yii ati pe o le ṣẹda profaili kan ti o ṣe deede si apoti kan pato. Eyi yoo ni lati ṣee titi ti awọn olupilẹṣẹ yoo fi ṣatunṣe kokoro naa ati ẹya tuntun (boya 1.18?) yoo wa fun gbogbo eniyan.

Akọran # 2: Ṣeto awọn profaili seccomp ni ipele eiyan.

Ni ọna ti o wulo, ofin yii maa n ṣiṣẹ bi idahun agbaye si ibeere naa: “Kini idi ti profaili seccomp mi n ṣiṣẹ pẹlu docker runṣugbọn ko ṣiṣẹ lẹhin gbigbe lọ si iṣupọ Kubernetes kan?

3. Lo asiko-ṣiṣe / aiyipada nikan bi ohun asegbeyin ti

Kubernetes ni awọn aṣayan meji fun awọn profaili ti a ṣe sinu: runtime/default и docker/default. Awọn mejeeji ni imuse nipasẹ akoko asiko eiyan, kii ṣe Kubernetes. Nitorinaa, wọn le yatọ si da lori agbegbe asiko asiko ti a lo ati ẹya rẹ.

Ni awọn ọrọ miiran, bi abajade iyipada akoko asiko, eiyan le ni iwọle si oriṣiriṣi awọn ipe eto, eyiti o le tabi ko le lo. Pupọ awọn akoko ṣiṣe lo Docker imuse. Ti o ba fẹ lati lo profaili yii, jọwọ rii daju pe o dara fun ọ.

profaili docker/default A ti yọkuro lati Kubernetes 1.11, nitorinaa yago fun lilo rẹ.

Ni ero mi, profaili runtime/default ni ibamu pipe fun idi eyiti o ṣẹda: aabo awọn olumulo lati awọn ewu ti o ni nkan ṣe pẹlu pipaṣẹ kan docker run lori awọn ọkọ ayọkẹlẹ wọn. Sibẹsibẹ, nigba ti o ba de awọn ohun elo iṣowo ti nṣiṣẹ lori awọn iṣupọ Kubernetes, Emi yoo gbiyanju lati jiyan pe iru profaili kan ti ṣii pupọ ati awọn olupilẹṣẹ yẹ ki o dojukọ lori ṣiṣẹda awọn profaili fun awọn ohun elo wọn (tabi awọn iru awọn ohun elo).

Akọran # 3: Ṣẹda awọn profaili seccomp fun awọn ohun elo kan pato. Ti eyi ko ba ṣeeṣe, ṣẹda awọn profaili fun awọn iru ohun elo, fun apẹẹrẹ, ṣẹda profaili to ti ni ilọsiwaju ti o pẹlu gbogbo awọn API wẹẹbu ti ohun elo Golang. Lo akoko ṣiṣe nikan/aiyipada bi ibi-afẹde to kẹhin.

Ni awọn ifiweranṣẹ iwaju, Emi yoo bo bii o ṣe le ṣẹda awọn profaili seccomp ti o ni atilẹyin SecDevOps, ṣe adaṣe wọn, ati idanwo wọn ni awọn opo gigun ti epo. Ni awọn ọrọ miiran, iwọ kii yoo ni awawi lati ma ṣe igbesoke si awọn profaili kan pato ohun elo.

4. Unconfined kii ṣe aṣayan.

Atiku akọkọ Kubernetes aabo se ayewo o wa ni jade wipe nipa aiyipada seccomp alaabo. Eyi tumọ si pe ti o ko ba ṣeto PodSecurityPolicy, eyi ti yoo jẹ ki o wa ninu iṣupọ, gbogbo awọn adarọ-ese fun eyiti a ko ṣe alaye profaili seccomp yoo ṣiṣẹ ni seccomp=unconfined.

Ṣiṣẹ ni ipo yii tumọ si pe gbogbo Layer ti idabobo ti sọnu ti o daabobo iṣupọ naa. Ọna yii kii ṣe iṣeduro nipasẹ awọn amoye aabo.

Akọran # 4: Ko si eiyan ninu iṣupọ yẹ ki o wa ni ṣiṣiṣẹ ni seccomp=unconfined, paapaa ni awọn agbegbe iṣelọpọ.

5. "Ipo iṣayẹwo"

Ojuami yii kii ṣe alailẹgbẹ si Kubernetes, ṣugbọn tun ṣubu sinu “awọn nkan lati mọ ṣaaju ki o to bẹrẹ” ẹka.

Bi o ti n ṣẹlẹ, ṣiṣẹda awọn profaili seccomp ti nigbagbogbo nija ati gbarale idanwo ati aṣiṣe. Otitọ ni pe awọn olumulo nìkan ko ni aye lati ṣe idanwo wọn ni awọn agbegbe iṣelọpọ laisi eewu “sisọ” ohun elo naa.

Lẹhin itusilẹ ti ekuro Linux 4.14, o ṣee ṣe lati ṣiṣẹ awọn apakan ti profaili kan ni ipo iṣayẹwo, gbigbasilẹ alaye nipa gbogbo awọn ipe eto ni syslog, ṣugbọn laisi idilọwọ wọn. O le mu ipo yii ṣiṣẹ nipa lilo paramita SCMT_ACT_LOG:

SCMP_ACT_LOG: seccomp kii yoo ni ipa lori okun ṣiṣe ipe eto ti ko ba ni ibamu pẹlu ofin eyikeyi ninu àlẹmọ, ṣugbọn alaye nipa ipe eto naa yoo wọle.

Eyi ni ilana aṣoju fun lilo ẹya yii:

  1. Gba awọn ipe eto laaye ti o nilo.
  2. Dina awọn ipe lati eto ti o mọ kii yoo wulo.
  3. Gba alaye nipa gbogbo awọn ipe miiran ninu awọn log.

Apeere ti o rọrun kan dabi eyi:

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

(alabọde-adalu-seccomp.json)

Ṣugbọn ranti pe o nilo lati dènà gbogbo awọn ipe ti o mọ pe kii yoo lo ati pe o le ṣe ipalara fun iṣupọ naa. Ipilẹ ti o dara fun ṣiṣe akojọpọ atokọ ni osise naa Docker iwe. O ṣe alaye ni awọn alaye iru awọn ipe eto ti dina ni profaili aiyipada ati idi.

Sibẹsibẹ, apeja kan wa. Biotilejepe SCMT_ACT_LOG ni atilẹyin nipasẹ ekuro Linux lati opin ọdun 2017, o wọ inu ilolupo ilolupo Kubernetes nikan laipẹ. Nitorinaa, lati lo ọna yii iwọ yoo nilo ekuro Linux 4.14 ati ẹya runC ko si isalẹ v1.0.0-rc9.

Akọran # 5: Profaili ipo iṣayẹwo fun idanwo ni iṣelọpọ le ṣẹda nipasẹ apapọ awọn atokọ dudu ati funfun, ati gbogbo awọn imukuro le wọle.

6. Lo whitelists

Kikọ funfun nilo igbiyanju afikun nitori pe o ni lati ṣe idanimọ gbogbo ipe ti ohun elo le nilo, ṣugbọn ọna yii ṣe ilọsiwaju aabo gaan:

O ti wa ni gíga niyanju lati lo awọn whitelist ona bi o ti rọrun ati siwaju sii gbẹkẹle. Akojọ dudu yoo nilo lati ni imudojuiwọn nigbakugba ti ipe eto ti o lewu (tabi asia/aṣayan ti o lewu ti o ba wa lori atokọ dudu) ti ṣafikun. Ni afikun, o ṣee ṣe nigbagbogbo lati yi aṣoju paramita kan pada laisi iyipada pataki rẹ ati nitorinaa fori awọn ihamọ ti atokọ dudu.

Fun awọn ohun elo Go, Mo ṣe agbekalẹ irinṣẹ pataki kan ti o tẹle ohun elo naa ati gba gbogbo awọn ipe ti a ṣe lakoko ipaniyan. Fun apẹẹrẹ, fun ohun elo atẹle:

package main

import "fmt"

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

... jẹ ki a lọlẹ gosystract bẹ:

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

ati pe a gba abajade wọnyi:

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

Fun bayi, eyi jẹ apẹẹrẹ nikan — awọn alaye diẹ sii nipa awọn irinṣẹ yoo tẹle.

Akọran # 6Gba awọn ipe laaye nikan ti o nilo gaan ati dina gbogbo awọn miiran.

7. Fi awọn ipilẹ ti o tọ silẹ (tabi mura silẹ fun ihuwasi airotẹlẹ)

Ekuro yoo fi ipa mu profaili naa laibikita ohun ti o kọ sinu rẹ. Paapa ti o ba ti o ni ko pato ohun ti o fe. Fun apẹẹrẹ, ti o ba dina wiwọle si awọn ipe bi exit tabi exit_group, eiyan naa kii yoo ni anfani lati ku ni pipe ati paapaa aṣẹ ti o rọrun bi echo hi gbe e sokeìwọ fún àkókò tí ó lọ kánrin. Bi abajade, iwọ yoo gba lilo Sipiyu giga ninu iṣupọ:

Seccomp ni Kubernetes: Awọn nkan 7 ti o nilo lati mọ lati ibẹrẹ akọkọ

Ni iru awọn ọran, ohun elo kan le wa si igbala strace - yoo fihan kini iṣoro naa le jẹ:

Seccomp ni Kubernetes: Awọn nkan 7 ti o nilo lati mọ lati ibẹrẹ akọkọ
sudo strace -c -p 9331

Rii daju wipe awọn profaili ni gbogbo awọn ipe eto ti ohun elo nilo ni asiko isise.

Akọran # 7: San ifojusi si awọn alaye ati rii daju pe gbogbo awọn ipe eto pataki jẹ akojọ funfun.

Eyi pari apakan akọkọ ti onka awọn nkan lori lilo seccomp ni Kubernetes ni ẹmi SecDevOps. Ni awọn apakan atẹle a yoo sọrọ nipa idi ti eyi ṣe pataki ati bii o ṣe le ṣe adaṣe ilana naa.

PS lati onitumọ

Ka tun lori bulọọgi wa:

orisun: www.habr.com

Fi ọrọìwòye kun