本文翻译自“一种理解Kubernetes认证的实用方法”。
本文是上周开始的Kubernetes安全系列的一部分。在前面的文章中涉及Kubernetes访问控制的概述和背景。在这一部分中,我们将通过实践方法了解身份验证的概念。
在生产环境中,Kubernetes管理员使用命名空间来隔离资源和deployment。命名空间充当逻辑便捷,以强制进行基本访问控制。
假设我们有Bob,一个加入DevOps团队的新的管理员,他负责管理工程组的Kubernetes部署。我们现在必须为他提供足够的访问权限来管理工程命名空间。假设您是具有管理全局资源和对象权限的集群管理员,您可以帮助Bob获取访问Kubernetes集群所需的凭据。
此方案基于Minikube,但它应该与您是群集管理员的任何其他配置一起使用。
创建一个名为cred的目录并运行以下命令为Bob生成私钥。
mkdir cred
cd cred
openssl genrsa -out bob.key 2048
Generating RSA private key, 2048 bit long modulus
..................................................................................................................+++
................................................+++
e is 65537 (0x10001)
我们还需要一个可以从密钥生成的证书签名请求。
openssl req -new -key bob.key -out bob.csr -subj "/CN=bob/O=eng"\n
将密钥移动到父文件夹并在Base64中对其进行编码。
cp bob.key ..
cd ..
cat cred/bob.csr | base64 | tr -d '\n'
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1lqQ0NBVW9DQVFBd0hURU1NQW9HQTFVRUF3d0RZbTlpTVEwd0N3WURWUVFLREFSbGJtZHVNSUlCSWpBTgpCZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEzSU9oUTArMFJUakpqZjBKTkd2Rmo0YWFlN1hYCkkrZWkzTzZWTEpqMHNKNDBvengyUTVndXBmeFc5b0lEYTJETnhVZjZkNHVMOUJ3V2lhdFdQdnBDNm80MHJQc2EKTjBUdEhEekFYeWppc0E5VXVRMVNKMWg5Mkg0TU9XWEpWNWJWaTlXYjBKU3hLbXVrSUVtaERJcW9TcEh6MU5xaApQMWNXOFFpNXpoVVBmWlpnOUhSaWVUQ2xEMmR3bWRtS1JjbU9uenNGVWhJWmZWanVZNzZJUm9KbksyaHNzVjZoCmMyY1JNTVNEdFA0ZDArYkxOY1BKdExpS3JjQkdwUGxLUEdrSHovM2NNbVhpVi8wY2xqUlppMzJCb3B4NlI1NUIKc0Z6cXZwcWgzNWxLNUVOUGxPZy9sdURFdllGeUtzOUY2aERBRFhDNzQxU0ZCQTI0TERzcTFiWWtVUUlEQVFBQgpvQUF3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUxTejgxL2N3bjQxbVRrUDhabWhhUUx3MkpIRkN4ZUlaOFdpCkZOV0U1cnRVd3hrSjJGWVJKRlFUL1hJN0FoL0pXTkhqeHlhOUNyN3c0OThmanN3bDF2ZzQ1QUgrR29DeVEwTWkKOU1MMHl0WmZyaG5jYmtpRG9oSUpuaWhJTjlCUGpHVkw2SG1USytGc0sybG1ZZ1JDdk9Cclg3Rkh6ZjgwM0ZFNAp4ZkgrZlFsdGxDdEZTSEhuaUlzZTFEQ2J4cFVTdnRISXpYMFcyb2hXV3RPVkRpOTAzOW8zY2VaWmdVK3VRYno0Cmp2djJoeVdRNDhORFl3RWF1UUU2S3NBQTFLT0IyUkI2dE45bjFTVWoxU1B2WnBsQkVieDZ5MTkzaUJSVFJRM2wKM2JhdFRNUUEzelBsdk01ZEE2Vy8rQWcwVm0xMk1SR091VFRLSEU2bE5INE1DbHQvRGZZPQotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0K
我们需要将生成的base64编码的字符串嵌入到YAML文件中,并将其作为证书签名请求提交给Kubernetes。此步骤可将Bob的私钥与Kubernetes集群相关联。
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: bob-csr
spec:
groups:
- system:authenticated
request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1lqQ0NBVW9DQVFBd0hURU1NQW9HQTFVRUF3d0RZbTlpTVEwd0N3WURWUVFLREFSbGJtZHVNSUlCSWpBTgpCZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEzSU9oUTArMFJUakpqZjBKTkd2Rmo0YWFlN1hYCkkrZWkzTzZWTEpqMHNKNDBvengyUTVndXBmeFc5b0lEYTJETnhVZjZkNHVMOUJ3V2lhdFdQdnBDNm80MHJQc2EKTjBUdEhEekFYeWppc0E5VXVRMVNKMWg5Mkg0TU9XWEpWNWJWaTlXYjBKU3hLbXVrSUVtaERJcW9TcEh6MU5xaApQMWNXOFFpNXpoVVBmWlpnOUhSaWVUQ2xEMmR3bWRtS1JjbU9uenNGVWhJWmZWanVZNzZJUm9KbksyaHNzVjZoCmMyY1JNTVNEdFA0ZDArYkxOY1BKdExpS3JjQkdwUGxLUEdrSHovM2NNbVhpVi8wY2xqUlppMzJCb3B4NlI1NUIKc0Z6cXZwcWgzNWxLNUVOUGxPZy9sdURFdllGeUtzOUY2aERBRFhDNzQxU0ZCQTI0TERzcTFiWWtVUUlEQVFBQgpvQUF3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUxTejgxL2N3bjQxbVRrUDhabWhhUUx3MkpIRkN4ZUlaOFdpCkZOV0U1cnRVd3hrSjJGWVJKRlFUL1hJN0FoL0pXTkhqeHlhOUNyN3c0OThmanN3bDF2ZzQ1QUgrR29DeVEwTWkKOU1MMHl0WmZyaG5jYmtpRG9oSUpuaWhJTjlCUGpHVkw2SG1USytGc0sybG1ZZ1JDdk9Cclg3Rkh6ZjgwM0ZFNAp4ZkgrZlFsdGxDdEZTSEhuaUlzZTFEQ2J4cFVTdnRISXpYMFcyb2hXV3RPVkRpOTAzOW8zY2VaWmdVK3VRYno0Cmp2djJoeVdRNDhORFl3RWF1UUU2S3NBQTFLT0IyUkI2dE45bjFTVWoxU1B2WnBsQkVieDZ5MTkzaUJSVFJRM2wKM2JhdFRNUUEzelBsdk01ZEE2Vy8rQWcwVm0xMk1SR091VFRLSEU2bE5INE1DbHQvRGZZPQotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0K
usages:
- digital signature
- key encipherment
- server auth
kubectl create -f signing-request.yaml
certificatesigningrequest.certificates.k8s.io/bob-csr created
使用以下kubectl命令验证CSR :
kubectl get csr
NAME AGE REQUESTOR CONDITION
bob-csr 41s minikube-user Pending
请注意,该请求仍处于待处理状态。集群管理员必须先批准它才能变为活动状态。
kubectl certificate approve bob-csr
certificatesigningrequest.certificates.k8s.io/bob-csr approved
kubectl get csr
NAME AGE REQUESTOR CONDITION
bob-csr 104s minikube-user Approved,Issued
既然已经批准并颁发了证书,我们需要从集群中获取签名证书。这是让Bob上手的最关键的一步。
kubectl get csr bob-csr -o jsonpath='{.status.certificate}' | base64 --decode > bob.crt
bob.crt文件是用于验证Bob的客户端证书。我们现在拥有Kubernetes的私钥(bob.key)和批准的证书(bob.crt)的组合。只要Bob拥有这两个资产,他就可以通过集群进行身份验证。
是时候将Bob作为用户添加到Kubernetes了。
kubectl config set-credentials bob --client-certificate=bob.crt --client-key=bob.key
User "bob" set.
打开〜/ .kube / config文件以验证是否已设置凭据。
让我们创建一个名为engineering的新命名空间,Bob是其管理员。
kubectl create namespace engineering
namespace/engineering created
kubectl get namespace
NAME STATUS AGE
default Active 37m
engineering Active 0s
kube-node-lease Active 37m
kube-public Active 37m
kube-system Active 37m
该kubectl CLI具有一个非常有用的开关AUTH可以用来验证特定用户是否拥有权限。让我们检查作为管理员的当前用户是否可以访问工程命名空间。鉴于您是集群管理员,看到这个输出结果并不奇怪。
kubectl auth can-i list pods --namespace engineering
yes
我们还可以检查Bob是否可以访问工程命名空间。
kubectl auth can-i list pods --namespace engineering --as bob
no
很明显,Bob无法访问命名空间。那是因为我们已经创建了凭据,但没有明确授权Bob对任何对象进行任何特定操作。
在本系列教程的下一部分中,我将向您介绍授权Bob所涉及的步骤。它还使我们有机会了解角色和角色绑定。敬请关注!
讲师主页:tonybai_cn
讲师博客: Tony Bai
实战课:《Kubernetes实战:高可用集群搭建,配置,运维与应用》
免费课:《Kubernetes基础:开启云原生之门》