08: Secrets — TLS, certyfikaty i wiele źródeł
Secrets — TLS, certyfikaty i wiele źródeł
15 min
Cel zadania
Celem zadania jest nauka pracy z certyfikatami TLS w Kubernetes Secrets oraz łączenie wielu źródeł Secrets w jednym Pod (zmienne środowiskowe + wolumeny).
Teoria
TLS (Transport Layer Security)
- TLS to protokół szyfrowania komunikacji sieciowej (następca SSL)
- Certyfikat (
tls.crt) — publiczny dokument potwierdzający tożsamość serwera - Klucz prywatny (
tls.key) — tajny klucz do szyfrowania/deszyfrowania - SAN (Subject Alternative Names) — lista domen, dla których certyfikat jest ważny (np.
example.com,www.example.com) - Self-signed — certyfikat podpisany przez siebie (nie przez zaufany CA) — używany w testach
Uproszczony flow TLS
graph LR
CLIENT["Klient<br/>(przeglądarka)"] -->|"1. Chcę się połączyć"| SERVER["Serwer"]
SERVER -->|"2. Oto mój certyfikat"| CLIENT
CLIENT -->|"3. Weryfikuję cert ✓<br/>Ustalam klucz sesji"| SERVER
SERVER <-->|"4. Szyfrowana komunikacja 🔒"| CLIENT
style CLIENT fill:#e3f2fd
style SERVER fill:#e8f5e9
W Kubernetes: Secret typu
kubernetes.io/tlsprzechowuje parę cert + key. Montujemy go jako wolumen, a aplikacja (np. nginx) używa tych plików do obsługi HTTPS.
Zadanie 1: Certyfikaty TLS w Secrets
1.1. Generowanie self-signed certyfikatu
# Tworzenie klucza prywatnego
openssl genrsa -out server.key 2048
# Tworzenie Certificate Signing Request (CSR)
openssl req -new -key server.key -out server.csr -subj "/CN=example.com/O=Test"
# Generowanie self-signed certyfikatu
openssl x509 -req -days 365 \
-in server.csr \
-signkey server.key \
-out server.crt \
-extensions v3_req \
-extfile <(echo "[v3_req]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = example.com
DNS.2 = www.example.com")
1.2. Tworzenie TLS Secret
# Tworzenie Secret z certyfikatem TLS
kubectl create secret tls example-tls-XX \
--cert=server.crt \
--key=server.key
1.3. Pod z zamontowanym certyfikatem TLS
Utwórz plik kuard-tls-XX.yaml:
apiVersion: v1
kind: Pod
metadata:
name: kuard-tls-XX
spec:
containers:
- name: kuard
image: gcr.io/kuar-demo/kuard-amd64:1
ports:
- containerPort: 8080
name: http
volumeMounts:
- name: tls-certs
mountPath: "/etc/tls"
readOnly: true
volumes:
- name: tls-certs
secret:
secretName: example-tls-XX
kubectl apply -f kuard-tls-XX.yaml
# Uruchom port-forward
kubectl port-forward pod/kuard-tls-XX 8080:8080
# Otwórz http://localhost:8080 i przejdź do zakładki "File System Browser"
# Nawiguj do /etc/tls aby zobaczyć zamontowane certyfikaty
Zadanie 2: Montowanie wielu Secrets
2.1. Pod z wieloma źródłami Secrets
Upewnij się, że masz utworzone Secrets z poprzednich ćwiczeń:
example-tls-XX(TLS Secret z zadania powyżej)app-secrets-XX(Opaque Secret z Lab 06)db-secrets-XX(Secret z Lab 06)
Utwórz plik kuard-multi-secrets-XX.yaml:
apiVersion: v1
kind: Pod
metadata:
name: kuard-multi-secrets-XX
spec:
containers:
- name: kuard
image: gcr.io/kuar-demo/kuard-amd64:1
ports:
- containerPort: 8080
name: http
volumeMounts:
- name: tls-certs
mountPath: "/etc/tls"
readOnly: true
- name: app-secrets
mountPath: "/etc/app-secrets"
readOnly: true
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secrets-XX
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secrets-XX
key: password
volumes:
- name: tls-certs
secret:
secretName: example-tls-XX
- name: app-secrets
secret:
secretName: app-secrets-XX
kubectl apply -f kuard-multi-secrets-XX.yaml
# Uruchom port-forward
kubectl port-forward pod/kuard-multi-secrets-XX 8080:8080
# Otwórz http://localhost:8080 i eksploruj:
# - Zakładka "ENV" dla zmiennych środowiskowych z secrets
# - Zakładka "File System Browser" dla zamontowanych plików
Zadanie 3: Weryfikacja
3.1. Sprawdzanie Secrets przez UI kuard
# Uruchom port-forward dla dowolnego pod z kuard
kubectl port-forward pod/kuard-multi-secrets-XX 8080:8080
# Otwórz http://localhost:8080 w przeglądarce i sprawdź:
# - Zakładka "ENV" - zmienne środowiskowe
# - Zakładka "File System Browser" - zamontowane pliki
# - Zakładka "Memory" - użycie pamięci
3.2. Weryfikacja przez kubectl
# Lista wszystkich Secrets
kubectl get secrets
# Dekodowanie Secret
kubectl get secret app-secrets-XX -o jsonpath='{.data.username}' | base64 --decode
# Sprawdzanie zamontowanych plików w Pod
kubectl exec kuard-multi-secrets-XX -- ls -lR /etc/app-secrets /etc/tls
# Sprawdzanie zmiennych środowiskowych
kubectl exec kuard-multi-secrets-XX -- env | grep DB_
Najczęstsze problemy
| Problem | Rozwiązanie |
|---|---|
| Secret nie jest widoczny w UI kuard | Sprawdź ścieżkę montowania i uprawnienia |
| Błąd certyfikatu TLS | Zweryfikuj format i zawartość certyfikatu |
| Problem z base64 | Użyj -w 0 dla prawidłowego kodowania |
| Pod nie startuje | Użyj kubectl describe pod/[nazwa] |
| Problemy z uprawnieniami plików | Sprawdź mode w sekcji items |
Dobre praktyki
- Bezpieczeństwo
- Nigdy nie przechowuj Secrets w repozytorium
- Używaj RBAC do ograniczenia dostępu
- Regularnie rotuj certyfikaty i hasła
- Używaj szyfrowania etcd dla dodatkowej ochrony
- Certyfikaty TLS
- Zawsze używaj SAN (Subject Alternative Names)
- Monitoruj daty wygaśnięcia certyfikatów
- Przechowuj kopie zapasowe kluczy w bezpiecznym miejscu
- Zarządzanie
- Automatyzuj proces rotacji Secrets
- Używaj zewnętrznych systemów zarządzania kluczami (KMS)
- Regularnie audytuj używane Secrets
Podsumowanie
- Kubernetes obsługuje dedykowany typ Secret dla certyfikatów TLS
- Można łączyć wiele Secrets w jednym Pod (env + volumeMounts)
- OpenSSL pozwala generować self-signed certyfikaty do testów
- UI kuard umożliwia wizualną weryfikację zmiennych i plików