mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 14:47:17 -07:00
Translated ['src/pentesting-cloud/kubernetes-security/kubernetes-basics.
This commit is contained in:
@@ -2,11 +2,11 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Postoje **različiti načini za izlaganje services** u Kubernetes tako da im mogu pristupiti i **internal** endpoints i **external** endpoints. Ova Kubernetes konfiguracija je prilično kritična jer administrator može da omogući pristup **attackers** services kojima ne bi trebalo da mogu da pristupe.
|
||||
Postoje **različiti načini za expose services** u Kubernetes tako da i **internal** endpoints i **external** endpoints mogu da im pristupe. Ova Kubernetes konfiguracija je prilično kritična jer administrator može dati access **attackersima do services kojima ne bi trebalo da mogu da pristupe**.
|
||||
|
||||
### Automatic Enumeration
|
||||
|
||||
Pre nego što počneš da enumerišeš načine koje K8s nudi za izlaganje services javnosti, znaj da ako možeš da izlistaš namespaces, services i ingresses, možeš da pronađeš sve što je exposed to the public sa:
|
||||
Pre nego što počnemo enumerating načine koje K8s nudi za expose services public, znaj da ako možeš da listuješ namespaces, services i ingresses, možeš da pronađeš sve exposed to the public sa:
|
||||
```bash
|
||||
kubectl get namespace -o custom-columns='NAME:.metadata.name' | grep -v NAME | while IFS='' read -r ns; do
|
||||
echo "Namespace: $ns"
|
||||
@@ -20,21 +20,21 @@ done | grep -v "ClusterIP"
|
||||
```
|
||||
### ClusterIP
|
||||
|
||||
A **ClusterIP** service je **podrazumevani** Kubernetes **service**. On vam daje **service unutar** vašeg klastera kom druge aplikacije unutar klastera mogu da pristupe. **Nema spoljnog pristupa**.
|
||||
**ClusterIP** service je **podrazumevani** Kubernetes **service**. On vam daje **service unutar** vašeg cluster-a kojem druge aplikacije unutar vašeg cluster-a mogu da pristupe. **Nema eksternog pristupa**.
|
||||
|
||||
Međutim, ovome se može pristupiti koristeći Kubernetes Proxy:
|
||||
```bash
|
||||
kubectl proxy --port=8080
|
||||
```
|
||||
Sada možete da se krećete kroz Kubernetes API da biste pristupili servisima koristeći ovu šemu:
|
||||
Sada možete da navigirate kroz Kubernetes API da biste pristupili uslugama koristeći ovu šemu:
|
||||
|
||||
`http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/`
|
||||
|
||||
Na primer, mogli biste da koristite sledeći URL:
|
||||
Na primer, možete da koristite sledeći URL:
|
||||
|
||||
`http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/`
|
||||
|
||||
da biste pristupili ovom servisu:
|
||||
da biste pristupili ovoj usluzi:
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
@@ -50,15 +50,15 @@ port: 80
|
||||
targetPort: 80
|
||||
protocol: TCP
|
||||
```
|
||||
_Ovaj metod zahteva da pokrećete `kubectl` kao **autentifikovan korisnik**._
|
||||
_Ovaj metod zahteva da pokrenete `kubectl` kao **autentifikovan korisnik**._
|
||||
|
||||
List all ClusterIPs:
|
||||
Prikažite sve ClusterIP adrese:
|
||||
```bash
|
||||
kubectl get services --all-namespaces -o=custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,TYPE:.spec.type,CLUSTER-IP:.spec.clusterIP,PORT(S):.spec.ports[*].port,TARGETPORT(S):.spec.ports[*].targetPort,SELECTOR:.spec.selector' | grep ClusterIP
|
||||
```
|
||||
### NodePort
|
||||
|
||||
Kada se koristi **NodePort**, određeni port se otvara na svim Nodes (koji predstavljaju Virtual Machines). **Traffic** usmeren ka tom konkretnom portu zatim se sistematski **usmerava ka service-u**. Uobičajeno, ovaj metod se ne preporučuje zbog svojih nedostataka.
|
||||
Kada se koristi **NodePort**, određeni port postaje dostupan na svim Node-ovima (koji predstavljaju Virtual Machines). **Traffic** usmeren na ovaj konkretan port zatim se sistematski **routuje ka service-u**. Obično se ovaj metod ne preporučuje zbog njegovih nedostataka.
|
||||
|
||||
List all NodePorts:
|
||||
```bash
|
||||
@@ -81,13 +81,24 @@ targetPort: 80
|
||||
nodePort: 30036
|
||||
protocol: TCP
|
||||
```
|
||||
Ako **ne navedete** **nodePort** u yaml-u (to je port koji će biti otvoren), koristiće se port iz **opsega 30000–32767**.
|
||||
Ako **ne navedete** **nodePort** u yaml (to je port koji će biti otvoren), koristiće se port u **rasponu 30000–32767**.
|
||||
|
||||
Prilikom pregleda NodePort ili LoadBalancer Services, takođe proverite traffic-policy polja jer ona menjaju koji su nodovi i backendovi korisni iz datog izvora:
|
||||
```bash
|
||||
kubectl get services --all-namespaces \
|
||||
-o custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,TYPE:.spec.type,ETP:.spec.externalTrafficPolicy,ITP:.spec.internalTrafficPolicy,AFFINITY:.spec.sessionAffinity,DIST:.spec.trafficDistribution,NODEPORTS:.spec.ports[*].nodePort'
|
||||
```
|
||||
- `externalTrafficPolicy: Local` čuva originalnu client source IP adresu za NodePort/LoadBalancer traffic i izbegava prosleđivanje ka endpointima na drugim node-ovima. Node bez lokalnog ready endpoint-a može da odbaci traffic čak i ako Service ima endpoint-e negde drugde.
|
||||
- `externalTrafficPolicy: Cluster` je podrazumevana opcija i može da prosleđuje kroz bilo koji node, ali backend logovi mogu da vide node IP adrese umesto stvarne eksternе client IP adrese.
|
||||
- `internalTrafficPolicy: Local` ograničava in-cluster Service traffic na endpoint-e lokalne za source node. Ovo je locality routing, ne authorization boundary.
|
||||
- `sessionAffinity: ClientIP` može da učini da ponovljeni testovi sa jednog client-a pogađaju isti backend, skrivajući druge ready endpoint-e tokom ručnih provera.
|
||||
- `trafficDistribution` i EndpointSlice topology hints mogu da preferiraju same-zone ili same-node endpoint-e na novijim cluster-ovima; tretirajte ih kao routing preferences, a ne kao strogu security policy.
|
||||
|
||||
### LoadBalancer
|
||||
|
||||
Izlaže Service eksterno **koristeći cloud provider-ov load balancer**. Na GKE-u, ovo će podići [Network Load Balancer](https://cloud.google.com/compute/docs/load-balancing/network/) koji će vam dati jednu IP adresu koja će prosleđivati sav traffic na vaš service. U AWS-u će pokrenuti Load Balancer.
|
||||
Exposes the Service externally **using a cloud provider's load balancer**. On GKE, this will spin up a [Network Load Balancer](https://cloud.google.com/compute/docs/load-balancing/network/) that will give you a single IP address that will forward all traffic to your service. In AWS it will launch a Load Balancer.
|
||||
|
||||
Morate da platite za LoadBalancer po izloženom service-u, što može biti skupo.
|
||||
You have to pay for a LoadBalancer per exposed service, which can be expensive.
|
||||
|
||||
List all LoadBalancers:
|
||||
```bash
|
||||
@@ -96,15 +107,15 @@ kubectl get services --all-namespaces -o=custom-columns='NAMESPACE:.metadata.nam
|
||||
### External IPs
|
||||
|
||||
> [!TIP]
|
||||
> External IPs su izložene putem servisa tipa Load Balancers i generalno se koriste kada se koristi eksterni Cloud Provider Load Balancer.
|
||||
> External IPs su izložene preko servisa tipa Load Balancers i uglavnom se koriste kada se koristi eksterni Cloud Provider Load Balancer.
|
||||
>
|
||||
> Za pronalaženje, proveri load balancers sa vrednostima u polju `EXTERNAL-IP`.
|
||||
> Za pronalaženje, proverite load balancere sa vrednostima u polju `EXTERNAL-IP`.
|
||||
|
||||
Saobraćaj koji ulazi u cluster sa **external IP** (kao **destination IP**), na portu Service-a, biće **rutiran ka jednom od Service endpointa**. `externalIPs` ne upravlja Kubernetes i odgovornost su cluster administratora.
|
||||
Saobraćaj koji ulazi u cluster sa **external IP** (kao **destination IP**), na Service port, biće **usmeren na jedan od Service endpointa**. `externalIPs` ne upravlja Kubernetes i za njih je odgovoran administrator cluster-a.
|
||||
|
||||
`externalIPs` je osetljivo polje za kontrolu ruta jer korisnik koji može da ga postavi može da preuzme saobraćaj za IP adresu nad kojom vlasnik Service-a ne bi trebalo da ima kontrolu, ako okolna mreža rutira taj IP ka clusteru. Kubernetes je najavio deprecaciju i planirano uklanjanje Service `externalIPs` u v1.36, zato gde god je moguće koristi mehanizme izlaganja koje kontroliše controller, kao što su LoadBalancer integracije ili Gateway API, i pažljivo ograniči/admituj ovo polje dok još postoji.
|
||||
`externalIPs` je osetljivo polje za kontrolu ruta, jer korisnik koji može da ga postavi može prisvojiti saobraćaj za IP adresu nad kojom vlasnik Service-a ne bi trebalo da ima kontrolu, ako okolna mreža usmerava taj IP ka cluster-u. Kubernetes je najavio deprecaciju i planirano uklanjanje Service `externalIPs` u v1.36, zato gde god je moguće preferirajte mehanizme izlaganja kojima upravljaju controller-i, kao što su LoadBalancer integracije ili Gateway API, i pažljivo ograničite/dozvoljavajte ovo polje dok još postoji.
|
||||
|
||||
U Service spec, `externalIPs` može biti naveden zajedno sa bilo kojim od `ServiceTypes`. U primeru ispod, "`my-service`" može biti dostupan klijentima na "`80.11.12.10:80`" (`externalIP:port`)
|
||||
U Service spec, `externalIPs` može biti naveden zajedno sa bilo kojim od `ServiceTypes`. U primeru ispod, "`my-service`" mogu da koriste klijenti na "`80.11.12.10:80`" (`externalIP:port`)
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
@@ -123,9 +134,9 @@ externalIPs:
|
||||
```
|
||||
### ExternalName
|
||||
|
||||
[**Iz dokumentacije:**](https://kubernetes.io/docs/concepts/services-networking/service/#externalname) Services tipa ExternalName **mapiraju Service na DNS ime**, ne na tipičan selector kao što je `my-service` ili `cassandra`. Ove Services navodite pomoću `spec.externalName` parametra.
|
||||
[**Iz dokumentacije:**](https://kubernetes.io/docs/concepts/services-networking/service/#externalname) Services tipa ExternalName **mapiraju Service na DNS ime**, a ne na tipičan selector kao što je `my-service` ili `cassandra`. Ove Services definišete pomoću `spec.externalName` parametra.
|
||||
|
||||
Ova Service definicija, na primer, mapira `my-service` Service u `prod` namespace-u na `my.database.example.com`:
|
||||
Ova definicija Service-a, na primer, mapira `my-service` Service u `prod` namespace-u na `my.database.example.com`:
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
@@ -136,32 +147,32 @@ spec:
|
||||
type: ExternalName
|
||||
externalName: my.database.example.com
|
||||
```
|
||||
Prilikom traženja hosta `my-service.prod.svc.cluster.local`, cluster DNS Service vraća `CNAME` zapis sa vrednošću `my.database.example.com`. Pristup `my-service` radi na isti način kao i ostali Services, ali sa ključnom razlikom da se **preusmeravanje dešava na DNS nivou** umesto preko proxying-a ili forwarding-a.
|
||||
Prilikom traženja hosta `my-service.prod.svc.cluster.local`, cluster DNS Service vraća `CNAME` zapis sa vrednošću `my.database.example.com`. Pristup `my-service` funkcioniše na isti način kao i kod drugih Services, ali sa ključnom razlikom da se **redirekcija dešava na DNS nivou** umesto preko proxying ili forwarding-a.
|
||||
|
||||
Izlistajte sve ExternalNames:
|
||||
Izlistaj sve ExternalNames:
|
||||
```bash
|
||||
kubectl get services --all-namespaces | grep ExternalName
|
||||
```
|
||||
### EndpointSlices
|
||||
|
||||
EndpointSlices prikazuju konkretne backend adrese i portove na koje Service trenutno usmerava promet. Posebno su korisni kada Service nema selector, kada labels ne objašnjavaju putanju saobraćaja, ili kada je samo neki backend spreman.
|
||||
EndpointSlices prikazuju konkretne backend adrese i portove na koje Service trenutno rutira. Posebno su korisni kada Service nema selector, kada labels ne objašnjavaju putanju saobraćaja, ili kada je spreman samo deo backendova.
|
||||
|
||||
List EndpointSlices associated with Services:
|
||||
Izlistaj EndpointSlices povezane sa Services:
|
||||
```bash
|
||||
kubectl get endpointslices --all-namespaces
|
||||
kubectl get endpointslice -n <namespace> -l kubernetes.io/service-name=<service-name> -o yaml
|
||||
kubectl get endpointslice -n <namespace> -l kubernetes.io/service-name=<service-name> \
|
||||
-o custom-columns='NAME:.metadata.name,ADDR:.endpoints[*].addresses,READY:.endpoints[*].conditions.ready,PORTS:.ports[*].port'
|
||||
```
|
||||
Prilikom pregleda exposure-a, uporedite Service selector sa EndpointSlice `targetRef`, endpoint adresama, readiness uslovima i portovima. Selectorless Service može biti uparen sa ručno upravljanim EndpointSlices i usmeravati traffic ka ne-Pod ili neočekivanim destinacijama.
|
||||
Prilikom pregleda exposure-a, uporedite Service selector sa EndpointSlice `targetRef`, adresama endpointa, readiness uslovima i portovima. Service bez selector-a može da se upari sa ručno upravljanim EndpointSlice-ovima i da usmerava traffic ka non-Pod ili neočekivanim destinacijama.
|
||||
|
||||
### Ingress
|
||||
|
||||
Za razliku od svih prethodnih primera, **Ingress NIJE tip service-a**. Umesto toga, stoji **ispred više services i ponaša se kao “smart router”** ili ulazna tačka u vaš cluster.
|
||||
Za razliku od svih gornjih primera, **Ingress NIJE tip service-a**. Umesto toga, nalazi se **ispred više services i deluje kao „smart router“** ili entrypoint u vaš cluster.
|
||||
|
||||
Sa Ingress-om možete raditi mnogo različitih stvari, a postoji **mnogo tipova Ingress controllers** koji imaju različite capabilities.
|
||||
Možete uraditi mnogo različitih stvari sa Ingress-om, i postoji **mnogo tipova Ingress controllers-a koji imaju različite mogućnosti**.
|
||||
|
||||
Default GKE ingress controller će vam podići [HTTP(S) Load Balancer](https://cloud.google.com/compute/docs/load-balancing/http/) umesto vas. Ovo će vam omogućiti da radite i path-based i subdomain-based routing ka backend services. Na primer, možete poslati sve sa foo.yourdomain.com na foo service, i sve pod yourdomain.com/bar/ path-om na bar service.
|
||||
Podrazumevani GKE ingress controller će podići [HTTP(S) Load Balancer](https://cloud.google.com/compute/docs/load-balancing/http/) za vas. Ovo će vam omogućiti i path based i subdomain based routing ka backend services. Na primer, možete poslati sve sa foo.yourdomain.com na foo service, i sve ispod yourdomain.com/bar/ path-a na bar service.
|
||||
|
||||
YAML za Ingress object na GKE sa [L7 HTTP Load Balancer](https://cloud.google.com/compute/docs/load-balancing/http/) može da izgleda ovako:
|
||||
```yaml
|
||||
@@ -197,19 +208,19 @@ name: bar
|
||||
port:
|
||||
number: 8080
|
||||
```
|
||||
Listaj sve ingress-e:
|
||||
Izlistajte sve ingresses:
|
||||
```bash
|
||||
kubectl get ingresses --all-namespaces -o=custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,RULES:spec.rules[*],STATUS:status'
|
||||
```
|
||||
Iako je u ovom slučaju bolje da se info svakog pojedinačno uzme kako bi se lakše pročitao:
|
||||
Iako je u ovom slučaju bolje uzeti informacije o svakoj pojedinačno da bi se lakše pročitale:
|
||||
```bash
|
||||
kubectl get ingresses --all-namespaces -o=yaml
|
||||
```
|
||||
### Gateway API
|
||||
|
||||
Gateway API je noviji Kubernetes API za izlaganje Services. On odvaja infrastrukturno vlasništvo nad Gateway objektima od aplikaciono vlasništvo nad Route objektima kao što je HTTPRoute. Ovo je korisno za delegiranje, ali takođe znači da exposure može biti podeljen across namespaces.
|
||||
Gateway API je noviji Kubernetes API za izlaganje Services. On razdvaja infrastrukturi-pripadajuće Gateway objekte od aplikaciji-pripadajućih Route objekata kao što je HTTPRoute. Ovo je korisno za delegiranje, ali takođe znači da exposure može biti podeljen između namespace-ova.
|
||||
|
||||
List Gateway API exposure objects:
|
||||
Prikaži Gateway API exposure objekte:
|
||||
```bash
|
||||
kubectl get gatewayclasses
|
||||
kubectl get gateways --all-namespaces
|
||||
@@ -217,13 +228,16 @@ kubectl get httproutes --all-namespaces
|
||||
kubectl get gateway -n <namespace> <gateway-name> -o yaml
|
||||
kubectl get httproute -n <namespace> <route-name> -o yaml
|
||||
```
|
||||
Proverite Gateway listeners, dozvoljene route namespaces, Route `parentRefs`, hostnames, filters, backend references i status uslove kao što je da li je route prihvaćen. Route koji prihvati shared Gateway može da izloži backend čak i kada ne postoji legacy Ingress objekat.
|
||||
Proveri Gateway listeners, allowed route namespaces, Route `parentRefs`, hostnames, filters, backend references i status conditions kao što je da li je route prihvaćen. Route koji je prihvaćen od strane shared Gateway može da izloži backend čak i kada ne postoji legacy Ingress object.
|
||||
|
||||
### References
|
||||
|
||||
- [https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0](https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0)
|
||||
- [https://kubernetes.io/docs/concepts/services-networking/service/](https://kubernetes.io/docs/concepts/services-networking/service/)
|
||||
- [https://kubernetes.io/blog/2026/05/14/kubernetes-v1-36-deprecation-and-removal-of-service-externalips/](https://kubernetes.io/blog/2026/05/14/kubernetes-v1-36-deprecation-and-removal-of-service-externalips/)
|
||||
- [https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/](https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/)
|
||||
- [https://kubernetes.io/docs/tutorials/services/source-ip/](https://kubernetes.io/docs/tutorials/services/source-ip/)
|
||||
- [https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/](https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/)
|
||||
- [https://kubernetes.io/docs/concepts/services-networking/endpoint-slices/](https://kubernetes.io/docs/concepts/services-networking/endpoint-slices/)
|
||||
- [https://gateway-api.sigs.k8s.io/](https://gateway-api.sigs.k8s.io/)
|
||||
|
||||
|
||||
@@ -9,56 +9,58 @@
|
||||
### What does Kubernetes do?
|
||||
|
||||
- Omogućava pokretanje container/s u container engine.
|
||||
- Schedule omogućava efikasno raspoređivanje containers.
|
||||
- Schedule omogućava da containers budu mission efficient.
|
||||
- Održava containers aktivnim.
|
||||
- Omogućava komunikaciju između containers.
|
||||
- Omogućava deployment tehnike.
|
||||
- Omogućava container communications.
|
||||
- Omogućava deployment techniques.
|
||||
- Rukuje volumes of information.
|
||||
|
||||
### Architecture
|
||||
|
||||

|
||||
|
||||
- **Node**: operating system sa pod ili pods.
|
||||
- **Pod**: Wrapper oko jednog container-a ili više containers. Pod treba da sadrži samo jednu application (zato obično pod pokreće samo 1 container). Pod je način na koji kubernetes apstrahuje tehnologiju container-a koja se pokreće.
|
||||
- **Service**: Svaki pod ima 1 internu **IP address** iz interne opsega node-a. Međutim, može biti i izložen preko service-a. **service takođe ima IP address** i njegov cilj je da održava komunikaciju između pods tako da ako jedan padne, **nova zamena** (sa drugačijom internom IP) **biće dostupna** izložena na **istoј IP address service-a**. Može biti podešen kao interni ili eksterni. Service takođe deluje kao **load balancer kada su 2 pod-a povezana** na isti service.\
|
||||
Kada se **service** **kreira** možete pronaći endpoints svakog service-a pokretanjem `kubectl get endpoints`
|
||||
- **Kubelet**: Primarni node agent. Komponenta koja uspostavlja komunikaciju između node-a i kubectl, i može da pokreće samo pods (preko API server). Kubelet ne upravlja container-ima koji nisu kreirani od strane Kubernetes.
|
||||
- **Kube-proxy**: je service zadužen za komunikaciju (services) između apiserver i node-a. Osnova je IPtables za nodes. Iskusniji korisnici mogu instalirati i druge kube-proxy-je od drugih vendora.
|
||||
- **Sidecar container**: Sidecar containers su containers koji treba da rade zajedno sa glavnim container-om u pod-u. Ovaj sidecar pattern proširuje i poboljšava funkcionalnost postojećih containers bez njihovog menjanja. Danas znamo da koristimo container tehnologiju da upakujemo sve dependencies za application da radi bilo gde. Container radi samo jednu stvar i tu stvar radi veoma dobro.
|
||||
- **Node**: operativni sistem sa pod ili pods.
|
||||
- **Pod**: Omotač oko container ili više containers sa. Pod treba da sadrži samo jednu aplikaciju (dakle, obično pod pokreće samo 1 container). Pod je način na koji kubernetes apstraktira container technology koja se pokreće.
|
||||
- **Service**: Svaki pod ima 1 internu **IP address** iz internog opsega node-a. Međutim, može biti i izložen preko service. **service ima takođe IP address** i njegova svrha je da održava komunikaciju između pods, tako da ako jedan padne, **nova zamena** (sa drugačijom internom IP) **biće dostupna** i izložena na **istoj IP address service-a**. Može se konfigurisati kao interni ili eksterni. service takođe deluje kao **load balancer kada su 2 pods povezana** na isti service.\
|
||||
Kada je **service** **kreiran** možete pronaći endpoints svakog service-a pokretanjem `kubectl get endpoints`
|
||||
- **Kubelet**: Primarni node agent. Komponenta koja uspostavlja komunikaciju između node i kubectl, i može da pokreće samo pods (preko API server). kubelet ne upravlja containers koji nisu kreirani od strane Kubernetes.
|
||||
- **Kube-proxy**: je service zadužen za communications (services) između apiserver i node. Osnova je IPtables za nodes. Iskusniji korisnici mogu instalirati druge kube-proxies od drugih vendora.
|
||||
- **Sidecar container**: Sidecar containers su containers koji treba da rade zajedno sa glavnim container u pod. Ovaj sidecar pattern proširuje i poboljšava funkcionalnost postojećih containers bez njihovog menjanja. Danas znamo da koristimo container technology da obložimo sve dependencies aplikacije kako bi radila bilo gde. Container radi samo jednu stvar i radi je veoma dobro.
|
||||
- **Master process:**
|
||||
- **Api Server:** To je način na koji korisnici i pods koriste za komunikaciju sa master process. Samo authenticated request treba da budu dozvoljeni.
|
||||
- **Scheduler**: Scheduling se odnosi na to da se obezbedi da Pods budu dodeljeni Nodes tako da Kubelet može da ih pokrene. Ima dovoljno inteligencije da odluči koji node ima više dostupnih resources i da mu dodeli novi pod. Imajte na umu da scheduler ne pokreće nove pods, on samo komunicira sa Kubelet process koji radi unutar node-a, a koji će pokrenuti novi pod.
|
||||
- **Kube Controller manager**: Proverava resources kao što su replica sets ili deployments da bi utvrdio, na primer, da li radi ispravan broj pods ili nodes. U slučaju da neki pod nedostaje, komuniciraće sa scheduler-om da pokrene novi. Kontroliše replication, tokens i account services ka API.
|
||||
- **etcd**: Data storage, persistent, consistent, i distributed. To je Kubernetes’s database i key-value storage gde čuva kompletno stanje clusters (svaka promena se ovde beleži). Komponente kao što su Scheduler ili Controller manager zavise od ovog date da bi znale koje su se promene dogodile (available resourced of the nodes, number of pods running...)
|
||||
- **Cloud controller manager**: To je specifičan controller za flow controls i applications, tj. ako imate clusters u AWS ili OpenStack.
|
||||
- **Scheduler**: Scheduling se odnosi na to da se obezbedi da su Pods usklađeni sa Nodes tako da Kubelet može da ih pokrene. Ima dovoljno inteligencije da odluči koji node ima više available resources i da mu dodeli novi pod. Imajte na umu da scheduler ne pokreće nove pods, već samo komunicira sa Kubelet process koji radi unutar node-a, a koji će pokrenuti novi pod.
|
||||
- **Kube Controller manager**: Proverava resources kao što su replica sets ili deployments kako bi proverio da li, na primer, radi tačan broj pods ili nodes. U slučaju da neki pod nedostaje, komuniciraće sa scheduler da pokrene novi. Kontroliše replication, tokens i account services ka API.
|
||||
- **etcd**: Data storage, persistent, consistent i distributed. To je Kubernetes-ova database i key-value storage u kojem čuva kompletno stanje clusters (svaka promena se ovde beleži). Komponente kao što su Scheduler ili Controller manager zavise od ovih date kako bi znale koje su se promene dogodile (available resourced of the nodes, number of pods running...)
|
||||
- **Cloud controller manager**: To je specifičan controller za flow controls i applications, tj: ako imate clusters u AWS ili OpenStack.
|
||||
|
||||
Imajte na umu da, pošto može postojati više nodes (koji pokreću više pods), može postojati i više master processes čiji je pristup Api server-u load balanced, a njihov etcd synchronized.
|
||||
Imajte na umu da pošto može postojati više nodes (koji pokreću više pods), može postojati i više master processes čiji je pristup Api server load balanced, a njihov etcd synchronized.
|
||||
|
||||
**Volumes:**
|
||||
|
||||
Kada pod kreira podatke koji ne bi trebalo da budu izgubljeni kada pod nestane, oni treba da budu sačuvani u fizičkom volume-u. **Kubernetes allow da se attach-uje volume na pod radi perzistiranja podataka**. Volume može biti na lokalnoj mašini ili u **remote storage**. Ako pokrećete pods na različitim fizičkim nodes, trebalo bi da koristite remote storage kako bi svi pods mogli da mu pristupe.
|
||||
Kada pod kreira podatke koji ne bi smeli biti izgubljeni kada pod nestane, oni treba da budu sačuvani u physical volume. **Kubernetes allow da attach-uje volume na pod kako bi se podaci sačuvali**. volume može biti na lokalnoj mašini ili u **remote storage**. Ako pokrećete pods na različitim physical nodes, trebalo bi da koristite remote storage kako bi svi pods mogli da mu pristupe.
|
||||
|
||||
Kubernetes takođe podržava **image volumes** u novijim verzijama. `image` volume mount-uje OCI image ili artifact kao **read-only** filesystem source unutar Pod-a, koristeći polja kao što su `volumes[].image.reference` i `volumes[].image.pullPolicy`. kubelet preuzima artifact koristeći iste credential sources kao i za container images, uključujući node credentials, Pod `imagePullSecrets`, i ServiceAccount `imagePullSecrets`. Tokom security review, tretirajte image volumes kao runtime inputs i supply-chain dependencies: proverite da li je reference pinned by digest, koji registry credentials mogu da ga preuzmu, gde je mount-ovan i da li `subPath` ograničava vidljiv direktorijum.
|
||||
|
||||
**Other configurations:**
|
||||
|
||||
- **ConfigMap**: Možete konfigurirati **URLs** za pristup services. Pod će odavde dobiti podatke da zna kako da komunicira sa ostatkom services (pods). Imajte na umu da ovo nije preporučeno mesto za čuvanje credentials!
|
||||
- **Secret**: Ovo je mesto za **čuvanje secret data** kao što su passwords, API keys... enkodirano u B64. Pod će moći da pristupi ovim podacima i da koristi potrebne credentials.
|
||||
- **Deployments**: Ovde se navode components koje treba da pokreće kubernetes. Korisnik obično neće direktno raditi sa pods, pods su apstrahovani u **ReplicaSets** (broj istih pods repliciranih), koji se pokreću preko deployments. Imajte na umu da su deployments za **stateless** applications. Minimalna konfiguracija za deployment je name i image koji treba pokrenuti.
|
||||
- **StatefulSet**: Ova komponenta je namenjena posebno za applications kao što su **databases** kojima je potrebno da **pristupe istom storage**.
|
||||
- **Ingress**: Ovo je konfiguracija koja se koristi da **izloži application javno putem URL**. Imajte na umu da se ovo može uraditi i pomoću eksternih services, ali ovo je ispravan način da se application izloži.
|
||||
- Ako implementirate Ingress, moraćete da kreirate **Ingress Controllers**. Ingress Controller je **pod** koji će biti endpoint koji prima requests i proverava ih, a zatim ih load balance-uje ka services. ingress controller će **slati request na osnovu konfigurisanih ingress rules**. Imajte na umu da ingress rules mogu da upućuju na različite paths ili čak subdomains ka različitim internim kubernetes services.
|
||||
- Bolja security praksa bila bi da se kao entrypoint koristi cloud load balancer ili proxy server, kako ne bi nijedan deo Kubernetes cluster-a bio exposed.
|
||||
- Kada se primi request koji ne odgovara nijednom ingress rule, ingress controller će ga usmeriti na "**Default backend**". Možete `describe` ingress controller da dobijete address ovog parametra.
|
||||
- **ConfigMap**: Možete konfigurisati **URLs** za pristup services. pod će odavde dobiti podatke kako bi znao kako da komunicira sa ostatkom services (pods). Imajte na umu da ovo nije preporučeno mesto za čuvanje credentials!
|
||||
- **Secret**: Ovo je mesto za **čuvanje secret data** kao što su passwords, API keys... kodiranih u B64. pod će moći da pristupi ovim podacima kako bi koristio potrebne credentials.
|
||||
- **Deployments**: Ovde se navode components koje treba da pokreće kubernetes. Korisnik obično neće raditi direktno sa pods, pods su apstraktirani u **ReplicaSets** (broj istih pods repliciranih), koji se pokreću putem deployments. Imajte na umu da su deployments za **stateless** applications. Minimalna konfiguracija za deployment je name i image koji će se pokrenuti.
|
||||
- **StatefulSet**: Ova komponenta je namenjena specifično za aplikacije kao što su **databases** koje treba da **pristupe istom storage**.
|
||||
- **Ingress**: Ovo je konfiguracija koja se koristi da se **aplikacija javno izloži putem URL**. Imajte na umu da se to može uraditi i korišćenjem external services, ali ovo je ispravan način da se aplikacija izloži.
|
||||
- Ako implementirate Ingress, moraćete da kreirate **Ingress Controllers**. Ingress Controller je **pod** koji će biti endpoint koji prima requests i proverava ih, i zatim će ih load balance-ovati ka services. ingress controller će **slati request na osnovu konfigurisanih ingress rules**. Imajte na umu da ingress rules mogu da pokazuju na različite paths ili čak subdomains ka različitim internim kubernetes services.
|
||||
- Bolja security practice bi bila da se koristi cloud load balancer ili proxy server kao entrypoint kako nijedan deo Kubernetes cluster ne bi bio exposed.
|
||||
- Kada se primi request koji se ne poklapa ni sa jednom ingress rule, ingress controller će ga proslediti na "**Default backend**". Možete `describe` ingress controller da biste dobili address ovog parametra.
|
||||
- `minikube addons enable ingress`
|
||||
|
||||
### PKI infrastructure - Certificate Authority CA:
|
||||
|
||||

|
||||
|
||||
- CA is trusted root za sve certificates unutar cluster-a.
|
||||
- Omogućava komponentama da međusobno validiraju.
|
||||
- CA je trusted root za sve certificates unutar cluster.
|
||||
- Omogućava komponentama da međusobno validiraju jedna drugu.
|
||||
- Svi cluster certificates su potpisani od strane CA.
|
||||
- ETCd ima svoj certificate.
|
||||
- ETCd ima svoj sopstveni certificate.
|
||||
- types:
|
||||
- apiserver cert.
|
||||
- kubelet cert.
|
||||
@@ -68,7 +70,7 @@ Kada pod kreira podatke koji ne bi trebalo da budu izgubljeni kada pod nestane,
|
||||
|
||||
### Minikube
|
||||
|
||||
**Minikube** može da se koristi za izvođenje nekih **quick tests** na kubernetes bez potrebe da se deploy-uje ceo kubernetes environment. Pokrenuće **master i node processes na jednoj mašini**. Minikube će koristiti virtualbox za pokretanje node-a. Pogledajte [**ovde kako da ga instalirate**](https://minikube.sigs.k8s.io/docs/start/).
|
||||
**Minikube** može da se koristi za izvođenje nekih **quick tests** na kubernetes bez potrebe da se deploy-uje kompletan kubernetes environment. Pokretaće **master i node processes na jednoj mašini**. Minikube će koristiti virtualbox za pokretanje node-a. Pogledajte [**ovde kako da ga instalirate**](https://minikube.sigs.k8s.io/docs/start/).
|
||||
```
|
||||
$ minikube start
|
||||
😄 minikube v1.19.0 on Ubuntu 20.04
|
||||
@@ -103,9 +105,9 @@ $ minikube delete
|
||||
🔥 Deleting "minikube" in virtualbox ...
|
||||
💀 Removed all traces of the "minikube" cluster
|
||||
```
|
||||
### Osnove Kubectl-a
|
||||
### Kubectl Basics
|
||||
|
||||
**`Kubectl`** je alat komandne linije za kubernetes klastere. Komunicira sa Api serverom master procesa da bi izvršavao radnje u kubernetes ili tražio podatke.
|
||||
**`Kubectl`** je command line alat za kubernetes cluster-e. Komunicira sa Api serverom master procesa da bi izvršavao akcije u kubernetes ili tražio podatke.
|
||||
```bash
|
||||
kubectl version #Get client and server version
|
||||
kubectl get pod
|
||||
@@ -138,7 +140,7 @@ kubectl apply -f deployment.yml
|
||||
```
|
||||
### Minikube Dashboard
|
||||
|
||||
Dashboard omogućava da lakše vidite šta Minikube pokreće, URL za pristup možete pronaći u:
|
||||
Dashboard vam omogućava da lakše vidite šta pokreće minikube, URL za pristup možete pronaći u:
|
||||
```
|
||||
minikube dashboard --url
|
||||
|
||||
@@ -153,12 +155,12 @@ http://127.0.0.1:50034/api/v1/namespaces/kubernetes-dashboard/services/http:kube
|
||||
```
|
||||
### YAML configuration files examples
|
||||
|
||||
Each configuration file has 3 parts: **metadata**, **specification** (šta treba da se pokrene), **status** (željeno stanje).\
|
||||
Unutar specification deployment configuration file možete pronaći template definisan sa novom configuration structure koja definiše image koji treba da se pokrene:
|
||||
Svaki configuration file ima 3 dela: **metadata**, **specification** (šta treba da se pokrene), **status** (desired state).\
|
||||
Unutar specification deployment configuration file-a možete pronaći template definisan sa novom configuration strukturom koja definiše image koji treba da se pokrene:
|
||||
|
||||
**Example of Deployment + Service declared in the same configuration file (from** [**here**](https://gitlab.com/nanuchi/youtube-tutorial-series/-/blob/master/demo-kubernetes-components/mongo.yaml)**)**
|
||||
|
||||
Pošto je service obično povezan sa jednim deployment-om, moguće je deklarisati oba u istoj configuration file (service deklarisan u ovom config-u je dostupan samo interno):
|
||||
Pošto je service obično povezan sa jednim deployment-om, moguće je deklarisati oba u istom configuration file-u (service deklarisan u ovoj config je dostupan samo interno):
|
||||
```yaml
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
@@ -205,9 +207,9 @@ ports:
|
||||
port: 27017
|
||||
targetPort: 27017
|
||||
```
|
||||
**Primer spoljne service konfiguracije**
|
||||
**Primer konfiguracije eksternog servisa**
|
||||
|
||||
Ova service će biti dostupna eksterno (proverite atribute `nodePort` i `type: LoadBlancer`):
|
||||
Ovaj servis će biti dostupan eksterno (proveri atribute `nodePort` i `type: LoadBlancer`):
|
||||
```yaml
|
||||
---
|
||||
apiVersion: v1
|
||||
@@ -225,9 +227,9 @@ targetPort: 8081
|
||||
nodePort: 30000
|
||||
```
|
||||
> [!NOTE]
|
||||
> Ovo je korisno za testiranje, ali za produkciju bi trebalo da imate samo interne servise i Ingress da izložite aplikaciju.
|
||||
> Ovo je korisno za testiranje, ali za production treba da imate samo internal services i Ingress da biste izložili aplikaciju.
|
||||
|
||||
**Example of Ingress config file**
|
||||
**Primer Ingress config file**
|
||||
|
||||
Ovo će izložiti aplikaciju na `http://dashboard.com`.
|
||||
```yaml
|
||||
@@ -245,9 +247,9 @@ paths:
|
||||
serviceName: kubernetes-dashboard
|
||||
servicePort: 80
|
||||
```
|
||||
**Primer konfiguracionog fajla sa tajnama**
|
||||
**Primer datoteke sa secrets config**
|
||||
|
||||
Obratite pažnju kako su password-i enkodirani u B64 (što nije secure!)
|
||||
Primeti kako su lozinke kodirane u B64 (što nije bezbedno!)
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
@@ -269,7 +271,7 @@ name: mongodb-configmap
|
||||
data:
|
||||
database_url: mongodb-service
|
||||
```
|
||||
Zatim, unutar **deployment config** ova adresa može da se navede na sledeći način, tako da se učita u env poda:
|
||||
Zatim, unutar **deployment config** ovaj address može biti naveden na sledeći način tako da se učita unutar env od pod-a:
|
||||
```yaml
|
||||
[...]
|
||||
spec:
|
||||
@@ -292,14 +294,14 @@ key: database_url
|
||||
```
|
||||
**Primer konfiguracije volume-a**
|
||||
|
||||
Možete pronaći različite primere yaml fajlova za storage konfiguraciju u [https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes](https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes).\
|
||||
Možete pronaći različite primere yaml fajlova za konfiguraciju storage-a na [https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes](https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes).\
|
||||
**Imajte na umu da volumes nisu unutar namespaces**
|
||||
|
||||
### Namespaces
|
||||
|
||||
Kubernetes podržava **više virtuelnih cluster-a** koji koriste isti fizički cluster. Ovi virtuelni cluster-i se zovu **namespaces**. Namenjeni su za upotrebu u okruženjima sa mnogo korisnika raspoređenih kroz više timova ili projekata. Za cluster-e sa nekoliko do desetina korisnika, ne bi trebalo uopšte da treba da kreirate ili razmišljate o namespaces. Namespaces treba da počnete da koristite tek kada želite bolju kontrolu i organizaciju svakog dela application deployed in kubernetes.
|
||||
Kubernetes podržava **više virtualnih klastera** zasnovanih na istom fizičkom klasteru. Ovi virtualni klasteri se zovu **namespaces**. Namenjeni su za upotrebu u okruženjima sa mnogo korisnika raspoređenih kroz više timova ili projekata. Za klastere sa nekoliko do desetina korisnika, ne bi trebalo uopšte da vam treba kreiranje ili razmišljanje o namespaces. Namespaces treba da počnete da koristite tek kada želite bolju kontrolu i organizaciju svakog dela aplikacije deploy-ovane u kubernetes.
|
||||
|
||||
Namespaces obezbeđuju opseg za nazive. Nazivi resources moraju biti jedinstveni unutar jednog namespace-a, ali ne i između različitih namespaces. Namespaces ne mogu biti ugnježdeni jedan u drugi i **svaki** Kubernetes **resource** može biti samo **u** **jednom** **namespace**-u.
|
||||
Namespaces obezbeđuju scope za imena. Imena resursa moraju biti jedinstvena unutar jednog namespace-a, ali ne i kroz sve namespaces. Namespaces ne mogu biti ugnježdeni jedan unutar drugog i **svaki** Kubernetes **resource** može biti samo **u** **jednom** **namespace**-u.
|
||||
|
||||
Postoje 4 namespaces po default-u ako koristite minikube:
|
||||
```
|
||||
@@ -310,23 +312,23 @@ kube-node-lease Active 1d
|
||||
kube-public Active 1d
|
||||
kube-system Active 1d
|
||||
```
|
||||
- **kube-system**: Nije namenjen za upotrebu od strane korisnika i ne bi trebalo da ga diraš. Namenjen je za master i kubectl procese.
|
||||
- **kube-public**: Javno dostupni podaci. Sadrži configmap koji sadrži informacije o klasteru.
|
||||
- **kube-node-lease**: Određuje dostupnost čvora.
|
||||
- **kube-system**: Nije namenjen za korišćenje od strane korisnika i ne bi trebalo da ga diraš. Namenjen je za master i kubectl procese.
|
||||
- **kube-public**: Javno dostupni podaci. Sadrži configmap koji sadrži informacije o cluster-u
|
||||
- **kube-node-lease**: Određuje dostupnost node-a
|
||||
- **default**: Namespace koji će korisnik koristiti za kreiranje resursa
|
||||
```bash
|
||||
#Create namespace
|
||||
kubectl create namespace my-namespace
|
||||
```
|
||||
> [!NOTE]
|
||||
> Imajte na umu da je većina Kubernetes resursa (npr. pods, services, replication controllers i drugi) u nekim namespace-ovima. Međutim, drugi resursi poput namespace resursa i low-level resursa, kao što su nodes i persistenVolumes, nisu u namespace-u. Da biste videli koji Kubernetes resursi jesu, a koji nisu u namespace-u:
|
||||
> Napomena da su većina Kubernetes resursa (npr. pods, services, replication controllers i drugi) u nekim namespaces. Međutim, drugi resursi kao što su namespace resources i low-level resources, poput nodes i persistenVolumes, nisu u namespace-u. Da biste videli koji Kubernetes resursi jesu, a koji nisu u namespace-u:
|
||||
>
|
||||
> ```bash
|
||||
> kubectl api-resources --namespaced=true #In a namespace
|
||||
> kubectl api-resources --namespaced=false #Not in a namespace
|
||||
> ```
|
||||
|
||||
Možete sačuvati namespace za sve naredne kubectl komande u tom kontekstu.
|
||||
Možete sačuvati namespace za sve naredne kubectl komande u tom context-u.
|
||||
```bash
|
||||
kubectl config set-context --current --namespace=<insert-namespace-name-here>
|
||||
```
|
||||
@@ -336,21 +338,21 @@ Helm je **package manager** za Kubernetes. Omogućava pakovanje YAML fajlova i n
|
||||
```
|
||||
helm search <keyword>
|
||||
```
|
||||
Helm je takođe template engine koji omogućava generisanje config fajlova sa promenljivama:
|
||||
Helm is also a template engine that allows to generate config files with variables:
|
||||
|
||||
## Kubernetes secrets
|
||||
|
||||
**Secret** je objekat koji **sadrži osetljive podatke** kao što su password, token ili key. Takve informacije bi inače mogle biti stavljene u Pod specification ili u image. Korisnici mogu kreirati Secrets, a sistem takođe kreira Secrets. Ime Secret objekta mora biti validan **DNS subdomain name**. Pročitajte ovde [the official documentation](https://kubernetes.io/docs/concepts/configuration/secret/).
|
||||
A **Secret** is an object that **contains sensitive data** such as a password, a token or a key. Such information might otherwise be put in a Pod specification or in an image. Users can create Secrets and the system also creates Secrets. The name of a Secret object must be a valid **DNS subdomain name**. Read here [the official documentation](https://kubernetes.io/docs/concepts/configuration/secret/).
|
||||
|
||||
Secrets mogu biti stvari poput:
|
||||
Secrets might be things like:
|
||||
|
||||
- API, SSH Keys.
|
||||
- OAuth tokens.
|
||||
- Credentials, Passwords (plain text ili b64 + encryption).
|
||||
- Credentials, Passwords (plain text or b64 + encryption).
|
||||
- Information or comments.
|
||||
- Database connection code, strings… .
|
||||
|
||||
Postoje različite vrste secrets u Kubernetes
|
||||
There are different types of secrets in Kubernetes
|
||||
|
||||
| Builtin Type | Usage |
|
||||
| ----------------------------------- | ----------------------------------------- |
|
||||
@@ -364,13 +366,13 @@ Postoje različite vrste secrets u Kubernetes
|
||||
| bootstrap.kubernetes.io/token | bootstrap token data |
|
||||
|
||||
> [!NOTE]
|
||||
> **Opaque type je podrazumevani, tipičan key-value pair definisan od strane korisnika.**
|
||||
> **The Opaque type is the default one, the typical key-value pair defined by users.**
|
||||
|
||||
**How secrets works:**
|
||||
|
||||

|
||||
|
||||
Sledeći configuration file definiše **secret** nazvan `mysecret` sa 2 key-value pair-a `username: YWRtaW4=` i `password: MWYyZDFlMmU2N2Rm`. Takođe definiše **pod** nazvan `secretpod` koji će imati `username` i `password` definisane u `mysecret` izložene u **environment variables** `SECRET_USERNAME` \_\_ i \_\_ `SECRET_PASSWOR`. Takođe će **mount**-ovati `username` secret unutar `mysecret` na path `/etc/foo/my-group/my-username` sa dozvolama `0640`.
|
||||
The following configuration file defines a **secret** called `mysecret` with 2 key-value pairs `username: YWRtaW4=` and `password: MWYyZDFlMmU2N2Rm`. It also defines a **pod** called `secretpod` that will have the `username` and `password` defined in `mysecret` exposed in the **environment variables** `SECRET_USERNAME` \_\_ and \_\_ `SECRET_PASSWOR`. It will also **mount** the `username` secret inside `mysecret` in the path `/etc/foo/my-group/my-username` with `0640` permissions.
|
||||
```yaml:secretpod.yaml
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
@@ -422,17 +424,17 @@ env | grep SECRET && cat /etc/foo/my-group/my-username && echo
|
||||
```
|
||||
### Tajne u etcd <a href="#discover-secrets-in-etcd" id="discover-secrets-in-etcd"></a>
|
||||
|
||||
**etcd** je konzistentan i visoko dostupan **key-value store** koji Kubernetes koristi kao backing store za sve podatke klastera. Hajde da pristupimo tajnama sačuvanim u etcd:
|
||||
**etcd** je konzistentan i visoko dostupan **key-value store** koji se koristi kao Kubernetes backing store za sve podatke klastera. Hajde da pristupimo tajnama uskladištenim u etcd:
|
||||
```bash
|
||||
cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep etcd
|
||||
```
|
||||
Videćete certs, keys i URL-ove koji se nalaze u FS. Kada ih dobijete, moći ćete da se povežete na etcd.
|
||||
Videćete da se certs, keys i url’s nalaze u FS. Kada ih dobijete, moći ćete da se povežete na etcd.
|
||||
```bash
|
||||
#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
|
||||
```
|
||||
Jednom kada uspostavite komunikaciju, moći ćete da dobijete secrets:
|
||||
Kada uspostavite komunikaciju, moći ćete da dobijete secrets:
|
||||
```bash
|
||||
#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>
|
||||
|
||||
@@ -440,7 +442,7 @@ ETCDCTL_API=3 etcdctl --cert /etc/kubernetes/pki/apiserver-etcd-client.crt --key
|
||||
```
|
||||
**Dodavanje enkripcije u ETCD**
|
||||
|
||||
Podrazumevano, svi secrets se **čuvaju u običnom** tekstu unutar etcd osim ako ne primenite encryption sloj. Sledeći primer je baziran na [https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/)
|
||||
Podrazumevano, svi secrets su **skladišteni u običnom** tekstu unutar etcd osim ako ne primenite encryption layer. Sledeći primer je zasnovan na [https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/)
|
||||
```yaml:encryption.yaml
|
||||
apiVersion: apiserver.config.k8s.io/v1
|
||||
kind: EncryptionConfiguration
|
||||
@@ -454,7 +456,7 @@ keys:
|
||||
secret: cjjPMcWpTPKhAdieVtd+KhG4NN+N6e3NmBPMXJvbfrY= #Any random key
|
||||
- identity: {}
|
||||
```
|
||||
Nakon toga, potrebno je da postaviš `--encryption-provider-config` flag na `kube-apiserver` tako da pokazuje na lokaciju kreiranog config fajla. Možeš da izmeniš `/etc/kubernetes/manifest/kube-apiserver.yaml` i dodaš sledeće linije:
|
||||
Nakon toga, treba da postavite zastavicu `--encryption-provider-config` na `kube-apiserver` da pokazuje na lokaciju kreiranog config fajla. Možete izmeniti `/etc/kubernetes/manifest/kube-apiserver.yaml` i dodati sledeće linije:
|
||||
```yaml
|
||||
containers:
|
||||
- command:
|
||||
@@ -474,43 +476,43 @@ path: /etc/kubernetes/etcd
|
||||
type: DirectoryOrCreate
|
||||
name: etcd
|
||||
```
|
||||
**Verifying that data is encrypted**
|
||||
**Provera da li su podaci enkriptovani**
|
||||
|
||||
Podaci su enkriptovani kada se upisuju u etcd. Nakon restartovanja vašeg `kube-apiserver`, svaki novokreirani ili ažurirani secret trebalo bi da bude enkriptovan kada se skladišti. Da biste proverili, možete koristiti `etcdctl` komandni program da biste preuzeli sadržaj vašeg secret-a.
|
||||
Podaci su enkriptovani kada se upisuju u etcd. Nakon restartovanja tvog `kube-apiserver`, svaki novokreirani ili ažurirani secret treba da bude enkriptovan kada se sačuva. Da proveriš, možeš da koristiš `etcdctl` command line program da preuzmeš sadržaj svog secreta.
|
||||
|
||||
1. Kreirajte novi secret pod nazivom `secret1` u `default` namespace-u:
|
||||
1. Kreiraj novi secret pod nazivom `secret1` u `default` namespace:
|
||||
|
||||
```
|
||||
kubectl create secret generic secret1 -n default --from-literal=mykey=mydata
|
||||
```
|
||||
|
||||
2. Koristeći etcdctl commandline, pročitajte taj secret iz etcd:
|
||||
2. Koristeći etcdctl commandline, pročitaj taj secret iz etcd:
|
||||
|
||||
`ETCDCTL_API=3 etcdctl get /registry/secrets/default/secret1 [...] | hexdump -C`
|
||||
|
||||
gde `[...]` mora da sadrži dodatne argumente za povezivanje sa etcd serverom.
|
||||
|
||||
3. Proverite da li je sačuvani secret prefiksiran sa `k8s:enc:aescbc:v1:` što ukazuje da je `aescbc` provider enkriptovao dobijene podatke.
|
||||
4. Proverite da li je secret ispravno dekriptovan kada se preuzme preko API-ja:
|
||||
3. Proveri da je sačuvani secret prefiksiran sa `k8s:enc:aescbc:v1:`, što pokazuje da je `aescbc` provider enkriptovao dobijene podatke.
|
||||
4. Proveri da je secret ispravno dekriptovan kada se preuzima preko API-ja:
|
||||
|
||||
```
|
||||
kubectl describe secret secret1 -n default
|
||||
```
|
||||
|
||||
trebalo bi da odgovara `mykey: bXlkYXRh`, mydata je encoded, check [decoding a secret](https://kubernetes.io/docs/concepts/configuration/secret#decoding-a-secret) to completely decode the secret.
|
||||
trebalo bi da odgovara `mykey: bXlkYXRh`, mydata je enkodiran, pogledaj [decoding a secret](https://kubernetes.io/docs/concepts/configuration/secret#decoding-a-secret) da potpuno dekodiraš secret.
|
||||
|
||||
**Since secrets are encrypted on write, performing an update on a secret will encrypt that content:**
|
||||
**Pošto se secrets enkriptuju pri upisu, svaka izmena secreta će enkriptovati taj sadržaj:**
|
||||
```
|
||||
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
|
||||
```
|
||||
**Konačni saveti:**
|
||||
**Final tips:**
|
||||
|
||||
- Pokušajte da ne držite secrets u FS, uzimajte ih iz drugih mesta.
|
||||
- Pogledajte [https://www.vaultproject.io/](https://www.vaultproject.io) da biste dodali više zaštite svojim secrets.
|
||||
- Pokušajte da ne držite tajne u FS, uzmite ih sa drugih mesta.
|
||||
- Pogledajte [https://www.vaultproject.io/](https://www.vaultproject.io) da biste dodali više zaštite za svoje tajne.
|
||||
- [https://kubernetes.io/docs/concepts/configuration/secret/#risks](https://kubernetes.io/docs/concepts/configuration/secret/#risks)
|
||||
- [https://docs.cyberark.com/Product-Doc/OnlineHelp/AAM-DAP/11.2/en/Content/Integrations/Kubernetes_deployApplicationsConjur-k8s-Secrets.htm](https://docs.cyberark.com/Product-Doc/OnlineHelp/AAM-DAP/11.2/en/Content/Integrations/Kubernetes_deployApplicationsConjur-k8s-Secrets.htm)
|
||||
|
||||
## Reference
|
||||
## References
|
||||
|
||||
{{#ref}}
|
||||
https://sickrov.github.io/
|
||||
@@ -520,4 +522,12 @@ https://sickrov.github.io/
|
||||
https://www.youtube.com/watch?v=X48VuDVv0do
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://kubernetes.io/docs/concepts/storage/volumes/#image
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://kubernetes.io/docs/tasks/configure-pod-container/image-volumes/
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
+46
-40
@@ -6,79 +6,85 @@
|
||||
|
||||
[**Iz dokumentacije:**](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core)
|
||||
|
||||
Kada navodite security context za Pod možete koristiti nekoliko atributa. Sa stanovišta defanzivne bezbednosti trebalo bi da razmotrite:
|
||||
Kada navodiš security context za Pod, možeš koristiti nekoliko atributa. Sa stanovišta defanzivne bezbednosti, trebalo bi da razmotriš:
|
||||
|
||||
- Da **runASNonRoot** bude **True**
|
||||
- Da konfigurišete **runAsUser**
|
||||
- Ako je moguće, razmotrite **ograničavanje** **permissions** navođenjem **seLinuxOptions** i **seccompProfile**
|
||||
- **NE** dajte **privilege** **group** access preko **runAsGroup** i **supplementaryGroups**
|
||||
- Da konfigurišeš **runAsUser**
|
||||
- Ako je moguće, razmotri **ograničavanje** **permissions** navođenjem **seLinuxOptions** i **seccompProfile**
|
||||
- **NE** dodeljuj **privilege** **group** pristup preko **runAsGroup** i **supplementaryGroups**
|
||||
|
||||
| Parameter | Description |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>fsGroup</strong></a><br><em>integer</em></p> | <p>Posebna supplemental grupa koja važi za <strong>sve kontejnere u podu</strong>. Neki tipovi volumena dozvoljavaju Kubelet-u da <strong>promeni ownership tog volumena</strong> tako da bude u vlasništvu poda:<br>1. Owning GID će biti FSGroup<br>2. setgid bit je postavljen (nove datoteke kreirane u volumenu biće u vlasništvu FSGroup)<br>3. permission bitovi se OR-uju sa rw-rw---- Ako nije postavljeno, Kubelet neće menjati ownership ni permissions nijednog volumena</p> |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>fsGroup</strong></a><br><em>integer</em></p> | <p>Posebna supplemental grupa koja se primenjuje na <strong>sve containere u podu</strong>. Neki tipovi volume-a omogućavaju da Kubelet <strong>promeni ownership tog volume-a</strong> tako da pripada podu:<br>1. Owning GID će biti FSGroup<br>2. setgid bit je postavljen (novi fajlovi kreirani u volume-u biće u vlasništvu FSGroup)<br>3. permission bitovi se OR-uju sa rw-rw---- Ako nije postavljeno, Kubelet neće menjati ownership i permissions nijednog volume-a</p> |
|
||||
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>fsGroupChangePolicy</strong></a><br><em>string</em></p> | Ovo definiše ponašanje **promene ownership-a i permissions volumena** pre nego što bude izložen unutar Pod-a. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsGroup</strong></a><br><em>integer</em></p> | **GID za pokretanje entrypoint-a procesa kontejnera**. Koristi podrazumevanu vrednost runtime-a ako nije postavljeno. Može takođe biti postavljeno u SecurityContext. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsNonRoot</strong></a><br><em>boolean</em></p> | Ukazuje da kontejner mora da radi kao non-root korisnik. Ako je true, Kubelet će u runtime-u proveriti image kako bi osigurao da ne radi kao UID 0 (root) i neće pokrenuti kontejner ako to radi. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsUser</strong></a><br><em>integer</em></p> | **UID za pokretanje entrypoint-a procesa kontejnera**. Podrazumevano je korisnik naveden u image metadata ako nije specificirano. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>seLinuxOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#selinuxoptions-v1-core"><em>SELinuxOptions</em></a><br><em>More info about</em> <em><strong>seLinux</strong></em></p> | **SELinux context koji će biti primenjen na sve kontejnere**. Ako nije naveden, container runtime će dodeliti nasumični SELinux context za svaki kontejner. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>seccompProfile</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#seccompprofile-v1-core"><em>SeccompProfile</em></a><br><em>More info about</em> <em><strong>Seccomp</strong></em></p> | **seccomp opcije koje treba da koriste kontejneri** u ovom podu. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>supplementalGroups</strong></a><br><em>integer array</em></p> | Lista **grupa koje se primenjuju na prvi proces pokrenut u svakom kontejneru**, pored primarne GID kontejnera. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>fsGroupChangePolicy</strong></a><br><em>string</em></p> | Ovo definiše ponašanje **promene ownership i permission-a volume-a** pre nego što bude izložen unutar Poda. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsGroup</strong></a><br><em>integer</em></p> | **GID za pokretanje entrypoint-a procesa containera**. Koristi runtime default ako nije postavljeno. Može takođe biti postavljeno u SecurityContext. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsNonRoot</strong></a><br><em>boolean</em></p> | Označava da container mora da radi kao non-root korisnik. Ako je true, Kubelet će validirati image u runtime-u kako bi osigurao da ne radi kao UID 0 (root) i neće pokrenuti container ako to radi. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsUser</strong></a><br><em>integer</em></p> | **UID za pokretanje entrypoint-a procesa containera**. Podrazumevano koristi korisnika navedenog u metadata image-a ako nije drugačije navedeno. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>seLinuxOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#selinuxoptions-v1-core"><em>SELinuxOptions</em></a><br><em>More info about</em> <em><strong>seLinux</strong></em></p> | **SELinux context koji će biti primenjen na sve containere**. Ako nije naveden, container runtime će dodeliti nasumičan SELinux context za svaki container. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>seccompProfile</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#seccompprofile-v1-core"><em>SeccompProfile</em></a><br><em>More info about</em> <em><strong>Seccomp</strong></em></p> | **seccomp opcije koje će koristiti containere** u ovom podu. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>supplementalGroups</strong></a><br><em>integer array</em></p> | Lista **grupa primenjenih na prvi proces pokrenut u svakom containeru**, pored primarne GID grupe containera. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>sysctls</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#sysctl-v1-core"><em>Sysctl</em></a> <em>array</em><br><em>More info about</em> <a href="https://www.garron.me/en/go2linux/sysctl-linux.html"><em><strong>sysctls</strong></em></a></p> | Sysctls sadrže listu **namespaced sysctls koji se koriste za pod**. Podovi sa nepodržanim sysctls (od strane container runtime-a) možda neće uspeti da se pokrenu. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>windowsOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#windowssecuritycontextoptions-v1-core"><em>WindowsSecurityContextOptions</em></a></p> | Windows-specifične postavke primenjene na sve kontejnere. Ako nije navedeno, koristiće se opcije unutar SecurityContext-a kontejnera. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>windowsOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#windowssecuritycontextoptions-v1-core"><em>WindowsSecurityContextOptions</em></a></p> | Windows specifična podešavanja primenjena na sve containere. Ako nije navedeno, koristiće se opcije unutar SecurityContext-a containera. |
|
||||
|
||||
## SecurityContext
|
||||
|
||||
[**Iz dokumentacije:**](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core)
|
||||
|
||||
Ovaj context se postavlja unutar definicija **containers**. Sa stanovišta defanzivne bezbednosti trebalo bi da razmotrite:
|
||||
Ovaj context se postavlja unutar **definicija containera**. Sa stanovišta defanzivne bezbednosti, trebalo bi da razmotriš:
|
||||
|
||||
- **allowPrivilegeEscalation** na **False**
|
||||
- Ne dodavati osetljive **capabilities** (i ukloniti one koje vam nisu potrebne)
|
||||
- Ne dodavati osetljive **capabilities** (i ukloniti one koje ti ne trebaju)
|
||||
- **privileged** na **False**
|
||||
- Ako je moguće, postaviti **readOnlyFilesystem** na **True**
|
||||
- Postaviti **runAsNonRoot** na **True** i postaviti **runAsUser**
|
||||
- Ako je moguće, razmotrite **ograničavanje** **permissions** navođenjem **seLinuxOptions** i **seccompProfile**
|
||||
- **NE** dajte **privilege** **group** access preko **runAsGroup.**
|
||||
- Ako je moguće, postavi **readOnlyFilesystem** na **True**
|
||||
- Postavi **runAsNonRoot** na **True** i postavi **runAsUser**
|
||||
- Ako je moguće, razmotri **ograničavanje** **permissions** navođenjem **seLinuxOptions** i **seccompProfile**
|
||||
- **NE** dodeljuj **privilege** **group** pristup preko **runAsGroup.**
|
||||
|
||||
Imajte na umu da za atribute postavljene i u **SecurityContext** i u **PodSecurityContext**, vrednost navedena u **SecurityContext** ima **prednost**.
|
||||
Imaj na umu da za atribute postavljene i u **SecurityContext** i u **PodSecurityContext**, vrednost navedena u **SecurityContext** ima **prednost**.
|
||||
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>allowPrivilegeEscalation</strong></a><br><em>boolean</em></p> | **AllowPrivilegeEscalation** kontroliše da li proces može da **stekne više privilegija** nego njegov parent process. Ovaj bool direktno kontroliše da li će no_new_privs flag biti postavljen na proces kontejnera. AllowPrivilegeEscalation je uvek true kada se kontejner pokreće kao **Privileged** ili ima **CAP_SYS_ADMIN** |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>allowPrivilegeEscalation</strong></a><br><em>boolean</em></p> | **AllowPrivilegeEscalation** kontroliše da li proces može da **stekne više privilegija** nego njegov parent process. Ovaj bool direktno kontroliše da li će no_new_privs flag biti postavljen na proces containera. AllowPrivilegeEscalation je uvek true kada container radi kao **Privileged** ili ima **CAP_SYS_ADMIN** |
|
||||
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>capabilities</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#capabilities-v1-core"><em>Capabilities</em></a><br><em>More info about</em> <em><strong>Capabilities</strong></em></p> | **Capabilities koje treba dodati/ukloniti pri pokretanju kontejnera**. Podrazumeva se defaultni skup capabilities. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>privileged</strong></a><br><em>boolean</em></p> | Pokreni kontejner u privileged režimu. Procesi u privileged kontejnerima su suštinski **ekvivalentni root-u na host-u**. Podrazumevano je false. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>procMount</strong></a><br><em>string</em></p> | procMount označava **tip proc mount-a koji treba koristiti za kontejnere**. Podrazumevano je DefaultProcMount koji koristi podrazumevane vrednosti container runtime-a za readonly putanje i masked putanje. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>readOnlyRootFilesystem</strong></a><br><em>boolean</em></p> | Da li ovaj **kontejner ima read-only root filesystem**. Podrazumevano je false. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsGroup</strong></a><br><em>integer</em></p> | **GID za pokretanje entrypoint-a** procesa kontejnera. Koristi podrazumevanu vrednost runtime-a ako nije postavljeno. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsNonRoot</strong></a><br><em>boolean</em></p> | Ukazuje da kontejner mora da **radi kao non-root korisnik**. Ako je true, Kubelet će u runtime-u proveriti image kako bi osigurao da ne radi kao UID 0 (root) i neće pokrenuti kontejner ako to radi. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsUser</strong></a><br><em>integer</em></p> | **UID za pokretanje entrypoint-a** procesa kontejnera. Podrazumevano je korisnik naveden u image metadata ako nije specificirano. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>seLinuxOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#selinuxoptions-v1-core"><em>SELinuxOptions</em></a><br><em>More info about</em> <em><strong>seLinux</strong></em></p> | **SELinux context koji će biti primenjen na kontejner**. Ako nije naveden, container runtime će dodeliti nasumični SELinux context za svaki kontejner. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>seccompProfile</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#seccompprofile-v1-core"><em>SeccompProfile</em></a></p> | **seccomp opcije** koje treba da koristi ovaj kontejner. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>windowsOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#windowssecuritycontextoptions-v1-core"><em>WindowsSecurityContextOptions</em></a></p> | **Windows-specifične postavke** primenjene na sve kontejnere. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>capabilities</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#capabilities-v1-core"><em>Capabilities</em></a><br><em>More info about</em> <em><strong>Capabilities</strong></em></p> | **Capabilities koje treba dodati/ukloniti pri pokretanju containera**. Podrazumevano koristi skup default capabilities. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>privileged</strong></a><br><em>boolean</em></p> | Pokreće container u privileged mode-u. Procesi u privileged containerima su suštinski **ekvivalentni root-u na hostu**. Podrazumevano je false. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>procMount</strong></a><br><em>string</em></p> | procMount označava **tip proc mount-a koji se koristi za containere**. Podrazumevana vrednost je DefaultProcMount, koji koristi container runtime default-e za readonly putanje i masked putanje. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>readOnlyRootFilesystem</strong></a><br><em>boolean</em></p> | Da li ovaj **container ima root filesystem samo za čitanje**. Podrazumevano je false. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsGroup</strong></a><br><em>integer</em></p> | **GID za pokretanje entrypoint-a** procesa containera. Koristi runtime default ako nije postavljeno. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsNonRoot</strong></a><br><em>boolean</em></p> | Označava da container mora da **radi kao non-root korisnik**. Ako je true, Kubelet će validirati image u runtime-u kako bi osigurao da ne radi kao UID 0 (root) i neće pokrenuti container ako to radi. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsUser</strong></a><br><em>integer</em></p> | **UID za pokretanje entrypoint-a** procesa containera. Podrazumevano koristi korisnika navedenog u metadata image-a ako nije drugačije navedeno. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>seLinuxOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#selinuxoptions-v1-core"><em>SELinuxOptions</em></a><br><em>More info about</em> <em><strong>seLinux</strong></em></p> | **SELinux context koji će biti primenjen na container**. Ako nije naveden, container runtime će dodeliti nasumičan SELinux context za svaki container. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>seccompProfile</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#seccompprofile-v1-core"><em>SeccompProfile</em></a></p> | **seccomp opcije** koje će koristiti ovaj container. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>windowsOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#windowssecuritycontextoptions-v1-core"><em>WindowsSecurityContextOptions</em></a></p> | **Windows specifična podešavanja** primenjena na sve containere. |
|
||||
|
||||
## Practical workload review checklist
|
||||
|
||||
Kada pregledate Pod ili workload template, proverite i `spec.securityContext` i svaki container-level `securityContext` unutar `containers`, `initContainers` i `ephemeralContainers`. Fields na nivou kontejnera mogu da pregaze podrazumevane vrednosti na nivou poda, pa Pod default koji deluje bezbedno ne garantuje da je svaki kontejner bezbedan.
|
||||
Kada pregledaš Pod ili workload template, proveri i `spec.securityContext` i svaki container-level `securityContext` unutar `containers`, `initContainers` i `ephemeralContainers`. Polja na nivou containera mogu da nadjačaju pod-level podrazumevane vrednosti, pa siguran pod default ne garantuje da je svaki container bezbedan.
|
||||
|
||||
Kombinacije visokog rizika na koje treba prvo obratiti pažnju:
|
||||
Kombinacije visokog rizika kojima treba dati prioritet:
|
||||
|
||||
- `privileged: true`, posebno sa `hostPID`, `hostIPC`, `hostNetwork`, `hostPath`, host ports ili runtime socket mounts.
|
||||
- `privileged: true`, posebno sa `hostPID`, `hostIPC`, `hostNetwork`, `hostPath`, host portovima ili runtime socket mount-ovima.
|
||||
- Dodate capabilities kao što su `SYS_ADMIN`, `NET_ADMIN`, `SYS_PTRACE`, `SYS_MODULE`, `DAC_READ_SEARCH` ili `DAC_OVERRIDE`.
|
||||
- `allowPrivilegeEscalation: true` ili nije postavljeno u kontejnerima koji mogu izvršavati attacker-controlled code.
|
||||
- `seccompProfile: Unconfined`, `procMount: Unmasked` ili nedostajući runtime profili na osetljivim workload-ovima.
|
||||
- Writable root filesystem ili široki writable volume mount-ovi u workload-ovima koji obrađuju untrusted input.
|
||||
- Nedostajući CPU, memory ili ephemeral-storage requests i limits u multi-tenant namespace-ovima.
|
||||
- `allowPrivilegeEscalation: true` ili nije postavljeno u containerima koji mogu da izvršavaju attacker-controlled code.
|
||||
- `seccompProfile: Unconfined`, `procMount: Unmasked` ili nedostaju runtime profili na osetljivim workload-ovima.
|
||||
- Writable root filesystem ili široki writable volume mount-ovi u workload-ovima koji obrađuju nepouzdane inpute.
|
||||
- Nedostaju CPU, memory ili ephemeral-storage requests i limits u multi-tenant namespace-ovima.
|
||||
- Nedostaju ili su nerealni pod-level `spec.resources` budžeti, i principals sa `patch` ili `update` na Pod `resize` subresource, jer podržani klasteri mogu da promene running CPU i memory desired state bez ponovnog kreiranja Poda.
|
||||
|
||||
Za većinu application workload-ova, dobar baseline je da se radi kao non-root UID, postavi `runAsNonRoot: true`, postavi `allowPrivilegeEscalation: false`, uklone sve capabilities i vrate samo minimalno potrebne, koristi `seccompProfile: RuntimeDefault`, preferira read-only root filesystem, i izbegavaju host namespaces, hostPath mount-ove i privileged mode.
|
||||
Kontrole resursa nisu deo `securityContext`, ali ih pregledaj u istom prolazu kroz workload jer definišu granicu dostupnosti. Moderni Kubernetes može da definiše CPU, memory i hugepage budžete na Pod nivou pod `spec.resources`, pored container-level `resources`. Pod sa sidecar-ovima može biti ograničen agregatnim Pod envelope-om čak i kada jedan container nema pojedinačne limite, dok lokalno ephemeral storage i dalje zahteva posebne `ephemeral-storage` limite, `emptyDir.sizeLimit`, LimitRanges i ResourceQuotas. Takođe uporedi željene resurse u Pod spec-u sa `status.containerStatuses[].resources` nakon in-place resize zahteva; neuspešan ili pending resize može ostaviti traženu vrednost u `spec` dok kubelet zadržava prethodnu runtime dodelu i prijavljuje `PodResizePending` condition.
|
||||
|
||||
Na cluster nivou, koristite [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) namespace labels da biste, gde je moguće, primenili Kubernetes [Pod Security Standards](https://kubernetes.io/docs/concepts/security/pod-security-standards/). Koristite `restricted` za namespace-ove koji to mogu da podrže, najmanje `baseline` za obične application namespace-ove, i držite privileged izuzetke uskim, dokumentovanim i izolovanim na trusted platform namespace-ove ili node pool-ove.
|
||||
Za većinu application workload-ova, dobar baseline je da radiš kao non-root UID, postaviš `runAsNonRoot: true`, postaviš `allowPrivilegeEscalation: false`, ukloniš sve capabilities i vratiš samo minimalno potrebne, koristiš `seccompProfile: RuntimeDefault`, preferiraš root filesystem samo za čitanje i izbegavaš host namespaces, hostPath mount-ove i privileged mode.
|
||||
|
||||
Na cluster nivou, koristi [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) namespace oznake da bi sproveo Kubernetes [Pod Security Standards](https://kubernetes.io/docs/concepts/security/pod-security-standards/) gde je moguće. Koristi `restricted` za namespace-ove koji to mogu da podrže, bar `baseline` za obične application namespace-ove, i zadrži privileged izuzetke uske, dokumentovane i izolovane na trusted platform namespace-ove ili node pool-ove.
|
||||
|
||||
## References
|
||||
|
||||
- [https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core)
|
||||
- [https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core)
|
||||
- [https://kubernetes.io/docs/tasks/configure-pod-container/security-context/](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/)
|
||||
- [https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/)
|
||||
- [https://kubernetes.io/docs/concepts/security/linux-kernel-security-constraints/](https://kubernetes.io/docs/concepts/security/linux-kernel-security-constraints/)
|
||||
- [https://kubernetes.io/docs/concepts/security/pod-security-standards/](https://kubernetes.io/docs/concepts/security/pod-security-standards/)
|
||||
- [https://kubernetes.io/docs/concepts/security/pod-security-admission/](https://kubernetes.io/docs/concepts/security/pod-security-admission/)
|
||||
- [https://kubernetes.io/docs/tasks/configure-pod-container/assign-pod-level-resources/](https://kubernetes.io/docs/tasks/configure-pod-container/assign-pod-level-resources/)
|
||||
- [https://kubernetes.io/docs/tasks/configure-pod-container/resize-container-resources/](https://kubernetes.io/docs/tasks/configure-pod-container/resize-container-resources/)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user