权限控制-通过实例理解Kubernetes的认证

3,534 阅读3分钟

这一系列文档都是关于Kubernetes集群内部pods等资源对外部请求的认证与授权的管以及如何使用roles和role binding控制Kubernetes内部资源的访问权限。

在生产环境中,Kubernetes管理员使用namespaces隔离集群上的资源。Namespaces在权限控制上扮演着资源的逻辑分界线角色。

设想下面的应用场景:

运维team中新加入一位同事名字叫Bob,他的主要工作是管理工程师组在Kubernetes上的部署工作。因此运维组的老大必须授权Bob操作engineering namesapces足够的权限。

下面的实验操作是发生在我的私人Kubernetes集群上,你可以使用具有Kubernetes集群最高权限的任何集群资源上完成下面的实验。

  1. 创建名为cred的文件夹,然后通过下面的命令为Bob生成私钥。
mkdir cred
cd cred
openssl genrsa -out bob.key 2048
  1. 使用私钥生成一个认证签名请求文件
openssl req -new -key bob.key -out bob.csr -subj "/CN=bob/O=eng"\n
  1. 查看认证签名文件
cat bob.csr | base64 | tr -d '\n'
  1. 创建Kubernetes Certificate Signing Request的signing-request.yaml文件,然后将认证签名文件作base64编码后插入到yaml文件中,最后通过命令创建Certificate Signing Request资源。
cat >> signing-request.yaml <<EOF
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
  name: bob-csr
spec:
  groups:
  - system:authenticated

  request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1lqQ0NBVW9DQVFBd0hURU1NQW9HQTFVRUF3d0RZbTlpTVEwd0N3WURWUVFLREFSbGJtZHVNSUlCSWpBTgpCZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF3amJvYldWeHFVd21kUS85SW50T01kNXBieUJtCjZPSEt2aDRsSm5DMEgrNVVWNXNGYUJhMm1TdFVFdG1ENGRuUk0zcFdBUVBPUEdQditaY1NCc1N5QmhYdmswY1kKNGJXcWRLRGdUMnpTWEoyemxTVFdlTUJBcFZwWFBseGRLRE80bXk5YWtjbFFUVmE2ZnJadU5MQTNBQnBBTGxxLwowY05Id0tlVkpGVlJoN0l2bzZ4VlZVY0wyN21YK3ZoMmpjZGZKZkU1bG5lQXRXT2xDL05IZE9TUzhuR3JEcCtUCmhJamI5Q0p4Ty90N3VLWUJOMWM2SG1qRUowTkc2cDZhaVRhZWZiYllONmVhVllOUVdWT2hYNFlqQWNTRWp6clUKOCtrd2drZ2h2YjFtNmV0OHQ3VUYzRlJzNDNiU0xrbExPVDBVUGd1MlRQN3RVajM1WlJweHY5ZUQ1UUlEQVFBQgpvQUF3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUdFeTRCZS9vRDlUZ1p0V1hvM2FGNkxwUkpsZGtMYWJBbFE4CkdjVGJ1dlhwNmt4ODhDT0NwZjhIb2tMbEgzeiswajZjWktMUFZIVHdzdzJnbmNJbjBCM0RvL3U3dDlWT0d3RVEKaHpzd0cxSFI3VjUrZ1VEMzdmeXc3MGhZUFg0cGlCbncyNWJqLzljR2ViYTQwTjNqNjBHaUVrWlpUa0JUSzNRVApNWmdTMjB4S1UzS0RIOWJENkFJZlQvbUxXRkRRQURKekhVMm9UQ2hqK3JiUlgwYU5qazJVck42dWNqMEx0T0tlCjdoMWJ4YVJjU3BEcDhTWkhYODRwcWY1eVFFWEJ5dEt0ZjF5T3dBK2tCVldPdS81SkJWQVpQTmRyVElKR2g4RmEKbjF0S0E4RngyYStLdkN2b2txQjlrYzFVQ3U0d2QyRHVncWJKUmhwUGRiaStSM3htenlzPQotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0K

  signerName: kubernetes.io/kube-apiserver-client
  expirationSeconds: 86400  # one day
  usages:
  - client auth
> EOF
kubectl apply -f signing-request.yaml
  1. 验证 Certificate Signing Request (CSR) 资源是否生成
kbuectl get csr

从上图可见csr资源对应的状态仍然是Pending,集群管理员使用approve命令使其变成active

  1. 将csr资源的状态变更为Active
kubectl certificate approve bob-csr

kubectl get csr

从上图可见csr资源已经变成Approved,Issued状态

  1. 获取认证的签名信息
kubectl get csr bob-csr -o jsonpath='{.status.certificate}' | base64 --decode > bob.crt

上面的bob.crt文件是用来对Bob进行认证和授权的文件。我们从Kubernetes中获得bob.key私钥文件和bob.crt认证文件后,我们就可以对bob账户做授权工作了。

  1. 将Bob添加为Kubernetes集群用户
kubectl config set-credentials bob --client-certificate=bob.crt --client-key=bob.key

通过上面命令可见bob用户已经添加到Kubernetes集群中

  1. 创建engineering namesapce
kubectl create namespace enginerging
  1. 验证
  • 验证kubernets admin管理员是否有操作engineering namespace的资源
kubectl auth can-i list pods --namespace engineering

yes
  • 验证bob管理员是否有操作engineering namespace的资源
kubectl auth can-i list pods --namespace engineering --as bob

no

明显可见Bob还不能操作enginering namespace的资源。这是为什么?

即便我们对Bob做关于Kubernetes集群访问的认证,但是我们并没有对Bob授权操作Kubernets资源的行为。

在这一系列文章的下一章节中,我将带你对bob用户授权操作Kubernetes资源的行为。这主要是关于 role和role binding的知识,继续加油哦!

文章翻译自A Practical Approach to Understanding Kubernetes Authentication ,行文略有删减