Kubernetes身份認證和授權操作全攻略:上手操作Kubernetes身份認證

  • 2019 年 12 月 5 日
  • 筆記

這是本系列文章的第二篇,在上篇文章中我們介紹了Kubernetes訪問控制。在本文中,我們將通過上手實踐的方式來進一步理解身份認證的概念。

在生產環境中,Kubernetes管理員使用命名空間來隔離資源和部署。命名空間作為一個邏輯邊界來強制基本訪問控制。

假設現在我們有個新的管理員叫Bob,要加入開發團隊為研發組管理Kubernetes部署。我們現在需要給他提供足夠的訪問許可權以便於他管理工程命名空間。假設你是集群管理員並且擁有管理全局資源和對象的許可權,你需要登上Bob的賬戶並幫助他獲取訪問Kubernetes集群所需的憑據。

我在操作中使用的是Minikube,但本文示例的場景適用於任何使用其他方式配置的Kubernetes集群(只要你是集群管理員身份就行)。

首先,創建一個名為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

請注意,請求此時依舊處於pending狀態。集群管理員需要批准它,才會變成active狀態。

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的形式提供了非常有用的開關,可以驗證特定用戶的許可權。讓我們檢查一下當前的管理員用戶是否可以訪問engineering命名空間。鑒於您集群管理員的身份,因此可以輕易看到輸出結果。

 kubectl auth can-i list pods --namespace engineering  yes

我們也能夠檢查Bob能否訪問engineering命名空間。

kubectl auth can-i list pods --namespace engineering --as bob  no

很顯然,Bob無法訪問命名空間,這是因為我們創建了憑據但是沒有明確授權Bob對任何對象進行任何特定的動作。

在下一篇文章中,我將引導您完成授權Bob的所有步驟。同時,還會介紹角色以及角色綁定。保持關注喲~