Knowledge Base
Kubernetes API открыт публично (порт 6443 / 8080)
Kubernetes API Server открыт публично
Категория: Server Hardening · Риск: critical
Kubernetes API Server открыт публично
Критическая угроза
Kubernetes API Server (порт 6443 — HTTPS, порт 8080 — небезопасный HTTP) — центральный компонент кластера. Несанкционированный доступ к нему означает:
- Полный контроль над всеми подами, сервисами, конфигами
- Чтение всех Secrets (пароли, токены, ключи)
- Создание привилегированных подов для escape на хост
- Удаление production workloads
# Проверка публичного доступа к K8s API
curl -sk https://<IP>:6443/api | jq .
# Если вернул данные без 401 — анонимный доступ включён
# Получить список секретов (при анонимном доступе)
kubectl --server=https://<IP>:6443 --insecure-skip-tls-verify get secrets --all-namespaces
Немедленное исправление
Закрыть порты файрволом
# Разрешить только worker nodes и admin IP
ufw allow from <WORKER_NODE_IP> to any port 6443
ufw allow from <ADMIN_IP> to any port 6443
ufw deny 6443
# Порт 8080 (небезопасный) — всегда закрыть
ufw deny 8080
Отключить анонимный доступ
# kube-apiserver (kubeadm)
# /etc/kubernetes/manifests/kube-apiserver.yaml
spec:
containers:
- command:
- kube-apiserver
- --anonymous-auth=false # ← добавить
- --insecure-port=0 # ← отключить HTTP порт
- --authorization-mode=Node,RBAC # ← строгая авторизация
Managed Kubernetes (AKS, EKS, GKE)
# AKS — разрешить доступ только с конкретных IP
az aks update -n myCluster -g myRG \
--api-server-authorized-ip-ranges "203.0.113.0/24"
# EKS — настройка через Security Groups
# GKE — Master authorized networks
Аудит RBAC
# Проверить кто имеет admin-права
kubectl get clusterrolebindings -o json | \
jq '.items[] | select(.roleRef.name=="cluster-admin") | .subjects'
# Проверить service account permissions
kubectl auth can-i --list --as=system:serviceaccount:default:default
Связанные проверки
- [Docker daemon открыт](/kb/server_hardening/exposed-docker-daemon-2375)
- [Production secrets](/kb/server_hardening/production-secrets-baseline)