Невозможно предоставить разрешения учетной записи службы для применения существующей роли «Ошибка с сервера (Запрещено) ... попытка предоставления дополнительных привилегий»

Я пытаюсь дать разрешение учетной записи службы для запуска kubectl apply -f somerole.yamlна существующую роли .

Я создал учетную запись службы со следующими разрешениями:

cat > ~/tmp/Role.yaml <<EOF 
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata: 
  namespace: default
  name: my-role6
rules: 
- apiGroups: ["*"]
  resources: ["roles"]
  verbs: ["replace", "patch", "get", "list", "create"] 
EOF

kubectl create -f ~/tmp/Role.yaml  

Все фоновые разрешения (RoleBinding, context) кажутся хорошими, потому что, если я добавлю podsв поле ресурсов, я могу использовать:
kubectl get pods --context=myservice6-context

Когда я запускаю:

kubectl apply -f malrole.yaml --context=$CONTEXT_NAME

Я получил:

Error from server (Forbidden): error when creating "malrole.yaml": roles.rbac.authorization.k8s.io "testrole" is forbidden: attempt to grant extra privileges: [PolicyRule{Resources:["pods"], APIGroups:["*"], Verbs:["get"]}] user=&{system:serviceaccount:default:myservice6 5cdb719b-828b-11e8-993e-02420d415928 [system:serviceaccounts system:serviceaccounts:default system:authenticated] map[]} ownerrules=[PolicyRule{Resources:["selfsubjectaccessreviews"], APIGroups:["authorization.k8s.io"], Verbs:["create"]} PolicyRule{NonResourceURLs:["/api" "/api/*" "/apis" "/apis/*" "/healthz" "/swagger-2.0.0.pb-v1" "/swagger.json" "/swaggerapi" "/swaggerapi/*""/version"], Verbs:["get"]} PolicyRule{Resources:["roles"], APIGroups:["*"], Verbs:["replace" "patch" "get" "list" "create"]}] ruleResolutionErrors=[]

Более читаемая версия:

Error from server (Forbidden): 
    error when creating "malrole.yaml": 
    roles.rbac.authorization.k8s.io "testrole" is forbidden: 
        attempt to grant extra privileges: 
        [ 
            PolicyRule{
                Resources:["pods"], APIGroups:["*"], Verbs:["get"]
            }
        ] 
        user=&{
            system:serviceaccount:default:myservice6 5cdb719b-828b-11e8-993e-02420d415928 
            [system:serviceaccounts system:serviceaccounts:default system:authenticated] map[]
            } 

        ownerrules=[
            PolicyRule{
                Resources:["selfsubjectaccessreviews"], APIGroups:["authorization.k8s.io"], 
                Verbs:["create"]
            } 

            PolicyRule{
                NonResourceURLs:["/api" "/api/*" "/apis" "/apis/*" "/healthz" "/swagger-2.0.0.pb-v1" "/swagger.json" "/swaggerapi" "/swaggerapi/*""/version"], 
                Verbs:["get"]
            }

            PolicyRule{
                Resources:["roles"], APIGroups:["*"], Verbs:["replace" "patch" "get" "list" "create"]
            }
        ] 


        ruleResolutionErrors=[]

malrole.yaml (файл, который я пытался применить):

kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  namespace: default
  name: testrole
rules:
- apiGroups: ["*"]
  resources: ["pods"]
  verbs: ["get"]

Он пишет:

Для получения дополнительных привилегий ...

Что взято из этой строки в коде:
https://github.com/kubernetes/kubernetes/blob/4d9873556201f2766ccf6161f7beac5f76b8fd60/pkg/registry/rbac/validation/rule.go#L52

Не знаю, почему.

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

ConfirmNoEscalation определяет , если роли для данного пользователя в заданном пространстве имен включают в представленной роль .

Но я попробовал также предоставить себе больше прав (см. Редактирование), и я все еще получил эту ошибку.

EDIT:
даже когда я меняю разрешения на

kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata: 
  namespace: default
  name: my-role6
rules: 
- apiGroups: ["*"]
  resources: ["roles"]
  verbs: ["*"] 

Я получил:

Error from server (Forbidden): error when applying patch:
{"metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{"apiVersion":"rbac.authorization.k8s.io/v1beta1","kind":"Role","metadata":{"annotations":{},"name":"testrole","namespace":"default"},"rules":[{"apiGroups":["*"],"resources":["pods"],"verbs":["list","get"]}]}
"}},"rules":[{"apiGroups":["*"],"resources":["pods"],"verbs":["list","get"]}]}
to:
&{0xc420b26840 0xc4202b18f0 default testrole malrole.yaml 0xc4211a8988 0xc42000c008 1638 false}
for: "malrole.yaml": roles.rbac.authorization.k8s.io "testrole" is forbidden: attempt to grant extra privileges: [PolicyRule{Resources:["pods"], APIGroups:["*"], Verbs:["list"]} PolicyRule{Resources:["pods"], APIGroups:["*"], Verbs:["get"]}] user=&{system:serviceaccount:default:myservice6 5cdb719b-828b-11e8-993e-02420d415928 [system:serviceaccounts system:serviceaccounts:default system:authenticated] map[]} ownerrules=[PolicyRule{Resources:["selfsubjectaccessreviews"], APIGroups:["authorization.k8s.io"], Verbs:["create"]} PolicyRule{NonResourceURLs:["/api" "/api/*" "/apis" "/apis/*" "/healthz" "/swagger-2.0.0.pb-v1" "/swagger.json" "/swaggerapi" "/swaggerapi/*" "/version"], Verbs:["get"]} PolicyRule{Resources:["roles"], APIGroups:["*"], Verbs:["*"]}] ruleResolutionErrors=[]

kubernetes,rbac,role,

0

Ответов: 1


0 принят

@liggitt сказал мне, что

Предотвращение эскалации отклоняет попытки создания ролей, содержащих разрешения, которыми вы еще не обладаете

Следуйте за:
https://kubernetes.io/docs/reference/access-authn-authz/rbac/#privilege-escalation-prevention-and-bootstrapping.

Я обнаружил, что для того, чтобы иметь возможность применять роли, мне нужно иметь следующие разрешения:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata: 
  namespace: default
  name: $ROLE_NAME
rules: 
- apiGroups: ["*"]
  resources: ["roles", "pods"]
  verbs: ["patch", "get", "list"] 

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

Как упоминалось в приведенной выше ссылке:

Чтобы пользователь мог создавать / обновлять роли:

  1. Предоставьте им роль, которая позволяет им создавать / обновлять объекты Role или ClusterRole по желанию.
  2. Даруйте им роль , содержащую те разрешения , которые вы бы хотели , чтобы они были в состоянии установить в роли или ClusterRole. Если они пытаются создать или изменить Роль или ClusterRole с разрешениями, которые они сами не получили, запрос API будет запрещен.
kubernetes, RBAC, роль,
Похожие вопросы