从零开始获得CKA证书之认证与授权

从零开始获得CKA证书之认证与授权对于集群的管理不可避免涉及到身份识别:认证会验证用户身份并检查用户是否确实是他们声称的,同时授权会检查用户所具有的权限。

大家好,欢迎来到IT知识分享网。

对于集群的管理不可避免涉及到身份识别:认证会验证用户身份并检查用户是否确实是他们声称的,同时授权会检查用户所具有的权限。Kubernetes支持多种不同的认证和授权模块

理论知识

  • API Server访问控制流

从零开始获得CKA证书之认证与授权

当请求到达API Server时:

  1. 它需要验证API Server的证书是否是证书机构所签发,这个证书是ca.cert文件。API server 的CA证书通常位于/etc/kubernetes/pki/ca.crt,客户端的证书通常位于$HOME/.kube/config文件中。
  2. 握手成功后,进入认证阶段。在Kubernetes中认证模块是链式结构的,当请求来时它会逐个尝试所有的认证模块,直到成功为止。如果都失败了,则请求被拒绝,返回401 Unauthorized错误。
  3. 认证成功后,进入授权阶段。它通过一组策略来验证用户是否有权执行他们的请求。它也是链式结构的,同样会尝试每个模块,直到成功为止。如果都失败了,则返回403 Forbidden错误。
  4. 准入控制是API Server中的一个可配置插件,用于确认请求是允许还是拒绝的。如果请求未被通过其中一项,则请求立刻被拒绝。我们可以通过在Master上运行下面的命令查看:
ps -aux | grep api | grep enable-admission-plugins

详细信息参考链接:
https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/

  1. 准入控制成功后,用户可以对API 对象进行CRUD操作。 CRUD代表创建,读取,修改和删除的操作,与之对应的HTTP方法分别是Post,GET,PATCH/PUT以及DELETE.
  • 认证

认证插件会返回已经认证过的用户的用户名和组。Kubernetes区分2种连接到API Server的客户端:服务账户(Service Account)和普通账户(User Account)

  1. Service Account: Pod使用SA与API Server进行通信。
    创建namespace时,Kubernetes创建token并存储为由base64编码的secret,将它作为volume挂载到container中,Pod中的进程就可以与API进行通讯了。
    可以通过下面方式查看:
root@u1:~# kubectl get secrets default-token-44srj NAME TYPE DATA AGE default-token-44srj kubernetes.io/service-account-token 3 12d root@u1:~# kubectl describe pod nginx Containers: nginx: Container ID: docker://bcb00d894f9e747fc8370f062326e0b0aef9ed5579d2c26d98974e5d Image: nginx Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-44srj (ro) root@u1:~# kubectl exec -it nginx -- ls /var/run/secrets/kubernetes.io/serviceaccount ca.crt namespace token
  1. User Account: Kubernetes外部系统中的普通用户

用户账户身份验证有多种形式:Client Certificate, token,username/password,OpenID token.

创建client certificate的方式如下:

 root@u1:~/AAA# openssl genrsa -out paul.key 2048 root@u1:~/AAA# openssl req -new -key paul.key -out paul.csr -subj "/CN=paul" root@u1:~/AAA# openssl x509 -req -in paul.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out paul.crt -days 360

创建API Token的方式如下:

 root@u1:~/AAA# kubectl create serviceaccount devops root@u1:~/AAA# kubectl describe sa devops Name: devops Tokens: devops-token-2rcf9 root@u1:~/AAA# kubectl describe secrets devops-token-2rcf9 Data ==== ca.crt: 1025 bytes namespace: 7 bytes token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImUyOTNGQTVkTVdZR1RXQ1VqcGFoVEpzVmxIaUJucGFXMFBHZW5ZQmRpbFkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRldm9wcy10b2tlbi0ycmNmOSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJkZXZvcHMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJlZjE4MmZjZC1jYmQ2LTQwNDAtYmEwZC1kNDM5ZWRlMWJlZmIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDpkZXZvcHMifQ.pv4HYGGXEqNj_HNRkOG5zM7__rz4y-HycYYGLfoiL4CNc6bpjpBV0uJkjLu-V2uYy6ivGQzD5f0p2LffaHszmTRY2iZfqcP80f5nf_MG2LgLqelN6J2wBFymMDobmhTp85d4v2lM70yFjYz575YbHuMTqDkGuudAR33zZzPoHd7ourmkq62-8QLeUsAkSEmJtBx-tZ1HjQ44thg4R-zT1Vc-i6ICThjxLtuPAq37Fl7_LOtb9or4-n6n-Ft2IyjehfYv3tKmutq_iNaq9FwE3AxhvnpeZ_7OJBkG0vev6D0zjh77NCKt7qwTJeqOH4d3eJlNxUwi733D1mKq4DP7VA
  • 授权

Kubernetes支持多种授权模块,常用的有:RBAC和Webhook。

  1. WebHook(节点授权):使用第三方授权
    kubelet使用节点授权向API Server发出请求,Kubernetes支持webhook来建立HTTP callback以使用外部RESTFul服务。但需要授权是,它就会发送POST请求。
  1. RBAC(基于角色的访问控制)

在RBAC中,管理员通过创建一些Role或者ClusterRole(权限)用于指定角色可以访问和操作一组资源和动作。然后,管理员通过RoleBinding或ClusterRoleBindings向用户授予Role的权限。

从零开始获得CKA证书之认证与授权

当然有时为了进行测试,我们临时需要取消Kubernetes的授权,可以采用下面的命令:

kubectl create clusterrolebinding permissive-binding --clusterrole=cluster-admin  --group=system:serviceaccounts

动手实验

  • 在default namespace创建名为curl的Pod,在Pod中查看kube-system下的Pod状态
#create SA、ClusterRole、 ClusterRoleBinding root@k8s-master:~/AAA# cat devops.yaml apiVersion: v1 kind: ServiceAccount metadata: name: devops labels: app: devops --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: devops labels: app: devops rules: - apiGroups: - pods - namespace resources: - '*' verbs: - get - list - nonResourceURLs: - '*' verbs: - '*' --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: devops-token subjects: - kind: ServiceAccount name: devops namespace: default roleRef: kind: ClusterRole name: devops apiGroup: rbac.authorization.k8s.io #create Pod root@u1:~/AAA# cat curl.yaml apiVersion: v1 kind: Pod metadata: name: curl namespace: default spec: serviceAccountName: devops containers: - name: curl image: tutum/curl command: - sleep - "3600" #check kube-system status root@u1:~/AAA# kubectl exec -it curl bash root@curl:/# TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1 KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443 
  • 创建名为devops用户,要求其能读取,查看Cluster的Pod,并使用Podman工具来确认

参考代码如下:

#获得devops用户token值 root@k8s-master:~/AAA# kubectl describe secrets devops-token-xl98p 

使用Podman工具:

  1. 设置K8s API-Server CA文件:Fille—Settings
从零开始获得CKA证书之认证与授权

  1. 打开API调试窗口,设置认证方式为token
从零开始获得CKA证书之认证与授权

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/76270.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信