ABC Keamanan ing Kubernetes: Authentication, Wewenang, Auditing
Cepet utawa mengko, ing operasi sistem apa wae, masalah keamanan muncul: njamin otentikasi, pamisahan hak, audit lan tugas liyane. Wis digawe kanggo Kubernetes akeh solusi, sing ngijini sampeyan kanggo entuk selaras karo standar malah ing lingkungan banget nuntut... Materi padha pengabdian kanggo aspèk dhasar saka keamanan dipun ginakaken ing mekanisme dibangun ing K8s. Kaping pisanan, bakal migunani kanggo wong-wong sing wiwit kenal karo Kubernetes - minangka titik wiwitan kanggo sinau babagan masalah keamanan.
Otentikasi
Ana rong jinis pangguna ing Kubernetes:
Akun Layanan - akun sing dikelola dening Kubernetes API;
pangguna — Pangguna "normal" sing dikelola dening eksternal, layanan independen.
Bentenipun utama ing antarane jinis iki yaiku kanggo Akun Layanan ana obyek khusus ing API Kubernetes (sing diarani - ServiceAccounts), sing disambungake menyang ruang jeneng lan sakumpulan data wewenang sing disimpen ing kluster ing obyek saka jinis Rahasia. Pangguna kasebut (Akun Layanan) utamane dimaksudake kanggo ngatur hak akses menyang API Kubernetes proses sing mlaku ing kluster Kubernetes.
Pangguna Biasa ora duwe entri ing API Kubernetes: kudu dikelola kanthi mekanisme eksternal. Iki ditrapake kanggo wong utawa proses sing manggon ing njaba kluster.
Saben panjalukan API digandhengake karo Akun Layanan, Panganggo, utawa dianggep anonim.
Data otentikasi pangguna kalebu:
Jeneng - jeneng pangguna (sensitif cilik!);
UID - string identifikasi pangguna sing bisa diwaca mesin sing "luwih konsisten lan unik tinimbang jeneng panganggo";
Groups - dhaptar klompok sing dadi pangguna pangguna;
Tambahan - lapangan tambahan sing bisa digunakake dening mekanisme wewenang.
Kubernetes bisa nggunakake akeh mekanisme otentikasi: sertifikat X509, Token Bearer, proxy otentikasi, Otentikasi Dasar HTTP. Nggunakake mekanisme kasebut, sampeyan bisa ngetrapake skema wewenang sing akeh: saka file statis kanthi sandhi menyang OpenID OAuth2.
Kajaba iku, sampeyan bisa nggunakake sawetara skema wewenang bebarengan. Kanthi gawan, kluster nggunakake:
token akun layanan - kanggo Akun Layanan;
X509 - kanggo Pangguna.
Pitakonan babagan ngatur ServiceAccounts ngluwihi ruang lingkup artikel iki, nanging kanggo wong-wong sing pengin ngerti masalah iki kanthi luwih rinci, aku nyaranake miwiti karo kaca dokumentasi resmi. Kita bakal nliti masalah babagan cara kerja sertifikat X509.
ngolah panjalukan sertifikat nggunakake tombol CA cluster Kubernetes, entuk sertifikat pangguna (kanggo entuk sertifikat, sampeyan kudu nggunakake akun sing nduweni akses menyang kunci CA cluster Kubernetes, sing minangka standar dumunung ing /etc/kubernetes/pki/ca.key):
Kanggo luwih gampang nransfer konfigurasi ing antarane akun lan server, migunani kanggo ngowahi nilai tombol ing ngisor iki:
certificate-authority
client-certificate
client-key
Kanggo nindakake iki, sampeyan bisa ngodhe file sing ditemtokake ing nggunakake base64 lan ndhaftar ing konfigurasi, nambah suffix ing jeneng tombol. -data, i.e. wis nampa certificate-authority-data lan kaya.
Sertifikat karo kubeadm
Kanthi release Kubernetes 1.15 nggarap sertifikat wis dadi luwih gampang thanks kanggo versi alpha support ing utilitas kubeadm. Contone, iki bisa uga katon kaya nggawe file konfigurasi nganggo tombol pangguna:
kubeadm alpha kubeconfig user --client-name=mynewuser --apiserver-advertise-address 192.168.100.200
NB: Dibutuhake alamat pariwara bisa ditemokake ing konfigurasi api-server, sing minangka standar dumunung ing /etc/kubernetes/manifests/kube-apiserver.yaml.
Konfigurasi sing diasilake bakal dadi output menyang stdout. Perlu disimpen ing ~/.kube/config akun pangguna utawa menyang file sing ditemtokake ing variabel lingkungan KUBECONFIG.
Dig Deeper
Kanggo sing pengin ngerti masalah sing diterangake luwih jero:
artikel kapisah babagan nggarap sertifikat ing dokumentasi resmi Kubernetes;
Akun sah standar ora duwe hak kanggo operate ing kluster. Kanggo menehi ijin, Kubernetes ngetrapake mekanisme wewenang.
Sadurunge versi 1.6, Kubernetes nggunakake jinis wewenang sing diarani ABAC (Kontrol akses adhedhasar atribut). Rincian babagan iki bisa ditemokake ing dokumentasi resmi. Pendekatan iki saiki dianggep warisan, nanging sampeyan isih bisa nggunakake bebarengan karo jinis otentikasi liyane.
Cara saiki (lan luwih fleksibel) kanggo mbagi hak akses menyang kluster diarani RBAC (Kontrol akses adhedhasar peran). Wis diumumake stabil wiwit versi Kubernetes 1.8. RBAC ngleksanakake model hak kang kabeh sing ora tegas diijini dilarang. Kanggo ngaktifake RBAC, sampeyan kudu miwiti Kubernetes api-server karo parameter --authorization-mode=RBAC. Parameter disetel ing manifes kanthi konfigurasi api-server, sing minangka standar dumunung ing sadawane dalan /etc/kubernetes/manifests/kube-apiserver.yaml, ing bagean command. Nanging, RBAC wis diaktifake kanthi standar, mula sampeyan ora perlu kuwatir: sampeyan bisa verifikasi iki kanthi nilai authorization-mode (ing sing wis kasebut kube-apiserver.yaml). Miturut cara, ing antarane makna kasebut bisa uga ana jinis wewenang liyane (node, webhook, always allow), nanging kita bakal ninggalake pertimbangan ing njaba ruang lingkup materi.
Miturut cara, kita wis diterbitake artikel kanthi katrangan sing cukup rinci babagan prinsip lan fitur nggarap RBAC, mula aku bakal mbatesi aku kanthi ringkes babagan dhasar lan conto.
Entitas API ing ngisor iki digunakake kanggo ngontrol akses ing Kubernetes liwat RBAC:
Role и ClusterRole - peran sing njlèntrèhaké hak akses:
Role ngijini sampeyan kanggo njlèntrèhaké hak ing namespace;
ClusterRole - ing kluster, kalebu obyek khusus kluster kayata simpul, url non-sumber daya (yaiku ora ana hubungane karo sumber daya Kubernetes - contone, /version, /logs, /api*);
RoleBinding и ClusterRoleBinding - digunakake kanggo naleni Role и ClusterRole menyang pangguna, grup pangguna utawa ServiceAccount.
Entitas RoleBinding lan RoleBinding diwatesi dening namespace, yaiku. kudu ana ing papan jeneng sing padha. Nanging, RoleBinding bisa ngrujuk ClusterRole, sing ngidini sampeyan nggawe set ijin umum lan ngontrol akses nggunakake.
Peran nggambarake hak nggunakake set aturan sing ngemot:
kelompok API - ndeleng dokumentasi resmi dening apiGroups lan output kubectl api-resources;
sumber daya (Sumber daya: pod, namespace, deployment lan liya-liyane.);
Tembung kriya (tembung kriya: set, update lsp).
jeneng sumber daya (resourceNames) - kanggo kasus nalika sampeyan kudu nyedhiyani akses menyang sumber tartamtu, lan ora kanggo kabeh sumber daya saka jinis iki.
Analisis wewenang sing luwih rinci ing Kubernetes bisa ditemokake ing kaca kasebut dokumentasi resmi. Nanging (utawa luwih, saliyane iki), aku bakal menehi conto sing nggambarake karyane.
Conto entitas RBAC
Prasaja Role, sing ngidini sampeyan entuk dhaptar lan status pod lan ngawasi ing ruang jeneng target-namespace:
Conto: ClusterRole, sing ngidini sampeyan entuk dhaptar lan status pod lan ngawasi kabeh klompok kasebut:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# секции "namespace" нет, так как ClusterRole задействует весь кластер
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
Conto: RoleBinding, sing ngidini pangguna mynewuser "maca" pods ing 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
Secara skematis, arsitektur Kubernetes bisa diwakili kaya ing ngisor iki:
Audit sistem minangka fitur menarik ing Kubernetes, sing dipateni kanthi standar. Ngidini sampeyan mlebu kabeh telpon menyang API Kubernetes. Minangka sampeyan bisa ngira, kabeh tumindak sing ana gandhengane karo ngawasi lan ngganti kahanan kluster ditindakake liwat API iki. Katrangan sing apik babagan kemampuane bisa ditemokake (kaya biasane) ing dokumentasi resmi k8s. Sabanjure, aku bakal nyoba nyritakake topik kasebut kanthi basa sing luwih gampang.
Supaya kanggo ngaktifake audit, kita kudu ngliwati telung parameter sing dibutuhake menyang wadhah ing api-server, sing diterangake kanthi luwih rinci ing ngisor iki:
Saliyane telung parameter sing dibutuhake, ana akeh setelan tambahan sing ana gandhengane karo audit: saka rotasi log nganti deskripsi webhook. Tuladha paramèter rotasi log:
--audit-log-maxbackup=10
--audit-log-maxsize=100
--audit-log-maxage=7
Nanging kita ora bakal ngrembug kanthi luwih rinci - sampeyan bisa nemokake kabeh rincian dokumentasi kube-apiserver.
Kaya sing wis kasebut, kabeh paramèter disetel ing manifest kanthi konfigurasi api-server (kanthi standar /etc/kubernetes/manifests/kube-apiserver.yaml), ing bagean command. Ayo bali menyang 3 parameter sing dibutuhake lan analisa:
audit-policy-file - path menyang file YAML sing njlèntrèhaké kabijakan audit. Kita bakal bali menyang isine mengko, nanging saiki aku bakal nyathet yen file kasebut kudu bisa diwaca dening proses api-server. Mulane, kudu dipasang ing wadhah, sing bisa ditambahake kode ing ngisor iki menyang bagean konfigurasi sing cocog:
audit-log-path - path menyang file log. Path kasebut uga kudu bisa diakses kanggo proses server api, mula kita nerangake babagan pemasangan kanthi cara sing padha:
audit-log-format - format log audit. Default punika json, nanging format teks warisan uga kasedhiya (legacy).
Kebijakan Audit
Saiki babagan file kasebut sing nggambarake kabijakan logging. Konsep pisanan saka kabijakan audit yaiku level, tingkat logging. Padha kaya ing ngisor iki:
None - aja mlebu log;
Metadata - metadata panyuwunan log: pangguna, wektu panyuwunan, sumber daya target (pod, namespace, lsp), jinis tumindak (kriya), lsp;
Request - metadata log lan badan panyuwunan;
RequestResponse - metadata log, awak panjalukan lan awak respon.
Loro tingkat pungkasan (Request и RequestResponse) aja nyathet panjalukan sing ora ngakses sumber daya (akses menyang url non-sumber daya).
Uga kabeh panjalukan liwat sawetara tahapan:
RequestReceived - tataran nalika panjalukan ditampa dening prosesor lan durung ditularake luwih lanjut ing rantai prosesor;
ResponseStarted - header respon dikirim, nanging sadurunge awak respon dikirim. Digawe kanggo pitakon sing wis suwe (contone, watch);
ResponseComplete - awak respon wis dikirim, ora ana informasi liyane sing bakal dikirim;
Panic - acara digawe nalika kahanan ora normal dideteksi.
Kanggo ngliwati langkah apa wae sing bisa digunakake omitStages.
Ing file kabijakan, kita bisa njlèntrèhaké sawetara bagean kanthi tingkat logging sing beda. Aturan sing cocog pisanan sing ditemokake ing deskripsi kebijakan bakal ditrapake.
Daemon kubelet ngawasi owah-owahan ing manifes kanthi konfigurasi api-server lan, yen ana sing dideteksi, miwiti maneh wadhah nganggo api-server. Nanging ana rincian penting: owah-owahan ing file privasi bakal dilirwakaké dening iku. Sawise nggawe owah-owahan ing file kebijakan, sampeyan kudu miwiti maneh api-server kanthi manual. Wiwit api-server diwiwiti minangka polong statis, tim kubectl delete ora bakal nimbulaké kanggo miwiti maneh. Sampeyan kudu nindakake kanthi manual docker stop ing kube-masters, ing ngendi kabijakan audit wis diganti:
Nalika ngaktifake audit, penting kanggo elinga beban ing kube-apiserver mundhak. Utamane, konsumsi memori kanggo nyimpen konteks request mundhak. Log diwiwiti mung sawise header respon dikirim. Beban uga gumantung marang konfigurasi kabijakan audit.
Tuladha kawicaksanan
Ayo ndeleng struktur file kebijakan nggunakake conto.
Punika file prasaja policykanggo log kabeh ing tingkat Metadata:
Ing kabijakan sampeyan bisa nemtokake dhaptar pangguna (Users и ServiceAccounts) lan grup pangguna. Contone, iki carane kita bakal nglirwakake pangguna sistem, nanging log kabeh liyane ing tingkat Request:
Kanggo cepet nanggapi acara audit, bisa uga describe webhook. Jeksa Agung bisa ngetokake iki dijamin ing dokumentasi resmi, Aku bakal ninggalake iku njaba orane katrangan saka artikel iki.
Hasil
Artikel kasebut nyedhiyakake ringkesan mekanisme keamanan dhasar ing kluster Kubernetes, sing ngidini sampeyan nggawe akun panganggo sing dipersonalisasi, misahake hak-hake, lan ngrekam tumindake. Muga-muga bisa migunani kanggo wong-wong sing ngadhepi masalah kasebut ing teori utawa ing praktik. Aku uga menehi saran supaya sampeyan maca dhaptar bahan liyane babagan topik keamanan ing Kubernetes, sing diwenehake ing "PS" - mbok menawa ing antarane sampeyan bakal nemokake rincian sing dibutuhake babagan masalah sing cocog karo sampeyan.