← Blog / Pentesting

Audyt klastra Kubernetes z CIS Benchmark i Trivy

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ędzieZastosowanie
kube-benchAutomatyczna weryfikacja CIS Kubernetes Benchmark
TrivySkanowanie obrazów kontenerów i konfiguracji K8s
kubectlRęczna weryfikacja konfiguracji
kubeauditAudyt 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

KategoriaZnaleziskaKrytyczneWysokie
CIS Benchmark6135
Podatności w obrazach2328
Błędy konfiguracji1214
RBAC422
Razem100819

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