Seccomp ing Kubernetes: 7 perkara sing kudu dingerteni wiwit wiwitan

Cathetan. nerjemahake.: We present menyang manungsa waé terjemahan saka artikel dening senior aplikasi keamanan engineer ing perusahaan Inggris ASOS.com. Kanthi iku, dheweke miwiti seri publikasi khusus kanggo nambah keamanan ing Kubernetes liwat nggunakake seccomp. Yen maca kaya pitepangan, kita bakal tindakake penulis lan terus karo materi mangsa ing topik iki.

Seccomp ing Kubernetes: 7 perkara sing kudu dingerteni wiwit wiwitan

Artikel iki minangka sing pisanan saka seri kiriman babagan carane nggawe profil seccomp kanthi semangat SecDevOps, tanpa nggunakake sihir lan ilmu sihir. Ing Bagean XNUMX, aku bakal nyakup dhasar lan rincian internal babagan implementasi seccomp ing Kubernetes.

Ekosistem Kubernetes nawakake macem-macem cara kanggo ngamanake lan ngisolasi wadhah. Artikel kasebut babagan Mode Komputasi Aman, uga dikenal minangka sekomp. Intine yaiku nyaring panggilan sistem sing kasedhiya kanggo eksekusi dening kontaner.

Apa sebabe penting? Wadhah mung minangka proses sing mlaku ing mesin tartamtu. Lan nggunakake kernel kaya aplikasi liyane. Yen kontaner bisa nindakake telpon sistem apa wae, enggal malware bakal njupuk kauntungan saka iki kanggo ngliwati isolasi wadah lan mengaruhi aplikasi liyane: informasi nyegat, ngganti setelan sistem, lsp.

profil seccom nemtokake panggilan sistem sing kudu diidini utawa dipateni. Runtime wadhah ngaktifake nalika diwiwiti supaya kernel bisa ngawasi eksekusi. Nggunakake profil kasebut ngidini sampeyan mbatesi vektor serangan lan nyuda karusakan yen ana program ing wadhah kasebut (yaiku, dependensi sampeyan, utawa dependensi) wiwit nindakake apa sing ora diidini.

Njupuk dhasar

Profil seccom dhasar kalebu telung unsur: defaultAction, architectures (utawa archMap) lan 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 nemtokake nasib standar sembarang telpon sistem ora kasebut ing bagean syscalls. Kanggo nggawe luwih gampang, ayo fokus ing rong nilai utama sing bakal digunakake:

  • SCMP_ACT_ERRNO - ngalangi eksekusi panggilan sistem,
  • SCMP_ACT_ALLOW - ngidini.

bagean architectures arsitektur target wis kadhaptar. Iki penting amarga panyaring dhewe, sing ditrapake ing tingkat kernel, gumantung marang pengenal telpon sistem, lan dudu jeneng sing ditemtokake ing profil kasebut. Wadhah runtime bakal cocog karo pengenal sadurunge digunakake. Gagasan kasebut yaiku panggilan sistem bisa duwe ID sing beda-beda gumantung saka arsitektur sistem. Contone, telpon sistem recvfrom (digunakake kanggo nampa informasi saka soket) wis ID = 64 ing sistem x64 lan ID = 517 ing x86. iku sampeyan bisa nemokake dhaptar kabeh panggilan sistem kanggo arsitektur x86-x64.

Ing bagean syscalls dhaptar kabeh panggilan sistem lan nemtokake apa sing kudu ditindakake. Contone, sampeyan bisa nggawe whitelist kanthi nyetel defaultAction ing SCMP_ACT_ERRNO, lan nelpon ing bagean syscalls nemtokaken SCMP_ACT_ALLOW. Mangkono, sampeyan mung ngidini telpon sing ditemtokake ing bagean kasebut syscalls, lan nglarang kabeh liyane. Kanggo dhaptar ireng sampeyan kudu ngganti nilai defaultAction lan tumindak kanggo ngelawan.

Saiki kita kudu ngomong sawetara tembung babagan nuansa sing ora pati jelas. Wigati dimangerteni manawa rekomendasi ing ngisor iki nganggep yen sampeyan nggunakake baris aplikasi bisnis ing Kubernetes lan sampeyan pengin supaya bisa digunakake kanthi jumlah hak istimewa sing paling sithik.

1. AllowPrivilegeEscalation=palsu

В securityContext wadhah duwe parameter AllowPrivilegeEscalation. Yen wis diinstal ing false, kontainer bakal diwiwiti karo (on) dicokot no_new_priv. Makna parameter iki jelas saka jeneng kasebut: ngalangi wadhah kasebut ora ngluncurake proses anyar kanthi hak istimewa luwih akeh tinimbang sing diduweni.

A efek sisih opsi iki disetel kanggo true (standar) iku runtime wadhah aplikasi profil seccom ing awal banget proses wiwitan. Mangkono, kabeh panggilan sistem sing dibutuhake kanggo mbukak proses runtime internal (contone, nyetel ID pangguna / grup, ngeculake kemampuan tartamtu) kudu diaktifake ing profil.

Marang wadhah sing nindakake perkara sepele echo hi, ijin ing ngisor iki bakal dibutuhake:

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

... tinimbang iki:

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

Nanging maneh, kenapa iki masalah? Secara pribadi, aku bakal ngindhari dhaptar putih ing telpon sistem ing ngisor iki (kajaba ana kabutuhan nyata): capset, set_tid_address, setgid, setgroups и setuid. Nanging, tantangan nyata yaiku kanthi ngidini pangolahan sing pancen ora bisa dikontrol, sampeyan ngubungake profil menyang implementasi runtime wadhah. Ing tembung liyane, ing sawijining dina sampeyan bisa nemokake manawa sawise nganyari lingkungan runtime wadhah (sampeyan utawa, luwih mungkin, dening panyedhiya layanan maya), wadhah kasebut dumadakan mandheg.

Tip # 1: Run wadhah karo AllowPrivilegeEscaltion=false. Iki bakal nyuda ukuran profil seccom lan nggawe wong kurang sensitif marang owah-owahan ing lingkungan runtime wadhah.

2. Nyetel profil seccom ing tingkat wadhah

Profil seccom bisa disetel ing tingkat pod:

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

...utawa ing tingkat wadhah:

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

Wigati dimangerteni yen sintaks ing ndhuwur bakal diganti nalika Kubernetes seccomp bakal dadi GA (acara iki samesthine ing release sabanjuré saka Kubernetes - 1.18 - approx. transl.).

Sawetara wong ngerti yen Kubernetes wis tau bugsing nyebabake profil seccom diterapake ngaso wadhah. Lingkungan runtime sebagian menehi ganti rugi kanggo kekurangan iki, nanging wadhah iki ora ilang saka pods, amarga digunakake kanggo ngatur infrastruktur.

Masalah iku wadhah iki tansah diwiwiti karo AllowPrivilegeEscalation=true, anjog kanggo masalah voiced ing paragraf 1, lan iki ora bisa diganti.

Kanthi nggunakake profil seccomp ing tingkat wadhah, sampeyan bisa nyegah pitfall iki lan bisa nggawe profil sing dicocogake kanggo wadhah tartamtu. Iki kudu rampung nganti pangembang ndandani bug lan versi anyar (bisa uga 1.18?) kasedhiya kanggo kabeh wong.

Tip # 2: Setel profil seccom ing tingkat wadhah.

Ing pangertèn praktis, aturan iki biasane dadi jawaban universal kanggo pitakonan: "Napa profil seccompku bisa digunakake docker runnanging ora bisa sawise nyebarke menyang cluster Kubernetes?

3. Gunakake runtime / standar mung minangka Resor pungkasan

Kubernetes duwe rong pilihan kanggo profil sing dibangun: runtime/default и docker/default. Loro-lorone dileksanakake dening runtime wadhah, dudu Kubernetes. Mulane, bisa beda-beda gumantung saka lingkungan runtime sing digunakake lan versi.

Ing tembung liyane, minangka asil saka owah-owahan runtime, wadhah bisa duwe akses menyang pesawat beda saka telpon sistem, kang bisa utawa ora bisa digunakake. Paling runtimes digunakake Implementasi Docker. Yen sampeyan pengin nggunakake profil iki, priksa manawa iku cocok kanggo sampeyan.

profile docker/default wis ora digunakake wiwit Kubernetes 1.11, mula aja nganggo.

Ing mratelakake panemume, profil runtime/default cocog banget kanggo tujuan sing digawe: nglindhungi pangguna saka risiko sing ana gandhengane karo nglakokake perintah docker run ing mobil sing. Nanging, nalika nerangake aplikasi bisnis sing mlaku ing kluster Kubernetes, aku bakal wani mbantah manawa profil kasebut mbukak banget lan pangembang kudu fokus ing nggawe profil kanggo aplikasi kasebut (utawa jinis aplikasi).

Tip # 3: Nggawe profil seccom kanggo aplikasi tartamtu. Yen iki ora bisa, nggawe profil kanggo jinis aplikasi, contone, nggawe profil majeng sing kalebu kabeh web API saka aplikasi Golang. Mung nggunakake runtime / standar minangka pilihan pungkasan.

Ing kiriman sabanjure, aku bakal nutupi carane nggawe profil seccomp sing diilhami dening SecDevOps, ngotomatisasi, lan nyoba ing saluran pipa. Ing tembung liya, sampeyan ora duwe alesan kanggo ora nganyarke menyang profil khusus aplikasi.

4. Unconfined ora pilihan.

Saka audit keamanan Kubernetes pisanan pranyata iku minangka standar seccom dipatèni. Iki tegese yen sampeyan ora nyetel PodSecurityPolicy, sing bakal ngaktifake ing kluster, kabeh pod sing profil seccomp ora ditetepake bakal bisa digunakake seccomp=unconfined.

Operasi ing mode iki tegese kabeh lapisan insulasi ilang sing nglindhungi kluster. Pendekatan iki ora dianjurake dening pakar keamanan.

Tip # 4: Ora ana wadhah ing kluster kudu mlaku seccomp=unconfined, utamané ing lingkungan produksi.

5. "Mode Audit"

Titik iki ora unik kanggo Kubernetes, nanging isih ana ing kategori "prekara sing kudu dingerteni sadurunge sampeyan miwiti".

Kaya sing kedadeyan, nggawe profil seccomp mesthi nantang lan gumantung banget marang nyoba lan kesalahan. Kasunyatane yaiku pangguna mung ora duwe kesempatan kanggo nyoba ing lingkungan produksi tanpa menehi risiko "nempelake" aplikasi kasebut.

Sawise rilis kernel Linux 4.14, bisa mbukak bagean profil ing mode audit, ngrekam informasi babagan kabeh panggilan sistem ing syslog, nanging tanpa ngalangi. Sampeyan bisa ngaktifake mode iki nggunakake parameter SCMT_ACT_LOG:

SCMP_ACT_LOG: seccomp ora bakal mengaruhi Utas nggawe telpon sistem yen ora cocog karo aturan ing Filter, nanging informasi bab telpon sistem bakal mlebu.

Mangkene strategi khas kanggo nggunakake fitur iki:

  1. Ngidini telpon sistem sing dibutuhake.
  2. Blokir telpon saka sistem sing sampeyan ngerti ora bakal migunani.
  3. Rekam informasi babagan kabeh telpon liyane ing log.

Conto sing disederhanakake katon kaya iki:

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

Nanging elinga yen sampeyan kudu mblokir kabeh telpon sing sampeyan ngerti ora bakal digunakake lan bisa nyebabake kluster kasebut. Dasar sing apik kanggo nyusun dhaptar yaiku resmi Dokumentasi Docker. Iki nerangake kanthi rinci babagan panggilan sistem sing diblokir ing profil standar lan ngapa.

Nanging, ana siji nyekel. sanadyan SCMT_ACT_LOG didhukung dening kernel Linux wiwit pungkasan taun 2017, mlebu ing ekosistem Kubernetes mung bubar. Mula, kanggo nggunakake metode iki sampeyan butuh kernel Linux 4.14 lan versi runC ora luwih murah v1.0.0-rc9.

Tip # 5: Profil mode audit kanggo testing ing produksi bisa digawe kanthi nggabungake dhaptar ireng lan putih, lan kabeh pangecualian bisa mlebu.

6. Gunakake whitelists

Whitelisting mbutuhake gaweyan tambahan amarga sampeyan kudu ngenali saben telpon sing bisa dibutuhake aplikasi, nanging pendekatan iki nambah keamanan:

Disaranake nggunakake pendekatan whitelist amarga luwih gampang lan dipercaya. Dhaptar ireng kudu dianyari nalika ana telpon sistem sing bisa mbebayani (utawa gendéra / pilihan sing mbebayani yen ana ing daftar ireng) ditambahake. Kajaba iku, asring bisa ngganti perwakilan parameter tanpa ngganti inti lan kanthi mangkono ngliwati watesan dhaptar ireng.

Kanggo aplikasi Go, aku ngembangake alat khusus sing ngiringi aplikasi kasebut lan ngumpulake kabeh telpon sing digawe nalika eksekusi. Contone, kanggo aplikasi ing ngisor iki:

package main

import "fmt"

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

... ayo diluncurake gosystract supaya:

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

... lan kita entuk asil ing ngisor iki:

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

Saiki, iki mung conto - rincian liyane babagan alat sing bakal ditindakake.

Tip # 6: Mung ngidini telpon sing pancene perlu lan mblokir kabeh liyane.

7. Nggawe dhasar sing bener (utawa nyiapake tumindak sing ora dikarepake)

Kernel bakal ngetrapake profil kasebut preduli saka apa sing sampeyan tulis. Sanajan ora persis sing dikarepake. Contone, yen sampeyan mblokir akses menyang telpon kaya exit utawa exit_group, wadhah ora bakal bisa mati kanthi bener lan malah prentah prasaja kaya echo hi gantung dhewekeo kanggo wektu sing ora ditemtokake. Akibaté, sampeyan bakal entuk panggunaan CPU sing dhuwur ing kluster:

Seccomp ing Kubernetes: 7 perkara sing kudu dingerteni wiwit wiwitan

Ing kasus kaya mengkono, sarana bisa teka kanggo ngluwari strace - bakal nuduhake apa masalahe:

Seccomp ing Kubernetes: 7 perkara sing kudu dingerteni wiwit wiwitan
sudo strace -c -p 9331

Priksa manawa profil ngemot kabeh panggilan sistem sing dibutuhake aplikasi nalika runtime.

Tip # 7: Pay manungsa waé kanggo rinci lan priksa manawa kabeh telpon sistem perlu wis whitelisted.

Iki nyimpulake bagean pisanan saka seri artikel babagan nggunakake seccomp ing Kubernetes kanthi semangat SecDevOps. Ing bagean ing ngisor iki kita bakal ngomong babagan kenapa iki penting lan cara ngotomatisasi proses kasebut.

PS saka penerjemah

Waca uga ing blog kita:

Source: www.habr.com

Add a comment