權限控制-經過實例理解Kubernetes的認證

這一系列文檔都是關於Kubernetes集羣內部pods等資源對外部請求的認證與受權的管以及如何使用roles和role binding控制Kubernetes內部資源的訪問權限。git

在生產環境中,Kubernetes管理員使用namespaces隔離集羣上的資源。Namespaces在權限控制上扮演着資源的邏輯分界線角色。json

設想下面的應用場景:api

運維team中新加入一位同事名字叫Bob,他的主要工做是管理工程師組在Kubernetes上的部署工做。所以運維組的老大必須受權Bob操做engineering namesapces足夠的權限。bash

下面的實驗操做是發生在個人私人Kubernetes集羣上,你可使用具備Kubernetes集羣最高權限的任何集羣資源上完成下面的實驗。app

  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

  usages:
  - digital signature
  - key encipherment
  - server 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狀態post

  1. 獲取認證的簽名信息
kubectl get csr bob-csr -o jsonpath='{.status.certificate}' | base64 --decode > bob.crt
複製代碼

上面的bob.crt文件是用來對Bob進行認證和受權的文件。咱們從Kubernetes中得到bob.key私鑰文件和bob.crt認證文件後,咱們就能夠對bob帳戶作受權工做了。jsonp

  1. 將Bob添加爲Kubernetes集羣用戶
kubectl config set-credentials bob --client-certificate=bob.crt --client-key=bob.key
複製代碼

經過上面命令可見bob用戶已經添加到Kubernetes集羣中ui

  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 ,行文略有刪減

相關文章
相關標籤/搜索