kubernetes API 訪問控制在阿里雲容器服務(ACK)上的實踐

提起K8s API的訪問控制,不少同窗應該都會想到RBAC,這是K8s用來作權限控制的方法,可是K8s對API的訪問控制卻不止於此,今天咱們就來簡單介紹下K8s的訪問控制以及ACK如何利用這套方法提供便捷的訪問控制管理node

訪問控制簡要說明
圖片描述
控制流程如上圖所示,咱們今天關注點在前兩步,也就是圖中的Authentication和Authorizationapi

Authentication作的是身份校驗,Authentication支持的方法包括X509 Client Certs、Password、Plain Tokens、Bootstrap Tokens 和 JWT Tokens,今天咱們要實踐的就是X509 Client Certs校驗方式工具

API server啓動時傳入--client-ca-file=SOMEFILE便可啓用證書校驗,參數指定的文件中必須包含至少一個CA證書用於校驗傳入的客戶端證書。
驗證經過後,證書中的common name(CN)字段會做爲請求的username,organization(O)字段做爲請求的group阿里雲

Authorization作的是受權鑑定,一個請求經過Authentication後,會帶着一個user和group,Authorization作的就是判斷請求的方法(verb)和對象(object)是否在user和group的權限範圍內;從1.8版本以後,RBAC模式進入stable狀態,也是ACK默認啓用的鑑權方式,RBAC模塊會經過role/clusterrole和rolebinding/clusterrolebinding來鑑定請求所關聯的user和group是否有操做的權限spa

下面咱們經過操做來看下ACK上是如何作這些事的3d

環境準備
kubernetes
能夠經過容器服務管理控制檯很是方便地快速建立 Kubernetes 集羣。具體過程能夠參考這裏code

一個授予集羣權限的子帳號
子帳號綁定的操做請參考這裏server

驗證
咱們按照上面的步驟操做,給子帳號綁定default空間下的開發人員角色
圖片描述對象

登陸子帳號,在集羣的詳情頁找到kubeconfig的信息,複製其中的user.client-certificate-data字段,執行下面的命令圖片

echo $CERTIFICATE | base64 -D > test.crt
openssl x509 -in test.crt -noout -text
會看到相似下面的輸出

Certificate:

Data:
    Version: 3 (0x2)
    Serial Number: 980377 (0xef599)
Signature Algorithm: sha256WithRSAEncryption
    Issuer: O=cb4541f68933d4927b445b1eec47ce8b6, OU=default, CN=cb4541f68933d4927b445b1eec47ce8b6
    Validity
        Not Before: Apr 24 08:19:00 2019 GMT
        Not After : Apr 23 08:24:49 2022 GMT
    Subject: O=system:users, OU=, CN=232157355171679750
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
            Public-Key: (1024 bit)
    ...

看證書的subject字段,O=system:users CN=232157355171679750,表示使用這個證書做爲身份校驗的請求,在服務端看來,user是232157355171679750,group是system:users

接下來咱們繼續看這個user和group在集羣中被賦予的權限

~ kubectl get rolebinding
NAME AGE
232157355171679750-default-rolebinding 10s

~ kubectl get rolebinding 232157355171679750-default-rolebinding -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
...
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cs:ns:dev
subjects:

  • apiGroup: rbac.authorization.k8s.io
    kind: User
    name: "232157355171679750"

能夠看到user 232157355171679750被綁定了cs:ns:dev這個集羣角色,能夠操做許多資源,可是都被限制在default這個namespace下(不能查看node,由於node是跨namespace的資源),由於給這個user綁定是經過rolebinding來作的,是受namespace的約束的(kubectl describe clusterrole cs:ns:dev便可看到這個子帳號被授予的全部權限)

咱們再給帳號擴大一些權限,此次給他綁定整個集羣的管理員角色
圖片描述
而後咱們就會發現剛纔的rolebinding已經被刪除了

~ kubectl get rolebinding
No resources found.
由於此次綁定是整個集羣範圍內的,因此產生的是clusterrolebinding

~ kubectl get clusterrolebinding
NAME AGE
232157355171679750-clusterrolebinding 3s
能夠用上面的方法繼續查看集羣管理員角色下的全部權限

可是集羣管理員並非權限最高的角色,權限最高的角色是自定義列表中的cluster-admin,這是kubernetes集羣啓動後內置的角色,也是主帳號建立集羣后生成的config文件中綁定的角色

角色和權限的選擇
既然kubernetes中內置了許多的role和clusterrole,那咱們該如何選擇呢?又如何判斷當前的角色是否知足了需求呢?

還好kubectl已經提供了對應的命令來幫助咱們快速判斷權限是否充分

kubectl auth can-i <verb> <resource> [<resourceName>]
咱們仍是以一個被綁定了集羣管理員的角色爲例,下面的kubectl命令均是使用了對應的config文件

~ kubectl auth can-i delete no
yes

~ kubectl auth can-i drain no
no - no RBAC policy matched

~ kubectl auth can-i taint no
no - no RBAC policy matched

~ kubectl auth can-i cordon no
no - no RBAC policy matched

~ kubectl auth can-i label no
no - no RBAC policy matched

~ kubectl auth can-i delete pv
yes

~ kubectl auth can-i delete pvc
yes
咱們看到這個角色的能夠刪除node、pv和pvc,可是不能對node作drain,taint,cordon,label,能夠利用這個工具快速定位操做失敗是否和權限有關

總結ACK將阿里雲上的子帳號系統和kubernetes自己的訪問控制很是平滑的鏈接在一塊兒,對用戶很是友好,不須要花太多的精力在RBAC的細節上,極大的下降了使用門檻

相關文章
相關標籤/搜索