Seccomp ma Kubernetes: 7 mau mea e pono ai ʻoe e ʻike mai ka hoʻomaka

Nānā. unuhi.: Ke hōʻike aku nei mākou i kou manaʻo i ka unuhi ʻana o kahi ʻatikala a kahi ʻenekini palekana noi noi nui ma ka hui Pelekane ʻo ASOS.com. Me ia, hoʻomaka ʻo ia i kahi ʻano o nā puke i hoʻolaʻa ʻia no ka hoʻomaikaʻi ʻana i ka palekana ma Kubernetes ma o ka hoʻohana ʻana i ka seccomp. Inā makemake ka poʻe heluhelu i ka hoʻolauna, e hahai mākou i ka mea kākau a hoʻomau i kāna mau mea e hiki mai ana ma kēia kumuhana.

Seccomp ma Kubernetes: 7 mau mea e pono ai ʻoe e ʻike mai ka hoʻomaka

ʻO kēia ʻatikala ka mea mua i ka pūʻulu o nā pou e pili ana i ka hana ʻana i nā profiles seccomp i ka ʻuhane o SecDevOps, me ka ʻole o ka hoʻohana ʻana i ka kilokilo a me ke kilokilo. Ma ka Māhele XNUMX, e uhi au i nā kumu a me nā kikoʻī kūloko o ka hoʻokō ʻana i ka seccomp ma Kubernetes.

Hāʻawi ke kaiaola Kubernetes i nā ʻano ala like ʻole e hoʻopaʻa a hoʻokaʻawale i nā ipu. ʻO ka ʻatikala e pili ana i ka Secure Computing Mode, i ʻike ʻia ʻo hūnā. ʻO kāna kumu, ʻo ia ke kānana i nā kelepona ʻōnaehana i loaʻa no ka hoʻokō ʻana e nā ipu.

No ke aha he mea nui? ʻO kahi pahu kahi hana wale nō e holo ana ma kahi mīkini kikoʻī. A hoʻohana ʻo ia i ka kernel e like me nā noi ʻē aʻe. Inā hiki i nā pahu ke hana i nā kelepona ʻōnaehana, hiki koke i ka polokalamu malware ke hoʻohana i kēia e kāpae i ka hoʻokaʻawale ʻana i ka pahu a hoʻopilikia i nā noi ʻē aʻe: hoʻopili i ka ʻike, hoʻololi i nā hoʻonohonoho ʻōnaehana, etc.

ʻO nā ʻaoʻao seccom e wehewehe i nā kelepona ʻōnaehana e ʻae ʻia a i ʻole ʻia. Hoʻomaka ka pahu pahu i ka wā e hoʻomaka ai i hiki i ka kernel ke nānā i kā lākou hoʻokō. ʻO ka hoʻohana ʻana i ia mau ʻaoʻao e hiki ai iā ʻoe ke kaupalena i ka vector hoʻouka a hōʻemi i ka pōʻino inā hoʻomaka kekahi papahana i loko o ka ipu (ʻo ia hoʻi, kāu mau hilinaʻi, a i ʻole ko lākou hilinaʻi) e hana i kahi mea ʻaʻole i ʻae ʻia e hana.

Ke hele nei i nā kumu

Aia i loko o ka moʻolelo seccom kumu ʻekolu mau mea: defaultAction, architectures (ai ole archMap) a 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 e hoʻoholo i ka hopena paʻamau o kekahi kelepona ʻōnaehana ʻaʻole i kuhikuhi ʻia ma ka ʻāpana syscalls. I mea e maʻalahi ai nā mea, e nānā kākou i nā waiwai nui ʻelua e hoʻohana ʻia:

  • SCMP_ACT_ERRNO - pale i ka hoʻokō ʻana i kahi kelepona ʻōnaehana,
  • SCMP_ACT_ALLOW - hiki.

pauku architectures ua helu ʻia nā hale kiʻi kiʻi. He mea koʻikoʻi kēia no ka mea ʻo ka kānana ponoʻī, i hoʻohana ʻia ma ka pae kernel, e hilinaʻi ʻia i nā ʻike kelepona ʻōnaehana, ʻaʻole ma ko lākou mau inoa i kuhikuhi ʻia ma ka ʻaoʻao. E hoʻohālikelike ka manawa holo pahu iā lākou me nā mea ʻike ma mua o ka hoʻohana ʻana. ʻO ka manaʻo, hiki i nā kelepona ʻōnaehana ke loaʻa nā ID ʻokoʻa loa ma muli o ka hoʻolālā ʻōnaehana. Eia kekahi laʻana, kelepona pūnaewele recvfrom (hoʻohana ʻia no ka loaʻa ʻana o ka ʻike mai ke kumu) he ID = 64 ma nā ʻōnaehana x64 a me ID = 517 ma x86. he mea hiki iā ʻoe ke ʻike i kahi papa inoa o nā kelepona ʻōnaehana āpau no nā hale hoʻolālā x86-x64.

Ma ka pauku syscalls papa inoa i nā kelepona ʻōnaehana āpau a kuhikuhi i ka mea e hana ai me lākou. No ka laʻana, hiki iā ʻoe ke hana i kahi papa inoa keʻokeʻo ma ka hoʻonohonoho ʻana defaultAction maluna o SCMP_ACT_ERRNO, a kelepona i ka pauku syscalls hāʻawi SCMP_ACT_ALLOW. No laila, ʻae wale ʻoe i nā kelepona i kuhikuhi ʻia ma ka ʻāpana syscalls, a papa aku i na mea e ae. No ka papa inoa ʻeleʻele pono ʻoe e hoʻololi i nā waiwai defaultAction a me na hana i ku e.

I kēia manawa pono mākou e ʻōlelo i kekahi mau huaʻōlelo e pili ana i nā nuances ʻaʻole maopopo. E ʻoluʻolu, e manaʻo ʻia nā ʻōlelo aʻoaʻo ma lalo nei e kau ana ʻoe i kahi laina o nā noi ʻoihana ma Kubernetes a makemake ʻoe e holo lākou me ka liʻiliʻi o nā pono.

1. AllowPrivilegeEscalation=false

В securityContext Loaʻa i ka pahu kahi ʻāpana AllowPrivilegeEscalation. Inā hoʻokomo ʻia i loko false, e hoʻomaka ana nā ipu me (on) iki no_new_priv. ʻIke ʻia ka manaʻo o kēia ʻāpana mai ka inoa: pale ia i ka pahu mai ka hoʻokuʻu ʻana i nā kaʻina hana hou me nā pono ʻoi aʻe ma mua o kona loaʻa.

Hoʻonohonoho ʻia kahi hopena ʻaoʻao o kēia koho true (paʻamau) ʻo ia ka hoʻohana ʻana o ka manawa holo pahu i ka ʻaoʻao seccom ma ka hoʻomaka ʻana o ke kaʻina hoʻomaka. No laila, pono e hoʻohana ʻia nā kelepona ʻōnaehana āpau e holo i nā kaʻina holo manawa kūloko (e laʻa me ka hoʻonohonoho ʻana i nā mea hoʻohana/hui ID, hoʻokuʻu i kekahi mau mea hiki) pono ke hoʻohana ʻia ma ka ʻaoʻao.

I kahi ipu e hana i nā mea liʻiliʻi echo hi, e koi ʻia kēia mau ʻae:

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

... ma kahi o kēia:

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

Akā hou, no ke aha kēia pilikia? ʻO wau iho, e pale aku au i ka hoʻopaʻa inoa ʻana i nā kelepona ʻōnaehana aʻe (ke ʻole he pono maoli no lākou): capset, set_tid_address, setgid, setgroups и setuid. Eia naʻe, ʻo ka paʻakikī maoli ʻo ia ma ka ʻae ʻana i nā kaʻina hana ʻaʻole ʻoe e hoʻomalu, ke hoʻopaʻa nei ʻoe i nā profiles i ka hoʻokō runtime pahu. I nā huaʻōlelo ʻē aʻe, i kekahi lā e ʻike paha ʻoe ma hope o ka hoʻonui ʻana i ke kaiapuni runtime pahu (a i ʻole ʻoe a i ʻole, ʻoi aku paha, e ka mea lawelawe kapuaʻi), pau koke nā ipu i ka holo.

Manaʻo kōkua # 1: Holo i na ipu me AllowPrivilegeEscaltion=false. E hoʻemi kēia i ka nui o nā profiles seccom a e hoʻemi iki iā lākou i nā hoʻololi i ka pōʻaiapuni manawa holo pahu.

2. Hoʻonohonoho i nā ʻaoʻao seccom ma ka pae pahu

Hiki ke hoʻonohonoho ʻia ka ʻaoʻao seccomp ma ka pae pod:

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

...a i ʻole ma ka pae pahu:

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

E ʻoluʻolu e hoʻololi ʻia ka syntax ma luna aʻe i ka wā e hoʻopau ai ʻo Kubernetes e lilo ʻo GA (manaʻo ʻia kēia hanana ma ka hoʻokuʻu hou ʻana o Kubernetes - 1.18 - ma kahi o transl.).

Kakaikahi ka poʻe i ʻike ua loaʻa mau iā Kubernetes ʻinoʻo ia ka mea i hoʻohana ʻia ai nā profiles seccom pahu hoʻomaha. ʻO ke kaiapuni runtime e uku hapa no kēia hemahema, akā ʻaʻole nalo kēia pahu mai nā pods, no ka mea, hoʻohana ʻia ia e hoʻonohonoho i kā lākou ʻoihana.

ʻO ka pilikia, hoʻomaka mau kēia pahu me AllowPrivilegeEscalation=true, e alakaʻi ana i nā pilikia i hoʻopuka ʻia ma ka paukū 1, a ʻaʻole hiki ke hoʻololi ʻia kēia.

Ma ka hoʻohana ʻana i nā profiles seccomp ma ka pae pahu, e pale aku ʻoe i kēia lua a hiki ke hana i kahi ʻaoʻao i hana ʻia i kahi pahu kikoʻī. Pono e hana ʻia kēia a hiki i ka wā e hoʻoponopono ai nā mea hoʻomohala i ka bug a loaʻa ka mana hou (malia paha 1.18?)

Manaʻo kōkua # 2: E hoʻonoho i nā ʻaoʻao seccom ma ka pae pahu.

Ma ka manaʻo kūpono, lilo kēia lula ma ke ʻano he pane āpau i ka nīnau: "No ke aha e hana ai kaʻu ʻaoʻao seccomp me docker runakā ʻaʻole hana ma hope o ka hoʻoili ʻana i kahi pūʻulu Kubernetes?

3. E hoʻohana i ka wā holo/paʻamau ma ke ʻano he hopena hope loa

He ʻelua koho ʻo Kubernetes no nā ʻaoʻao i kūkulu ʻia: runtime/default и docker/default. Hoʻokō ʻia nā mea ʻelua e ka pahu holo manawa, ʻaʻole Kubernetes. No laila, ʻokoʻa paha lākou ma muli o ke kaiapuni runtime i hoʻohana ʻia a me kāna ʻano.

I nā huaʻōlelo ʻē aʻe, ma muli o ka hoʻololi ʻana i ka manawa holo, hiki i ka pahu ke komo i kahi ʻano ʻē aʻe o nā kelepona ʻōnaehana, hiki iā ia ke hoʻohana a ʻaʻole paha. Hoʻohana ka hapa nui o nā manawa holo Hoʻokō Docker. Inā makemake ʻoe e hoʻohana i kēia ʻaoʻao, e ʻoluʻolu e hōʻoia ua kūpono ia iā ʻoe.

Profile docker/default ua hoʻopau ʻia mai ka Kubernetes 1.11, no laila e pale i ka hoʻohana ʻana.

I koʻu manaʻo, profile runtime/default kūpono loa no ke kumu i hana ʻia ai: pale i nā mea hoʻohana mai nā pilikia e pili ana i ka hoʻokō ʻana i kahi kauoha docker run ma ko lakou mau kaa. Eia nō naʻe, i ka wā e pili ana i nā noi pāʻoihana e holo ana ma nā pūʻulu Kubernetes, e ʻaʻa wau e hoʻopaʻapaʻa i ka wehe ʻana o ia ʻaoʻao a pono nā mea hoʻomohala e nānā i ka hana ʻana i nā profiles no kā lākou noi (a i ʻole nā ​​ʻano o nā noi).

Manaʻo kōkua # 3: E hana i nā moʻolelo seccom no nā noi kikoʻī. Inā ʻaʻole hiki kēia, hana i nā ʻaoʻao no nā ʻano noi, no ka laʻana, e hana i kahi ʻaoʻao kiʻekiʻe e pili ana i nā API pūnaewele āpau o ka noi Golang. E hoʻohana wale i ka wā holo/paʻamau ma ke ʻano he hopena hope loa.

Ma nā pou e hiki mai ana, e uhi au i ka hana ʻana i nā profiles seccomp i hoʻoikaika ʻia e SecDevOps, hoʻomaʻamaʻa iā lākou, a hoʻāʻo iā lākou i nā pipelines. I nā huaʻōlelo ʻē aʻe, ʻaʻohe ou kumu e hoʻomaikaʻi ʻole ai i nā kiʻi kikoʻī kikoʻī.

4. ʻAʻole koho ʻo Unconfined.

Mai ʻO ka loiloi palekana Kubernetes mua ua hoʻololi ʻia ma ka paʻamau seccom disabled. ʻO ia ke ʻano inā ʻaʻole ʻoe e hoʻonohonoho PodSecurityPolicy, ka mea e hiki ai iā ia i loko o ka pūʻulu, nā pods a pau i wehewehe ʻole ʻia ka ʻaoʻao seccomp e hana i loko seccomp=unconfined.

ʻO ka hana ʻana ma kēia ʻano, ʻo ia hoʻi, ua nalowale kahi papa insulation holoʻokoʻa e pale ai i ka pūpū. ʻAʻole ʻōlelo ʻia kēia ala e nā loea palekana.

Manaʻo kōkua # 4: ʻAʻohe ipu i loko o ka pūʻulu e holo i loko seccomp=unconfined, ʻoi aku ma nā wahi hana.

5. "Keʻano loiloi"

ʻAʻole kūʻokoʻa kēia helu i nā Kubernetes, akā hāʻule mau nō i ka ʻāpana "mea e ʻike ma mua o kou hoʻomaka ʻana".

E like me ka mea e hiki mai ana, ua paʻakikī mau ka hana ʻana i nā profile seccomp a hilinaʻi nui i ka hoʻāʻo a me ka hewa. ʻO ka ʻoiaʻiʻo ʻaʻole loaʻa i nā mea hoʻohana ka manawa e hoʻāʻo ai iā lākou i nā wahi hana me ka ʻole o ka "hoʻokuʻu" i ka noi.

Ma hope o ka hoʻokuʻu ʻia ʻana o ka Linux kernel 4.14, ua hiki ke holo i nā ʻāpana o ka ʻaoʻao i ke ʻano loiloi, e hoʻopaʻa ana i ka ʻike e pili ana i nā kelepona ʻōnaehana āpau i ka syslog, akā me ka ʻole o ka pale ʻana iā lākou. Hiki iā ʻoe ke hoʻāla i kēia ʻano me ka hoʻohana ʻana i ka parameter SCMT_ACT_LOG:

SCMP_ACT_LOG: ʻAʻole pili ka seccomp i ke kaula e hana ana i ke kelepona ʻōnaehana inā ʻaʻole i kūlike i kekahi lula i loko o ka kānana, akā e hoʻopaʻa ʻia ka ʻike e pili ana i ke kelepona ʻōnaehana.

Eia kahi hoʻolālā maʻamau no ka hoʻohana ʻana i kēia hiʻohiʻona:

  1. E ʻae i nā kelepona ʻōnaehana e pono ai.
  2. Kāohi i nā kelepona mai ka ʻōnaehana āu i ʻike ʻaʻole pono.
  3. E hoʻopaʻa i ka ʻike e pili ana i nā kelepona ʻē aʻe a pau ma ka log.

ʻO kahi hiʻohiʻona maʻalahi e like me kēia:

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

Akā, e hoʻomanaʻo pono ʻoe e ālai i nā kelepona a pau āu i ʻike ʻaʻole e hoʻohana ʻia a hiki ke hōʻeha i ka pūpū. ʻO kahi kumu maikaʻi no ka hōʻuluʻulu ʻana i kahi papa inoa ʻo ka luna Nā palapala Docker. E wehewehe kikoʻī i nā kelepona ʻōnaehana i kāohi ʻia i ka ʻaoʻao paʻamau a me ke kumu.

Eia naʻe, hoʻokahi hopu. ʻOiai SCMT_ACT_LOG kākoʻo ʻia e ka Linux kernel mai ka hopena o 2017, ua komo ʻo ia i ka kaiaola Kubernetes i kēia manawa wale nō. No laila, no ka hoʻohana ʻana i kēia ʻano, pono ʻoe i kahi Linux kernel 4.14 a me ka runC version ʻaʻole haʻahaʻa v1.0.0-rc9.

Manaʻo kōkua # 5: Hiki ke hana ʻia kahi hōʻike ʻano loiloi no ka hoʻāʻo ʻana i ka hana ma ka hui ʻana i nā papa inoa ʻeleʻele a me ke keʻokeʻo, a hiki ke hoʻopaʻa ʻia nā ʻokoʻa a pau.

6. E hoʻohana i nā papa inoa keʻokeʻo

Pono ʻo Whitelisting i ka hoʻoikaika hou ʻana no ka mea pono ʻoe e ʻike i kēlā me kēia kelepona e pono ai ka noi, akā hoʻomaikaʻi nui kēia ala i ka palekana:

Manaʻo nui ʻia e hoʻohana i ke ʻano whitelist no ka mea ʻoi aku ka maʻalahi a me ka hilinaʻi. Pono e hoʻonui hou ʻia ka papa inoa ʻeleʻele i kēlā me kēia manawa e hoʻohui ʻia kahi ʻōnaehana pilikia (a i ʻole he hae / koho inā aia ma ka papa inoa ʻeleʻele). Eia kekahi, hiki ke hoʻololi pinepine i ka hōʻike ʻana o kahi ʻāpana me ka ʻole o ka hoʻololi ʻana i kona ʻano a no laila e kāpae i nā palena o ka papa inoa ʻeleʻele.

No nā noi Go, ua hoʻomohala wau i kahi mea hana kūikawā e hele pū me ka noi a hōʻiliʻili i nā kelepona āpau i hana ʻia i ka wā o ka hoʻokō. No ka laʻana, no kēia noi:

package main

import "fmt"

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

... e hoʻolana kākou gosystract e like me kēia:

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

... a loaʻa iā mākou ka hopena aʻe:

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

I kēia manawa, he laʻana wale nō kēia—e hahai nā kikoʻī hou aku e pili ana i nā mea hana.

Manaʻo kōkua # 6: E ʻae wale i kēlā mau kelepona āu e pono ai a kāpae i nā mea ʻē aʻe.

7. E kau i nā kumu kūpono (a i ʻole e hoʻomākaukau no ka hana i manaʻo ʻole ʻia)

E hoʻokō ka kernel i ka ʻaoʻao me ka nānā ʻole i kāu mea e kākau ai i loko. ʻOiai ʻaʻole ia ka mea āu i makemake ai. No ka laʻana, inā ʻoe e ālai i ke komo ʻana i nā kelepona like exit ai ole ia, exit_group, ʻaʻole hiki i ka ipu ke pani pololei a hiki i kahi kauoha maʻalahi e like me echo hi e kau iā ia i lunao no ka manawa pau ole. ʻO ka hopena, e loaʻa iā ʻoe ka hoʻohana CPU kiʻekiʻe i ka pūʻulu:

Seccomp ma Kubernetes: 7 mau mea e pono ai ʻoe e ʻike mai ka hoʻomaka

I ia mau hihia, hiki i kahi mea hoʻohana ke hoʻopakele strace - e hōʻike ana i ke ʻano o ka pilikia:

Seccomp ma Kubernetes: 7 mau mea e pono ai ʻoe e ʻike mai ka hoʻomaka
sudo strace -c -p 9331

E hōʻoia i ka ʻaoʻao pili i nā kelepona ʻōnaehana āpau e pono ai ka noi i ka wā holo.

Manaʻo kōkua # 7: E noʻonoʻo i nā kikoʻī a e hōʻoia i ka papa inoa keʻokeʻo o nā kelepona pono āpau.

Hoʻopau kēia i ka ʻāpana mua o nā ʻatikala e pili ana i ka hoʻohana ʻana i ka seccomp ma Kubernetes ma ka ʻuhane o SecDevOps. Ma nā ʻāpana aʻe e kamaʻilio mākou e pili ana i ke kumu nui o kēia a pehea e hoʻomaʻamaʻa ai i ke kaʻina hana.

PS mai ka unuhi

E heluhelu pū ma kā mākou blog:

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka