Skip to content

Users Can't Delegate CSR Approval/Signing Permissions Within A Domain #122154

Open
kubernetes/website
#49275
@stevekuznetsov

Description

@stevekuznetsov

What happened?

If a user has permission to approve or sign CSRs for a whole domain, they cannot delegate some part of that domain to another role.

What did you expect to happen?

The escalation check on RBAC creation should not erroneously tell you that you can't escalate, when you are not escalating.

How can we reproduce it (as minimally and precisely as possible)?

$ cat /tmp/setup.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: uber-csr-approver
rules:
- apiGroups:
  - rbac.authorization.k8s.io
  resources:
  - clusterroles
  verbs:
  - create
- apiGroups:
  - certificates.k8s.io
  resourceNames:
  - example.com/*
  resources:
  - signers
  verbs:
  - approve
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: delegator-uber-csr-approver
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: uber-csr-approver
subjects:
- kind: ServiceAccount
  name: delegator
  namespace: csr-test
---
apiVersion: v1
kind: Namespace
metadata:
  name: csr-test
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: delegator
  namespace: csr-test

$ kubectl apply -f /tmp/setup.yaml
clusterrole.rbac.authorization.k8s.io/uber-csr-approver created
clusterrolebinding.rbac.authorization.k8s.io/delegator-uber-csr-approver created
namespace/csr-test created
serviceaccount/delegator created

$ cat /tmp/delegate.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: specific-csr-approver
rules:
- apiGroups:
  - certificates.k8s.io
  resourceNames:
  - example.com/specific
  resources:
  - signers
  verbs:
  - approve

$ kubectl --as system:serviceaccount:csr-test:delegator apply -f /tmp/delegate.yaml
Error from server (Forbidden): error when creating "/tmp/csr.yaml": clusterroles.rbac.authorization.k8s.io "specific-csr-approver" is forbidden: user "system:serviceaccount:csr-test:delegator" (groups=["system:serviceaccounts" "system:serviceaccounts:csr-test" "system:authenticated"]) is attempting to grant RBAC permissions not currently held:
{APIGroups:["certificates.k8s.io"], Resources:["signers"], ResourceNames:["example.com/specific"], Verbs:["approve"]}

Anything else we need to know?

No response

Kubernetes version

$ kubectl version
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short.  Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"26", GitVersion:"v1.26.1", GitCommit:"17b7accf8", GitTreeState:"clean", BuildDate:"2023-08-11T12:23:21Z", GoVersion:"go1.19.10", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v4.5.7
Server Version: version.Info{Major:"1", Minor:"26", GitVersion:"v1.26.9+aa37255", GitCommit:"e782f8ba0e57d260867ea108b671c94844780ef2", GitTreeState:"clean", BuildDate:"2023-11-21T19:15:07Z", GoVersion:"go1.19.13 X:strictfipsruntime", Compiler:"gc", Platform:"linux/amd64"}

Cloud provider

N/A

OS version

N/A

Install tools

N/A

Container runtime (CRI) and version (if applicable)

N/A

Related plugins (CNI, CSI, ...) and versions (if applicable)

N/A

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-kindIndicates a PR lacks a `kind/foo` label and requires one.needs-triageIndicates an issue or PR lacks a `triage/foo` label and requires one.sig/authCategorizes an issue or PR as relevant to SIG Auth.

    Type

    No type

    Projects

    Status

    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions