
Iga sĂŒsteemi kasutamisel kerkib varem vĂ”i hiljem esile turvakĂŒsimus: autentimise tagamise, Ă”iguste jagamise, auditi ja teiste ĂŒlesannete kindlustamine. Kubernetes'ele on juba loodud , mis vĂ”imaldavad saavutada vastavust standarditele isegi vĂ€ga nĂ”udlikes keskkondades⊠See materjal on pĂŒhendatud Kubernetes'i sisseehitatud mehhanismide raamides rakendatud turvaelementide pĂ”hialustele. EelkĂ”ige on see kasulik neile, kes alustavad Kubernetes'ega tutvumist, â kui lĂ€htepunkt turvakĂŒsimuste uurimiseks.
Autentimine
Kubernetes'is on kaks kasutajatĂŒĂŒpi:
- Teenusekontod â kontod, mida haldab Kubernetes API;
- Kasutajad â âtavalisedâ kasutajad, mida haldavad vĂ€listest, sĂ”ltumatutest teenustest.
Peamine erinevus nende tĂŒĂŒpide vahel on see, et Teenusekontode jaoks on Kubernetes API-s erilised objektid (need kannavad samuti nime â Teenusekontod), mis on seotud nimedega ja autoriseerimisandmete kogumiga, mis on salvestatud klastri Secrets tĂŒĂŒpi objektides. Sellised kasutajad (Teenusekontod) on peamiselt mĂ”eldud Ă”iguste haldamiseks Kubernetes API juurdepÀÀsuks Kubernetes klastri protsesside jaoks.
Tavalised kasutajad ei oma kirjeid Kubernetes API-s: nende haldamine peab toimuma vÀlistes mehhanismides. Need on mÔeldud inimestele vÔi protsessidele, kes elavad vÀljaspool klastrit.
Iga API-pĂ€ring on seotud kas teenusekonto (Service Account) vĂ”i kasutajaga, vĂ”i seda peetakse anonĂŒĂŒmseks.
Kasutaja autentimisandmed sisaldavad:
- Kasutajanimi â kasutajanimi (sensitiivne suurte tĂ€htede suhtes!);
- UID â masinloetav kasutaja identifitseerimisrida, mis on "jĂ€rjekindlam ja ainulaadsem kui kasutajanimi";
- Groups â kasutaja kuuluvate rĂŒhmade loetelu;
- Extra â lisavĂ€ljad, mida vĂ”ib kasutada autoriseerimismehhanism.
Kubernetes toetab suurt hulka autentimismehhanisme: X509 sertifikaadid, Bearer-tokenid, autentimisproxi, HTTP Basic Auth. Neid mehhanisme kasutades saab rakendada mitmeid autoriseerimisskeeme: alates staatilisest paroolifailist kuni OpenID OAuth2-ni.
Lisaks on lubatud samaaegne mitme autoriseerimisskeemi kasutamine. Vaikimisi kasutatakse klastris:
- teenusekonto tokenid â teenusekontode jaoks;
- X509 â kasutajate jaoks.
KĂŒsimus ServiceAccountide haldamise kohta jÀÀb selle artikli raamest vĂ€lja, kuid soovitan selle teema pĂ”hjalikumaks tutvumiseks alustada . Meie vaatame lĂ€hemalt X509 sertifikaatide tööd.
Kasutaja sertifikaadid (X.509)
Klassikaline viis sertifikaatidega töötamiseks hÔlmab:
- vÔtme genereerimist:
mkdir -p ~/mynewuser/.certs/ openssl genrsa -out ~/.certs/mynewuser.key 2048 - sertifikaadi pÀringu genereerimist:
openssl req -new -key ~/.certs/mynewuser.key -out ~/.certs/mynewuser.csr -subj "/CN=mynewuser/O=company" - sertifikaadi pÀringu töötlemist Kubernetes klastri CA vÔtmete abil, kasutaja sertifikaadi saamist (sertifikaadi saamiseks tuleb kasutada kontot, millel on juurdepÀÀs klastri sertifitseerimiskeskuse vÔtmele, mis vaikimisi asub
/etc/kubernetes/pki/ca.key):openssl x509 -req -in ~/.certs/mynewuser.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out ~/.certs/mynewuser.crt -days 500 - konfiguratsioonifaili loomist:
- klastri kirjeldus (mÀrkige CA sertifikaadi aadress ja asukoht antud klastrite installatsioonis):
kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --server=https://192.168.100.200:6443 - vĂ”i â kuidas eisoovitatav valik â juuresertifikaati ei ole vaja nĂ€idata (sel juhul ei kontrolli kubectl klastrite api-serveri Ă”igust):
kubectl config set-cluster kubernetes --insecure-skip-tls-verify=true --server=https://192.168.100.200:6443 - kasutaja lisamine konfiguratsioonifaili:
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 kirjeldus (mÀrkige CA sertifikaadi aadress ja asukoht antud klastrite installatsioonis):
PĂ€rast ĂŒlalkirjeldatud toimingute tegemist, failis .kube/config loodakse konfiguraator jĂ€rgmises vormis:
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.keyKonfiguraatori edasiviimise lihtsustamiseks kontode ja serverite vahel on kasulik redigeerida jÀrgmiste vÔtmete vÀÀrtusi:
-
certificate-authority -
client-certificate -
client-key
Selleks vÔib mÀÀratletud failid kodeerida base64 abil ja lisada need konfiguratsiooni, lisades vÔtme nimedele sufiksi -data, st saades certificate-authority-data jne.
Sertifikaadid kubeadm-iga
Koos vĂ€ljaandega sertifikaatidega töötamine on muutunud oluliselt lihtsamaks, tĂ€nu selle toe alfa-versioonile . NĂ€iteks, siin on, kuidas nĂŒĂŒd vĂ”ib vĂ€lja nĂ€ha kasutaja vĂ”tmete konfigureerimisfaili genereerimine:
kubeadm alpha kubeconfig user --client-name=mynewuser --apiserver-advertise-address 192.168.100.200 NB: NÔutav reklaamimisadress saab vaadata api-serveri konfigureerimisfailist, mis asub vaikimisi aadressil /etc/kubernetes/manifests/kube-apiserver.yaml.
Tulemuseks olev konfiguraatsioon kuvatakse stdout-is. See tuleb salvestada ~/.kube/config kasutaja kontole vÔi faili, mille kohta on mÀÀratud keskkonnamuutuja KUBECONFIG.
SĂŒgavamale kaevuma
Neile, kes soovivad pÔhjalikumalt uurida kÀsitletud teemasid:
- sertifikaatide kÀsitlemisest Kubernetes'i ametlikus dokumentatsioonis;
- , kus sertifikaatide kĂŒsimust kĂ€sitletakse praktilisest kĂŒljest.
- Kubernetes'e autentimise kohta.
Autoriseerimine
Vaikimisi volitatud konto ei oma Ôigusi klastris tegutsemiseks. Kubernetes'is on volituste andmiseks rakendatud autoriseerimise mehanismi.
Kuni versioonini 1.6 kasutati Kubernetes'is autoriseerimistĂŒĂŒp, mida nimetatakse ABAC (atribuutide pĂ”hine juurdepÀÀsu kontroll). Lisainfot leiate . Praegu peetakse seda lĂ€henemist vananenuks (legacy), kuid saate seda siiski kasutada koos teiste autoriseerimisliikidega.
Praegune (ja paindlikum) meetod juurdepÀÀsuÔiguste jagamiseks klastris on nimetatud RBAC (). See kuulutati stabiilseks alates versioonist . RBAC rakendab Ôiguste mudelit, kus keelatud on kÔik, mis ei ole selgelt lubatud.
RBAC-i aktiveerimisekstuleb kĂ€ivitada Kubernetes api-server koos parameetriga --authorization-mode=RBAC. Parameetrid mÀÀratakse api-serveri konfigureerimise manifestis, mis asub vaikimisi teel /etc/kubernetes/manifests/kube-apiserver.yaml, jaoks command. Siiski on RBAC vaikimisi juba sisse lĂŒlitatud, seega tĂ”enĂ€oliselt pole pĂ”hjust muretseda: saate seda kontrollida vÀÀrtuse kaudu authorization-mode (eelnevalt mainitud kube-apiserver.yaml). Muide, selle vÀÀrtuste seas vĂ”ivad esineda ka teisi autoriseerimisliike (node, webhook, always allow), kuid nende arutamine jÀÀb materiaali raames vĂ€lja.
Muide, oleme juba avaldanud ĂŒsna pĂ”hjaliku ĂŒlevaate RBAC-iga töötamise pĂ”himĂ”tetest ja eripĂ€radest, seega piirdun siin pĂ”hitĂ”dede ja nĂ€idete lĂŒhikese loeteluga.
Kubernetes'i RBAC kaudu juurdepÀÀsu haldamiseks kasutatakse jÀrgmisi API-entiteete:
-
RolljaClusterRoleâ rollid, mis kirjeldavad ligipÀÀsuĂ”igusi: -
RollkĂŒtus kirjeldada Ă”igusi nimetatud nimekirjas; -
ClusterRoleâ klastris, sealhulgas klastrispetsiifiliste objektide, nagu sĂ”lmede, non-resources URL-ide (st Kubernetes'e ressurssidega mitte seotud â nĂ€iteks,/version,/logs,/api*); -
Rolli seondusjaClusterRoleBindingâ teenib seondumiseksRolljaClusterRolekasutajale, kasutajagrupile vĂ”i ServiceAccount'ile.
Rolli ja Rolli seondus entiteedid on piiratud nimeserveri ulatuses, st nad peavad olema ĂŒhe nimeserveri piires. Siiski vĂ”ib Rolli seondus viidata ClusterRole'ile, mis vĂ”imaldab luua rikka loomuliku loa komplekti ja hallata juurdepÀÀsu nende abil.
Rollid kirjeldavad Ôigusi reeglite komplektide abil, mis sisaldavad:
- API-grupid â vt. apiGroups ja vĂ€ljund
kubectl api-resources; - ressursid (resources:
pod,namespace,deploymentjne); - tegusÔnad (verbs:
set,updatejne). - ressursi nimed (
resourceNames) â olukordades, kus tuleb anda juurdepÀÀs kindlale ressursile, mitte kĂ”igile selle tĂŒĂŒbi ressurssidele.
Kubernetes'i autoriseerimise ĂŒksikasjalikum analĂŒĂŒs on saadaval lehekĂŒljelt . Selle asemel (ja tĂ€ienduseks sellele) toon nĂ€ited, mis illustreerivad selle toimimist.
RBAC-i nÀidisobjektid
Lihtne Roll, mis vÔimaldab tuua vÀlja podide nimekirja ja staatuse ning neid jÀlgida sihtnimekirjas siht-nimekiri:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: siht-nimekiri
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"] NÀide ClusterRole, mis vÔimaldab tuua vÀlja podide nimekirja ja staatuse ning neid jÀlgida kogu klastris:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# sektsiooni "namespace" ei ole, kuna ClusterRole katab kogu klastri
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"] NĂ€ide Rolli seondus, mis annab kasutajale minuunewuser «lugeda» podâe sihtnimekirjas minu-nimekiri:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: siht-nimekiri
subjects:
- kind: User
name: minuuser # kasutajanimi on tundlik suur- ja vÀikeharfide suhtes!
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role # siin peab olema âRoleâ vĂ”i âClusterRoleâ
name: pod-reader # Role'i nimi, mis asub samas nimekirjas
# vÔi ClusterRole'i nimi, mille kasutamist
# soovime kasutajale lubada
apiGroup: rbac.authorization.k8s.ioSĂŒndmuste audit
Kubernetes'i arhitektuuri vÔib joonistada jÀrgmiselt:

Kubernetes'i peamine komponent, mis vastutab pĂ€ringute töötlemise eest, on api-server. KĂ”ik klastriga seotud toimingud kĂ€ivad selle kaudu. Nendest sisemistest mehhanismidest saab rohkem lugeda artiklist â».
SĂŒsteemi auditeerimine on huvitav funktsioon Kuberneteses, mis on vaikimisi vĂ€lja lĂŒlitatud. See vĂ”imaldab logida kĂ”iki pöördumisi Kubernetes API-le. Nagu lihtne arvata, tehakse kĂ”ik klastrit puudutavad toimingud just selle API kaudu. Selle vĂ”imaluste kohta saab head kirjeldust leida (nagu ikka) K8s. JĂ€rgnevalt pĂŒĂŒan teemat lihtsamalt selgitada.
Nii et, auditimise lubamiseks, peame api-serverile konteinerisse edastama kolm kohustuslikku parameetrit, millest allpool rohkem juttu:
-
--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 vajalikele parameetrile on veel palju muid seadeid auditeerimise kohta: logide pööramine kuni webhookide kirjeldusteni. NÀide logide pööramise parameetritest:
-
--audit-log-maxbackup=10 -
--audit-log-maxsize=100 -
--audit-log-maxage=7
Kuid jÀÀme nendele pikemalt peatuma â kĂ”ik detailid leiate .
Nagu juba mainitud, seadistatakse kÔik parameetrid api-serveri konfiguratsioonimanifestis (vaikimisi /etc/kubernetes/manifests/kube-apiserver.yaml), sektsioonis command. Naaseme kolme kohustusliku parameetri juurde ja vaatame need lÀbi:
-
audit-policy-fileâ tee YAML-failini, mis kirjeldab auditi poliitikat (policy). Me pöördume selle sisu poole hiljem, aga mĂ€rkida tuleb, et fail peab olema api-serveri protsessile loetav. SeetĂ”ttu tuleb see konteinerisse montaaĆŸida, mille jaoks saate lisada jĂ€rgmise koodi vastavatesse konfigureerimise sektsioonidesse: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 olema samuti api-serveri protsessile loetav, seega kirjeldame selle montaaĆŸi samamoodi: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, aga saadaval on ka vananenud tekstivormaat (legacy).
Auditi poliitika
NĂŒĂŒd rÀÀkides mainitud logipoliitikast. Esimene mĂ”isted audit policy â see on level, logimise tase. Need vĂ”ivad olla jĂ€rgmised:
-
Puudubâ ei logi; -
Metadataâ logige pĂ€ringute metaandmed: kasutaja, pĂ€ringu aeg, sihtressurss (pod, namespace jne), tegevuse tĂŒĂŒp (verb) jne; -
Requestâ logige metaandmed ja pĂ€ringu body; -
RequestResponseâ logige metaandmed, pĂ€ringu body ja vastuse body.
Viimane kaks taset (Request ja RequestResponse) ei logi pÀringuid, mis ei suunatud ressurssidele (nn non-resources urls).
Samuti lÀbivad kÔik pÀringud mitmeid etappe:
-
RequestReceivedâ etapp, kui pĂ€ring on töödeldud ja pole veel edastatud jĂ€rgnevatele töötlejatele; -
ResponseStartedâ vastuse pealkirjad on saadetud, kuid enne vastuse body edastamist. See genereeritakse pikaajaliste pĂ€ringute jaoks (nĂ€iteks,watch); -
ResponseCompleteâ vastuse body on saadetud, rohkem teavet ei saadeta; -
Panicâ sĂŒndmused genereeritakse, kui avastatakse ebanormaalne olukord.
MÔnede etapide vahelejÀtmiseks saab kasutada omitStages.
Poliitika failis saame kirjeldada mitmeid sektsioone erinevate logimise tasemetega. Rakendatakse esimest sobivat reeglit, mis leiti poliitika kirjeldusest.
Kubelet jĂ€lgib api-serveri konfiguratsioonifesti muudatusi ja, kui selliseid avastatakse, taaskĂ€ivitab api-serveri konteineri. Kuid on ĂŒks oluline detail: muudatusi policy failis ei vĂ”eta arvesse.PĂ€rast muudatuste tegemist policy failis tuleb api-server manuaalselt taaskĂ€ivitada. Kuna api-server töötab kui , kĂ€sk kubectl delete ei too kaasa tema taaskĂ€ivitamist. Manuaalselt tuleb teha docker stop kube-masteritel, kus audiitpoliitikat on muudetud:
docker stop $(docker ps | grep k8s_kube-apiserver | awk '{print $1}')Auditimise lubamisel on oluline meeles pidada, et kube-apiserverile tÔuseb koormus.Eriti suureneb mÀlu tarbimine pÀringute konteksti salvestamiseks. Logimise algus toimub alles pÀrast vastusepealkirja saatmist. Samuti sÔltub koormus audiitpoliitika konfiguratsioonist.
Poliitika nÀidised
AnalĂŒĂŒsime policy failide struktuuri nĂ€idete varal.
Siin on lihtne fail policy, et logida kÔike tasemel Metadata:
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata Policy failis saab mÀÀrata kasutajate (Kasutajad ja Teenusekontod) ja kasutajagruppide loendi. NĂ€iteks, nii ignoreerime sĂŒsteemikasutajaid, kuid logime kĂ”ik muu tasemel Request:
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:
- nimetused (
namespaces); - tegusÔnad (verbs:
get,update,kustutaja muud); - ressursid (resources, nimelt:
pod,configmapsjne.) ning ressursside rĂŒhmad (apiGroups).
Palun pöörake tÀhelepanu! Ressursse ja ressursigruppide (API grupid, st apiGroups) versioone, mis on klastris installitud, saab saada jÀrgmiste kÀskude abil:
kubectl api-resources
kubectl api-versionsJĂ€rgmine audit policy on toodud parimate praktikate demonstreerimiseks :
apiVersion: audit.k8s.io/v1beta1
kind: Policy
# Ăra logi RequestReceived etappi
omitStages:
- "RequestReceived"
rules:
# Ăra logi sĂŒndmusi, mis peetakse vĂ€henenud tĂ€htsusega ja mitteohtlikeks:
- level: None
users: ["system:kube-proxy"]
verbs: ["watch"]
resources:
- group: "" # see on api grupp tĂŒhja nimega, mis kuulub
# Kubernetes'i pĂ”hivahendite alla, 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 lugemisĂ”igusega URL-e:
- level: None
nonResourceURLs:
- /healthz*
- /version
- /swagger*
# Ăra logi sĂŒndmusi, mis kuuluvad âsĂŒndmusteâ ressursi tĂŒĂŒbi alla:
- level: None
resources:
- group: "" # core
resources: ["events"]
# Secret-i, ConfigMap-i ja TokenReview'i ressursid vÔivad sisaldada salajasi andmeid,
# seega logime vaid seotud pÀringute metainformatsiooni
- level: Metadata
resources:
- group: "" # core
resources: ["secrets", "configmaps"]
- group: authentication.k8s.io
resources: ["tokenreviews"]
# Get-, list- ja watch-toimingud vÔivad olla ressursiintensiivsed; 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 standardsete API ressursside 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Ôigi teiste pÀringute jaoks
- level: MetadataTeine hea nÀide auditipoliitikast on .
AuditisĂŒndmustele reageerimiseks on vĂ”imalik kirjeldada webhook'i. Seda kĂŒsimust kĂ€sitletakse , jĂ€tn Ă€ra selle artikli raamidest.
KokkuvÔte
Artiklis antakse ĂŒlevaade Kubernetes'e klastrite pĂ”hiturvamehhanismidest, mis vĂ”imaldavad luua isikupĂ€rastatud kasutajakontosid, jagada nende Ă”igusi ja registreerida nende tegevusi. Loodan, et see on kasulik neile, kes on sarnaste kĂŒsimustega kokku puutunud teoorias vĂ”i juba praktikas. Samuti soovitan tutvuda muude turvateemadega seotud materjalide loetelu, mis on toodud "P.S.", â vĂ”ib-olla leiate nende hulgast vajalikke ĂŒksikasju teie jaoks olulistes kĂŒsimustes.
P.S.
Lugege ka meie blogist:
- «»;
- «»;
- «»;
- «»;
- «».
Allikas: habr.com
