k8s往secret里导入证书_k8s实践记录(四)

7f445c5c1818fce198fa3a37d526e310.png

16 如何对pod做权限限制?(认证、授权篇)

要想知道k8s如何对pod做权限限制,首先我们得知道pod是怎么访问k8s集群的资源的。

由于k8s本身是没有提供用户管理能力的,所以只要“用户”(非linux用户)持有kubeconfig凭据或者服务(如pod)具有访问集群资源的ServiceAccount,经过k8s认证流程之后,api-server 就会将请求凭证中的用户身份转化为对应的usergroups这样的用户模型,使用这个用户模型通过鉴权流程准入控制流程就可以访问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}') --
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值