• 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
.github Loading commit data...
Godeps Loading commit data...
api/swagger-spec Loading commit data...
build Loading commit data...
cluster Loading commit data...
cmd Loading commit data...
contrib Loading commit data...
docs Loading commit data...
examples Loading commit data...
federation Loading commit data...
hack Loading commit data...
hooks Loading commit data...
logo Loading commit data...
pkg Loading commit data...
plugin Loading commit data...
release Loading commit data...
test Loading commit data...
third_party Loading commit data...
vendor Loading commit data...
www Loading commit data...
.generated_docs Loading commit data...
.gitignore Loading commit data...
CHANGELOG.md Loading commit data...
CONTRIB.md Loading commit data...
CONTRIBUTING.md Loading commit data...
DESIGN.md Loading commit data...
LICENSE Loading commit data...
Makefile Loading commit data...
Makefile.generated_files Loading commit data...
README.md Loading commit data...
Vagrantfile Loading commit data...
code-of-conduct.md Loading commit data...