16 如何对pod做权限限制?(认证、授权篇)
要想知道k8s如何对pod做权限限制,首先我们得知道pod是怎么访问k8s集群的资源的。
由于k8s本身是没有提供用户管理能力的,所以只要“用户”(非linux用户)持有kubeconfig凭据或者服务(如pod)具有访问集群资源的ServiceAccount,经过k8s认证流程之后,api-server 就会将请求凭证中的用户身份转化为对应的user
和groups
这样的用户模型,使用这个用户模型通过鉴权流程和准入控制流程就可以访问api-server中有权限访问的资源。
上面提到的k8s访问请求流程具体可以分为认证authentication(是否为集群合法用户)、鉴权authorization(用户是否有权限操作所请求的资源)、准入控制admissioncontrol(请求是否安全合规)、持久化数据到etcd这几个步骤。
而集群资源访问控制的两种方式,使用kubeconfig凭据和使用serviceaccount就是这次实践内容。而k8s对pod做权限限制使用的就是serviceaccount
的方式。
一、第一种访问方式:使用kubeconfig凭据方式访问集群
先看使用kubeconfig的方式,k8s使用证书请求资源的认证方式基本都是X509证书认证,访问者通常会使用由集群 CA 签发的客户端证书config去访问api-server。这种方式通常是用户本地连接k8s集群使用的方式。pod使用的就是serviceaccount
的方式。
X509证书认证的证书由放在集群master节点的/etc/kubernetes/pki/
目录下的公钥ca.crt
和私钥ca.key
来签发,那证书如何签发呢,k8s提供了个签发的apicertificates.k8s.io/v1beta1
第一种访问方式实践
比如现在我要创建一个‘用户’vickey
来访问集群的资源,首先要创建一个证书签名请求CSR certificate signing request和一个私钥。
[root@master-1 yamlfiles]# openssl req -new -newkey rsa:4096 -nodes -keyout vickey.key -out vickey.csr -subj "/CN=vickey/O=dev"
Generating a 4096 bit RSA private key
..........................................++
.........++
writing new private key to 'vickey.key'
-----
[root@master-1 yamlfiles]# ls vickey.*
vickey.csr vickey.key
然后用生成的证书签名请求csr文件创建一个k8s对象csr
,在未被有权限的管理员审批approve
之前会处于pending
状态,只有审批后状态才会变成Approved,Issued
。
[root@master-1 yamlfiles]# kubectl get csr --all-namespaces
No resources found
[root@master-1 yamlfiles]# cat <apiVersion: certificates.k8s.io/v1beta1kind: CertificateSigningRequestmetadata:name: vickey-access-testspec:request: $(cat vickey.csr | base64 | tr -d '\n')usages:
- client auth
EOF
certificatesigningrequest.certificates.k8s.io/vickey-access-test created
[root@master-1 yamlfiles]# ls vickey.*
vickey.csr vickey.key
[root@master-1 yamlfiles]# kubectl get csr
NAME AGE REQUESTOR CONDITION
vickey-access-test 14s kubernetes-admin Pending
[root@master-1 yamlfiles]# kubectl certificate approve vickey-access-test
certificatesigningrequest.certificates.k8s.io/vickey-access-test approved
[root@master-1 yamlfiles]# kubectl get csr
NAME AGE REQUESTOR CONDITION
vickey-access-test 8m15s kubernetes-admin Approved,Issued
将已签名的证书内容持久化到.crt
文件中
[root@master-1 yamlfiles]# kubectl get csr vickey-access-test -o jsonpath='{.status.certificate}' | base64 --decode > vickey-access-test.crt
[root@master-1 yamlfiles]# cat vickey-access-test.crt
-----BEGIN CERTIFICATE-----
MIIEBjCCAu6gAwIBAgIUbSNC1co5FiJ4rUd3zN15ITBLQxYwDQYJKoZIhvcNAQEL
......
d2xAmipqTuhqnjLbx+OZDsMjuTktiAXA+OHZcF/JjpLP5xjibbfYwkziLZEiuPON
usiDR2nUKLeCEp2CcJG/1/hzCrQNnuVQrgc=
-----END CERTIFICATE-----
有了签名证书还需要集群的ca.crt
证书,因为下面配置集群权限需要用到。可以直接从/etc/kubernetes/pki/ca.crt
复制一份过来,因为kubectl config view -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' --raw | base64 --decode - > k8s-cluster-ca.crt
获取的就是ca.crt
的内容。
[root@master-1 yamlfiles]# kubectl config view -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' --raw | base64 --decode - > k8s-cluster-ca.crt
[root@master-1 yamlfiles]# cat k8s-cluster-ca.crt
-----BEGIN CERTIFICATE-----
MIICyDCCAbCgAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJl
......
4IzuQQRMTa7QqzyHCYlbp6Sb7YFxkwcwfMbLpqlUPWGDFGqepnKFp5aHhd0=
-----END CERTIFICATE-----
[root@master-1 yamlfiles]# diff k8s-cluster-ca.crt /etc/kubernetes/pki/ca.crt
[root@master-1 yamlfiles]#
因为kubeconfig
是用户本地连接k8s集群使用的重要访问凭证,使用kubeconfig凭据方式访问集群最关键的一步就是生成config凭据,它是一个包含‘用户’已被签名的证书、集群的ca证书等信息的证书。这个生成凭据过程又细分为3步。
第一步:设置连接集群的必要信息(集群名,集群url)并写入到用来连接集群的访问凭据vickey-config
中。
[root@master-1 yamlfiles]# kubectl config set-cluster $(kubectl config view -o jsonpath='{.clusters[0].name}') --