Úvod
Většina aplikací nasazených prostřednictvím Kubernetes vyžaduje přístup k databázím, službám a dalším zdrojům umístěným externě. Nejjednodušší způsob, jak spravovat přihlašovací údaje potřebné pro přístup k těmto zdrojům, je pomocí tajných klíčů Kubernetes. Tajemství pomáhají organizovat a distribuovat citlivé informace v rámci clusteru.
V tomto tutoriálu se dozvíte, co jsou tajemství Kubernetes a jak je vytvářet a používat ve vašem clusteru.
Předpoklady
- Cluster Kubernetes (pro účely testování jej můžete vytvořit pomocí minikube)
- Nástroj příkazového řádku Kubernetes kubectl
Co jsou tajemství Kubernetes?
Tajemství Kubernetes je objekt ukládající citlivá data, jako jsou uživatelská jména, hesla, tokeny a klíče. Tajemství vytváří systém během instalace aplikace nebo uživatelé, kdykoli potřebují uložit citlivé informace a zpřístupnit je pod.
Pokud by hesla, tokeny nebo klíče byly jednoduše součástí definice podu nebo obrazu kontejneru, mohly by být náhodně odhaleny během operací Kubernetes. Nejdůležitější funkcí tajemství je proto zabránit náhodnému odhalení informací v něm uložených a zároveň je zpřístupnit, kdekoli je uživatel potřebuje.
Typy tajných informací Kubernetes
Kubernetes obsahuje dvě kategorie tajemství:
- Služební účty systému automaticky vytvářejí vestavěná tajemství a přidružit je ke kontejnerům spolu s přihlašovacími údaji API.
- Můžete také vytvořit přizpůsobená tajemství pro přihlašovací údaje, které musíte zpřístupnit podům.
Vestavěná tajemství existují v několika typech, které odpovídají populárním scénářům použití:
Vestavěný typ | Popis |
---|---|
Opaque | Toto je výchozí typ tajného klíče. Všechny tajné klíče, jejichž konfigurační soubor neobsahuje příkaz typu, jsou považovány za tento typ. Neprůhledná tajemství jsou navržena k ukládání libovolných uživatelských dat. |
kubernetes.io/service-account-token | Tokeny tajných klíčů účtu služby ukládají tokeny identifikující účty služeb. Po vytvoření podu Kubernetes automaticky vytvoří toto tajemství a přidruží ho k podu, čímž umožní bezpečný přístup k rozhraní API. Toto chování lze zakázat. |
kubernetes.io/dockercfg | Přístup k registru Docker pro obrázky vyžaduje platná pověření Docker. Tento typ tajného klíče se používá k uložení serializovaného ~/.dockercfg starší formát pro konfiguraci příkazového řádku Docker. Obsahuje .dockercfg zakódovaný v base64 klíč. |
kubernetes.io/dockerconfigjson | Tento typ tajného klíče obsahuje .dockerconfigjson klíč, což je verze ~/.docker/config.json v kódování base64 soubor, novou verzi zastaralého .dockercfg . |
kubernetes.io/basic-auth | Tajemství pro ukládání základních autentizačních dat. Musí obsahovat dva klíče – username a password . |
kubernetes.io/ssh-auth | Pro ukládání dat nezbytných pro navázání připojení SSH použijte ssh-auth typ. Datové pole tohoto typu musí obsahovat ssh-privatekey pár klíč–hodnota. |
kubernetes.io/tls | Tento typ se používá k ukládání certifikátů a klíčů TLS. Nejběžnějším scénářem použití je ukončení zdroje Ingress, ale tls typ se také někdy používá s jinými zdroji. |
bootstrap.kubernetes.io/token | Tokeny používané během procesu bootstrap uzlu jsou uloženy pomocí tajného typu tokenu. Tento typ se obvykle vytváří v systému kube-system jmenný prostor. |
Chcete-li definovat přizpůsobený typ tajného klíče, přiřaďte neprázdný řetězec jako hodnotu v type
pole tajného souboru. Ponecháte-li pole prázdné, říkáte Kubernetes, aby převzal Opaque
typ. Přizpůsobený typ osvobozuje od tajemství omezení, která představují vestavěné typy.
Používání Kubernetes Secrets
Když vytvoříte tajemství, musí na něj odkazovat modul, který jej bude používat. Zpřístupnění tajemství pro modul:
1. Připojte tajný klíč jako soubor ve svazku dostupném pro libovolný počet kontejnerů v modulu.
2. Importujte tajný klíč jako proměnnou prostředí do kontejneru.
3. Použijte kubelet a imagePullSecrets
pole.
Následující části vysvětlují, jak vytvořit tajné klíče Kubernetes a také jak je dekódovat a přistupovat k nim.
Vytvořte tajemství Kubernetes
Chcete-li vytvořit tajný klíč Kubernetes, použijte jednu z následujících metod:
- Použijte
kubectl
pro přístup založený na příkazovém řádku. - Vytvořte konfigurační soubor pro tajný klíč.
- K vygenerování tajemství použijte generátor, jako je Kustomize.
Vytváření tajemství pomocí kubectl
1. Chcete-li začít vytvářet tajný klíč pomocí kubectl
, nejprve vytvořte soubory pro uložení citlivých informací:
echo -n '[username]' > [file1]
echo -n '[password]' > [file2]
-n
volba říká echo
nepřidávat nový řádek na konec řetězce. S novým řádkem se také zachází jako se znakem, takže by byl zakódován společně se zbytkem znaků, čímž by vznikla jiná zakódovaná hodnota.
2. Nyní použijte kubectl
k vytvoření tajného klíče pomocí souborů z předchozího kroku. Pomocí obecného dílčího příkazu vytvořte Opaque
tajný. Přidejte také --from-file
možnost pro každý ze souborů, které chcete zahrnout:
kubectl create secret generic [secret-name] \
--from-file=[file1] \
--from-file=[file2]
Výstup potvrzuje vytvoření tajenky:
3. Chcete-li poskytnout klíče pro hodnoty uložené v tajném klíči, použijte následující syntaxi:
kubectl create secret generic [secret-name] \
--from-file=[key1]=[file1] \
--from-file=[key2]=[file2]
4. Zkontrolujte, zda byl tajný klíč úspěšně vytvořen zadáním:
kubectl get secrets
Příkaz zobrazí seznam dostupných tajných klíčů – jejich názvy, typy, počet datových hodnot, které obsahují, a jejich stáří:
Vytvoření tajných klíčů v konfiguračním souboru
1. Chcete-li vytvořit tajemství zadáním nezbytných informací v konfiguračním souboru, začněte kódováním hodnot, které chcete uložit:
echo -n '[value1]' | base64
echo -n '[value2]' | base64
2. Nyní vytvořte soubor yaml pomocí textového editoru. Soubor by měl vypadat takto:
apiVersion: v1
kind: Secret
metadata:
name: newsecret
type: Opaque
data:
username: dXNlcg==
password: NTRmNDFkMTJlOGZh
3. Uložte soubor a použijte kubectl apply
příkaz k vytvoření tajného klíče:
kubectl apply -f [file]
Vytvořte Kubernetes Secret pomocí generátorů
Generátory, jako je Kustomize, pomáhají rychle generovat tajemství.
1. Chcete-li vytvořit tajemství pomocí Kustomize, vytvořte soubor s názvem kustomization.yaml
a naformátujte jej následovně:
secretGenerator:
- name: db-credentials
files:
- username.txt
- password.txt
Výše uvedený příklad uvádí db-credentials
jako název tajného klíče a používá dva dříve vytvořené soubory, username.txt
a password.txt
, jako datové hodnoty.
2. Chcete-li poskytnout nezašifrovanou doslovnou verzi hodnot dat, zahrňte literals
sekce s páry klíč–hodnota, které chcete uložit:
secretGenerator:
- name: db-credentials
literals:
- username=user
- password=54f41d12e8fa
3. Uložte soubor a použijte následující příkaz ve složce kustomization.yaml
se nachází:
kubectl apply -k .
Výstup potvrzuje vytvoření tajenky:
K zobrazení vytvořených tajemství použijte kubectl description
kubectl describe
zobrazuje základní informace o objektech Kubernetes. Použijte jej k zobrazení popisu tajemství.
kubectl describe secrets/[secret]
První příklad ukazuje tajemství vytvořené poskytnutím souborů jako datových hodnot:
Druhý příklad popisuje tajemství vytvořené pomocí řetězcových literálů. Všimněte si změny v Data
sekce, která nyní zobrazuje názvy klíčů místo názvů souborů:
Dekódovat tajemství
1. Chcete-li dekódovat hodnoty v tajném klíči, otevřete je zadáním následujícího příkazu:
kubectl get secret [secret] -o jsonpath='{.data}'
Výstup zobrazuje zakódované páry klíč–hodnota uložené v datové sekci:
2. Pomocí příkazu echo zadejte kódovaný řetězec a výstup převeďte do base64
příkaz:
echo '[encoded-value]' | base64 --decode
Dekódované řetězce se zobrazí jako výstup:
Přístup k tajným informacím načteným ve svazku
1. Chcete-li získat přístup k tajným klíčům připojeným k modulu v samostatném svazku, upravte definici modulu tak, aby zahrnovala nový svazek. Vyberte libovolný název svazku, který chcete, ale ujistěte se, že je stejný jako název tajného objektu.
2. Nezapomeňte zadat readOnly
jako pravda. Definice pod může vypadat například takto:
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: redis
volumeMounts:
- name: newsecret
mountPath: “/etc/newsecret”
readOnly: true
volumes:
- name: newsecret
secret:
secretName: newsecret
2. Otevřete další instanci terminálu a použijte kubectl exec
příkaz pro přístup k bash shellu modulu:
kubectl exec -it [pod] -- /bin/bash
3. cd
do /etc/newsecret
a najděte soubory obsažené v tajence:
cd /etc/newsecret
Projektujte tajemství do kontejneru pomocí proměnných prostředí
1. Dalším způsobem, jak získat přístup k tajným klíčům v podu Kubernetes, je importovat je jako proměnné prostředí úpravou definice podu tak, aby na ně obsahovala odkazy. Například:
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: secret-env-pod
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: newsecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: newsecret
key: password
restartPolicy: Never
2. Použijte kubectl exec
znovu udeřit do lusku.
3. Otestujte proměnnou prostředí pomocí echo
příkaz:
echo $[VARIABLE]
Výstup příkazu zobrazuje hodnotu mapovanou do proměnné:
Použití tajných klíčů k stahování obrázků dockeru ze soukromých registrů dockeru
1. Chcete-li používat soukromé registry Docker, musíte se nejprve přihlásit do Docker:
docker login
2. Po zobrazení výzvy zadejte své přihlašovací údaje:
3. Pokud je přihlášení úspěšné, Docker aktualizuje config.json
soubor s vašimi údaji. Pro zobrazení souboru použijte příkaz cat:
cat ~/.docker/config.json
auths
sekce obsahuje auth
klíč, což je zakódovaná verze přihlašovacích údajů Docker.
4. Použijte kubectl
k vytvoření tajného klíče s uvedením umístění souboru config.json
soubor a typ tajného klíče:
kubectl create secret generic [secret] \
--from-file=.dockerconfigjson=./.docker/config.json \
--type=kubernetes.io/dockerconfigjson
Případně proveďte všechny výše uvedené kroky, včetně přihlášení do Dockeru, na stejném řádku:
kubectl create secret docker-registry [secret] --docker-server:[address] --docker-username=[username] --docker-password=[password] --docker-email=[email]
5. Chcete-li vytvořit modul, který má přístup k tomuto tajemství, vytvořte yaml
soubor, který jej definuje. Soubor by měl vypadat takto:
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image:
imagePullSecrets:
- name: regcred
6. Dokončete vytváření modulu jeho aktivací pomocí kubectl apply
:
kubectl apply -f [file]
Úvahy o tajných službách Kubernetes
Tajemství Kubernetes jsou bezpečným způsobem ukládání citlivých informací. Než se však rozhodnete pro nejlepší metodu pro váš scénář použití, měli byste zvážit následující body:
- Uživatelská jména a hesla v Tajemství jsou kódována pomocí base-64. Tato technika kódování textu zakrývá data a zabraňuje náhodnému odhalení, ale není zabezpečená proti škodlivým kybernetickým útokům.
- Tajemství jsou dostupná pouze v clusteru, ve kterém se nacházejí.
- Tajemství obvykle závisí na hlavním klíči, který se používá k jejich odemknutí. I když existují metody zabezpečení hlavního klíče, jejich použití vytváří pouze další scénář hlavního klíče.
Chcete-li tyto problémy zmírnit, použijte některá z níže uvedených řešení:
- Integrujte nástroj pro správu tajemství, který používá účet Kubernetes Service k ověřování uživatelů, kteří potřebují přístup k tajnému trezoru.
- Integrujte nástroj IAM (Identity and Access Management), který systému umožní používat tokeny ze služby Secure Token Service.
- Integrujte do modulů správce tajemství třetí strany.