5
votes

roles.rbac.authorization.k8s.io est interdit même ajouté dans apiGroups

J'exécute kubernetes v1.11.5 et j'installe helm avec un déploiement de tiller pour chaque espace de noms. Concentrons-nous sur un seul espace de noms. Voici la configuration du compte de service de barre franche:

$kubectl describe role tiller-manager
Name:         tiller-manager
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"rbac.authorization.k8s.io/v1","kind":"Role","metadata":{"annotations":{},"name":"tiller-manager","namespace":"marketplace-i...
PolicyRule:
  Resources                          Non-Resource URLs  Resource Names  Verbs
  ---------                          -----------------  --------------  -----
  *                                  []                 []              [*]
  *.apps                             []                 []              [*]
  *.authorization.k8s.io             []                 []              [*]
  *.extensions                       []                 []              [*]
  *.rbac.authorization.k8s.io        []                 []              [*]
  *.roles.rbac.authorization.k8s.io  []                 []              [*]

Lorsque j'essaie de déployer un graphique, j'obtiens cette erreur:

# Source: marketplace/templates/role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  labels:
    app: citest
    chart: marketplace-0.1.0
    heritage: Tiller
    release: citest
    namespace: marketplace-int
  name: marketplace-int-role-ns-admin
rules:
  - apiGroups: ["*"]
    resources: ["*"]
    verbs: ["*"]

L'erreur survient lorsque essayer de créer la configuration rbac pour cet espace de noms (avec tiller sa):

Error: release citest failed: roles.rbac.authorization.k8s.io "marketplace-int-role-ns-admin" is forbidden: 
attempt to grant extra privileges: 
[{[*] [*] [*] [] []}] user=&{system:serviceaccount:marketplace-int:tiller 5c6af739-1023-11e9-a245-0ab514dfdff4 
[system:serviceaccounts system:serviceaccounts:marketplace-int system:authenticated] map[]} 
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/]} 
{[*] [ extensions apps rbac.authorization.k8s.io roles.rbac.authorization.k8s.io authorization.k8s.io] [*] [] []}] ruleResolutionErrors=[]

Le message d'erreur indique clairement que le compte de service de tiller n'a pas l'autorisation pour les rôles . rbac.authorization.k8s.io mais cette autorisation est accordée comme indiqué précédemment.

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: marketplace-int
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: tiller-manager
  namespace: marketplace-int
rules:
- apiGroups:
  - ""
  - extensions
  - apps
  - rbac.authorization.k8s.io
  - roles.rbac.authorization.k8s.io
  - authorization.k8s.io
  resources: ["*"]
  verbs: ["*"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: tiller-binding
  namespace: marketplace-int
subjects:
- kind: ServiceAccount
  name: tiller
  namespace: marketplace-int
roleRef:
  kind: Role
  name: tiller-manager
  apiGroup: rbac.authorization.k8s.io

Honnêtement, je ne comprends pas entièrement le message d'erreur pour vérifier si le Les ownerrules sont très bien et j'essaie de savoir ce que cela signifie ce type de messages qui semble être lié à la description du rôle: {[*] [*] [*] [ ] []}

Avez-vous une idée des autorisations qui me manquent?


0 commentaires

3 Réponses :


1
votes

Vous devez d'abord donner l'autorisation d'administrateur de cluster à tiller SA.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: marketplace-int

Une fois que vous avez attribué le rôle d'administrateur de cluster à tiller SA, vous devriez pouvoir créer le rôle. p >


1 commentaires

Mais je ne souhaite pas accorder d’autorisations au niveau du cluster. C’est la raison pour laquelle je crée un motoculteur par espace de noms. Oublions la barre. Avec un SA disposant des autorisations répertoriées dans ma question, je ne peux pas créer ce rôle pour un espace de noms autorisé. Est-ce exact?



0
votes

Vous devriez pouvoir créer des rôles dans ce même espace de noms. J'ai essayé cela moi-même, c'est-à-dire créer un rôle en utilisant le même rôle que celui que vous avez décrit dans votre question et j'ai pu le faire avec succès (j'ai changé mon espace de noms pour tester), donc je ne pense pas que cela soit lié à votre définition de rôle, mais comment tiller utilise ce compte de service spécifique pour créer de nouvelles choses.

$ mv ~/.kube ~/.kube.tmp
$ echo 'apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  labels:
    app: citest
    chart: marketplace-0.1.0
    heritage: Tiller
    release: citest
  namespace: test
  name: marketplace-int-role-ns-admin
rules:
  - apiGroups: ["*"]
    resources: ["*"]
    verbs: ["*"]' | kubectl -n test --token <your-token> --server <your-kubeapiserver> apply -f - 
role.rbac.authorization.k8s.io/marketplace-int-role-ns-admin created

Ensuite:

$ kubectl -n test describe secret tiller-token-xxxxx
Name:         tiller-token-xxxx
Namespace:    test
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: tiller

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  4 bytes
token:      <my-token>

Puis:

# With an cluster-admin cluster role
$ echo '---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: test
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: tiller-manager
  namespace: test
rules:
- apiGroups:
  - ""
  - extensions
  - apps
  - rbac.authorization.k8s.io
  - roles.rbac.authorization.k8s.io
  - authorization.k8s.io
  resources: ["*"]
  verbs: ["*"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: tiller-binding
  namespace: test
subjects:
- kind: ServiceAccount
  name: tiller
  namespace: test
roleRef:
  kind: Role
  name: tiller-manager
  apiGroup: rbac.authorization.k8s.io' | kubectl apply -f -


0 commentaires

5
votes

Cela est dû à la prévention de l'augmentation des autorisations dans RBAC. Voir https://kubernetes.io / docs / reference / access-authn-authz / rbac / # privilege-escalation-prevention-and-bootstrapping pour plus de détails.

L'autorisation de créer un objet de rôle est nécessaire, mais pas suffisante.

Un utilisateur ne peut créer / mettre à jour un rôle que si au moins l'une des choses suivantes est vraie:

  1. ils ont déjà toutes les autorisations contenues dans le rôle, dans la même étendue que l'objet en cours de modification (à l'échelle du cluster pour un ClusterRole, dans le même espace de noms ou à l'échelle du cluster pour un rôle). Dans votre cas, cela signifierait que l'utilisateur qui tente de créer le rôle doit déjà disposer des autorisations apiGroups = *, resources = *, verbs = * dans l'espace de noms où il tente de créer le rôle. Vous pouvez accorder cela en accordant le rôle de cluster d'administrateur de cluster au compte de service dans cet espace de noms avec une liaison de rôle.

  2. ils reçoivent l'autorisation explicite d'exécuter le verbe "escalate" sur la ressource roles ou clusterroles dans le groupe d'API rbac.authorization.k8s.io (Kubernetes 1.12 et plus récent)


2 commentaires

avec kubectl create clusterrolebinding tiller-clusteradmin-mkp-int --clusterrole = cluster-admin --serviceaccount = marketplace-int: tiller fonctionne très bien. Si j'ai trois déploiements de barre, tous auront l'autorisation de créer quoi que ce soit au niveau du cluster? S'il y a une erreur de configuration de CI, cela pourrait entraîner l'utilisation de tiller à l'intérieur de l'espace de noms 1 pour se déployer dans l'espace de noms2?


Vous pouvez facilement le tester vous-même.