Kubernetes Basics
Last updated
Last updated
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Die oorspronklike skrywer van hierdie bladsy is Jorge (lees sy oorspronklike pos hier)
Laat toe om een of meer houers in 'n houer-enjin te laat loop.
Skeduleer houers missie doeltreffend.
Hou houers lewendig.
Laat houer kommunikasie toe.
Laat ontplooiingstegnieke toe.
Hanteer volumes van inligting.
Node: bedryfstelsel met pod of pods.
Pod: Wrapper rondom 'n houer of verskeie houers. 'n Pod moet slegs een toepassing bevat (so gewoonlik, 'n pod loop net 1 houer). Die pod is die manier waarop kubernetes die houertegnologie wat loop, abstraheer.
Diens: Elke pod het 1 interne IP adres van die interne reeks van die node. Dit kan egter ook blootgestel word via 'n diens. Die diens het ook 'n IP adres en sy doel is om die kommunikasie tussen pods te handhaaf sodat as een sterf, die nuwe vervanging (met 'n ander interne IP) toeganklik sal wees blootgestel in die dieselfde IP van die diens. Dit kan as intern of ekstern geconfigureer word. Die diens funksioneer ook as 'n laaibalansier wanneer 2 pods aan dieselfde diens gekoppel is.
Wanneer 'n diens geskep word, kan jy die eindpunte van elke diens vind deur kubectl get endpoints
te loop.
Kubelet: Primêre node agent. Die komponent wat kommunikasie tussen node en kubectl tot stand bring, en kan slegs pods laat loop (deur API bediener). Die kubelet bestuur nie houers wat nie deur Kubernetes geskep is nie.
Kube-proxy: is die diens wat verantwoordelik is vir die kommunikasies (dienste) tussen die apiserver en die node. Die basis is 'n IPtables vir nodes. Mees ervare gebruikers kan ander kube-proxies van ander verskaffers installeer.
Sidecar houer: Sidecar houers is die houers wat saam met die hoofhouer in die pod moet loop. Hierdie sidecar patroon brei en verbeter die funksionaliteit van huidige houers sonder om hulle te verander. Vandag weet ons dat ons houertegnologie gebruik om al die afhanklikhede vir die toepassing te verpak om oral te loop. 'n Houer doen net een ding en doen dit baie goed.
Meester proses:
Api Server: Is die manier waarop die gebruikers en die pods kommunikeer met die meester proses. Slegs geverifieerde versoeke moet toegelaat word.
Scheduler: Skedulering verwys na die verseker dat Pods aan Nodes gekoppel word sodat Kubelet hulle kan laat loop. Dit het genoeg intelligensie om te besluit watter node meer beskikbare hulpbronne het om die nuwe pod aan te dui. Let daarop dat die scheduler nie nuwe pods begin nie, dit kommunikeer net met die Kubelet proses wat binne die node loop, wat die nuwe pod sal bekendstel.
Kube Controller bestuurder: Dit kontroleer hulpbronne soos replika stelle of ontplooiings om te kyk of, byvoorbeeld, die korrekte aantal pods of nodes loop. In die geval dat 'n pod ontbreek, sal dit met die scheduler kommunikeer om 'n nuwe een te begin. Dit beheer replika, tokens, en rekeningdienste aan die API.
etcd: Data berging, volhoubaar, konsekwent, en versprei. Is Kubernetes se databasis en die sleutel-waarde berging waar dit die volledige toestand van die klusters hou (elke verandering word hier geregistreer). Komponente soos die Scheduler of die Controller bestuurder hang van hierdie data af om te weet watter veranderinge plaasgevind het (beskikbare hulpbronne van die nodes, aantal pods wat loop...)
Cloud controller bestuurder: Is die spesifieke bestuurder vir vloei kontroles en toepassings, d.w.s.: as jy klusters in AWS of OpenStack het.
Let daarop dat daar verskeie nodes kan wees (wat verskeie pods loop), daar kan ook verskeie meester prosesse wees wat hul toegang tot die Api server gebalanseerd is en hul etcd gesinkroniseer is.
Volumes:
Wanneer 'n pod data skep wat nie verlore moet gaan wanneer die pod verdwyn nie, moet dit in 'n fisiese volume gestoor word. Kubernetes laat toe om 'n volume aan 'n pod te koppel om die data te behou. Die volume kan in die plaaslike masjien of in 'n afgeleë berging wees. As jy pods in verskillende fisiese nodes loop, moet jy 'n afgeleë berging gebruik sodat al die pods toegang kan hê.
Ander konfigurasies:
ConfigMap: Jy kan URLs konfigureer om toegang tot dienste te verkry. Die pod sal data hieruit verkry om te weet hoe om met die res van die dienste (pods) te kommunikeer. Let daarop dat dit nie die aanbevole plek is om akrediteer te stoor nie!
Secret: Dit is die plek om geheime data soos wagwoorde, API sleutels... in B64 te kodeer. Die pod sal toegang hê tot hierdie data om die vereiste akrediteer te gebruik.
Ontplooiings: Dit is waar die komponente wat deur kubernetes gedra moet word, aangedui word. 'n Gebruiker sal gewoonlik nie direk met pods werk nie, pods is geabstraheer in ReplicaSets (aantal van dieselfde pods wat gerepliseer word), wat deur ontplooiings gedra word. Let daarop dat ontplooiings vir statuslose toepassings is. Die minimum konfigurasie vir 'n ontplooiing is die naam en die beeld om te loop.
StatefulSet: Hierdie komponent is spesifiek bedoel vir toepassings soos databasisse wat die selfde berging moet toegang.
Ingress: Dit is die konfigurasie wat gebruik word om die toepassing publiek met 'n URL bloot te stel. Let daarop dat dit ook met eksterne dienste gedoen kan word, maar dit is die korrekte manier om die toepassing bloot te stel.
As jy 'n Ingress implementeer, sal jy Ingress Controllers moet skep. Die Ingress Controller is 'n pod wat die eindpunt sal wees wat die versoeke sal ontvang en nagaan en dit na die dienste sal laai balanseer. Die ingress controller sal die versoek stuur gebaseer op die ingestelde ingress reëls. Let daarop dat die ingress reëls na verskillende paaie of selfs subdomeine na verskillende interne kubernetes dienste kan verwys.
'n Beter sekuriteitspraktyk sou wees om 'n wolk laaibalansier of 'n proxy bediener as toegangspunt te gebruik om nie enige deel van die Kubernetes-kluster bloot te stel nie.
Wanneer 'n versoek wat nie aan enige ingress reel voldoen nie, ontvang word, sal die ingress controller dit na die "Default backend" lei. Jy kan describe
die ingress controller om die adres van hierdie parameter te kry.
minikube addons enable ingress
CA is die vertroude wortel vir alle sertifikate binne die kluster.
Laat komponente toe om mekaar te valideer.
Alle kluster sertifikate word deur die CA onderteken.
ETCd het sy eie sertifikaat.
tipes:
apiserver sert.
kubelet sert.
scheduler sert.
Minikube kan gebruik word om 'n paar vinnige toetse op kubernetes uit te voer sonder om 'n hele kubernetes omgewing te ontplooi. Dit sal die meester en node prosesse op een masjien laat loop. Minikube sal virtualbox gebruik om die node te laat loop. Sien hier hoe om dit te installeer.
Kubectl
is die opdraglyn hulpmiddel vir kubernetes klusters. Dit kommunikeer met die Api bediener van die meester proses om aksies in kubernetes uit te voer of om data te vra.
Die dashboard laat jou toe om makliker te sien wat minikube hardloop, jy kan die URL vind om dit te benader in:
Elke konfigurasie lêer het 3 dele: metadata, spesifikasie (wat nodig is om te begin), status (gewens toestand). Binne die spesifikasie van die ontplooiing konfigurasie lêer kan jy die sjabloon vind wat gedefinieer is met 'n nuwe konfigurasiestruktuur wat die beeld om te loop definieer:
Voorbeeld van Ontplooiing + Diens verklaar in dieselfde konfigurasie lêer (van hier)
Aangesien 'n diens gewoonlik verband hou met een ontplooiing, is dit moontlik om albei in dieselfde konfigurasie lêer te verklaar (die diens wat in hierdie konfigurasie verklaar is, is slegs intern toeganklik):
Voorbeeld van eksterne dienskonfigurasie
Hierdie diens sal ekstern toeganklik wees (kyk na die nodePort
en type: LoadBlancer
eienskappe):
Dit is nuttig vir toetsing, maar vir produksie moet jy slegs interne dienste hê en 'n Ingress om die toepassing bloot te stel.
Voorbeeld van Ingress konfigurasie lêer
Dit sal die toepassing blootstel in http://dashboard.com
.
Voorbeeld van geheime konfigurasie lêer
Let op hoe die wagwoord in B64 gekodeer is (wat nie veilig is nie!)
Voorbeeld van ConfigMap
'n ConfigMap is die konfigurasie wat aan die pods gegee word sodat hulle weet hoe om ander dienste te lokaliseer en toegang te verkry. In hierdie geval sal elke pod weet dat die naam mongodb-service
die adres van 'n pod is waarmee hulle kan kommunikeer (hierdie pod sal 'n mongodb uitvoer):
Dan kan hierdie adres binne 'n deployment config op die volgende manier gespesifiseer word sodat dit binne die omgewing van die pod gelaai word:
Voorbeeld van volume konfigurasie
Jy kan verskillende voorbeelde van stoor konfigurasie yaml lêers vind in https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes. Let daarop dat volumes nie binne namespaces is nie
Kubernetes ondersteun meervoudige virtuele klusters wat deur dieselfde fisiese kluster ondersteun word. Hierdie virtuele klusters word namespaces genoem. Hierdie is bedoel vir gebruik in omgewings met baie gebruikers versprei oor verskeie spanne of projekte. Vir klusters met 'n paar tot tien gebruikers, behoort jy glad nie namespaces te moet skep of daaroor te dink nie. Jy behoort slegs namespaces te begin gebruik om 'n beter beheer en organisasie van elke deel van die toepassing wat in kubernetes ontplooi is, te hê.
Namespaces bied 'n omvang vir name. Name van hulpbronne moet uniek wees binne 'n namespace, maar nie oor namespaces nie. Namespaces kan nie binne mekaar genest wees nie en elke Kubernetes hulpbron kan slegs in een namespace wees.
Daar is 4 namespaces per standaard as jy minikube gebruik:
kube-system: Dit is nie bedoel vir gebruikers nie en jy behoort dit nie aan te raak nie. Dit is vir master en kubectl prosesse.
kube-public: Publiek toeganklike data. Bevat 'n configmap wat klusterinligting bevat.
kube-node-lease: Bepaal die beskikbaarheid van 'n node.
default: Die naamruimte wat die gebruiker sal gebruik om hulpbronne te skep.
Let op dat die meeste Kubernetes hulpbronne (bv. pods, dienste, replika kontrollers, en ander) in sommige namespaces is. egter, ander hulpbronne soos namespace hulpbronne en lae vlak hulpbronne, soos nodes en persistenVolumes is nie in 'n namespace nie. Om te sien watter Kubernetes hulpbronne in 'n namespace is en nie:
Jy kan die naamruimte vir alle daaropvolgende kubectl-opdragte in daardie konteks stoor.
Helm is die pakketbestuurder vir Kubernetes. Dit stel in staat om YAML-lêers te pak en dit in openbare en private repositories te versprei. Hierdie pakkette word Helm Charts genoem.
Helm is ook 'n sjabloon enjin wat dit moontlik maak om konfigurasie lêers met veranderlikes te genereer:
'n Geheim is 'n objek wat sensitiewe data soos 'n wagwoord, 'n token of 'n sleutel bevat. Sulke inligting kan andersins in 'n Pod spesifikasie of in 'n beeld geplaas word. Gebruikers kan Geheime skep en die stelsel skep ook Geheime. Die naam van 'n Geheim objek moet 'n geldige DNS subdomeinnaam wees. Lees hier die amptelike dokumentasie.
Geheime kan dinge wees soos:
API, SSH Sleutels.
OAuth tokens.
Kredensiale, Wagwoorde (plak teks of b64 + versleuteling).
Inligting of kommentaar.
Databasis verbindsleutel, stringe… .
Daar is verskillende tipes geheime in Kubernetes
Opaque
arbitraire gebruiker-gedefinieerde data (Standaard)
kubernetes.io/service-account-token
diensrekening token
kubernetes.io/dockercfg
geserialiseerde ~/.dockercfg lêer
kubernetes.io/dockerconfigjson
geserialiseerde ~/.docker/config.json lêer
kubernetes.io/basic-auth
kredensiale vir basiese verifikasie
kubernetes.io/ssh-auth
kredensiale vir SSH verifikasie
kubernetes.io/tls
data vir 'n TLS kliënt of bediener
bootstrap.kubernetes.io/token
bootstrap token data
Die Opaque tipe is die standaard een, die tipiese sleutel-waarde paar gedefinieer deur gebruikers.
Hoe geheime werk:
Die volgende konfigurasielêer definieer 'n geheim genoem mysecret
met 2 sleutel-waarde pare username: YWRtaW4=
en password: MWYyZDFlMmU2N2Rm
. Dit definieer ook 'n pod genoem secretpod
wat die username
en password
gedefinieer in mysecret
in die omgewing veranderlikes SECRET_USERNAME
__ en __ SECRET_PASSWOR
sal blootstel. Dit sal ook die username
geheim binne mysecret
in die pad /etc/foo/my-group/my-username
met 0640
regte monteer.
etcd is 'n konsekwente en hoogs-beskikbare key-value store wat as Kubernetes agtergrondopslag vir alle klusterdata gebruik word. Laat ons toegang verkry tot die geheime wat in etcd gestoor is:
U sal sien dat sertifikate, sleutels en URL's in die FS geleë is. Sodra u dit kry, sal u in staat wees om met etcd te verbind.
Sodra jy kommunikasie gevestig het, sal jy in staat wees om die geheime te verkry:
Voeg versleuteling by die ETCD
Standaard word al die geheime in duidelike teks binne etcd gestoor tensy jy 'n versleutelinglaag toepas. Die volgende voorbeeld is gebaseer op https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/
Daarna moet jy die --encryption-provider-config
vlag op die kube-apiserver
stel om na die ligging van die geskepte konfigurasie-lêer te verwys. Jy kan /etc/kubernetes/manifest/kube-apiserver.yaml
wysig en die volgende lyne byvoeg:
Scroll af in die volumeMounts:
Scroll af in die volumeMounts na hostPath:
Verifikasie dat data geënkripteer is
Data word geënkripteer wanneer dit na etcd geskryf word. Na die herbegin van jou kube-apiserver
, moet enige nuut geskepte of opgedateerde geheim geënkripteer wees wanneer dit gestoor word. Om te kontroleer, kan jy die etcdctl
opdraglynprogram gebruik om die inhoud van jou geheim te verkry.
Skep 'n nuwe geheim genaamd secret1
in die default
naamruimte:
Gebruik die etcdctl opdraglyn, lees daardie geheim uit etcd:
ETCDCTL_API=3 etcdctl get /registry/secrets/default/secret1 [...] | hexdump -C
waar [...]
die bykomende argumente moet wees om met die etcd bediener te verbind. 3. Verifieer dat die gestoor geheim voorafgegaan word deur k8s:enc:aescbc:v1:
wat aandui dat die aescbc
verskaffer die resultaatdata geënkripteer het. 4. Verifieer dat die geheim korrek gedekodeer word wanneer dit via die API verkry word:
moet ooreenstem met mykey: bXlkYXRh
, mydata is gekodeer, kyk na dekodering van 'n geheim om die geheim heeltemal te dekodeer.
Aangesien geheime geënkripteer word wanneer geskryf word, sal die uitvoering van 'n opdatering op 'n geheim daardie inhoud geënkripteer:
Finale wenke:
Probeer om nie geheime in die FS te hou nie, kry dit van ander plekke.
Kyk na https://www.vaultproject.io/ om meer beskerming aan jou geheime toe te voeg.
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)