
Varem vĂ”i hiljem tekib iga sĂŒsteemi kasutamisel kĂŒsimus turvalisusest: autentimise, Ă”iguste jagamise, auditeerimise ja muude ĂŒlesannete tagamisest. Kubernetes'ele on juba loodud , mis vĂ”imaldavad saavutada vastavust standarditele isegi vĂ€ga nĂ”udlikes keskkondades... See materjal keskendub K8s sisseehitatud mehhanismide raames rakendatud turvalisuse pĂ”hiaspektidele. Esiteks on see kasulik neile, kes tutvuvad Kubernetes'ega, - kui alguspunkt kĂŒsimuste uurimiseks, mis on seotud turvalisusega.
Ahnikeerimine
Kubernetes'is on kaks kasutajatĂŒĂŒpi:
- Teenusekontod â Kubernetes API poolt hallatavad kontod;
- Kasutajad â "tavalised" kasutajad, keda haldavad vĂ€lised, sĂ”ltumatud teenused.
Peamine erinevus nende tĂŒĂŒpide vahel on see, et Teenusekontode jaoks eksisteerivad Kubernetes API-s spetsiaalsed objektid (neid nimetatakse ka Teenusekontodeks), mis on seotud nimede ruumiga ja autoriseerimisandmete kogumiga, mis on salvestatud klastris Secrets tĂŒĂŒpi objektidesse. Sellised kasutajad (Teenusekontod) on peamiselt mĂ”eldud Kubernetes API juurdepÀÀsuĂ”iguste haldamiseks nende protsesside jaoks, mis töötavad Kubernetes klastris.
Tavalised kasutajad ei oma kirjeid Kubernetes API-s: nende haldamine peab toimuma vÀliste mehhanismide kaudu. Nad on mÔeldud inimestele vÔi protsessidele, kes elavad klastrist vÀljaspool.
Iga API pĂ€ring on seotud kas Teenusekonto vĂ”i Kasutajaga vĂ”i loetakse anonĂŒĂŒmseks.
Kasutaja autentimisandmed sisaldavad:
- Kasutajanimi â kasutajanimi (sĂ”ltub suurtest ja vĂ€ikestest tĂ€htedest!);
- UID â masinloetav identifitseerimisnumber, mis on "tugevam ja ainulaadsem kui kasutajanimi";
- RĂŒhmad â kasutaja kuuluvate rĂŒhmade nimekiri;
- Extra â tĂ€iendavad vĂ€ljad, mida vĂ”ib autoriseerimismehhanismis kasutada.
Kubernetes saab kasutada mitmeid autentimismehhanisme: X509 sertifikaate, Bearer-tokens, autentimisproxies, HTTP Basic Auth. Nende mehhanismide abil saab rakendada mitmeid autoriseerimisskeeme: staatilisest paroolifailist kuni OpenID OAuth2-ni.
Lisaks on lubatud mitme autoriseerimisskeemi samaaegne kasutamine. Vaikimisi kasutatakse klastris:
- teenusekonto mĂ€rke â Teenusekontode jaoks;
- X509 â Kasutajate jaoks.
KĂŒsimus ServiceAccounts'i haldamise kohta ĂŒletab kĂ€esoleva artikli piire, ning neile, kes soovivad sellest teemast lĂ€hemalt tutvuda, soovitan alustada . Me kĂ€sitleme detailsemalt X.509 sertifikaatide tööd.
Kasutajate sertifikaadid (X.509)
Klassikaline sertifikaatidega töötamise viis eeldab:
- vÔtme genereerimist:
mkdir -p ~/mynewuser/.certs/ openssl genrsa -out ~/mynewuser/.certs/mynewuser.key 2048 - sertifikaadi taotluse genereerimist:
openssl req -new -key ~/mynewuser/.certs/mynewuser.key -out ~/mynewuser/.certs/mynewuser.csr -subj "/CN=mynewuser/O=company" - sertifikaadi taotluse töötlemist Kubernetes klastrite CA vÔtmete abil, kasutaja sertifikaadi saamist (sertifikaadi saamiseks tuleb kasutada kontot, millel on juurdepÀÀs Kubernetes klastrite sertifitseerimiskeskuse vÔtmele, mis asub vaikimisi
/etc/kubernetes/pki/ca.key):openssl x509 -req -in ~/mynewuser/.certs/mynewuser.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out ~/mynewuser/.certs/mynewuser.crt -days 500 - konfiguratsiooni faili loomist:
- klastri kirjeldust (mÀÀra CA sertifikaadi aadress ja asukoht konkreetse klastri installatsiooni kohta):
kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --server=https://192.168.100.200:6443 - vĂ”i â nagu eisoovitatav variant â ei pruugi öelda juure sertifikaadi (siis kubectl ei kontrolli klastrite api-serveri Ă”igust):
kubectl config set-cluster kubernetes --insecure-skip-tls-verify=true --server=https://192.168.100.200:6443 - kasutaja lisamine konfigureerimisfaili:
kubectl config set-credentials mynewuser --client-certificate=.certs/mynewuser.crt --client-key=.certs/mynewuser.key - konteksti lisamine:
kubectl config set-context mynewuser-context --cluster=kubernetes --namespace=target-namespace --user=mynewuser - vaikimisi konteksti mÀÀramine:
kubectl config use-context mynewuser-context
- klastri kirjeldust (mÀÀra CA sertifikaadi aadress ja asukoht konkreetse klastri installatsiooni kohta):
PĂ€rast ĂŒlaltoodud toiminguid luuakse failis .kube/config konfiguratsioon jĂ€rgmisel kujul:
apiVersion: v1
clusters:
- cluster:
certificate-authority: /etc/kubernetes/pki/ca.crt
server: https://192.168.100.200:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
namespace: target-namespace
user: mynewuser
name: mynewuser-context
current-context: mynewuser-context
kind: Config
preferences: {}
users:
- name: mynewuser
user:
client-certificate: /home/mynewuser/.certs/mynewuser.crt
client-key: /home/mynewuser/.certs/mynewuser.keyKonfiguratsiooni lihtsustamiseks konto ja serverite vahel on kasulik redigeerida jÀrgmiste vÔtmete vÀÀrtusi:
-
certificate-authority -
client-certificate -
client-key
Selleks saab nimetatud failid kodeerida base64 ja kirjutada need konfiguratsiooni, lisades vÔtme nimedele suffiksi -data, st pakkuda certificate-authority-data jne.
Sertifikaadid kubeadm'iga
Kubernetes 1.15 vĂ€ljaandega Töötamine sertifikaatidega on muutunud oluliselt lihtsamaks tĂ€nu alpha-versioonile selle toe. NĂ€iteks, nii vĂ”iks nĂŒĂŒd vĂ€lja nĂ€ha ĐșĐŸĐœŃОгŃŃаŃĐžĐŸĐœĐœŃĐč ŃаĐčĐ» koos kasutaja vĂ”tmetega:
kubeadm alpha kubeconfig user --client-name=mynewuser --apiserver-advertise-address 192.168.100.200 NB: NÔutud advertise address. Saate seda vaadata api-serveri konfiguraatsioonis, mis asub vaikimisi aadressil /etc/kubernetes/manifests/kube-apiserver.yaml.
Tulemuslik konfiguraatsioon kuvatakse stdout-s. See tuleb salvestada ~/.kube/config kasutaja kontole vÔi faili, mille olete mÀÀranud keskkonnamuutujas. KUBECONFIG.
Kaevama sĂŒgavamale
Neile, kes soovivad neid kĂŒsimusi pĂ”hjalikumalt uurida:
- sertifikaatide töötamine Kubernetes ametlikus dokumentatsioonis;
- , kus sertifikaatide kĂŒsimust kĂ€sitletakse praktilise poole pealt.
- Kubernetes'e autentimise kohta.
Autoriseerimine
Vaikimisi ei oma autoriseeritud konto Ôigusi klastris tegutsemiseks. Kubernetes'is on rakendatud autoriseerimise mehhanism Ôiguste mÀÀramiseks.
Kuni versioonini 1.6 kasutati Kubernetes'is autoriseerimise tĂŒĂŒpi, mida nimetatakse ABAC (Attribute-based access control). Ăksikasjad selle kohta leiate Siiski peetakse seda lĂ€henemist vananenuks (legacy), kuid saate seda ikkagi kasutada koos teiste autoriseerimise tĂŒĂŒpidena.
Praegu aktsepteeritud (ja paindlikum) viis Ôiguste jagamiseks klastrisse nimetatakse RBAC () See kuulutati stabiilseks alates versioonist RBAC rakendab Ôiguste mudelit, kus kÔik, mis ei ole selgesÔnaliselt lubatud, on keelatud.
RBAC'i lubamiseks, peate kĂ€ivitama Kubernetes api-serveri koos parameetriga --authorization-mode=RBAC.Parameetrid seotakse manti jaga konfigureerimisega, mis asub vaikimisi aadressil /etc/kubernetes/manifests/kube-apiserver.yaml, jaotises kĂ€sk. Siiski on RBAC vaikimisi juba lubatud, mistĂ”ttu ei tasu selle pĂ€rast Ă€revust tunda: selle olemasolu saab kontrollida vÀÀrtusest authorization-mode (juba mainitud kube-apiserver.yaml.). Muide, selle vÀÀrtuste hulgas vĂ”ivad olla ka teised autoriseerimise tĂŒĂŒbid (node, webhook, always allow), kuid nende kĂ€sitlemine jÀÀb kĂ€esoleva materjali teemast vĂ€ljapoole.
Muide, oleme juba avaldanud piisavalt detailselt juttu RBAC'iga töötamise pĂ”himĂ”tetest ja eripĂ€radest, seega piirduksin edaspidi pĂ”himĂ”tete ja nĂ€idete lĂŒhikese loetlemisega.
Kubernetes'is juurdepÀÀsu haldamiseks RBAC kaudu kasutatakse jĂ€rgmisi API ĂŒksusi:
-
RolejaClusterRoleâ rollid, mis kirjeldavad juurdepÀÀsuĂ”igusi: -
Roleaitab kirjeldada Ôigusi nimiruumide raames; -
ClusterRoleâ klastris, sealhulgas klastrispetsiifilised objektid nagu sĂ”lmed, non-resources urls (st mitte-Kubernetes'i ressurssidega seotud â nĂ€iteks,/version,/logs,/api*); -
RoleBindingjaClusterRoleBindingâ teenib sidumise jaoksRolejaClusterRolekasutajale, kasutajagruppidele vĂ”i ServiceAccount'ile.
Rolli ja RolliSidumise entiteedid on piiratud nimiruumiga, st peavad jÀÀma ĂŒhe nimiruumi piiresse. Kuid RolliSidumine vĂ”ib viidata ClusterRole'le, mis vĂ”imaldab luua tĂŒĂŒpiliste Ă”iguste komplekti ja hallata juurdepÀÀsu nende kaudu.
Rollid kirjeldavad Ôigusi reeglite kogumite abil, mis sisaldavad:
- API rĂŒhmad - vt. apiGroups ja vĂ€ljundit
kubectl api-resources; - ressursid (ressursid:
pod,namespace,deploymentjne); - tegusÔnad (tegusÔnad:
set,updatejne.). - ressursside nimed (
resourceNames) â juhul, kui on vaja anda juurdepÀÀs mĂ”nele konkreetsele ressursile, mitte kĂ”igile selle tĂŒĂŒbi ressurssidele.
Kubernetes'i autoriseerimise pĂ”hjalikku analĂŒĂŒsi leiate lehelt . Selle asemel (ja tĂ€psemalt â selle lisandina) toome nĂ€ited, mis illustreerivad selle toimimist.
RBAC entiteetide nÀited
Lihtne Role, mis vÔimaldab saada loend ja olek pod'ide ning jÀlgida neid nimiruumis target-namespace:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: target-namespace
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"] NÀide ClusterRole, mis vÔimaldab saada loend ja olek pod'ide ning jÀlgida neid kogu klastris:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# sektsioon "namespace" puudub, kuna ClusterRole katab kogu klastri
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"] NÀide RoleBinding, mis vÔimaldab kasutajal mynewuser «lugeda» pod'e nimiruumis my-namespace:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: target-namespace
subjects:
- kind: User
name: mynewuser # kasutajanimi on juhtumists sÔltuv!
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role # siin peab olema âRoleâ vĂ”i âClusterRoleâ
name: pod-reader # rolli nimi, mis asub samas nimiruumis,
# vÔi ClusterRole'i nimi, mille kasutamist
# tahame kasutajale lubada
apiGroup: rbac.authorization.k8s.ioSĂŒndmuste audit
Kubernetes'i arhitektuuri vÔib skeemiliselt esitada jÀrgmiselt:

Kubernetes'i vÔtmeelement, mis vastutab pÀringute töötlemise eest, on api-server. KÔik operatsioonid klastriga toimuvad selle kaudu. TÀiendava teabe saamiseks nende sisemehanismide kohta lugege artiklit «».
SĂŒsteemi auditeerimine on huvitav funktsioon Kuberneteses, mis on vaikimisi vĂ€lja lĂŒlitatud. See vĂ”imaldab logida kĂ”ik pĂ€ringud Kubernetes API-le. Nagu kergesti arvata vĂ”ib, toimub kĂ”ik tegevused, mis on seotud klastri oleku kontrolli ja muutmisega, lĂ€bi selle API. Hea ĂŒlevaate selle vĂ”imalustest saab (nagu tavaliselt) leida K8s. Edasi pĂŒĂŒan ma teemat vĂ€ljendada lihtsamate sĂ”nadega.
Nii, auditeerimise aktiveerimiseks, peame edastama konteinerile api-serverisse kolm kohustuslikku parameetrit, millest lÀhemalt rÀÀgin allpool:
-
--audit-policy-file=\/etc\/kubernetes\/policies\/audit-policy.yaml -
--audit-log-path=\/var\/log\/kube-audit\/audit.log -
--audit-log-format=json
Lisaks nendele kolmele vajalikule parameetrile on olemas palju lisaseadeid, mis puudutavad auditeerimist: logide pööramine kuni webhookide seadistamiseni. NÀide logide pööramise parameetritest:
-
--audit-log-maxbackup=10 -
--audit-log-maxsize=100 -
--audit-log-maxage=7
Aga ei hakka nendel pikemalt peatuma â kĂ”ik detailid on leitavad .
Nagu juba mainitud, kÔik parameetrid mÀÀratakse api-serveri konfiguratsiooni manifestis (vaikimisi /etc/kubernetes/manifests/kube-apiserver.yaml), sektsioonis kÀsk. Naaseme kolme kohustusliku parameetri juurde ja vaatame neid lÀhemalt:
-
audit-policy-fileâ tee YAML-failini, kus on kirjas auditeerimise poliitika. Selle sisusse me veel tagasi tuleme, kuid praegu mainin, et fail peab olema api-serveri protsessile ligipÀÀsetav. SeetĂ”ttu tuleb see konteinerisse mountida, nii et saame lisada jĂ€rgmise koodi vastavatesse seadistuse osadesse:volumeMounts: - mountPath: \/etc\/kubernetes\/policies name: policies readOnly: true volumes: - hostPath: path: \/etc\/kubernetes\/policies type: DirectoryOrCreate name: policies -
audit-log-pathâ tee logifailini. Tee peab samuti olema api-serveri protsessile ligipÀÀsetav, seega kirjeldame selle mountimist sarnaselt:volumeMounts: - mountPath: \/var\/log\/kube-audit name: logs readOnly: false volumes: - hostPath: path: \/var\/log\/kube-audit type: DirectoryOrCreate name: logs -
audit-log-formatâ auditi logi formaat. Vaikimisi on seejson, kuid saadaval on ka vananenud tekstiformaadis (legacy).
Auditeerimise poliitika
NĂŒĂŒd rÀÀkides mainitud failist, kus on kirjas logimise poliitika. Esimene mĂ”isted audit policy â see on level, logimise tase. Need vĂ”ivad olla jĂ€rgmised:
-
Noneâ mitte logida; -
Metadataâ logida pĂ€ringu metainformatsiooni: kasutaja, pĂ€ringu aeg, sihtressurss (pod, namespace jne), tegevuse tĂŒĂŒp (verb) jne; -
PĂ€ringâ logida metainformatsioon ja pĂ€ringu keha; -
RequestResponseâ logida metaandmeid, pĂ€ringu sisu ja vastuse sisu.
Viimane kaks taset (PÀring ja RequestResponse) ei logi pÀringuid, mis ei suunanud ressursse (nÀiteks nn non-resources urls).
KÔik pÀringud lÀbivad samuti mitu etappi:
-
RequestReceivedâ etapp, mil pĂ€ring on töötleja poolt saadud ja ei ole veel edasi antud töötleja ahelas; -
ResponseStartedâ vastuse pealkirjad on saadetud, kuid enne vastuse sisu saatmist. Genereeritakse pikaajaliste pĂ€ringute jaoks (nĂ€iteks,watch); -
ResponseCompleteâ vastuse sisu on saadetud, rohkem teavet ei saadeta; -
Panicâ sĂŒndmused genereeritakse, kui tuvastatakse erandolukord.
MÔningate etappide vahelejÀtmiseks saab kasutada omitStages.
Poliitika failis saame kirjeldada mitmeid sektsioone erinevate logimise tasemetega. Rakendatakse esimest sobivat reeglit, mis leiti poliitika kirjeldusest.
Demon kubelet jĂ€lgib api-serveri konfiguratsiooni manifesti muutusi ja tuvastades, kĂ€ivitab ta api-serveri konteineri uuesti. Kuid on oluline ĂŒks detail: poliitika faili muutusi ignoreeritakse. PĂ€rast muudatuste tegemist poliitika failis tuleb api-server spetsiaalselt uuesti kĂ€ivitada. Kuna api-server on kĂ€ivitunud kui , kĂ€sk kubectl delete ei pĂ”hjusta selle taaskĂ€ivitamist. Tuleb manuaalselt teha docker stop kube-masterâides, kus auditi poliitika on muudetud:
docker stop $(docker ps | grep k8s_kube-apiserver | awk '{print $1}')Auditi lubamisel on oluline meeles pidada, et kube-apiserveri koormus tÔuseb. Eriti suureneb mÀlu tarbimine pÀringute konteksti hoidmiseks. Logimine algab alles pÀrast vastuse pealkirja saatmist. Samuti sÔltub koormus auditi poliitika konfiguratsioonist.
Poliitikate nÀited
KÀsitleme poliitika failide struktuuri nÀidete kaudu.
Siin on lihtne fail policy, et logida kÔike tasemel Metadata:
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata Poliitikas saab mÀÀrata kasutajate (Kasutajad ja Teenusekontodeks) ja kasutajagruppide nimekirja. NĂ€iteks, nii ignoreerime sĂŒsteemi kasutajaid, kuid logime kĂ”ik muu tasemel PĂ€ring:
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: None
userGroups:
- "system:serviceaccounts"
- "system:nodes"
users:
- "system:anonymous"
- "system:apiserver"
- "system:kube-controller-manager"
- "system:kube-scheduler"
- level: RequestSamuti on vÔimalik kirjeldada sihtkohti:
- nimetuse ruume (
namespaces); - tegusÔnad (tegusÔnad:
get,update,deleteja muud); - ressursid (ressursid, nimelt:
pod,configmapsjne.) ja ressursside gruppe (apiGroups).
Pange tĂ€hele! Ressursid ja ressursigrupid (API rĂŒhmad, st apiGroups) ning nende versioonid, mis on klastrisse installitud, on saadaval jĂ€rgmiste kĂ€skude abil:
kubectl api-resources
kubectl api-versionsJÀrgnevat auditi poliitikat tuuakse kui parimate praktikate nÀide :
apiVersion: audit.k8s.io/v1beta1
kind: Policy
# Ăra logi RequestReceived etappi
omitStages:
- "RequestReceived"
rules:
# Ăra logi juhtumeid, mida peetakse vĂ€heoluliseks ja mitte ohtlikuks:
- level: None
users: ["system:kube-proxy"]
verbs: ["watch"]
resources:
- group: "" # see on api rĂŒhm tĂŒhja nimega, mis kuulub
# Kubernetes'i pÔhivara, mida nimetatakse "core"
resources: ["endpoints", "services"]
- level: None
users: ["system:unsecured"]
namespaces: ["kube-system"]
verbs: ["get"]
resources:
- group: "" # core
resources: ["configmaps"]
- level: None
users: ["kubelet"]
verbs: ["get"]
resources:
- group: "" # core
resources: ["nodes"]
- level: None
userGroups: ["system:nodes"]
verbs: ["get"]
resources:
- group: "" # core
resources: ["nodes"]
- level: None
users:
- system:kube-controller-manager
- system:kube-scheduler
- system:serviceaccount:kube-system:endpoint-controller
verbs: ["get", "update"]
namespaces: ["kube-system"]
resources:
- group: "" # core
resources: ["endpoints"]
- level: None
users: ["system:apiserver"]
verbs: ["get"]
resources:
- group: "" # core
resources: ["namespaces"]
# Ăra logi lugemise ainult URL-esid:
- level: None
nonResourceURLs:
- /healthz*
- /version
- /swagger*
# Ăra logi sĂ”numeid, mis kuuluvad "sĂŒndmuste" ressursside tĂŒĂŒbile:
- level: None
resources:
- group: "" # core
resources: ["events"]
# Salajased andmed, ConfigMap ja TokenReview ressursid vÔivad sisaldada
# salajasi andmeid, seega logime ainult nende taotluste metainfoid
- level: Metadata
resources:
- group: "" # core
resources: ["secrets", "configmaps"]
- group: authentication.k8s.io
resources: ["tokenreviews"]
# Get, list ja watch toimingud vÔivad olla ressursimahukad; ei logi neid
- level: Request
verbs: ["get", "list", "watch"]
resources:
- group: "" # core
- group: "admissionregistration.k8s.io"
- group: "apps"
- group: "authentication.k8s.io"
- group: "authorization.k8s.io"
- group: "autoscaling"
- group: "batch"
- group: "certificates.k8s.io"
- group: "extensions"
- group: "networking.k8s.io"
- group: "policy"
- group: "rbac.authorization.k8s.io"
- group: "settings.k8s.io"
- group: "storage.k8s.io"
# Vaikimisi logimise tase API standardressursside jaoks
- level: RequestResponse
resources:
- group: "" # core
- group: "admissionregistration.k8s.io"
- group: "apps"
- group: "authentication.k8s.io"
- group: "authorization.k8s.io"
- group: "autoscaling"
- group: "batch"
- group: "certificates.k8s.io"
- group: "extensions"
- group: "networking.k8s.io"
- group: "policy"
- group: "rbac.authorization.k8s.io"
- group: "settings.k8s.io"
- group: "storage.k8s.io"
# Vaikimisi logimise tase kÔikide teiste taotluste jaoks
- level: MetadataTeine hea nĂ€ide audit poliitikast â .
AuditisĂŒndmustele kiiresti reageerimiseks on vĂ”imalus kirjeldada webhook. See teema on avatud , jĂ€tan selle artikli raames kĂ€sitlemata.
Summary
Artiklis antakse ĂŒlevaade Kubernetes klastrite pĂ”hjalike turvainstrumentide mehhanismidest, mis vĂ”imaldavad luua isikupĂ€rastatud kontosid kasutajatele, jagada nende Ă”igusi ning registreerida nende tegevusi. Loodan, et see on kasulik neile, kes on silmitsi selliste kĂŒsimustega teoorias vĂ”i juba praktikaliselt. Soovitan tutvuda ka muu turvalisuse temaatikaga seotud materjalide nimekirjaga, mis on toodud "P.S."-s â vĂ”ib-olla leiate sealt vajalikud ĂŒksikasjad teile olulistes probleemides.
P.S.
Lugege ka meie blogist:
- «»;
- «»;
- «»;
- «»;
- «».
Allikas: habr.com
