K8S-如何設置對Kubernetes集群的基於角色的訪問!

如果您使用Kubernetes已有一段時間,則可能會遇到一種情況,即必須為某些用戶提供對Kubernetes集群的有限訪問權限。例如,您可能希望用戶(例如來自開發部門的Alice)只能訪問開發名稱空間中的某些資源,而不能訪問其他資源。為了實現這種基於角色的訪問,我們在Kubernetes中使用了身份驗證和授權的概念。

K8S-如何設置對Kubernetes集群的基於角色的訪問!

K8S

大致來說,有三種用戶需要訪問Kubernetes集群:

1.開發人員/管理員:

負責在群集上執行管理或開發任務的用戶。這包括諸如升級群集或在群集上創建資源/工作負載之類的操作。

2.最終用戶:

訪問我們Kubernetes集群上部署的應用程序的用戶。這些用戶的訪問限制由應用程序本身管理。例如,在Kubernetes集群上運行的Web應用程序將具有自己的安全機制,以防止未經授權的訪問。

3.應用程序/機器人:

其他應用程序可能需要訪問Kubernetes集群,通常是為了與集群中的資源或工作負載進行通信。Kubernetes通過使用Service Accounts(這是另一篇文章的主題)來簡化此過程 。在這裡,我們將專注於基於角色的訪問控制(RBAC)。

K8S-如何設置對Kubernetes集群的基於角色的訪問!

用戶

因此,可以使用RBAC進行管理的用戶類別是開發人員/管理員。簡而言之,使用RBAC時,您將創建用戶併為其分配角色。每個角色都映射有特定的權限,因此將每個用戶限制為一組由他們分配的角色定義的操作。到目前為止,Kubernetes還沒有任何機制可以在集群內部創建或管理用戶。它們需要在外部創建和管理。現在讓我們看看Kubernetes RBAC的實際應用。

我們在這裡要做的是創建一個用戶,該用戶將被允許執行某些任務或僅從名稱空間訪問某些資源。該用戶不應執行任何其他任務或訪問任何其他資源。

我已經使用 minikube 集群進行了演示,但是隻要您有一個運行良好的Kubernetes集群,一切也應該對您有用。如果您有興趣,下面是我的特定minikube版本。

<code>Docker 18.09.6上的Kubernetes v1.14.2
minikube版本:v1.1.0/<code>

首先創建一個名稱空間。

<code>$ kubectl create namespace development
namespace/development created/<code>

創建用於身份驗證的客戶端證書

因為我們知道任何客戶端都可以通過使用基於SSL的身份驗證機制向kube-apiserver進行身份驗證來訪問Kubernetes集群。我們將必須生成私鑰和X-509客戶端證書,DevUser 以使用kube-apiserver的名稱對用戶進行身份驗證 。該用戶將使用開發名稱空間。讓我們為它創建私鑰和一個CSR(證書籤名請求) DevUser

<code>$ cd ${HOME}/.kube
$ openssl genrsa -out DevUser.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
$ openssl req -new -key DevUser.key -out DevUser.csr -subj "/CN=DevUser/O=development"/<code>

主題的通用名稱(CN)將用作身份驗證請求的用戶名。組織字段(O)將用於指示用戶的組成員身份。

擁有私鑰和CSR之後,我們將必須對該CSR進行自簽名以生成證書。我們必須提供Kubernetes集群的CA密鑰來生成證書,因為CA已被minikube 集群批准 。

<code>$ openssl x509 -req -in DevUser.csr -CA ${HOME}/.minikube/ca.crt -CAkey ${HOME}/.minikube/ca.key -CAcreateserial -out DevUser.crt -days 45
Signature ok
subject=CN = DevUser, O = development
Getting CA Private Key/<code>

請確保提供正確的CA證書和密鑰集。要了解這一點,您可以運行kubectl config view並獲取詳細信息。

配置kubectl

現在您已經擁有一個用戶(DevUser),私鑰和一個證書來連接到kube-apiserver,是時候我們在配置文件(即Kubeconfig)中配置這些詳細信息了。我們可以使用這些詳細信息從Kubernetes集群查詢資源。我們可以手動配置這些詳細信息,也可以使用kubectl客戶端在配置文件中進行更改。Kubeconfig文件與任何其他Kubernetes資源清單一樣,具有三個主要部分:集群,上下文和用戶。顧名思義,kubeconfig文件的clusters部分將包含集群的詳細信息。用戶部分將具有用戶的詳細信息,而上下文部分將具有集群與用戶之間的關係。配置文件中還有另一個字段,用於告訴我們當前配置的上下文。如果在使用kubectl時未提供任何上下文,則將使用此上下文。

這是我擁有的kubeconfig文件的示例。

<code># cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority: /home/vivek/.minikube/ca.crt
server: https://192.168.99.100:8443
name: minikube
contexts:
- context:
cluster: minikube
user: minikube
name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
user:
client-certificate: /home/vivek/.minikube/client.crt
client-key: /home/vivek/.minikube/client.key
/<code>

將條目添加到用戶部分

讓我們繼續添加已創建的用戶。要將用戶添加到Kubeconfig文件中,我們可以執行以下命令(set-credentials)。請確保您提供了私鑰和DevUser證書的正確路徑。

$ kubectl config set-credentials DevUser –客戶端證書$ {HOME} /。kube / DevUser.crt –client-key $ {HOME} /。kube / DevUser.key用戶設置了“ DevUser”。

現在,如果我們使用kubectl config view命令查看配置文件,我們將能夠看到在用戶部分下添加的新用戶。

<code>$ kubectl config view
…
users:
- name: DevUser
user:
client-certificate: DevUser.crt
client-key: DevUser.key
- name: minikube
user:
client-certificate: /home/vivek/.minikube/client.crt
client-key: /home/vivek/.minikube/client.key/<code>

將條目添加到上下文部分

下一步是在配置文件中添加一個上下文,該上下文將允許該用戶(DevUser)訪問集群中的開發名稱空間。使用以下命令執行相同的操作。

<code>$ kubectl config set-context DevUser-context --cluster=minikube --namespace=development --user=DevUser
Context "DevUser-context" created./<code>

驗證是否已將其他上下文添加到配置文件。

<code># cat ~/.kube/config
…
contexts:
- context:
cluster: minikube
namespace: development
user: DevUser
name: DevUser-context
- context:
cluster: minikube
user: minikube
name: minikube/<code>

向用戶添加更多權限

運行 kubectl get pods 將返回 當前上下文 minikube的名稱空間默認資源 。但是,如果我們更改上下文 ,則將無法訪問資源。因此,使用新的上下文運行 將導致以下錯誤DevUser-contextkubectl get pods

<code>$ kubectl get pods --context=DevUser-context 
Error from server (Forbidden): pods is forbidden: User "DevUser" cannot list resource "pods" in API group "" in the namespace "development"/<code>

為了使這個新創建的用戶只能訪問開發名稱空間中的Pod,讓我們創建一個角色,然後使用角色綁定資源將該角色綁定到DevUser。角色就像任何其他Kubernetes資源一樣。它決定了某人扮演該角色時可以採取的資源和操作。使用以下清單創建角色資源,

<code>kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: dev-role
namespace: development
rules:
- apiGroups: [""] 
resources: ["pods"]
verbs: ["get", "update", "list"]/<code>

我們僅提供動詞get,update和list。這樣可以確保DevUser僅能在pod上進行獲取,更新和列出活動,而不能進行其他任何操作。

使用角色綁定DevUser資源將上面創建的角色綁定到 以下清單

<code>kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: dev-DevUser
namespace: development
subjects:
- kind: User
name: DevUser
apiGroup: ""
roleRef:
kind: Role
name: dev-role
apiGroup: ""/<code>

因此,您可以在這裡看到我們正在將角色dev-role(我們之前創建的)與關聯 DevUser。

創建角色和角色綁定之後,讓我們嘗試再次列出窗格。我們將能夠成功列出它們。

<code>$ kubectl get pods --context=DevUser-context 
No resources found.
# we are not able to see any resources because we don't have any pods running
# in development namespace/<code>

如您現在所見,我們能夠使用新創建的上下文列出資源。我們知道 DevUser 只能接收,更新和列出Pod。讓我們嘗試使用此上下文創建容器。

<code>$ kubectl run nginx --image=nginx --context=DevUser-context 
Error from server (Forbidden): deployments.apps is forbidden: User "DevUser" cannot create resource "deployments" in API group "apps" in the namespace "development"/<code>

同樣,如果您嘗試使用此上下文刪除正在運行的窗格,則將無法刪除。如果您還希望允許該用戶創建和刪除,則只需更改分配給該用戶的角色。確保角色中有正確的資源和動詞。

如果要允許其他用戶訪問您的群集,請重複這些步驟。


分享到:


相關文章: