Kubernetes身份認證和受權操做全攻略:上手操做Kubernetes身份認證

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

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

假設如今咱們有個新的管理員叫Bob,要加入開發團隊爲研發組管理Kubernetes部署。咱們如今須要給他提供足夠的訪問權限以便於他管理工程命名空間。假設你是集羣管理員而且擁有管理全局資源和對象的權限,你須要登上Bob的帳戶並幫助他獲取訪問Kubernetes集羣所需的憑據。json

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

首先,建立一個名爲cred的目錄,並運行如下命令爲Bob生成一個私鑰。併發

mkdir cred
cd cred
openssl genrsa -out bob.key 2048
Generating RSA private key, 2048 bit long modulus
..................................................................................................................+++
................................................+++
e is 65537 (0x10001)

咱們還須要一個能夠從私鑰生成的證書籤名請求。app

openssl req -new -key bob.key -out bob.csr -subj "/CN=bob/O=eng"\n

將密鑰移動到父級文件夾並在Base64中對其進行編碼。jsonp

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:spa

kubectl get csr
NAME      AGE   REQUESTOR       CONDITION
bob-csr   41s   minikube-user   Pending

請注意,請求此時依舊處於pending狀態。集羣管理員須要批准它,纔會變成active狀態。3d

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的全部步驟。同時,還會介紹角色以及角色綁定。保持關注喲~

相關文章
相關標籤/搜索