一、RBAC授權(quán)認證理論知識
1、什么是RBAC授權(quán)?
RBAC是一種基于角色訪問控制方式,它將權(quán)限和角色相關(guān)聯(lián),用戶加入到角色中,就會擁有角色中的權(quán)限,RBAC的核心思想是,將權(quán)限賦予給角色,角色中加入多個用戶,加入進來的用戶會具有角色的權(quán)限,如果修改權(quán)限也是針對角色進行操作,而不是針對每個用戶進行權(quán)限操作,這樣效率太低了。
2、認證基本流程
第一步:認證,針對用戶做認證,判斷用戶是否符合要求
K8S中主要通過APIservice對外提供服務(wù),那么就需要針對apiserver做用戶認證,如果任何用戶都可以訪問apiserver,那么就可以隨意在K8S集群中創(chuàng)建、刪除等操作,這就很危險了,也容易遭到黑客的攻擊,所以我們需要針對apiserver做用戶授權(quán)認證,確保是合法符合要求的用戶。
第二步:授權(quán),認證通過,針對用戶做權(quán)限控制,賦予那些權(quán)限
認證通過后僅僅表示此用戶是被apiserver進行的用戶,可以訪問apiserver,但是不一定擁有刪除資源,創(chuàng)建資源的權(quán)限,需要進行授權(quán)操作,常見的授權(quán)方式有rbac授權(quán)。
第三步:準入控制
用戶認證授權(quán)通過后,最后一步就是準入控制,K8S提供多種準入控制,有點類似于插件,為apiserver提供更好的 “可拓展性”。請求apiserver時,通過認證,鑒權(quán)后、持久化(api對象,保存到etcd前),會經(jīng)過"準入控制",它可以做變更和驗證。
比如:如果我們創(chuàng)建Pod時定義了資源上下限制,但不滿足LimitRange規(guī)則中定義的資源上下限制,此時LimitRange就會拒絕我們的請求,假如我們定義了一個名稱空間叫test,這個名稱空間做下資源限制:限制最多可以使用10vCPU、10Gi內(nèi)存,在這個名稱空間下創(chuàng)建的所有Pod都不能超過這個限制。
3、K8S客戶端訪問apiserver的認證幾方式
1、第一種:客戶端認證
客戶端認證也稱雙向TLS認證,kubectl在訪問apiserver的時候,apiserver要經(jīng)過CA認證kubectl用戶是否合法的,如下圖:
2、第二種:Bearertoken方式
Bearetoken方式,可以理解為apiserver將一個密碼通過非對稱加密方式告訴你了kubectl,然后通過該密碼進行相互訪問,如下圖:
3、第三種:Serviceaccount方式
上面客戶端認證、Bearertoken都是外部訪問apiserver的時候使用的方式,而Serviceaccount這種方式是內(nèi)部訪問Pod和apiserver交互采用的一種方式。
Serviceaccount包括了Namespace、Token、CA、且通過目錄掛載的方式給予Pod,當(dāng)Pod運行起來的時候,會讀取到這些信息,從而使用該方式和apiserver進行通信,如下圖:
當(dāng)我們使用kubectl操作K8S資源時,需要確定我們使用那個用戶進行1訪問那個K8S集群,kubectl操作默認讀取 /root/.kube/config
文件,也可以使用 kubectl config view
命令進行差看config文件內(nèi)容。
如果config文件沒有在/root/.kube/config
,可以使用 --kubeconfig
參數(shù)進行指定文件位置:
kubectl get nodes --kubeconfig=/root/.kube/config
config文件內(nèi)容如下:
4、RBAC授權(quán)常見角色綁定方式
1、第一種:用戶基于RoleBinding綁定到Role上
特點:RoleBinding是具有名稱空間限制的,這種方式只限定在Rolebinding的名稱空間下,如下圖:
2、第二種:用戶基于RoleBinding綁定到ClusterRole上
特點:沒有名稱空間限制,如下圖:
3、第三種:用戶基于ClusterRoleBinding綁定到ClusterRole上
特點:對任何名稱空間下用戶都具有ClusteRrole所具有的權(quán)限,如下圖:
5、準入控制插件基本介紹
官方中文參考文檔
在K8S中準入控制器的模塊有很多,其中比較常用的有LimitRanger、ResourceQuota、ServiceAccount,也是K8S默認啟用的準入模塊(具體看K8S版本),我們只需要定義對應(yīng)的規(guī)則即可。
如果是使用kubeadm方式搭建的K8S集群,我們可以修改 /etc/kubernetes/manifests/kube-apiserver.yaml
文件中--enable-admission-plugins
參數(shù)定義使用的準入插件,多個使用逗號隔開,改完重啟kubelet即可生效。
二、Useraccount、Serviceaccount基本使用
1、Useraccount、Serviceaccount介紹
Useraccount:用戶賬戶,是給K8S集群外部用戶使用的,如kubectl訪問K8S集群要用useraccount用戶,kubeadm搭建的K8s集群默認useraccount用戶是kubernetes-admin
。
apiserver需要對客戶端做認證,使用kubeadm安裝的K8s,會在用戶家目錄下創(chuàng)建一個認證配置文件 .kube/config
這里面保存了客戶端訪問API Server的密鑰相關(guān)信息,這樣當(dāng)用kubectl訪問k8s時,它就會自動讀取該配置文件,向API Server發(fā)起認證,然后完成操作請求。
Serviceaccount:服務(wù)賬戶,是給Pod使用的賬戶,就是在Pod容器內(nèi)可以訪問到apiserver,serviceaccount僅局限它所在的名稱空間,每個名稱空間創(chuàng)建是都會自動創(chuàng)建一個默認的serviceaccount,在創(chuàng)建Pod時,指定了此名稱空間,且沒有指定serviceaccount,那么這個Pod會使用此名稱空間下默認的serviceaccount。
如下圖,是在創(chuàng)建Pod時沒有指定serviceaccount,會使用名稱空間下默認的serviceaccount。
2、案例:創(chuàng)建ServiceAccount綁定到Pod
第一步:創(chuàng)建名為sa-test
的ServiceAccount
kubectl create sa sa-test
第二步:創(chuàng)建Pod指定ServiceAccount
cat sa-test.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: sa-test
namespace: default
spec:
serviceAccountName: sa-test # 指定sa
containers:
- name: sa-nginx
image: nginx
imagePullPolicy: IfNotPresent
kubectl apply -f sa-test.yaml
第三步:進入容器測試是否可以調(diào)用apiserver接口
kubectl exec -it sa-test -- /bin/bash
指定sa后證書存放在/var/run/secrets/kubernetes.io/serviceaccount/
目錄
cd /var/run/secrets/kubernetes.io/serviceaccount/
ls
ca.crt namespace token
我們指定證書調(diào)用apiserver接口
curl --cacert ./ca.crt -H "Authorization: Bearer $(cat ./token)" https://kubernetesapi/v1/namespaces/kube-system
返回信息如下:就是被拒絕訪問了,原因是我們只創(chuàng)建了sa用戶,沒進行授權(quán)
第四步:對sa做授權(quán),然后在進行訪問
創(chuàng)建一個 ClusterRoleBinding(集群角色綁定)來授予名為 sa-test
的服務(wù)賬號在 default
命名空間下?lián)碛?cluster-admin
集群角色的權(quán)限。通過這個綁定,sa-test
可以在整個集群中擁有最高權(quán)限,包括對集群節(jié)點、命名空間、Pod 等資源的管理權(quán)限。
kubectl create clusterrolebinding sa-test-admin --clusterrole=cluster-admin --serviceaccount=default:sa-test
進入容器在請求一下:
kubectl exec -it sa-test -- /bin/bash
cd /var/run/secrets/kubernetes.io/serviceaccount/
curl --cacert ./ca.crt -H "Authorization: Bearer $(cat ./token)" https://kubernetesapi/v1/namespaces/kube-system
進行授權(quán)后就可以訪問到apiserver接口了如下圖:
文章來源:http://www.zghlxwxcb.cn/news/detail-596401.html
由于RBAC授權(quán)內(nèi)容較多,分兩次進行講解,請關(guān)下篇文章,感謝支持~文章來源地址http://www.zghlxwxcb.cn/news/detail-596401.html
到了這里,關(guān)于【Kubernetes運維篇】RBAC認證授權(quán)詳解(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!