Kubernetes Basics

Msingi wa Kubernetes

Jifunze kuhusu kuvamia AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Mwandishi asili wa ukurasa huu ni Jorge (soma chapisho lake la asili hapa)

Usanifu na Msingi

Kubernetes Inafanya Nini?

  • Inaruhusu kukimbia chombo/au vyombo vya kontena katika injini ya kontena.

  • Ratiba inaruhusu vyombo kutekeleza kazi kwa ufanisi.

  • Kuweka vyombo hai.

  • Inaruhusu mawasiliano ya vyombo.

  • Inaruhusu mbinu za kupeleka.

  • Kusimamia kiasi kikubwa cha habari.

Usanifu

  • Node: mfumo wa uendeshaji na podi au podi.

  • Pod: Kifungashio cha kontena au vyombo vingi na. Kipodi inapaswa kuwa na maombi moja tu (kwa hivyo kawaida, podi inaendesha kontena 1 tu). Podi ni njia ambayo kubernetes inaondoa teknolojia ya kontena inayotumika.

  • Huduma: Kila podi ina anwani ya IP ya ndani kutoka kwa safu ya ndani ya node. Walakini, inaweza pia kufunuliwa kupitia huduma. Huduma pia ina anwani ya IP na lengo lake ni kudumisha mawasiliano kati ya podi ili ikiwa moja inakufa mbadala mpya (na anwani tofauti ya ndani) itapatikana ikiwa inafunuliwa katika anwani sawa ya huduma. Inaweza kusanidiwa kama ndani au nje. Huduma pia hufanya kazi kama mizani ya mzigo wakati podi 2 zimeunganishwa kwenye huduma ile ile. Wakati huduma inapoundwa unaweza kupata vituo vya mwisho vya kila huduma inayotumika kubectl get endpoints

  • Kubelet: Wakala wa nodi wa msingi. Sehemu ambayo inaweka mawasiliano kati ya nodi na kubectl, na inaweza kuendesha podi tu (kupitia seva ya API). Kubelet haisimamii kontena ambazo hazikuundwa na Kubernetes.

  • Kube-proxy: ni huduma inayohusika na mawasiliano (huduma) kati ya apiserver na nodi. Msingi ni IPtables kwa nodi. Watumiaji wengi wenye uzoefu wanaweza kusakinisha kube-proxies zingine kutoka kwa wauzaji wengine.

  • Kontena ya Sidecar: Kontena za Sidecar ni kontena ambazo zinapaswa kuendeshwa pamoja na kontena kuu katika podi. Mtindo huu wa sidecar unapanua na kuboresha utendaji wa kontena za sasa bila kuzibadilisha. Leo, Tunajua kwamba tunatumia teknolojia ya kontena kufunga mahitaji yote ya programu ili iweze kufanya kazi mahali popote. Kontena inafanya kitu kimoja tu na kinafanya kitu hicho vizuri sana.

  • Mchakato wa Mkuu:

  • Seva ya API: Ni njia ambayo watumiaji na podi hutumia kuzungumza na mchakato wa mkuu. Ombi lililothibitishwa tu linapaswa kuruhusiwa.

  • Mipangilio: Ratiba inahusiana na kuhakikisha kuwa Podi zinalinganishwa na Nodi ili Kubelet iweze kuziendesha. Ina akili ya kutosha kuamua ni nodi ipi ina rasilimali zaidi zilizopo na kugawa podi mpya kwake. Kumbuka kuwa ratiba haisababishi podi mpya, inawasiliana tu na mchakato wa Kubelet unaoendesha ndani ya nodi, ambayo itazindua podi mpya.

  • Meneja wa Kudhibiti wa Kube: Huchunguza rasilimali kama seti za nakala au kupeleka ili kuhakikisha kuwa, kwa mfano, idadi sahihi ya podi au nodi zinaendeshwa. Kwa mfano, ikiwa podi inakosekana, itawasiliana na ratiba kuanza mpya. Inadhibiti nakala, alama, na huduma za akaunti kwa API.

  • etcd: Uhifadhi wa data, thabiti, na usambazaji. Ni hifadhidata ya Kubernetes na uhifadhi wa funguo-na-thamani ambapo inahifadhi hali kamili ya vikundi (kila mabadiliko yanalogwa hapa). Vipengele kama Ratiba au Meneja wa Kudhibiti hutegemea tarehe hii kujua mabadiliko yaliyotokea (rasilimali zilizopo za nodi, idadi ya podi zinazoendeshwa...)

  • Meneja wa Kudhibiti wa Kudhibiti wa Wingu: Ni meneja maalum wa udhibiti wa mtiririko na programu, yaani: ikiwa una vikundi katika AWS au OpenStack.

Tafadhali kumbuka kwamba kwa kuwa kunaweza kuwa na nodi kadhaa (zinaendesha podi kadhaa), pia kunaweza kuwa na mchakato wa mkuu kadhaa ambapo upatikanaji wao kwa seva ya Api unagawanywa mzigo na etcd yao kusawazishwa.

Vipimo:

Wakati podi inaunda data ambayo haipaswi kupotea wakati podi inapotea inapaswa kuhifadhiwa kwenye kiasi cha kimwili. Kubernetes inaruhusu kuambatisha kiasi kwa podi ili kuhifadhi data. Kiasi kinaweza kuwa kwenye mashine ya ndani au kwenye uhifadhi wa mbali. Ikiwa unaendesha podi kwenye nodi za kimwili tofauti unapaswa kutumia uhifadhi wa mbali ili podi zote ziweze kufikia.

Mipangilio Mingine:

  • Ramani ya Mipangilio: Unaweza kusanidi URLs za kupata huduma. Podi itapata data kutoka hapa kujua jinsi ya kuwasiliana na huduma zingine (podi). Tafadhali kumbuka kuwa hii sio mahali pa kupakia siri!

  • Siri: Hii ni mahali pa kuhifadhi data za siri kama nywila, funguo za API... zilizoandikwa kwa B64. Podi itaweza kupata data hii kutumia siri inayohitajika.

  • Upelekaji: Hapa ndipo viungo vinavyotakiwa kutekelezwa na kubernetes vinavyoonyeshwa. Mtumiaji kawaida hatafanya kazi moja kwa moja na podi, podi zinafichwa katika Seti za Nakala (idadi ya podi sawa zilizorekebishwa), ambazo hufanywa kupitia upelekaji. Tafadhali kumbuka kuwa upelekaji ni kwa maombi yasiyo na hali. Mipangilio ya chini kwa upelekaji ni jina na picha ya kuendesha.

  • Seti ya Kustahiki: Kipengele hiki kimeundwa kwa maombi maalum kama benki ya data ambayo inahitaji kufikia uhifadhi sawa.

  • Kuingia: Hii ni usanidi unaotumiwa kufunua programu kwa umma na URL. Tafadhali kumbuka hii inaweza pia kufanywa kwa kutumia huduma za nje, lakini hii ndio njia sahihi ya kufunua programu.

  • Ikiwa unatekeleza Kuingia utahitaji kuunda Wakalishi wa Kuingia. Mlezi wa Kuingia ni podi ambayo itakuwa mwisho wa kupokea maombi na kuchunguza na kuzipakia kwa huduma. mlezi wa kuingia atatuma ombi kulingana na sheria za kuingia zilizosanidiwa. Tafadhali kumbuka kuwa sheria za kuingia zinaweza kuelekeza kwa njia tofauti au hata subdomains kwa huduma za ndani za kubernetes.

  • Mbinu bora ya usalama itakuwa kutumia mizani ya mzigo wa wingu au seva ya wakala kama kituo cha kuingia ili usiwe na sehemu yoyote ya kikundi cha Kubernetes iliyofunuliwa.

  • Wakati ombi ambalo halilingani na sheria yoyote ya kuingia linapokelewa, mlezi wa kuingia atalielekeza kwa "Mwisho wa Msingi". Unaweza eleza mlezi wa kuingia kupata anwani ya kipengele hiki.

  • minikube addons enable ingress

Miundombinu ya PKI - Mamlaka ya Cheti CA:

  • CA ni mzizi wa kuaminika kwa vyeti vyote ndani ya kikundi.

  • Inaruhusu vipengele kuthibitisha kwa kila mmoja.

  • Vyeti vyote vya kikundi vinasainiwa na CA.

  • ETCd ina cheti chake cha kipekee.

  • aina:

    • cheti cha apiserver.

    • cheti cha kubelet.

    • cheti cha scheduler.

Hatua za Msingi

Minikube

Minikube inaweza kutumika kufanya vipimo vya haraka kwenye kubernetes bila kuwa na haja ya kupeleka mazingira kamili ya kubernetes. Itaendesha mchakato wa bwana na nodi kwenye mashine moja. Minikube itatumia virtualbox kuendesha nodi. Angalia hapa jinsi ya kuweka.

$ minikube start
😄  minikube v1.19.0 on Ubuntu 20.04
✨  Automatically selected the virtualbox driver. Other choices: none, ssh
💿  Downloading VM boot image ...
> minikube-v1.19.0.iso.sha256: 65 B / 65 B [-------------] 100.00% ? p/s 0s
> minikube-v1.19.0.iso: 244.49 MiB / 244.49 MiB  100.00% 1.78 MiB p/s 2m17.
👍  Starting control plane node minikube in cluster minikube
💾  Downloading Kubernetes v1.20.2 preload ...
> preloaded-images-k8s-v10-v1...: 491.71 MiB / 491.71 MiB  100.00% 2.59 MiB
🔥  Creating virtualbox VM (CPUs=2, Memory=3900MB, Disk=20000MB) ...
🐳  Preparing Kubernetes v1.20.2 on Docker 20.10.4 ...
▪ Generating certificates and keys ...
▪ Booting up control plane ...
▪ Configuring RBAC rules ...
🔎  Verifying Kubernetes components...
▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by defaul

$ minikube status
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

---- ONCE YOU HAVE A K8 SERVICE RUNNING WITH AN EXTERNAL SERVICE -----
$ minikube service mongo-express-service
(This will open your browser to access the service exposed port)

$ minikube delete
🔥  Deleting "minikube" in virtualbox ...
💀  Removed all traces of the "minikube" cluster

Misingi ya Kubectl

Kubectl ni chombo cha mstari wa amri kwa vikundi vya kubernetes. Inawasiliana na seva ya Api ya mchakato wa msingi kutekeleza vitendo katika kubernetes au kuomba data.

kubectl version #Get client and server version
kubectl get pod
kubectl get services
kubectl get deployment
kubectl get replicaset
kubectl get secret
kubectl get all
kubectl get ingress
kubectl get endpoints

#kubectl create deployment <deployment-name> --image=<docker image>
kubectl create deployment nginx-deployment --image=nginx
#Access the configuration of the deployment and modify it
#kubectl edit deployment <deployment-name>
kubectl edit deployment nginx-deployment
#Get the logs of the pod for debbugging (the output of the docker container running)
#kubectl logs <replicaset-id/pod-id>
kubectl logs nginx-deployment-84cd76b964
#kubectl describe pod <pod-id>
kubectl describe pod mongo-depl-5fd6b7d4b4-kkt9q
#kubectl exec -it <pod-id> -- bash
kubectl exec -it mongo-depl-5fd6b7d4b4-kkt9q -- bash
#kubectl describe service <service-name>
kubectl describe service mongodb-service
#kubectl delete deployment <deployment-name>
kubectl delete deployment mongo-depl
#Deploy from config file
kubectl apply -f deployment.yml

Dashibodi ya Minikube

Dashibodi inaruhusu kuona kwa urahisi ni nini kinachofanyika kwenye minikube, unaweza kupata URL ya kufikia hapo:

minikube dashboard --url


🔌  Enabling dashboard ...
▪ Using image kubernetesui/dashboard:v2.3.1
▪ Using image kubernetesui/metrics-scraper:v1.0.7
🤔  Verifying dashboard health ...
🚀  Launching proxy ...
🤔  Verifying proxy health ...
http://127.0.0.1:50034/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/

Mifano ya faili za usanidi wa YAML

Kila faili ya usanidi ina sehemu 3: metadata, specification (kile kinachohitaji kuzinduliwa), hali (hali inayotakiwa). Ndani ya maelezo ya usanidi wa faili ya usanidi wa kutolewa unaweza kupata kiolezo kilichoelezwa na muundo mpya wa usanidi unaoelezea picha ya kukimbia:

Mfano wa Kutolewa + Huduma iliyotangazwa katika faili moja ya usanidi (kutoka hapa)

Kwa kuwa huduma kawaida inahusiana na kutolewa moja, ni rahisi kutangaza yote mawili katika faili moja ya usanidi (huduma iliyotangazwa katika usanidi huu inaweza kufikiwa ndani tu):

apiVersion: apps/v1
kind: Deployment
metadata:
name: mongodb-deployment
labels:
app: mongodb
spec:
replicas: 1
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: mongo
ports:
- containerPort: 27017
env:
- name: MONGO_INITDB_ROOT_USERNAME
valueFrom:
secretKeyRef:
name: mongodb-secret
key: mongo-root-username
- name: MONGO_INITDB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mongodb-secret
key: mongo-root-password
---
apiVersion: v1
kind: Service
metadata:
name: mongodb-service
spec:
selector:
app: mongodb
ports:
- protocol: TCP
port: 27017
targetPort: 27017

Mfano wa usanidi wa huduma ya nje

Huduma hii itapatikana kwa njia ya nje (angalia sifa za nodePort na type: LoadBalancer):

---
apiVersion: v1
kind: Service
metadata:
name: mongo-express-service
spec:
selector:
app: mongo-express
type: LoadBalancer
ports:
- protocol: TCP
port: 8081
targetPort: 8081
nodePort: 30000

Hii ni muhimu kwa ajili ya majaribio lakini kwa uzalishaji unapaswa kuwa na huduma za ndani pekee na Ingress ili kufunua programu.

Mfano wa faili ya mazingira ya Ingress

Hii itafunua programu katika http://dashboard.com.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dashboard-ingress
namespace: kubernetes-dashboard
spec:
rules:
- host: dashboard.com
http:
paths:
- backend:
serviceName: kubernetes-dashboard
servicePort: 80

Mfano wa faili ya usanidi wa siri

Tafadhali angalia jinsi nywila zilivyoandikwa kwa msimbo wa Base64 (ambao si salama!)

apiVersion: v1
kind: Secret
metadata:
name: mongodb-secret
type: Opaque
data:
mongo-root-username: dXNlcm5hbWU=
mongo-root-password: cGFzc3dvcmQ=

Mfano wa ConfigMap

ConfigMap ni usanidi ambao unatolewa kwa makasha ili wajue jinsi ya kutambua na kupata huduma nyingine. Katika kesi hii, kila kasha litajua kuwa jina mongodb-service ni anwani ya kasha wanayoweza kuwasiliana nayo (kasha hili litakuwa linatekeleza mongodb):

apiVersion: v1
kind: ConfigMap
metadata:
name: mongodb-configmap
data:
database_url: mongodb-service

Kisha, ndani ya mseto wa utekelezaji, anwani hii inaweza kutajwa kwa njia ifuatayo ili ipakiwe ndani ya env ya kikapu:

[...]
spec:
[...]
template:
[...]
spec:
containers:
- name: mongo-express
image: mongo-express
ports:
- containerPort: 8081
env:
- name: ME_CONFIG_MONGODB_SERVER
valueFrom:
configMapKeyRef:
name: mongodb-configmap
key: database_url
[...]

Mfano wa mpangilio wa kiasi

Unaweza kupata mifano tofauti ya faili za yaml za mpangilio wa uhifadhi katika https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes. Tafadhali kumbuka kuwa volumes hazipo ndani ya majina ya nafasi

Majina ya Nafasi

Kubernetes inasaidia vijitengo vya kielelezo vingi vinavyoungwa mkono na kikundi cha mwili kimoja. Vijitengo hivi vya kielelezo vinaitwa majina ya nafasi. Hizi zimekusudiwa kutumiwa katika mazingira yenye watumiaji wengi waliotapakaa katika timu au miradi tofauti. Kwa vikundi vyenye watumiaji kadhaa hadi kumi, hauitaji kuunda au kufikiria majina ya nafasi kabisa. Unapaswa tuanza kutumia majina ya nafasi ili kuwa na udhibiti bora na kuandaa kila sehemu ya programu iliyosakinishwa katika kubernetes.

Majina ya nafasi hutoa eneo la majina. Majina ya rasilimali lazima yawe ya kipekee ndani ya nafasi, lakini sio kati ya majina ya nafasi. Majina ya nafasi haziwezi kuwa ndani ya nyingine na kila rasilimali ya Kubernetes inaweza kuwa katika nafasi moja tu.

Kuna majina 4 ya nafasi kwa chaguo-msingi ikiwa unatumia minikube:

kubectl get namespace
NAME              STATUS   AGE
default           Active   1d
kube-node-lease   Active   1d
kube-public       Active   1d
kube-system       Active   1d
  • kube-system: Haijamaanishwa au watumiaji kutumia na usiguse. Ni kwa ajili ya mchakato wa kudhibiti na kubectl.

  • kube-public: Tarehe inayopatikana kwa umma. Ina configmap ambayo ina habari za kikundi.

  • kube-node-lease: Inabainisha upatikanaji wa kifaa.

  • default: Nafasi ambayo mtumiaji atatumia kuunda rasilimali.

#Create namespace
kubectl create namespace my-namespace

Tafadhali kumbuka kuwa rasilimali nyingi za Kubernetes (k.m. pods, huduma, wakala wa uigaji, na zingine) ziko katika majina ya nafasi fulani. Walakini, rasilimali zingine kama rasilimali za nafasi na rasilimali za kiwango cha chini, kama vile nodes na persistenVolumes haziko katika nafasi. Ili kuona ni rasilimali zipi za Kubernetes ziko na haziko katika nafasi:

kubectl api-resources --namespaced=true #In a namespace
kubectl api-resources --namespaced=false #Not in a namespace

Unaweza kuokoa jina la nafasi kwa amri zote za kubectl zinazofuata katika muktadha huo.

kubectl config set-context --current --namespace=<insert-namespace-name-here>

Helm

Helm ni msimamizi wa pakiti kwa Kubernetes. Inaruhusu kupakia faili za YAML na kuzisambaza kwenye hifadhi za umma na binafsi. Pakiti hizi huitwa Helm Charts.

helm search <keyword>

Helm pia ni injini ya templeti inayoruhusu kuzalisha faili za config na mabadiliko:

Siri za Kubernetes

Siri ni kitu ambacho kina data nyeti kama nenosiri, token au ufunguo. Taarifa kama hizo zingine zingeweza kuwekwa kwenye maelezo ya Pod au kwenye picha. Watumiaji wanaweza kuunda Siri na mfumo pia hujenga Siri. Jina la kitu cha Siri lazima liwe jina la subdomain la DNS halali. Soma hapa hati rasmi.

Siri zinaweza kuwa vitu kama:

  • API, funguo za SSH.

  • Vyeti vya OAuth.

  • Anwani, Nenosiri (maandishi ya kawaida au b64 + kificho).

  • Taarifa au maoni.

  • Kanuni za uunganisho wa database, mistari… .

Kuna aina tofauti za siri katika Kubernetes

Aina ya KujengwaMatumizi

Opaque

data iliyoundwa na mtumiaji (Chaguo-msingi)

kubernetes.io/service-account-token

tokeni ya akaunti ya huduma

kubernetes.io/dockercfg

faili iliyosanidishwa ~/.dockercfg

kubernetes.io/dockerconfigjson

faili iliyosanidishwa ~/.docker/config.json

kubernetes.io/basic-auth

anwani za uthibitishaji wa msingi

kubernetes.io/ssh-auth

anwani za uthibitishaji wa SSH

kubernetes.io/tls

data kwa mteja au seva ya TLS

bootstrap.kubernetes.io/token

data ya tokeni ya kuanzisha

Aina ya Opaque ni ile ya chaguo-msingi, jozi ya kawaida ya funguo- thamani iliyoundwa na watumiaji.

Jinsi siri inavyofanya kazi:

Faili ya usanidi ifuatayo inaainisha siri inayoitwa mysecret na jozi 2 za funguo-thamani username: YWRtaW4= na password: MWYyZDFlMmU2N2Rm. Pia inaainisha pod inayoitwa secretpod ambayo itakuwa na username na password iliyoundwa katika mysecret ikionyeshwa katika mazingira ya pembejeo SECRET_USERNAME __ na __ SECRET_PASSWOR. Pia ita weka siri ya username ndani ya mysecret kwenye njia /etc/foo/my-group/my-username na ruhusa za 0640.

secretpod.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
---
apiVersion: v1
kind: Pod
metadata:
name: secretpod
spec:
containers:
- name: secretpod
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
volumeMounts:
- name: foo
mountPath: "/etc/foo"
restartPolicy: Never
volumes:
- name: foo
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
mode: 0640
kubectl apply -f <secretpod.yaml>
kubectl get pods #Wait until the pod secretpod is running
kubectl exec -it  secretpod -- bash
env | grep SECRET && cat /etc/foo/my-group/my-username && echo

Siri katika etcd

etcd ni duka la thamani-ufunguo linalofanana na linalopatikana kila wakati linalotumiwa kama duka la nyuma la Kubernetes kwa data zote za kikundi. Hebu tupate ufikivu wa siri zilizohifadhiwa katika etcd:

cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep etcd

Utaweza kuona vyeti, funguo na url ziko wapi kwenye FS. Mara utakapovipata, utaweza kuunganisha kwenye etcd.

#ETCDCTL_API=3 etcdctl --cert <path to client.crt> --key <path to client.ket> --cacert <path to CA.cert> endpoint=[<ip:port>] health

ETCDCTL_API=3 etcdctl --cert /etc/kubernetes/pki/apiserver-etcd-client.crt --key /etc/kubernetes/pki/apiserver-etcd-client.key --cacert /etc/kubernetes/pki/etcd/etcd/ca.cert endpoint=[127.0.0.1:1234] health

Baada ya kufanikiwa kuanzisha mawasiliano ungeweza kupata siri:

#ETCDCTL_API=3 etcdctl --cert <path to client.crt> --key <path to client.ket> --cacert <path to CA.cert> endpoint=[<ip:port>] get <path/to/secret>

ETCDCTL_API=3 etcdctl --cert /etc/kubernetes/pki/apiserver-etcd-client.crt --key /etc/kubernetes/pki/apiserver-etcd-client.key --cacert /etc/kubernetes/pki/etcd/etcd/ca.cert endpoint=[127.0.0.1:1234] get /registry/secrets/default/secret_02

Kuongeza encryption kwa ETCD

Kwa chaguo-msingi siri zote huhifadhiwa kwa maandishi wazi ndani ya etcd isipokuwa utumie safu ya encryption. Mfano ufuatao unategemea https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/

encryption.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: cjjPMcWpTPKhAdieVtd+KhG4NN+N6e3NmBPMXJvbfrY= #Any random key
- identity: {}

Baada ya hapo, unahitaji kuweka bendera ya --encryption-provider-config kwenye kube-apiserver ili ielekeze kwenye eneo la faili ya usanidi iliyoundwa. Unaweza kuhariri /etc/kubernetes/manifest/kube-apiserver.yaml na kuongeza mistari ifuatayo:

containers:
- command:
- kube-apiserver
- --encriyption-provider-config=/etc/kubernetes/etcd/<configFile.yaml>

Endelea kushuka katika volumeMounts:

- mountPath: /etc/kubernetes/etcd
name: etcd
readOnly: true

Endelea chini kwenye volumeMounts hadi hostPath:

- hostPath:
path: /etc/kubernetes/etcd
type: DirectoryOrCreate
name: etcd

Kuthibitisha kuwa data imefichwa

Data inaandikwa kwa njia ya siri kwenye etcd. Baada ya kuanzisha upya kube-apiserver yako, siri mpya au iliyosasishwa inapaswa kuwa imefichwa wakati inapohifadhiwa. Ili kuthibitisha hili, unaweza kutumia programu ya mstari wa amri ya etcdctl kupata maudhui ya siri yako.

  1. Unda siri mpya iitwayo secret1 kwenye eneo la default:

kubectl create secret generic secret1 -n default --from-literal=mykey=mydata
  1. Kutumia amri ya mstari wa amri ya etcdctl, soma siri hiyo kutoka kwa etcd:

ETCDCTL_API=3 etcdctl get /registry/secrets/default/secret1 [...] | hexdump -C

ambapo [...] lazima iwe ni vigezo vya ziada vya kuunganisha kwenye seva ya etcd. 3. Thibitisha siri iliyohifadhiwa imeanzishwa na k8s:enc:aescbc:v1: ambayo inaonyesha kuwa mtoa huduma wa aescbc ameficha data inayotokana. 4. Hakikisha siri inadecode vizuri wakati inapopatikana kupitia API:

kubectl describe secret secret1 -n default

inapaswa kulingana na mykey: bXlkYXRh, mydata imefichwa, angalia kudecode siri ili kudecode siri hiyo kikamilifu.

Kwa kuwa siri zinafichwa wakati wa kuandika, kufanya sasisho kwenye siri kutaficha yaliyomo:

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Vidokezo vya mwisho:

Marejeo

Jifunze kuhusu kuvamia AWS kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks:

Last updated