• k8s-merge-robot's avatar
    Merge pull request #29071 from albatross0/fix_rbac_for_serviceaccounts · 8043baf1
    k8s-merge-robot authored
    Automatic merge from submit-queue
    
    Fix RBAC authorizer of ServiceAccount
    
    RBAC authorizer assigns a role to a wrong service account.
    
    How to reproduce
    
    1.Create role and rolebinding to allow default user in kube-system namespace to read secrets in kube-system namespace.
    
    ```
    # kubectl create -f role.yaml
    # kubectl create -f binding.yaml
    ```
    
    ```yaml
    # role.yaml
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1alpha1
    metadata:
      name: secret-reader
      namespace: kube-system
    rules:
      - apiGroups: [""]
        resources: ["secrets"]
        verbs: ["get", "watch", "list"]
        nonResourceURLs: []
    ```
    
    ```yaml
    # binding.yaml
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1alpha1
    metadata:
      name: read-secrets
      namespace: kube-system
    subjects:
      - kind: ServiceAccount
        name: default
        namespace: kube-system
    roleRef:
      kind: Role
      namespace: kube-system
      name: secret-reader
      apiVersion: rbac.authorization.k8s.io/v1alpha1
    ```
    
    2.Set a credential of default user
    
    ```
    $ kubectl config set-credentials default_user --token=<token_of_system:serviceaccount:kube-system:default>
    $ kubectl config set-context default_user-context --cluster=test-cluster --user=default_user
    $ kubectl config use-context default_user-context
    ```
    
    3.Try to get secrets as default user in kube-system namespace
    
    ```
    $ kubectl --namespace=kube-system get secrets
    the server does not allow access to the requested resource (get secrets)
    ```
    
    As shown above, default user could not access to secrets.
    But if I have kube-system user in default namespace, it is allowed access to secrets.
    
    
    4.Create a service account and try to get secrets as kube-system user in default namespace
    
    ```
    # kubectl --namespace=default create serviceaccount kube-system
    serviceaccount "kube-system" created
    $ kubectl config set-credentials kube-system_user --token=<token_of_system:serviceaccount:default:kube-system>
    $ kubectl config set-context kube-system_user-context --cluster=test-cluster --user=kube-system_user
    $ kubectl config use-context kube-system_user-context
    $ kubectl --namespace=kube-system get secrets
    NAME                  TYPE                                  DATA      AGE
    default-token-8pyb3   kubernetes.io/service-account-token   3         4d
    
    ```
    8043baf1
Name
Last commit
Last update
..
admission Loading commit data...
api Loading commit data...
apimachinery Loading commit data...
apis Loading commit data...
apiserver Loading commit data...
auth Loading commit data...
capabilities Loading commit data...
client Loading commit data...
cloudprovider Loading commit data...
controller Loading commit data...
conversion Loading commit data...
credentialprovider Loading commit data...
dns Loading commit data...
fieldpath Loading commit data...
fields Loading commit data...
genericapiserver Loading commit data...
healthz Loading commit data...
httplog Loading commit data...
hyperkube Loading commit data...
kubectl Loading commit data...
kubelet Loading commit data...
kubemark Loading commit data...
labels Loading commit data...
master Loading commit data...
metrics Loading commit data...
probe Loading commit data...
proxy Loading commit data...
quota Loading commit data...
registry Loading commit data...
runtime Loading commit data...
security Loading commit data...
securitycontext Loading commit data...
serviceaccount Loading commit data...
ssh Loading commit data...
storage Loading commit data...
types Loading commit data...
ui Loading commit data...
util Loading commit data...
version Loading commit data...
volume Loading commit data...
watch Loading commit data...
OWNERS Loading commit data...