Service account default:default в k8s

Автор: S0ER

Кратко рассмотрим что из себя представляет сервисный аккаунт default:default в Kubernates, чем опасно его использование

default:default в Kubernetes — это ServiceAccount (учётная запись пода) в namespace default, который создаётся автоматически в каждом кластере.

🔍 Что это значит?

default (первое) — это namespace (пространство имён), где работают ресурсы, если не указано другое. default (второе) — это имя ServiceAccount, который автоматически присваивается подам, если не задан явно.

⚠️ Почему это опасно?

По умолчанию, default ServiceAccount имеет минимальные права (но их можно случайно расширить). Однако:

Если RBAC не настроен — этот аккаунт может получить слишком много прав (например, cluster-admin).

Любой под в default namespace может использовать этот токен для доступа к API Kubernetes.

Если злоумышленник получит доступ к поду — он может украсть этот токен и атаковать кластер.

🛡️ Как исправить? Не использовать default namespace для рабочих нагрузок:

kubectl create namespace my-safe-app
kubectl config set-context --current --namespace=my-safe-app

Создавать отдельные ServiceAccount для каждого приложения:

kubectl create serviceaccount my-app-sa

И указывать его в манифесте пода:

spec:
  serviceAccountName: my-app-sa  # вместо default

Ограничивать права через RBAC:

kubectl create rolebinding my-app-sa-view \
  --clusterrole=view \
  --serviceaccount=my-safe-app:my-app-sa \
  --namespace=my-safe-app

🔥 Пример атаки Если под с default:default имеет слишком много прав, злоумышленник может:

# Получить токен:
cat /var/run/secrets/kubernetes.io/serviceaccount/token

# И использовать его для управления кластером:
curl -k -H "Authorization: Bearer <TOKEN>" https://kubernetes-api/

Вывод: default:default — это мина замедленного действия. Всегда настраивайте RBAC и изолируйте приложения!