Kubernetes drošības ABC: autentifikācija, autorizācija, audits
Agri vai vēlu jebkuras sistēmas darbībā rodas drošības jautājums: autentifikācijas nodrošināšana, tiesību nodalīšana, audits un citi uzdevumi. Jau izveidots priekš Kubernetes daudz risinājumu, kas ļauj sasniegt atbilstību standartiem pat ļoti prasīgās vidēs... Tas pats materiāls ir veltīts K8s iebūvēto mehānismu ietvaros īstenotajiem drošības pamataspektiem. Pirmkārt, tas noderēs tiem, kas sāk iepazīties ar Kubernetes - kā atspēriena punktu ar drošību saistītu jautājumu izpētei.
Autentifikācija
Kubernetes ir divu veidu lietotāji:
Pakalpojumu konti — Kubernetes API pārvaldītie konti;
Lietotāji — “parastie” lietotāji, kurus pārvalda ārēji neatkarīgi pakalpojumi.
Galvenā atšķirība starp šiem veidiem ir tāda, ka pakalpojumu kontiem Kubernetes API ir īpaši objekti (tos sauc par - ServiceAccounts), kas ir piesaistīti nosaukumvietai un autorizācijas datu kopai, kas glabājas klasterī noslēpumu tipa objektos. Šādi lietotāji (pakalpojumu konti) galvenokārt ir paredzēti, lai pārvaldītu Kubernetes klasterī darbināmo procesu piekļuves tiesības Kubernetes API.
Parastajiem lietotājiem nav ierakstu Kubernetes API: tie ir jāpārvalda ar ārējiem mehānismiem. Tie ir paredzēti cilvēkiem vai procesiem, kas dzīvo ārpus klastera.
Katrs API pieprasījums ir saistīts ar pakalpojuma kontu, lietotāju vai tiek uzskatīts par anonīmu.
Lietotāja autentifikācijas dati ietver:
Lietotājvārds — lietotājvārds (reģistrjutīgs!);
UID - mašīnlasāma lietotāja identifikācijas virkne, kas ir “konsekventāka un unikālāka par lietotājvārdu”;
grupas — to grupu saraksts, kurām lietotājs pieder;
Papildus — papildu lauki, ko var izmantot autorizācijas mehānisms.
Kubernetes var izmantot lielu skaitu autentifikācijas mehānismu: X509 sertifikāti, nesēja marķieri, autentifikācijas starpniekserveris, HTTP pamata autentifikācija. Izmantojot šos mehānismus, varat ieviest lielu skaitu autorizācijas shēmu: no statiska faila ar parolēm līdz OpenID OAuth2.
Turklāt ir iespējams vienlaikus izmantot vairākas autorizācijas shēmas. Pēc noklusējuma klasteris izmanto:
pakalpojumu kontu marķieri - Pakalpojumu kontiem;
X509 - lietotājiem.
Jautājums par ServiceAccounts pārvaldību ir ārpus šī raksta, taču tiem, kas vēlas iepazīties ar šo problēmu sīkāk, iesaku sākt ar oficiālās dokumentācijas lapas. Mēs sīkāk aplūkosim jautājumu par to, kā darbojas X509 sertifikāti.
Sertifikāti lietotājiem (X.509)
Klasiskais veids, kā strādāt ar sertifikātiem, ietver:
sertifikāta pieprasījuma apstrāde, izmantojot Kubernetes klastera CA atslēgas, lietotāja sertifikāta iegūšana (lai iegūtu sertifikātu, ir jāizmanto konts, kuram ir piekļuve Kubernetes klastera CA atslēgai, kas pēc noklusējuma atrodas /etc/kubernetes/pki/ca.key):
Lai atvieglotu konfigurācijas pārsūtīšanu starp kontiem un serveriem, ir lietderīgi rediģēt šādu atslēgu vērtības:
certificate-authority
client-certificate
client-key
Lai to izdarītu, tajos norādītos failus var iekodēt, izmantojot base64, un reģistrēt tos konfigurācijā, pievienojot atslēgu nosaukumam sufiksu -data, t.i. saņemot certificate-authority-data uc
Sertifikāti ar kubeadm
Ar atbrīvošanu Kubernetes 1.15 darbs ar sertifikātiem ir kļuvis daudz vienkāršāks, pateicoties tā atbalsta alfa versijai kubeadm utilīta. Piemēram, konfigurācijas faila ģenerēšana ar lietotāja atslēgām tagad varētu izskatīties šādi:
kubeadm alpha kubeconfig user --client-name=mynewuser --apiserver-advertise-address 192.168.100.200
NB: Obligāti reklamēt adresi var atrast api-servera konfigurācijā, kas pēc noklusējuma atrodas /etc/kubernetes/manifests/kube-apiserver.yaml.
Iegūtā konfigurācija tiks izvadīta uz stdout. Tas ir jāsaglabā ~/.kube/config lietotāja kontam vai failam, kas norādīts vides mainīgajā KUBECONFIG.
Rakt dziļāk
Tiem, kas vēlas sīkāk izprast aprakstītos jautājumus:
atsevišķs raksts par darbu ar sertifikātiem oficiālajā Kubernetes dokumentācijā;
Noklusējuma autorizētajam kontam nav tiesību darboties klasterī. Lai piešķirtu atļaujas, Kubernetes ievieš autorizācijas mehānismu.
Pirms versijas 1.6 Kubernetes izmantoja autorizācijas veidu, ko sauc ABAC (Uz atribūtiem balstīta piekļuves kontrole). Sīkāku informāciju par to var atrast oficiālā dokumentācija. Šī pieeja pašlaik tiek uzskatīta par mantotu, taču jūs joprojām varat to izmantot kopā ar citiem autentifikācijas veidiem.
Tiek saukts pašreizējais (un elastīgāks) veids, kā sadalīt piekļuves tiesības klasterim RBAC (Uz lomu balstīta piekļuves kontrole). Kopš versijas tas ir pasludināts par stabilu Kubernetes 1.8. RBAC ievieš tiesību modeli, kurā viss, kas nav tieši atļauts, ir aizliegts. Lai iespējotu RBAC, jums ir jāstartē Kubernetes api-server ar parametru --authorization-mode=RBAC. Parametri tiek iestatīti manifestā ar api-servera konfigurāciju, kas pēc noklusējuma atrodas ceļā /etc/kubernetes/manifests/kube-apiserver.yaml, sadaļā command. Tomēr RBAC jau ir iespējots pēc noklusējuma, tāpēc, visticamāk, jums par to nevajadzētu uztraukties: varat to pārbaudīt pēc vērtības authorization-mode (jau minētajā kube-apiserver.yaml). Starp citu, starp tā nozīmēm var būt arī citi autorizācijas veidi (node, webhook, always allow), taču mēs to izskatīšanu atstāsim ārpus materiāla tvēruma.
Starp citu, mēs jau esam publicējuši raksts ar diezgan detalizētu aprakstu par darba ar RBAC principiem un iezīmēm, tāpēc turpmāk aprobežošos ar īsu pamatu un piemēru uzskaitījumu.
Lai kontrolētu piekļuvi Kubernetes, izmantojot RBAC, tiek izmantotas šādas API entītijas:
Role и ClusterRole — lomas, kas kalpo, lai aprakstītu piekļuves tiesības:
Role ļauj aprakstīt tiesības nosaukumvietā;
ClusterRole - klasterī, tostarp uz klasteriem raksturīgiem objektiem, piemēram, mezgliem, neresursiem URL (t.i., kas nav saistīti ar Kubernetes resursiem, piemēram, /version, /logs, /api*);
RoleBinding и ClusterRoleBinding - izmanto iesiešanai Role и ClusterRole lietotājam, lietotāju grupai vai ServiceAccount.
Entītijas Role un RoleBinding ierobežo nosaukumvieta, t.i. jāatrodas tajā pašā nosaukumvietā. Tomēr RoleBinding var atsaukties uz ClusterRole, kas ļauj izveidot vispārīgu atļauju kopu un kontrolēt piekļuvi, izmantojot tās.
Lomas apraksta tiesības, izmantojot noteikumu kopas, kas ietver:
resursi (resursi: pod, namespace, deployment un tā tālāk.);
Darbības vārdi (darbības vārdi: set, update uc).
resursu nosaukumi (resourceNames) - gadījumam, kad jums ir jānodrošina piekļuve konkrētam resursam, nevis visiem šāda veida resursiem.
Detalizētāku Kubernetes autorizācijas analīzi var atrast lapā oficiālā dokumentācija. Tā vietā (vai drīzāk, papildus tam) es sniegšu piemērus, kas ilustrē viņas darbu.
RBAC entītiju piemēri
Vienkāršs Role, kas ļauj iegūt pākstu sarakstu un statusu un pārraudzīt tos nosaukumvietā target-namespace:
Piemērs ClusterRole, kas ļauj iegūt pākstu sarakstu un statusu un pārraudzīt tos visā klasterī:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# секции "namespace" нет, так как ClusterRole задействует весь кластер
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
Piemērs RoleBinding, kas ļauj lietotājam mynewuser "lasīt" pākstis nosaukumvietā 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
Pasākuma audits
Shematiski Kubernetes arhitektūru var attēlot šādi:
Galvenais Kubernetes komponents, kas atbild par pieprasījumu apstrādi, ir api-serveris. Visas klastera darbības tiek veiktas caur to. Vairāk par šiem iekšējiem mehānismiem varat lasīt rakstā “Kas notiek Kubernetes, kad palaižat kubectl run?'.
Sistēmas audits ir interesanta Kubernetes funkcija, kas pēc noklusējuma ir atspējota. Tas ļauj reģistrēt visus Kubernetes API zvanus. Kā jūs varētu nojaust, visas darbības, kas saistītas ar klastera stāvokļa uzraudzību un maiņu, tiek veiktas, izmantojot šo API. Labu tā iespēju aprakstu (kā parasti) var atrast oficiālā dokumentācija K8s. Tālāk es mēģināšu tēmu izklāstīt vienkāršākā valodā.
Tātad, lai iespējotu auditu, mums ir jānodod trīs nepieciešamie parametri api-servera konteineram, kas sīkāk aprakstīti tālāk:
Papildus šiem trim nepieciešamajiem parametriem ir daudz papildu iestatījumu, kas saistīti ar auditēšanu: no žurnāla rotācijas līdz tīmekļa aizķeres aprakstiem. Žurnāla rotācijas parametru piemērs:
Kā jau minēts, visi parametri tiek iestatīti manifestā ar api-servera konfigurāciju (pēc noklusējuma /etc/kubernetes/manifests/kube-apiserver.yaml), sadaļā command. Atgriezīsimies pie 3 nepieciešamajiem parametriem un analizēsim tos:
audit-policy-file — ceļš uz YAML failu, kurā aprakstīta audita politika. Mēs atgriezīsimies pie tā satura vēlāk, taču pagaidām atzīmēšu, ka failam jābūt lasāmam api-servera procesam. Tāpēc tas ir jāmontē konteinera iekšpusē, kuram attiecīgajās konfigurācijas sadaļās varat pievienot šādu kodu:
audit-log-format — audita žurnāla formāts. Noklusējums ir json, taču ir pieejams arī mantotais teksta formāts (legacy).
Revīzijas politika
Tagad par minēto failu, kas apraksta reģistrēšanas politiku. Pirmā revīzijas politikas koncepcija ir level, mežizstrādes līmenis. Tie ir šādi:
None - nereģistrēties;
Metadata — žurnāla pieprasījuma metadati: lietotājs, pieprasījuma laiks, mērķa resurss (pod, nosaukumtelpa utt.), darbības veids (darbības vārds) utt.;
Request — žurnāla metadati un pieprasījuma struktūra;
RequestResponse — žurnāla metadati, pieprasījuma pamatteksts un atbildes struktūra.
Pēdējie divi līmeņi (Request и RequestResponse) nereģistrējiet pieprasījumus, kas nepiekļuva resursiem (piekļuve tā sauktajiem ne-resursu URL).
Arī visi pieprasījumi tiek izpildīti vairākus posmus:
RequestReceived — posms, kurā apstrādātājs ir saņēmis pieprasījumu un vēl nav nosūtīts tālāk pa apstrādātāju ķēdi;
ResponseStarted — atbildes galvenes tiek nosūtītas, bet pirms atbildes pamatteksta nosūtīšanas. Ģenerēts ilgstošiem vaicājumiem (piemēram, watch);
ResponseComplete — atbildes struktūra ir nosūtīta, vairāk informācija netiks nosūtīta;
Panic — notikumi tiek ģenerēti, kad tiek konstatēta neparasta situācija.
Lai izlaistu visas darbības, ko varat izmantot omitStages.
Politikas failā mēs varam aprakstīt vairākas sadaļas ar dažādiem reģistrēšanas līmeņiem. Tiks piemērota pirmā politikas aprakstā atrastā atbilstošā kārtula.
Kubelet dēmons pārrauga izmaiņas manifestā ar api-servera konfigurāciju un, ja tādas tiek konstatētas, restartē konteineru ar api-serveri. Bet ir svarīga detaļa: izmaiņas politikas failā tiks ignorētas. Pēc izmaiņu veikšanas politikas failā jums būs manuāli jārestartē api-serveris. Tā kā api-serveris ir palaists kā statisks pods, komanda kubectl delete neizraisīs tā restartēšanos. Jums tas būs jādara manuāli docker stop vietnē kube-masters, kur ir mainīta audita politika:
Iespējojot auditu, ir svarīgi to atcerēties kube-apiserver slodze palielinās. Jo īpaši palielinās atmiņas patēriņš pieprasījuma konteksta glabāšanai. Reģistrēšana sākas tikai pēc atbildes galvenes nosūtīšanas. Slodze ir atkarīga arī no audita politikas konfigurācijas.
Politiku piemēri
Apskatīsim politikas failu struktūru, izmantojot piemērus.
Šeit ir vienkāršs fails policylai visu pieteiktu līmenī Metadata:
Politikā varat norādīt lietotāju sarakstu (Users и ServiceAccounts) un lietotāju grupas. Piemēram, šādi mēs ignorēsim sistēmas lietotājus, bet visu pārējo reģistrēsim līmenī Request:
Ātri reaģēt uz audita notikumiem, tas ir iespējams aprakstiet tīmekļa aizķeri. Šis jautājums ir apskatīts oficiālā dokumentācija, es to atstāšu ārpus šī raksta darbības jomas.
Rezultāti
Rakstā ir sniegts pārskats par pamata drošības mehānismiem Kubernetes klasteros, kas ļauj izveidot personalizētus lietotāju kontus, nodalīt viņu tiesības un reģistrēt viņu darbības. Es ceru, ka tas būs noderīgi tiem, kas teorētiski vai praktiski sastopas ar šādiem jautājumiem. Iesaku arī izlasīt citu materiālu sarakstu par drošības tēmu Kubernetes, kas ir sniegts “PS” - iespējams, starp tiem atradīsit nepieciešamo informāciju par jums aktuālajām problēmām.