Kubernetes Basics
Last updated
Last updated
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Originalni autor ove stranice je Jorge (pročitajte njegov originalni post ovde)
Omogućava pokretanje kontejnera u kontejnerskom motoru.
Raspoređuje kontejnere efikasno.
Održava kontejnere aktivnim.
Omogućava komunikaciju između kontejnera.
Omogućava tehnike implementacije.
Rukuje količinama informacija.
Čvor: operativni sistem sa podom ili podovima.
Pod: Omotač oko kontejnera ili više kontejnera. Pod bi trebao sadržati samo jednu aplikaciju (tako da obično, pod pokreće samo 1 kontejner). Pod je način na koji Kubernetes apstrahuje tehnologiju kontejnera koja se pokreće.
Servis: Svaki pod ima 1 internu IP adresu iz unutrašnjeg opsega čvora. Međutim, može biti izložen i putem servisa. Servis takođe ima IP adresu i njegov cilj je održavanje komunikacije između podova, tako da ako jedan umre, novi zamenski (sa drugačijom internom IP) će biti dostupan izložen na isto IP servisa. Može se konfigurisati kao unutrašnji ili spoljašnji. Servis takođe deluje kao balansirnik opterećenja kada su 2 poda povezana na isti servis.
Kada se servis kreira, možete pronaći krajnje tačke svakog servisa pokretanjem kubectl get endpoints
Kubelet: Primarni agent čvora. Komponenta koja uspostavlja komunikaciju između čvora i kubectl, i može pokretati samo podove (putem API servera). Kubelet ne upravlja kontejnerima koji nisu kreirani od strane Kubernetesa.
Kube-proxy: je servis zadužen za komunikaciju (servise) između apiservera i čvora. Osnova je IPtables za čvorove. Najiskusniji korisnici mogu instalirati druge kube-proxije od drugih dobavljača.
Sidecar kontejner: Sidecar kontejneri su kontejneri koji bi trebali raditi zajedno sa glavnim kontejnerom u podu. Ovaj sidecar obrazac proširuje i poboljšava funkcionalnost trenutnih kontejnera bez promene. Danas znamo da koristimo tehnologiju kontejnera da obavijemo sve zavisnosti za aplikaciju da bi radila bilo gde. Kontejner radi samo jednu stvar i radi tu stvar veoma dobro.
Glavni proces:
Api Server: To je način na koji korisnici i podovi komuniciraju sa glavnim procesom. Samo autentifikovani zahtevi bi trebali biti dozvoljeni.
Raspoređivač: Raspoređivanje se odnosi na osiguranje da su podovi usklađeni sa čvorovima kako bi Kubelet mogao da ih pokrene. Ima dovoljno inteligencije da odluči koji čvor ima više dostupnih resursa i dodeli novi pod njemu. Imajte na umu da raspoređivač ne pokreće nove podove, samo komunicira sa Kubelet procesom koji se pokreće unutar čvora, koji će pokrenuti novi pod.
Kube Controller menadžer: Proverava resurse kao što su replikacijski setovi ili implementacije da proveri da li, na primer, ispravan broj podova ili čvorova radi. U slučaju da nedostaje pod, komuniciraće sa raspoređivačem da pokrene novi. Kontroliše replikaciju, tokene i usluge računa za API.
etcd: Skladište podataka, postojano, konzistentno i distribuirano. To je baza podataka Kubernetesa i skladište ključ-vrednost gde čuva potpuno stanje klastera (svaka promena se ovde beleži). Komponente kao što su Raspoređivač ili Menadžer kontrolera zavise od ovih podataka da bi znale koje su promene nastale (dostupni resursi čvorova, broj pokrenutih podova...)
Cloud controller menadžer: To je specifični kontroler za tokove kontrole i aplikacije, tj: ako imate klastere u AWS-u ili OpenStack-u.
Imajte na umu da kako može biti nekoliko čvorova (koji pokreću nekoliko podova), može biti i nekoliko glavnih procesa čiji je pristup API serveru balansiran opterećenjem i njihov etcd sinhronizovan.
Volumeni:
Kada pod kreira podatke koji ne bi trebali biti izgubljeni kada pod nestane, trebali bi biti smešteni u fizičkom volumenu. Kubernetes omogućava povezivanje volumena sa podom kako bi se podaci sačuvali. Volumen može biti na lokalnoj mašini ili u daljinskom skladištu. Ako pokrećete podove na različitim fizičkim čvorovima, trebali biste koristiti daljinsko skladište kako bi svi podovi mogli da mu pristupe.
Druge konfiguracije:
ConfigMap: Možete konfigurisati URL-ove za pristup servisima. Pod će dobiti podatke odavde da zna kako da komunicira sa ostalim servisima (podovima). Imajte na umu da ovo nije preporučeno mesto za čuvanje kredencijala!
Tajna: Ovo je mesto za čuvanje tajnih podataka kao što su lozinke, API ključevi... kodirani u B64. Pod će moći da pristupi ovim podacima da koristi potrebne kredencijale.
Implementacije: Ovo je mesto gde su navedeni komponenti koje će pokretati Kubernetes. Korisnik obično ne radi direktno sa podovima, podovi su apstrahovani u ReplicaSets (broj istih podova replikovanih), koji se pokreću putem implementacija. Imajte na umu da su implementacije za stateless aplikacije. Minimalna konfiguracija za implementaciju je ime i slika koja se pokreće.
StatefulSet: Ova komponenta je namenjena posebno za aplikacije kao što su baze podataka koje trebaju pristupiti istom skladištu.
Ingress: Ovo je konfiguracija koja se koristi za izlaganje aplikacije javno putem URL-a. Imajte na umu da se ovo može uraditi i korišćenjem spoljašnjih servisa, ali ovo je ispravan način za izlaganje aplikacije.
Ako implementirate Ingress, biće potrebno da kreirate Ingress kontrolere. Ingress kontroler je pod koji će biti krajnja tačka koja će primati zahteve, proveravati ih i balansirati ih na servise. Ingress kontroler će slati zahtev na osnovu konfigurisanih ingress pravila. Imajte na umu da ingress pravila mogu ukazivati na različite putanje ili čak poddomene različitim internim Kubernetes servisima.
Bolja praksa bezbednosti bi bila korišćenje cloud balansirnika opterećenja ili proxy servera kao ulazne tačke kako ne bi bilo koje delove Kubernetes klastera izložene.
Kada se primi zahtev koji ne odgovara nijednom ingress pravilu, ingress kontroler će ga usmeriti na "Podrazumevani backend". Možete opisati
ingress kontroler da dobijete adresu ovog parametra.
minikube addons enable ingress
CA je povereni koren za sve sertifikate unutar klastera.
Omogućava komponentama da se međusobno validiraju.
Svi klasterski sertifikati su potpisani od strane CA.
ETCd ima svoj sertifikat.
tipovi:
apiserver sertifikat.
kubelet sertifikat.
raspoređivač sertifikat.
Minikube se može koristiti za izvođenje nekih brzih testova na Kubernetes-u bez potrebe za implementacijom celog Kubernetes okruženja. Pokrenuće glavne i čvorne procese na jednoj mašini. Minikube će koristiti virtualbox za pokretanje čvora. Pogledajte ovde kako da ga instalirate.
Kubectl
je alat za komandnu liniju za kubernetes klastere. Komunicira sa Api serverom glavnog procesa kako bi izvršio akcije u kubernetesu ili zatražio podatke.
Kontrolna tabla vam omogućava da lakše vidite šta minikube pokreće, možete pronaći URL za pristup u:
Свака конфигурациона датотека има 3 дела: метаподаци, спецификација (шта треба да се покрене), статус (жељено стање). Унутар спецификације конфигурационе датотеке за распоређивање можете пронаћи шаблон дефинисан новом конфигурационом структуром која дефинише слику за покретање:
Пример распоређивања + услуге декларисане у истој конфигурационој датотеци (из овде)
Како је услуга обично повезана са једним распоређивањем, могуће је декларисати обе у истој конфигурационој датотеци (услуга декларисана у овој конфигурацији је доступна само интерно):
Primer konfiguracije spoljne usluge
Ova usluga će biti dostupna spolja (proverite atribute nodePort
i type: LoadBlancer
):
Ovo je korisno za testiranje, ali za produkciju trebate imati samo interne usluge i Ingress za izlaganje aplikacije.
Primer Ingress konfiguracione datoteke
Ovo će izložiti aplikaciju na http://dashboard.com
.
Primer konfiguracione datoteke za tajne
Obratite pažnju na to kako su lozinke kodirane u B64 (što nije sigurno!)
Primer ConfigMap-a
A ConfigMap je konfiguracija koja se daje podovima kako bi znali kako da lociraju i pristupaju drugim servisima. U ovom slučaju, svaki pod će znati da je ime mongodb-service
adresa poda sa kojim mogu da komuniciraju (ovaj pod će izvršavati mongodb):
Zatim, unutar deployment config ova adresa može biti specificirana na sledeći način kako bi se učitala unutar env pod-a:
Primer konfiguracije volumena
Možete pronaći različite primere yaml datoteka za konfiguraciju skladišta na https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes. Napomena: volumeni nisu unutar imenskih prostora
Kubernetes podržava više virtuelnih klastera koji se oslanjaju na isti fizički klaster. Ovi virtuelni klasteri se nazivaju imenski prostori. Namenjeni su za korišćenje u okruženjima sa mnogo korisnika raspoređenih u više timova ili projekata. Za klastere sa nekoliko do desetina korisnika, ne bi trebalo da kreirate ili razmišljate o imenskim prostorima. Trebalo bi da počnete da koristite imenske prostore kako biste imali bolju kontrolu i organizaciju svake komponente aplikacije koja je implementirana u kubernetesu.
Imenski prostori pružaju opseg za imena. Imena resursa moraju biti jedinstvena unutar imenskog prostora, ali ne i između imenskih prostora. Imenski prostori ne mogu biti ugnježdeni jedni unutar drugih i svaki Kubernetes resurs može biti samo u jednom imenskom prostoru.
Postoje 4 imenska prostora po defaultu ako koristite minikube:
kube-system: Nije namenjen za korišćenje od strane korisnika i ne biste trebali da ga dirate. To je za master i kubectl procese.
kube-public: Javna dostupna podataka. Sadrži configmap koji sadrži informacije o klasteru.
kube-node-lease: Određuje dostupnost čvora.
default: Namespace koji korisnik koristi za kreiranje resursa.
Napomena da se većina Kubernetes resursa (npr. podovi, servisi, kontroleri replikacije i drugi) nalaze u nekim prostorima imena. Međutim, drugi resursi kao što su resursi prostora imena i resursi niskog nivoa, kao što su čvorovi i persistenVolumes, nisu u prostoru imena. Da biste videli koji Kubernetes resursi su i nisu u prostoru imena:
Možete sačuvati namespace za sve naredne kubectl komande u tom kontekstu.
Helm je menadžer paketa za Kubernetes. Omogućava pakovanje YAML datoteka i distribuciju u javnim i privatnim repozitorijumima. Ovi paketi se nazivaju Helm Charts.
Helm je takođe engine za šablone koji omogućava generisanje konfiguracionih fajlova sa promenljivim vrednostima:
Tajna je objekat koji sadrži osetljive podatke kao što su lozinka, token ili ključ. Takve informacije bi inače mogle biti smeštene u specifikaciji Pod-a ili u slici. Korisnici mogu kreirati Tajne, a sistem takođe kreira Tajne. Ime objekta Tajne mora biti validno DNS poddomen ime. Pročitajte ovde službenu dokumentaciju.
Tajne mogu biti stvari poput:
API, SSH ključevi.
OAuth tokeni.
Akreditivi, Lozinke (običan tekst ili b64 + enkripcija).
Informacije ili komentari.
Kod za povezivanje sa bazom podataka, stringovi… .
Postoje različite vrste tajni u Kubernetes-u
Opaque
arbitrarni podaci definisani od strane korisnika (Podrazumevano)
kubernetes.io/service-account-token
token za servisni nalog
kubernetes.io/dockercfg
serijalizovana ~/.dockercfg datoteka
kubernetes.io/dockerconfigjson
serijalizovana ~/.docker/config.json datoteka
kubernetes.io/basic-auth
akreditivi za osnovnu autentifikaciju
kubernetes.io/ssh-auth
akreditivi za SSH autentifikaciju
kubernetes.io/tls
podaci za TLS klijent ili server
bootstrap.kubernetes.io/token
podaci o bootstrap tokenu
Opaque tip je podrazumevani, tipični par ključ-vrednost definisan od strane korisnika.
Kako tajne funkcionišu:
Sledeći konfiguracioni fajl definiše tajnu pod nazivom mysecret
sa 2 para ključ-vrednost username: YWRtaW4=
i password: MWYyZDFlMmU2N2Rm
. Takođe definiše pod pod nazivom secretpod
koji će imati username
i password
definisane u mysecret
izložene u promenljivim okruženja SECRET_USERNAME
__ i __ SECRET_PASSWOR
. Takođe će montirati tajnu username
unutar mysecret
na putanji /etc/foo/my-group/my-username
sa 0640
dozvolama.
etcd je konzistentna i visoko dostupna key-value skladište koje se koristi kao pozadinsko skladište za sve podatke klastera u Kubernetes-u. Hajde da pristupimo tajnama koje su pohranjene u etcd:
Videćete da su certifikati, ključevi i URL-ovi smešteni u FS. Kada ih dobijete, moći ćete da se povežete na etcd.
Kada uspostavite komunikaciju, moći ćete da dobijete tajne:
Dodavanje enkripcije u ETCD
Po defaultu, sve tajne su smeštene u običnom tekstu unutar etcd-a, osim ako ne primenite sloj enkripcije. Sledeći primer se zasniva na https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/
Nakon toga, potrebno je postaviti --encryption-provider-config
zastavicu na kube-apiserver
da ukazuje na lokaciju kreirane konfiguracione datoteke. Možete izmeniti /etc/kubernetes/manifest/kube-apiserver.yaml
i dodati sledeće linije:
Scroll down in the volumeMounts:
Pomерите se prema dole u volumeMounts do hostPath:
Proveravanje da li su podaci enkriptovani
Podaci su enkriptovani kada se zapisuju u etcd. Nakon ponovnog pokretanja vašeg kube-apiserver
, svaka nova ili ažurirana tajna treba da bude enkriptovana kada se skladišti. Da biste proverili, možete koristiti etcdctl
komandnu liniju da preuzmete sadržaj vaše tajne.
Kreirajte novu tajnu pod nazivom secret1
u default
imenskom prostoru:
Koristeći etcdctl komandnu liniju, pročitajte tu tajnu iz etcd:
ETCDCTL_API=3 etcdctl get /registry/secrets/default/secret1 [...] | hexdump -C
gde [...]
moraju biti dodatni argumenti za povezivanje sa etcd serverom. 3. Proverite da li je sačuvana tajna prefiksovana sa k8s:enc:aescbc:v1:
što ukazuje da je aescbc
provajder enkriptovao dobijene podatke. 4. Proverite da li je tajna ispravno dekriptovana kada se preuzme putem API-ja:
trebalo bi da odgovara mykey: bXlkYXRh
, mydata je kodirana, proverite dekodiranje tajne da biste potpuno dekodirali tajnu.
Pošto su tajne enkriptovane prilikom pisanja, izvršavanje ažuriranja na tajni će enkriptovati taj sadržaj:
Završni saveti:
Pokušajte da ne čuvate tajne u FS, uzmite ih iz drugih izvora.
Pogledajte https://www.vaultproject.io/ za dodatnu zaštitu vaših tajni.
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)