Kubernetes Basics
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
The original author of this page is Jorge (read his original post here)
Umożliwia uruchamianie kontenerów w silniku kontenerowym.
Harmonogram pozwala na efektywne planowanie misji kontenerów.
Utrzymuje kontenery przy życiu.
Umożliwia komunikację między kontenerami.
Umożliwia techniki wdrażania.
Obsługuje wolumeny informacji.
Node: system operacyjny z podem lub podami.
Pod: Opakowanie wokół kontenera lub wielu kontenerów. Pod powinien zawierać tylko jedną aplikację (zazwyczaj pod uruchamia tylko 1 kontener). Pod to sposób, w jaki Kubernetes abstrahuje technologię kontenerową.
Service: Każdy pod ma 1 wewnętrzny adres IP z wewnętrznego zakresu węzła. Może być również udostępniony za pośrednictwem usługi. Usługa ma również adres IP i jej celem jest utrzymanie komunikacji między podami, więc jeśli jeden z nich umrze, nowa wymiana (z innym wewnętrznym IP) będzie dostępna pod tym samym adresem IP usługi. Może być skonfigurowana jako wewnętrzna lub zewnętrzna. Usługa działa również jako load balancer, gdy 2 pody są połączone z tą samą usługą.
Gdy usługa jest tworzona, możesz znaleźć punkty końcowe każdej usługi uruchamiając kubectl get endpoints
Kubelet: Główny agent węzła. Komponent, który nawiązuje komunikację między węzłem a kubectl, i może uruchamiać tylko pody (przez API server). Kubelet nie zarządza kontenerami, które nie zostały utworzone przez Kubernetes.
Kube-proxy: jest usługą odpowiedzialną za komunikację (usługi) między apiserver a węzłem. Podstawą jest IPtables dla węzłów. Najbardziej doświadczeni użytkownicy mogą zainstalować inne kube-proxy od innych dostawców.
Sidecar container: Kontenery sidecar to kontenery, które powinny działać razem z głównym kontenerem w podzie. Ten wzór sidecar rozszerza i poprawia funkcjonalność obecnych kontenerów bez ich zmiany. Obecnie wiemy, że używamy technologii kontenerowej do opakowania wszystkich zależności, aby aplikacja mogła działać wszędzie. Kontener robi tylko jedną rzecz i robi to bardzo dobrze.
Master process:
Api Server: To sposób, w jaki użytkownicy i pody komunikują się z procesem głównym. Tylko uwierzytelnione żądania powinny być dozwolone.
Scheduler: Planowanie odnosi się do upewnienia się, że pody są dopasowane do węzłów, aby Kubelet mógł je uruchomić. Ma wystarczającą inteligencję, aby zdecydować, który węzeł ma więcej dostępnych zasobów, a następnie przypisać nowy pod do niego. Należy zauważyć, że scheduler nie uruchamia nowych podów, tylko komunikuje się z procesem Kubelet działającym wewnątrz węzła, który uruchomi nowy pod.
Kube Controller manager: Sprawdza zasoby, takie jak zestawy replik lub wdrożenia, aby sprawdzić, czy na przykład działa odpowiednia liczba podów lub węzłów. W przypadku braku poda skomunikuje się z harmonogramem, aby uruchomić nowy. Kontroluje replikację, tokeny i usługi konta do API.
etcd: Przechowywanie danych, trwałe, spójne i rozproszone. Jest bazą danych Kubernetes i przechowuje stan klastrów (każda zmiana jest tutaj rejestrowana). Komponenty, takie jak Scheduler czy Controller manager, polegają na tych danych, aby wiedzieć, jakie zmiany zaszły (dostępne zasoby węzłów, liczba działających podów...)
Cloud controller manager: Jest to specyficzny kontroler do kontroli przepływu i aplikacji, tj. jeśli masz klastry w AWS lub OpenStack.
Należy zauważyć, że ponieważ może być kilka węzłów (uruchamiających kilka podów), może być również kilka procesów głównych, których dostęp do Api server jest równoważony obciążeniem, a ich etcd synchronizowane.
Volumes:
Gdy pod tworzy dane, które nie powinny zostać utracone, gdy pod zniknie, powinny być przechowywane w fizycznym wolumenie. Kubernetes pozwala na podłączenie wolumenu do poda, aby zachować dane. Wolumen może znajdować się na lokalnej maszynie lub w zdalnym magazynie. Jeśli uruchamiasz pody na różnych fizycznych węzłach, powinieneś użyć zdalnego magazynu, aby wszystkie pody mogły uzyskać do niego dostęp.
Other configurations:
ConfigMap: Możesz skonfigurować URL do uzyskiwania dostępu do usług. Pod uzyska dane stąd, aby wiedzieć, jak komunikować się z pozostałymi usługami (podami). Należy zauważyć, że to nie jest zalecane miejsce do przechowywania poświadczeń!
Secret: To miejsce do przechowywania tajnych danych takich jak hasła, klucze API... zakodowane w B64. Pod będzie mógł uzyskać dostęp do tych danych, aby użyć wymaganych poświadczeń.
Deployments: To tutaj wskazuje się komponenty, które mają być uruchamiane przez Kubernetes. Użytkownik zazwyczaj nie pracuje bezpośrednio z podami, pody są abstrahowane w ReplicaSets (liczba tych samych replikowanych podów), które są uruchamiane za pośrednictwem wdrożeń. Należy zauważyć, że wdrożenia są dla aplikacji bezstanowych. Minimalna konfiguracja dla wdrożenia to nazwa i obraz do uruchomienia.
StatefulSet: Ten komponent jest przeznaczony specjalnie dla aplikacji takich jak bazy danych, które muszą uzyskiwać dostęp do tego samego magazynu.
Ingress: To konfiguracja, która jest używana do udostępnienia aplikacji publicznie za pomocą URL. Należy zauważyć, że można to również zrobić za pomocą zewnętrznych usług, ale to jest poprawny sposób na udostępnienie aplikacji.
Jeśli wdrożysz Ingress, będziesz musiał utworzyć Ingress Controllers. Kontroler Ingress to pod, który będzie punktem końcowym, który otrzyma żądania, sprawdzi je i zrównoważy obciążenie do usług. Kontroler ingress wyśle żądanie na podstawie skonfigurowanych reguł ingress. Należy zauważyć, że reguły ingress mogą wskazywać na różne ścieżki lub nawet subdomeny do różnych wewnętrznych usług Kubernetes.
Lepszą praktyką bezpieczeństwa byłoby użycie zdalnego load balancera lub serwera proxy jako punktu wejścia, aby żadna część klastra Kubernetes nie była wystawiona.
Gdy otrzymane zostanie żądanie, które nie pasuje do żadnej reguły ingress, kontroler ingress skieruje je do "Default backend". Możesz describe
kontroler ingress, aby uzyskać adres tego parametru.
minikube addons enable ingress
CA jest zaufanym korzeniem dla wszystkich certyfikatów w klastrze.
Umożliwia komponentom wzajemną weryfikację.
Wszystkie certyfikaty klastra są podpisane przez CA.
ETCd ma własny certyfikat.
typy:
certyfikat apiserver.
certyfikat kubelet.
certyfikat scheduler.
Minikube może być używany do przeprowadzania kilku szybkich testów na Kubernetes bez potrzeby wdrażania całego środowiska Kubernetes. Uruchomi procesy master i node na jednej maszynie. Minikube użyje virtualbox do uruchomienia węzła. Zobacz tutaj, jak go zainstalować.
Kubectl
to narzędzie wiersza poleceń dla klastrów kubernetes. Komunikuje się z serwerem Api głównego procesu, aby wykonywać akcje w kubernetes lub aby prosić o dane.
Panel sterowania pozwala łatwiej zobaczyć, co uruchamia minikube, możesz znaleźć adres URL do jego uzyskania w:
Każdy plik konfiguracyjny ma 3 części: metadata, specyfikacja (co należy uruchomić), status (pożądany stan). Wewnątrz specyfikacji pliku konfiguracyjnego wdrożenia można znaleźć szablon zdefiniowany z nową strukturą konfiguracyjną definiującą obraz do uruchomienia:
Przykład Wdrożenia + Usługi zadeklarowanej w tym samym pliku konfiguracyjnym (z tutaj)
Ponieważ usługa zazwyczaj jest związana z jednym wdrożeniem, możliwe jest zadeklarowanie obu w tym samym pliku konfiguracyjnym (usługa zadeklarowana w tej konfiguracji jest dostępna tylko wewnętrznie):
Przykład konfiguracji usługi zewnętrznej
Ta usługa będzie dostępna zewnętrznie (sprawdź atrybuty nodePort
i type: LoadBlancer
):
To jest przydatne do testowania, ale w produkcji powinieneś mieć tylko usługi wewnętrzne i Ingress, aby udostępnić aplikację.
Przykład pliku konfiguracyjnego Ingress
To udostępni aplikację pod adresem http://dashboard.com
.
Przykład pliku konfiguracyjnego sekretów
Zauważ, jak hasła są kodowane w B64 (co nie jest bezpieczne!)
Przykład ConfigMap
A ConfigMap to konfiguracja, która jest przekazywana do podów, aby wiedziały, jak lokalizować i uzyskiwać dostęp do innych usług. W tym przypadku każdy pod będzie wiedział, że nazwa mongodb-service
jest adresem poda, z którym mogą się komunikować (ten pod będzie uruchamiał mongodb):
Następnie, wewnątrz deployment config ten adres można określić w następujący sposób, aby został załadowany w env pod:
Przykład konfiguracji woluminu
Możesz znaleźć różne przykłady plików konfiguracyjnych storage yaml w https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes. Zauważ, że woluminy nie są wewnątrz przestrzeni nazw
Kubernetes wspiera wiele wirtualnych klastrów opartych na tym samym fizycznym klastrze. Te wirtualne klastry nazywane są przestrzeniami nazw. Są one przeznaczone do użytku w środowiskach z wieloma użytkownikami rozproszonymi w różnych zespołach lub projektach. Dla klastrów z kilkoma do kilkunastu użytkowników, nie powinieneś w ogóle tworzyć ani myśleć o przestrzeniach nazw. Powinieneś zacząć używać przestrzeni nazw, aby lepiej kontrolować i organizować każdą część aplikacji wdrożonej w kubernetes.
Przestrzenie nazw zapewniają zakres dla nazw. Nazwy zasobów muszą być unikalne w obrębie przestrzeni nazw, ale nie w różnych przestrzeniach nazw. Przestrzenie nazw nie mogą być zagnieżdżane w sobie nawzajem, a każdy zasób Kubernetes może być tylko w jednej przestrzeni nazw.
Domyślnie są 4 przestrzenie nazw, jeśli używasz minikube:
kube-system: Nie jest przeznaczony do użytku przez użytkowników i nie powinieneś go dotykać. Jest to przestrzeń dla procesów master i kubectl.
kube-public: Publicznie dostępne dane. Zawiera configmap, który zawiera informacje o klastrze.
kube-node-lease: Określa dostępność węzła.
default: Przestrzeń nazw, której użytkownik użyje do tworzenia zasobów.
Zauważ, że większość zasobów Kubernetes (np. pods, services, replication controllers i inne) znajduje się w pewnych przestrzeniach nazw. Jednak inne zasoby, takie jak zasoby przestrzeni nazw i zasoby niskiego poziomu, takie jak węzły i persistenVolumes, nie znajdują się w przestrzeni nazw. Aby zobaczyć, które zasoby Kubernetes są i nie są w przestrzeni nazw:
Możesz zapisać przestrzeń nazw dla wszystkich kolejnych poleceń kubectl w tym kontekście.
Helm to menedżer pakietów dla Kubernetes. Umożliwia pakowanie plików YAML i dystrybucję ich w publicznych i prywatnych repozytoriach. Te pakiety nazywane są Helm Charts.
Helm jest również silnikiem szablonów, który pozwala na generowanie plików konfiguracyjnych z zmiennymi:
Secret to obiekt, który zawiera wrażliwe dane, takie jak hasło, token lub klucz. Takie informacje mogłyby być umieszczone w specyfikacji Pod lub w obrazie. Użytkownicy mogą tworzyć Secrets, a system również tworzy Secrets. Nazwa obiektu Secret musi być ważną nazwą subdomeny DNS. Przeczytaj tutaj oficjalną dokumentację.
Secrets mogą być takie jak:
Klucze API, SSH.
Tokeny OAuth.
Poświadczenia, Hasła (czysty tekst lub b64 + szyfrowanie).
Informacje lub komentarze.
Kod połączenia z bazą danych, ciągi… .
Istnieją różne typy sekretów w Kubernetes
Opaque
dowolne dane zdefiniowane przez użytkownika (Domyślnie)
kubernetes.io/service-account-token
token konta usługi
kubernetes.io/dockercfg
zserializowany plik ~/.dockercfg
kubernetes.io/dockerconfigjson
zserializowany plik ~/.docker/config.json
kubernetes.io/basic-auth
poświadczenia do podstawowej autoryzacji
kubernetes.io/ssh-auth
poświadczenia do autoryzacji SSH
kubernetes.io/tls
dane dla klienta lub serwera TLS
bootstrap.kubernetes.io/token
dane tokena bootstrap
Typ Opaque jest domyślnym typem, typową parą klucz-wartość zdefiniowaną przez użytkowników.
Jak działają sekrety:
Poniższy plik konfiguracyjny definiuje secret o nazwie mysecret
z 2 parami klucz-wartość username: YWRtaW4=
i password: MWYyZDFlMmU2N2Rm
. Definiuje również pod o nazwie secretpod
, który będzie miał username
i password
zdefiniowane w mysecret
wystawione w zmiennych środowiskowych SECRET_USERNAME
__ i __ SECRET_PASSWOR
. Będzie również montować sekret username
wewnątrz mysecret
w ścieżce /etc/foo/my-group/my-username
z uprawnieniami 0640
.
etcd to spójny i wysoko dostępny magazyn klucz-wartość używany jako zaplecze Kubernetes dla wszystkich danych klastra. Uzyskajmy dostęp do sekretów przechowywanych w etcd:
Zobaczysz certy, klucze i adresy URL, które znajdują się w systemie plików. Gdy je zdobędziesz, będziesz mógł połączyć się z etcd.
Gdy uda ci się nawiązać komunikację, będziesz mógł uzyskać sekrety:
Dodawanie szyfrowania do ETCD
Domyślnie wszystkie sekrety są przechowywane w postaci niezaszyfrowanej wewnątrz etcd, chyba że zastosujesz warstwę szyfrowania. Poniższy przykład oparty jest na https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/
Po tym musisz ustawić flagę --encryption-provider-config
na kube-apiserver
, aby wskazywała na lokalizację utworzonego pliku konfiguracyjnego. Możesz zmodyfikować /etc/kubernetes/manifest/kube-apiserver.yaml
i dodać następujące linie:
Przewiń w dół w volumeMounts:
Przewiń w dół w volumeMounts do hostPath:
Weryfikacja, że dane są szyfrowane
Dane są szyfrowane podczas zapisu do etcd. Po ponownym uruchomieniu kube-apiserver
, każdy nowo utworzony lub zaktualizowany sekret powinien być szyfrowany podczas przechowywania. Aby to sprawdzić, możesz użyć programu wiersza poleceń etcdctl
, aby pobrać zawartość swojego sekretu.
Utwórz nowy sekret o nazwie secret1
w przestrzeni nazw default
:
Używając wiersza poleceń etcdctl, odczytaj ten sekret z etcd:
ETCDCTL_API=3 etcdctl get /registry/secrets/default/secret1 [...] | hexdump -C
gdzie [...]
musi być dodatkowymi argumentami do połączenia z serwerem etcd. 3. Zweryfikuj, że przechowywany sekret jest poprzedzony prefiksem k8s:enc:aescbc:v1:
, co wskazuje, że dostawca aescbc
zaszyfrował wynikowe dane. 4. Zweryfikuj, że sekret jest poprawnie odszyfrowany po pobraniu za pośrednictwem API:
powinno odpowiadać mykey: bXlkYXRh
, mydata jest zakodowane, sprawdź dekodowanie sekretu, aby całkowicie dekodować sekret.
Ponieważ sekrety są szyfrowane podczas zapisu, wykonanie aktualizacji na sekrecie zaszyfruje tę zawartość:
Ostateczne wskazówki:
Staraj się nie przechowywać sekretów w FS, pozyskuj je z innych miejsc.
Sprawdź https://www.vaultproject.io/, aby dodać więcej ochrony do swoich sekretów.
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)