概述

在RABC API中,通过如下的步骤进行授权:
1)定义角色:在定义角色时会指定此角色对于资源的访问控制的规则;
2)绑定角色:将主体与角色进行绑定,对用户进行访问授权。

image.png

Authentication(认证)

认证方式现共有8种,可以启用一种或多种认证方式,只要有一种认证方式通过,就不再进行其它方式的认证。通常启用X509 Client Certs和Service Accout Tokens两种认证方式。

UserAccount(用户账户)

用户账户。给用户使用,全局唯一,不受 namespace 命名空间的限制。这种类型的账户由外部应用进行管理。
使用kubectl命令时用的就是UserAccount帐户;查看~/.kube/config用户账户信息

  1. cat ~/.kube/config
  2. ....
  3. users:
  4. - name: docker-desktop
  5. user:

ServiceAccount(服务账户)

给应用程序使用即:运行在集群中的程序访问 API Service 时使用。通常就是 Pod(准确说是运行在 Pod 中的应用)。这种类型的账户由 Kubernetes 进行管理
与UserAccount区别

区别 ServiceAccount UserAccount
集群 存在集群内部的资源对象 存在于集群外部
namespace 属于某个 namespace 下,不是全局的 不属于某个 namespace 所有,全局唯一的,
使用者 一般被 Pod 使用,与 API Server 交互 一般被 kubectl 或 REST 请求使用
  1. kubectl get serviceaccounts
  2. NAME SECRETS AGE
  3. default 1 107m

创建账户

  1. kubectl create serviceaccount test
  2. serviceaccount/test created

查看详细信息

  1. kubectl describe serviceaccount test
  2. Name: test
  3. Namespace: default
  4. Labels: <none>
  5. Annotations: <none>
  6. Image pull secrets: <none>
  7. Mountable secrets: test-token-5xf7v
  8. Tokens: test-token-5xf7v
  9. Events: <none>

会创建自定义的token秘钥

  1. kubectl describe secret test-token-5xf7v
  2. Name: test-token-5xf7v
  3. Namespace: default
  4. Labels: <none>
  5. Annotations: kubernetes.io/service-account.name: test
  6. kubernetes.io/service-account.uid: 65b86028-c7e3-490a-a5dd-08cc9848d751
  7. Type: kubernetes.io/service-account-token
  8. Data
  9. ====
  10. ca.crt: 1025 bytes
  11. namespace: 7 bytes
  12. token: eyJhbGciOiJSUzI1NiIsImtpZCI6IjNoUnBfU2xrbTZjYndTTWFKNmo4RWRlbFdkamtLQTcxQXh0Nzk2b0s3X00ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InRlc3QtdG9rZW4tNXhmN3YiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoidGVzdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjY1Yjg2MDI4LWM3ZTMtNDkwYS1hNWRkLTA4Y2M5ODQ4ZDc1MSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnRlc3QifQ.Xk9Rw8-6W8Jw2-3TNQibSuXMSj3YScYjuF5MGGL7vGgxCA6M24t8FPlmGlVoevkw88-IVJFdrN2Gu564vn4eZJGNpRcvcx-fN0CMPNpjCrR3zcT4xXOEpKJmwHnnNqDNiuL9Uv8LHQ0BBZORe52uUr8NjfLKJwUAhXotGnUStYfWxOhG7eZJDoUzhH-XcwlRcSj43aA-D_y0orDbHl-B3N0GjBFv_CLgPnQlA302K0a8CzzIKGtZFk9YrDkEdHdxSjz0digDjZnOq9dl9m3-YK7mo2pUNRrJD60qtRnFRGy7P-aNPmGOL_JTJF6WWUyln-PW9rBNL9MTiVt3yUoEYw

token 中有 3 个条目,分别为:ca.crt、namespace、token,这 3 个条目和默认的 ServiceAccount 的条目相同,但是对应的值肯定是不同的。

Authorization(授权)

角色/Role

K8S 中的角色从类别上主要有两类,Role 和 ClusterRole。

  • role:命名空间(Namespace)访问权限。
  • ClusterRole:所以命名空间Namespace访问权限,并且还有一些非资源类的访问权限。

查看roles

  1. kubectl get roles --all-namespaces=true
  2. NAMESPACE NAME CREATED AT
  3. kube-public kubeadm:bootstrap-signer-clusterinfo 2020-07-11T13:38:28Z
  4. kube-public system:controller:bootstrap-signer 2020-07-11T13:38:27Z

查看clusterrole

  1. kubectl get clusterroles
  2. NAME CREATED AT
  3. admin 2020-07-11T13:38:26Z
  4. cluster-admin 2020-07-11T13:38:26Z
  5. compose-service 2020-07-11T13:39:35Z
  6. compose-stack-admin 2020-07-11T13:39:36Z
  7. compose-stack-edit 2020-07-11T13:39:35Z

创建集群角色cluster role

  1. kubectl create clusterrole pv-reader --verb=get,list --resource=persistentvolumes

创建集群角色绑定cluster role binding

  1. kubectl create clusterrolebinding pv-test --clusterrole=pv-reader --serviceaccount=web:default

准入控制/AdmissionControl

判断请求的操作是否符合集群的要求。可以设置“准入控制器列表”。获得授权的请求都需要通过准入控制器的检查,如果检查不通过,请求依然会被拒绝。
Admission Control 在改变资源持久化之前(资源的创建、修改、删除)的机制。

HelloWorld

创建命名空间

  1. $ kubectl create ns role-ctl
  2. namespace/role-ctl created

创建pod

  1. $ kubectl run nginx --image=nginx -n role-ctl
  2. pod/nginx created
  3. $ kubectl get pods -n role-ctl
  4. NAME READY STATUS RESTARTS AGE
  5. nginx 1/1 Running 0 51s

创建角色

  1. kind: Role
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. namespace: role-ctl
  5. name: pod-reader
  6. rules:
  7. - apiGroups: [""]
  8. resources: ["pods"]
  9. verbs: ["get", "watch", "list"]

执行角色创建命令

  1. $ kubectl create -f pod-role.yaml
  2. role.rbac.authorization.k8s.io/pod-reader created
  3. $ kubectl get role -n role-ctl
  4. NAME CREATED AT
  5. pod-reader 2020-10-04T12:44:18Z

创建角色绑定

参考

https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/
https://blog.csdn.net/songxi_bo/article/details/105269225