Wprowadzenie
Klaster Kubernetes z domyślną konfiguracją jest pełen luk bezpieczeństwa. Większość z nich nie wynika ze złośliwości — domyślne ustawienia faworyzują wygodę nad bezpieczeństwem. W tym artykule przeprowadzimy systematyczny audyt klastra z użyciem CIS Kubernetes Benchmark i Trivy, żeby znaleźć i naprawić najpopularniejsze problemy.
Narzędzia
| Narzędzie | Zastosowanie |
|---|---|
| kube-bench | Automatyczna weryfikacja CIS Kubernetes Benchmark |
| Trivy | Skanowanie obrazów kontenerów i konfiguracji K8s |
| kubectl | Ręczna weryfikacja konfiguracji |
| kubeaudit | Audyt zasobów K8s pod kątem bezpieczeństwa |
Krok 1 — CIS Benchmark z kube-bench
kubectl apply -f https://raw.githubusercontent.com/aquasecurity/kube-bench/main/job.yaml
kubectl wait --for=condition=complete job/kube-bench --timeout=300s
kubectl logs job/kube-bench
Przykładowy output:
== Summary master ==
42 checks PASS
8 checks FAIL
11 checks WARN
Najczęstsze FAIL i jak je naprawić
1.2.1 — Anonymous auth włączony:
# /etc/kubernetes/manifests/kube-apiserver.yaml
- --anonymous-auth=false
4.2.6 — Kubelet bez uwierzytelniania:
# /var/lib/kubelet/config.yaml
authentication:
anonymous:
enabled: false
webhook:
enabled: true
authorization:
mode: Webhook
Krok 2 — Skanowanie obrazów z Trivy
# Skanuj obraz
trivy image --severity CRITICAL,HIGH nginx:latest
# Skanuj cały klaster
trivy k8s --report summary cluster
# Skanuj pliki manifestów
trivy config ./k8s-manifests/
Przykładowy output:
nginx:latest (debian 12.4)
Total: 23 (CRITICAL: 2, HIGH: 8, MEDIUM: 13)
┌─────────┬──────────────────┬──────────┬─────────┬───────────────┐
│ Library │ Vulnerability │ Severity │ Installed│ Fixed Version │
├─────────┼──────────────────┼──────────┼─────────┼───────────────┤
│ openssl │ CVE-2024-0727 │ CRITICAL │ 3.0.11 │ 3.0.12 │
└─────────┴──────────────────┴──────────┴─────────┴───────────────┘
Krok 3 — Audyt RBAC
# Kto ma uprawnienia cluster-admin?
kubectl get clusterrolebindings -o json | \
jq '.items[] | select(.roleRef.name=="cluster-admin") | .subjects'
# Sprawdź uprawnienia ServiceAccount
kubectl auth can-i --list --as=system:serviceaccount:default:myapp
Typowe błędy RBAC
# ŹLE — nadmierne uprawnienia
roleRef:
name: cluster-admin
# DOBRZE — zasada minimalnych uprawnień
rules:
- apiGroups: [""]
resources: ["pods", "configmaps"]
verbs: ["get", "list", "watch"]
Krok 4 — Network Policies
Domyślnie wszystkie pody mogą się komunikować. Wdróż politykę deny-all:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
Podsumowanie wyników — przykładowy raport
| Kategoria | Znaleziska | Krytyczne | Wysokie |
|---|---|---|---|
| CIS Benchmark | 61 | 3 | 5 |
| Podatności w obrazach | 23 | 2 | 8 |
| Błędy konfiguracji | 12 | 1 | 4 |
| RBAC | 4 | 2 | 2 |
| Razem | 100 | 8 | 19 |
Podsumowanie
Audyt klastra Kubernetes to nie jednorazowa akcja. Rekomendujemy:
- Trivy w pipeline CI/CD — skanowanie każdego obrazu przed deploymentem
- kube-bench miesięcznie — weryfikacja konfiguracji
- Network Policies — wdrożyć zaraz po postawieniu klastra