Запрещена попытка K8s предоставить дополнительные привилегии - PullRequest
0 голосов
/ 29 января 2019

Невозможно создать ClusterRole с помощью API REST K8s.Я получаю сообщение «Запрещено: попытка предоставить дополнительные привилегии».Даже если вы можете создать то же самое ClusterRole, используя «kubectl apply».Используя того же пользователя.Работает в GCP.Версия: '1.11.6-gke.3'.

Вот мои шаги:

1.IAM Config

Пользователь IAM: berlioz-robot@xxx.iam.gserviceaccount.com Роль: Администратор Kubernetes Engine

2.Заставьте пользователя admin

применить, используя kubectl:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: berlioz:robot-cluster-admin-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: berlioz-robot@xxx.iam.gserviceaccount.com

3.Генерировать логин

Заголовок:

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "xxxxxxxxxxxxxxxxxxxxxxxxxx"
}

Полезная нагрузка:

{
  "iss": "berlioz-robot@xxx.iam.gserviceaccount.com",
  "sub": "berlioz-robot@xxx.iam.gserviceaccount.com",
  "aud": "https://www.googleapis.com/oauth2/v4/token",
  "scope": "https://www.googleapis.com/auth/cloud-platform",
  "iat": 1548743213,
  "exp": 1548746813
}

4.Логин

URL: https://www.googleapis.com/oauth2/v4/token
Method: POST
Body: {
    'grant_type': 'urn:ietf:params:oauth:grant-type:jwt-bearer',
    'assertion': here-goes-the-signed-token
}

Результат:

{
    "access_token": "ya29.xxxxxxxxxxxxxxxx",
    "expires_in": 3600,
    "token_type": "Bearer"
}

5.Создайте новое ClusterRole с REST API

URL: https://CLUSTER-IP-ADDRESS/apis/rbac.authorization.k8s.io/v1/clusterroles
Method: POST
Headers: {
    Authorization: "Bearer ya29.xxxxxxxxxxxxxxxx",
    Content-Type: "application/json"
}
Body: {
    "metadata": {
      "name": "berlioz:controller-cluster-role"
    },
    "rules": [
      {
        "verbs": [
          "get",
          "list",
          "watch"
        ],
        "apiGroups": [
          ""
        ],
        "resources": [
          "nodes"
        ]
      }
    ],
    "kind": "ClusterRole",
    "apiVersion": "rbac.authorization.k8s.io/v1"
}

РЕЗУЛЬТАТ:

{
    "kind": "Status",
    "apiVersion": "v1",
    "metadata": {},
    "status": "Failure",
    "message": "clusterroles.rbac.authorization.k8s.io \"berlioz:controller-cluster-role-test\" is forbidden: attempt to grant extra privileges: [{[get] [] [nodes] [] []} {[list] [] [nodes] [] []} {[watch] [] [nodes] [] []}] user=&{110887992956644566571  [system:authenticated] map[user-assertion.cloud.google.com:[xxxxx]]} ownerrules=[{[create] [authorization.k8s.io] [selfsubjectaccessreviews selfsubjectrulesreviews] [] []} {[get] [] [] [] [/api /api/* /apis /apis/* /healthz /openapi /openapi/* /swagger-2.0.0.pb-v1 /swagger.json /swaggerapi /swaggerapi/* /version /version/]}] ruleResolutionErrors=[]",
    "reason": "Forbidden",
    "details": {
        "name": "berlioz:controller-cluster-role-test",
        "group": "rbac.authorization.k8s.io",
        "kind": "clusterroles"
    },
    "code": 403
}

Интересно, что если я установлю список правил пустым, все пройдет.Как упоминалось выше, одна и та же роль кластера успешно создается с использованием kubectl.

1 Ответ

0 голосов
/ 05 июля 2019

Согласно документации RBAC Google cloud :

В GKE интегрированы Cloud IAM и RBAC Kubernetes для авторизации пользователей на выполнение действий, если они имеют достаточные разрешения в соответствии с любым из этих инструментов.,Это важная часть начальной загрузки кластера GKE, поскольку по умолчанию пользователи GCP не имеют привязок ролей RBAC Kubernetes .

После аутентификации пользователей или учетных записей служб GCP они также должны быть авторизованы.выполнять какие-либо действия в кластере GKE.

В кластерах GKE, использующих GKE v1.11.x и более ранних версий, существует ограничение, заключающееся в том, что Cloud IAM не может предоставить возможность создания роли Kubernetes RBAC или ClusterRole..Однако роль IAM Kubernetes Engine Admin Cloud Cloud предоставляет пользователям возможность создания Kubernetes RBAC RoleBinding или ClusterRoleBinding для любого пользователя, включая их самих, который можно использовать для привязки пользователей GCP. предопределенные роли RBAC .

В частности, предопределенная роль RBAC cluster-admin предоставляет пользователям полные разрешения в кластере.Поэтому для начальной загрузки пользователя, чтобы он мог создавать роли RBAC и ClusterRoles, введите следующую команду, заменив [USER_ACCOUNT] адресом электронной почты для входа в систему GCP целевого пользователя.

kubectl create clusterrolebinding cluster-admin-binding \
  --clusterrole cluster-admin \
  --user [USER_ACCOUNT]

Примечание : [USER_ACCOUNT] чувствителен к регистру.Чтобы избежать ошибок, введите адрес электронной почты целевого пользователя в нижнем регистре.

В качестве альтернативы вы можете использовать следующий yaml:

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: cluster-admin-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: username@google-account-domain.com

После создания такой привязки ClusterRoleBinding вы сможете создатьClusterRole.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...