Похоже, что новая учетная запись службы Kubernetes имеет разрешения администратора кластера - PullRequest
2 голосов
/ 06 марта 2020

Я испытываю странное поведение из недавно созданных учетных записей службы Kubernetes. Похоже, что их токены предоставляют неограниченные права доступа в нашем кластере.

Если я создаю новое пространство имен, новую учетную запись службы внутри этого пространства имен, а затем использую токен учетной записи службы в новой конфигурации куба, я могу выполнить все действия в кластере.

# SERVER is the only variable you'll need to change to replicate on your own cluster
SERVER=https://k8s-api.example.com
NAMESPACE=test-namespace
SERVICE_ACCOUNT=test-sa

# Create a new namespace and service account
kubectl create namespace "${NAMESPACE}"
kubectl create serviceaccount -n "${NAMESPACE}" "${SERVICE_ACCOUNT}"

SECRET_NAME=$(kubectl get serviceaccount "${SERVICE_ACCOUNT}" --namespace=test-namespace -o jsonpath='{.secrets[*].name}')
CA=$(kubectl get secret -n "${NAMESPACE}" "${SECRET_NAME}" -o jsonpath='{.data.ca\.crt}')
TOKEN=$(kubectl get secret -n "${NAMESPACE}" "${SECRET_NAME}" -o jsonpath='{.data.token}' | base64 --decode)

# Create the config file using the certificate authority and token from the newly created
# service account
echo "
apiVersion: v1
kind: Config
clusters:
- name: test-cluster
  cluster:
    certificate-authority-data: ${CA}
    server: ${SERVER}
contexts:
- name: test-context
  context:
    cluster: test-cluster
    namespace: ${NAMESPACE}
    user: ${SERVICE_ACCOUNT}
current-context: test-context
users:
- name: ${SERVICE_ACCOUNT}
  user:
    token: ${TOKEN}
" > config

Запуск этого ^ в качестве сценария оболочки приводит к config в текущем каталоге. Проблема в том, что, используя этот файл, я могу читать и редактировать все ресурсы в кластере. Мне бы хотелось, чтобы у вновь созданной учетной записи службы не было разрешений, если я не предоставлю их явно через RBA C.

# All pods are shown, including kube-system pods
KUBECONFIG=./config kubectl get pods --all-namespaces

# And I can edit any of them
KUBECONFIG=./config kubectl edit pods -n kube-system some-pod

Я не добавил привязок ролей к вновь созданной учетной записи службы, поэтому я ожидал, что он получит ответы об отказе в доступе для всех kubectl запросов с использованием только что созданного конфига.

Ниже приведен пример JWT учетной записи службы test-sa, встроенной в config:

{
  "iss": "kubernetes/serviceaccount",
  "kubernetes.io/serviceaccount/namespace": "test-namespace",
  "kubernetes.io/serviceaccount/secret.name": "test-sa-token-fpfb4",
  "kubernetes.io/serviceaccount/service-account.name": "test-sa",
  "kubernetes.io/serviceaccount/service-account.uid": "7d2ecd36-b709-4299-9ec9-b3a0d754c770",
  "sub": "system:serviceaccount:test-namespace:test-sa"

}

Что нужно учитывать ...

  • RBA C, кажется, включен в кластере, как я вижу rbac.authorization.k8s.io/v1 и rbac.authorization.k8s.io/v1beta1 на выходе kubectl api-versions | grep rbac, как предложено в этот пост . Примечательно, что kubectl cluster-info dump | grep authorization-mode, как предлагается в другом ответе на тот же вопрос, не показывает вывод. Можно ли предположить, что RBA C на самом деле не включен?
  • Мой пользователь имеет cluster-admin привилегии роли, но я не ожидаю, что они будут перенесены на учетные записи служб, созданные с его помощью.
  • Мы запускаем наш кластер на GKE.
  • Насколько я знаю, у нас нет неортодоксальных ролей или привязок RBA C в кластере, которые могли бы вызвать это. Я мог что-то упустить или вообще не знал о конфигурациях K8s RBA C, которые могли бы вызвать это.

Правильно ли я полагаю, что вновь созданные учетные записи служб должны иметь крайне ограниченный доступ к кластеру, и описанный выше сценарий не должен быть возможен без привязки разрешающей роли к новой учетной записи службы? Любые мысли о том, что здесь происходит, или способы, которыми я могу ограничить доступ test-sa?

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Я не смог воспроизвести вашу проблему на трех разных версиях K8S в моей тестовой лаборатории (включая v1.15.3, v1.14.10-gke.17, v1.11.7-gke.12 - с основами c auth enabled).

К сожалению, действия по входу в систему на основе маркеров не записываются в консоли AuditLogs Cloud Logs для кластеров GKE :(.

Насколько мне известно, только операции доступа к данным, которые go через Google Cloud регистрируются (на основе AIM = kubectl с использованием google auth провайдера).

Если вашей учетной записи службы "test-sa" каким-либо образом разрешено выполнять определенные операции c по RBA C, Я бы все же попытался изучить Журналы аудита вашего кластера GKE. Может быть, каким-то образом ваша учетная запись службы привязана к учетной записи службы Google одна и, таким образом, авторизована.

Вы всегда можете связаться с официальным каналом поддержки GCP, чтобы продолжить поиск неисправностей в вашем необычном случае.

1 голос
/ 07 марта 2020

Вы можете проверить разрешение учетной записи службы, выполнив команду

kubectl auth can-i --list --as=system:serviceaccount:test-namespace:test-sa

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

Resources                                       Non-Resource URLs   Resource Names   Verbs
selfsubjectaccessreviews.authorization.k8s.io   []                  []               [create]
selfsubjectrulesreviews.authorization.k8s.io    []                  []               [create]
                                                [/api/*]            []               [get]
                                                [/api]              []               [get]
                                                [/apis/*]           []               [get]
                                                [/apis]             []               [get]
                                                [/healthz]          []               [get]
                                                [/healthz]          []               [get]
                                                [/livez]            []               [get]
                                                [/livez]            []               [get]
                                                [/openapi/*]        []               [get]
                                                [/openapi]          []               [get]
                                                [/readyz]           []               [get]
                                                [/readyz]           []               [get]
                                                [/version/]         []               [get]
                                                [/version/]         []               [get]
                                                [/version]          []               [get]
                                                [/version]          []               [get]
...