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/tls przechowuje 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

  1. 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
  2. Certyfikaty TLS
    • Zawsze używaj SAN (Subject Alternative Names)
    • Monitoruj daty wygaśnięcia certyfikatów
    • Przechowuj kopie zapasowe kluczy w bezpiecznym miejscu
  3. 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

results matching ""

    No results matching ""