ABC Kaamanan di Kubernetes: Auténtikasi, Otorisasina, Auditing
Moal lami deui atanapi engké, dina operasi sistem naon waé, masalah kaamanan timbul: mastikeun auténtikasi, pamisahan hak, pamariksaan sareng tugas sanés. Geus dijieun pikeun Kubernetes loba solusi, nu ngidinan Anjeun pikeun ngahontal minuhan standar malah dina lingkungan pisan nuntut... Bahan sarua devoted kana aspék dasar kaamanan dilaksanakeun dina mékanisme diwangun-di K8s. Anu mimiti, éta bakal mangpaat pikeun anu mimiti kenal sareng Kubernetes - salaku titik awal pikeun diajar masalah anu aya hubunganana sareng kaamanan.
Konfirmasi
Aya dua jinis pangguna dina Kubernetes:
Rekening jasa - akun anu dikelola ku API Kubernetes;
pamaké — Pamaké "normal" anu diurus ku jasa éksternal anu mandiri.
Beda utama antara jenis ieu nyaéta pikeun Akun Layanan aya objék khusus dina API Kubernetes (anjeunna disebut - ServiceAccounts), nu dihijikeun ka ngaranspasi sarta susunan data otorisasina disimpen dina klaster dina objék tina tipe Rahasia. Pamaké sapertos kitu (Akun Layanan) utamina dimaksudkeun pikeun ngatur hak aksés kana API Kubernetes prosés anu dijalankeun dina klaster Kubernetes.
Pamaké Biasa teu gaduh éntri dina API Kubernetes: aranjeunna kedah diurus ku mékanisme éksternal. Éta dimaksudkeun pikeun jalma atanapi prosés anu hirup di luar klaster.
Unggal pamundut API pakait sareng Akun Layanan, Pamaké, atanapi dianggap anonim.
Data auténtikasi pangguna kalebet:
ngaran nu maké - ngaran pamaké (sénsitip leutik!);
UID - string idéntifikasi pamaké nu bisa dibaca mesin nu "leuwih konsisten tur unik ti ngaran pamaké";
Grup - daptar grup nu pamaké milik;
tambahan - widang tambahan nu bisa dipaké ku mékanisme otorisasina.
Kubernetes tiasa ngagunakeun angka nu gede ngarupakeun mékanisme auténtikasi: sertipikat X509, tokens Bearer, authenticating proxy, HTTP Auth Dasar. Nganggo mékanisme ieu, anjeun tiasa nerapkeun sajumlah ageung skéma otorisasi: tina file statik sareng kecap akses ka OpenID OAuth2.
Leuwih ti éta, kasebut nyaéta dimungkinkeun pikeun ngagunakeun sababaraha schemes otorisasina sakaligus. Sacara standar, klaster ngagunakeun:
token akun jasa - pikeun Akun Layanan;
X509 - pikeun Pamaké.
Patarosan ngeunaan ngatur ServiceAccounts saluareun ruang lingkup artikel ieu, tapi pikeun maranéhanana anu hayang familiarize diri jeung masalah ieu dina leuwih jéntré, abdi nyarankeun dimimitian ku. kaca dokuméntasi resmi. Urang bakal ningali langkung caket kana masalah kumaha sertipikat X509 jalan.
Sertipikat pikeun pamaké (X.509)
Cara klasik pikeun damel sareng sertipikat ngalibatkeun:
ngolah pamundut sertipikat ngagunakeun kenop Kubernetes klaster CA, meunangkeun sertipikat pamaké (pikeun ménta sertipikat, Anjeun kudu make akun nu boga aksés ka konci Kubernetes klaster CA, nu sacara standar lokasina di /etc/kubernetes/pki/ca.key):
Pikeun ngagampangkeun nransfer konfigurasi antara akun sareng server, mangpaat pikeun ngédit nilai-nilai konci ieu:
certificate-authority
client-certificate
client-key
Jang ngalampahkeun ieu, anjeun tiasa encode file anu ditunjukkeun dina aranjeunna nganggo base64 sareng ngadaptarkeunana dina konfigurasi, nambihan sufiks kana nami konci. -data, i.e. sanggeus narima certificate-authority-data jeung sajabana
Sertipikat sareng kubeadm
Kalayan ngaleupaskeun Kubernet 1.15 gawé bareng sertipikat geus jadi loba gampang berkat versi alfa pangrojong na di utiliti kubeadm. Salaku conto, ieu mangrupikeun anu ngahasilkeun file konfigurasi nganggo konci pangguna ayeuna sigana sapertos:
kubeadm alpha kubeconfig user --client-name=mynewuser --apiserver-advertise-address 192.168.100.200
NB: Diperlukeun alamat ngiklankeun tiasa dipendakan dina konfigurasi api-server, anu sacara standar aya di /etc/kubernetes/manifests/kube-apiserver.yaml.
Konfigurasi anu dihasilkeun bakal kaluaran ka stdout. Ieu perlu disimpen dina ~/.kube/config akun pamaké atawa kana file nu ditangtukeun dina variabel lingkungan KUBECONFIG.
Ngali Deeper
Pikeun anu hoyong ngartos masalah anu dijelaskeun langkung lengkep:
tulisan misah dina gawé bareng sertipikat dina dokuméntasi resmi Kubernetes;
Akun otorisasi standar teu gaduh hak pikeun beroperasi dina kluster. Pikeun masihan idin, Kubernetes nerapkeun mékanisme otorisasi.
Sateuacan versi 1.6, Kubernetes nganggo jinis otorisasi anu disebut ABAC (Kadali aksés dumasar-atribut). Rincian ngeunaan éta tiasa dipendakan dina dokuméntasi resmi. Pendekatan ieu ayeuna dianggap warisan, tapi anjeun masih tiasa dianggo sareng jinis auténtikasi anu sanés.
Cara ayeuna (sareng langkung fleksibel) ngabagi hak aksés kana klaster disebut basa sunda (Kontrol aksés dumasar peran). Eta geus dinyatakeun stabil saprak versi Kubernet 1.8. RBAC nerapkeun modél hak dimana sagala hal anu henteu diidinan sacara eksplisit dilarang. Pikeun ngaktipkeun RBAC, Anjeun kudu ngamimitian Kubernetes api-server jeung parameter --authorization-mode=RBAC. Parameter disetél dina manifest kalayan konfigurasi api-server, anu sacara standar aya di sapanjang jalur /etc/kubernetes/manifests/kube-apiserver.yaml, dina bagian command. Nanging, RBAC parantos diaktipkeun sacara standar, janten kamungkinan anjeun henteu kedah hariwang ngeunaan éta: anjeun tiasa pariksa ieu ku nilai authorization-mode (dina anu parantos disebatkeun kube-apiserver.yaml). Ku jalan kitu, diantara harti na meureun aya tipe séjén otorisasina (node, webhook, always allow), tapi urang bakal ninggalkeun tinimbangan maranéhanana di luar lingkup materi.
Ku jalan kitu, kami geus diterbitkeun tulisan kalayan katerangan anu cukup rinci ngeunaan prinsip sareng fitur gawé bareng RBAC, janten salajengna kuring bakal ngawatesan diri kana daptar ringkes dasar sareng conto.
Éntitas API di handap ieu dipaké pikeun ngadalikeun aksés di Kubernetes via RBAC:
Role и ClusterRole - kalungguhan anu ngagambarkeun hak aksés:
Role ngidinan Anjeun pikeun ngajelaskeun hak dina spasi ngaran;
ClusterRole - dina kluster, kaasup kana objék husus kluster sapertos titik, url non-sumberdaya (nyaéta henteu aya hubunganana sareng sumber Kubernetes - contona, /version, /logs, /api*);
RoleBinding и ClusterRoleBinding - dipaké pikeun ngariung Role и ClusterRole ka pamaké, grup pamaké atawa ServiceAccount.
Peran jeung RoleBinding éntitas diwatesan ku namespace, i.e. kedah aya dina rohangan ngaran anu sami. Nanging, RoleBinding tiasa ngarujuk kana ClusterRole, anu ngamungkinkeun anjeun nyiptakeun sakumpulan idin umum sareng ngontrol aksés ngagunakeunana.
Peran ngajelaskeun hak ngagunakeun set aturan anu ngandung:
Grup API - tingali dokuméntasi resmi ku apiGroups jeung output kubectl api-resources;
Kecap pagawéan (kecap gawe: set, update teras salajengna.).
ngaran sumberdaya (resourceNames) - pikeun kasus nalika anjeun kedah nyayogikeun aksés kana sumber daya khusus, sareng henteu ka sadaya sumber tina jinis ieu.
Analisis otorisasi anu langkung rinci dina Kubernetes tiasa dipendakan dina halaman dokuméntasi resmi. Gantina (atawa rada, salian ieu), abdi bakal masihan conto nu ngagambarkeun karya nya.
Conto éntitas RBAC
Basajan Role, anu ngamungkinkeun anjeun kéngingkeun daptar sareng status pod sareng ngawas aranjeunna dina rohangan ngaran target-namespace:
conto ClusterRole, anu ngamungkinkeun anjeun kéngingkeun daptar sareng status pod sareng ngawas aranjeunna sapanjang kluster:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# секции "namespace" нет, так как ClusterRole задействует весь кластер
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
conto RoleBinding, nu ngidinan pamaké mynewuser "baca" pods dina namespace my-namespace:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: target-namespace
subjects:
- kind: User
name: mynewuser # имя пользователя зависимо от регистра!
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role # здесь должно быть “Role” или “ClusterRole”
name: pod-reader # имя Role, что находится в том же namespace,
# или имя ClusterRole, использование которой
# хотим разрешить пользователю
apiGroup: rbac.authorization.k8s.io
Audit acara
Sacara skéma, arsitéktur Kubernetes bisa digambarkeun saperti kieu:
Auditing sistem mangrupikeun fitur anu pikaresepeun dina Kubernetes, anu ditumpurkeun sacara standar. Éta ngamungkinkeun anjeun log sadaya telepon ka API Kubernetes. Sakumaha anjeun tiasa nebak, sadaya tindakan anu aya hubunganana sareng ngawaskeun sareng ngarobih kaayaan klaster dilaksanakeun ngalangkungan API ieu. Katerangan anu hadé ngeunaan kamampuanna tiasa (sapertos biasa) dipendakan dina dokuméntasi resmi K8s. Salajengna, abdi bakal nyobian nampilkeun topik dina basa basajan.
Ku kituna, pikeun ngaktipkeun auditing, urang kudu lulus tilu parameter diperlukeun kana wadahna di api-server, nu dijelaskeun dina leuwih jéntré di handap:
Salian tilu parameter ieu diperlukeun, aya loba setelan tambahan patali auditing: ti rotasi log nepi ka déskripsi webhook. Conto parameter rotasi log:
--audit-log-maxbackup=10
--audit-log-maxsize=100
--audit-log-maxage=7
Tapi kami moal ngémutan aranjeunna langkung rinci - anjeun tiasa mendakan sadaya detil dokuméntasi kube-apiserver.
Sakumaha anu parantos disebatkeun, sadaya parameter disetél dina manifest kalayan konfigurasi api-server (sacara standar /etc/kubernetes/manifests/kube-apiserver.yaml), dina bagian command. Hayu urang balik deui ka 3 parameter anu diperyogikeun sareng analisa aranjeunna:
audit-policy-file - jalur ka file YAML ngajéntrékeun kawijakan Inok. Urang bakal balik deui ka eusina engké, tapi pikeun ayeuna kuring bakal dicatet yén file kudu bisa dibaca ku prosés api-server. Ku alatan éta, perlu dipasang di jero wadahna, nu Anjeun bisa nambah kodeu handap kana bagian luyu tina config nu:
RequestResponse - metadata log, badan pamundut sareng badan réspon.
Dua tingkatan terakhir (Request и RequestResponse) ulah asup log requests nu teu ngakses sumberdaya (aksés ka disebut non-sumberdaya url).
Ogé sagala requests ngaliwatan sababaraha tahapan:
RequestReceived - tahap nalika pamundut ditampi ku prosesor sareng henteu acan dikirimkeun langkung jauh sapanjang ranté prosesor;
ResponseStarted - headers respon dikirim, tapi saméméh awak respon dikirim. Dihasilkeun pikeun patarosan anu panjang (contona, watch);
ResponseComplete - badan réspon parantos dikirim, teu aya inpormasi anu langkung seueur anu bakal dikirim;
Panic - kajadian anu dihasilkeun nalika kaayaan abnormal dideteksi.
Pikeun ngalangkungan léngkah-léngkah anu anjeun tiasa dianggo omitStages.
Dina file kawijakan, urang tiasa ngajelaskeun sababaraha bagian kalayan tingkat logging anu béda. Aturan cocog munggaran kapanggih dina pedaran kawijakan bakal dilarapkeun.
Daemon kubelet ngawas parobahan dina manifes ku konfigurasi api-server sareng, upami aya anu dideteksi, balikan deui wadahna nganggo api-server. Tapi aya hiji rinci penting: parobahan dina file kawijakan bakal dipaliré ku eta. Saatos ngadamel parobihan kana file kawijakan, anjeun kedah ngabalikan deui api-server sacara manual. Kusabab api-server dimimitian salaku pod statik, tim kubectl delete moal ngabalukarkeun eta balikan deui. Anjeun kedah ngalakukeunana sacara manual docker stop on kube-masters, dimana kawijakan audit geus robah:
Nalika ngaktipkeun auditing, hal anu penting pikeun nginget éta beban dina kube-apiserver naek. Khususna, konsumsi mémori pikeun neundeun kontéks paménta ningkat. Logging dimimitian ngan sanggeus lulugu respon dikirim. Beban ogé gumantung kana konfigurasi kawijakan Inok.
Conto kawijakan
Hayu urang tingali struktur file kawijakan nganggo conto.
Ieu file basajan policypikeun log sadayana dina tingkat Metadata:
Dina kawijakan anjeun tiasa netepkeun daptar pangguna (Users и ServiceAccounts) jeung grup pamaké. Contona, ieu kumaha urang bakal malire pamaké sistem, tapi log sagalana sejenna dina tingkat nu Request:
Pikeun gancang ngabales acara Inok, mungkin ngajelaskeun webhook. masalah ieu katutupan di dokuméntasi resmi, Kuring bakal ninggalkeun eta di luar ruang lingkup artikel ieu.
hasil
Tulisan éta nyayogikeun tinjauan mékanisme kaamanan dasar dina klaster Kubernetes, anu ngamungkinkeun anjeun nyiptakeun akun pangguna anu dipersonalisasi, misahkeun hakna, sareng ngarékam tindakanna. Muga-muga aya mangpaatna pikeun anu disanghareupan ku pasualan-pasualan sapertos kitu dina teori atanapi prakna. Kuring ogé nyarankeun yén anjeun maca daptar bahan séjén dina topik kaamanan di Kubernetes, anu dirumuskeun dina "PS" - meureun diantara aranjeunna anjeun bakal manggihan rinci diperlukeun dina masalah anu relevan pikeun anjeun.