k8s-RBAC授權-十六


一、簡介

基於角色的訪問控制(“RBAC”)

http://docs.kubernetes.org.cn/80.html

(1)

Kubernetes的授權是基於插件形式的,常用的授權插件有以下幾種:

  1. Node:node節點授權
  2. ABAC:基於屬性的訪問控制
  3. RBAC:基於角色的訪問控制
  4. Webhook:自定義http回調方法

RBAC:http://docs.kubernetes.org.cn/148.html

  

基於角色的訪問控制:如圖,先讓一個用戶(Users)扮演一個角色(Role),讓角色(Role)擁有權限,從而讓用戶擁有這樣的權限,然后在授權機制當中,只需要將權限授予某個角色,此時用戶將獲取對應角色的權限,從而實現角色的訪問控制;

(2)Role和ClusterRole 

  Role是一系列的權限的集合,例如一個Role可以包含讀取 Pod 的權限和列出 Pod 的權限, ClusterRole 跟 Role 類似,但是可以在集群中全局使用。

  Role只能授予單個namespace 中資源的訪問權限。

  ClusterRole授權 >= Role授予(與Role類似),但ClusterRole屬於集群級別對象:

    • 集群范圍(cluster-scoped)的資源訪問控制(如:節點訪問權限)
    • 非資源類型(如“/ healthz”)
    • 所有namespaces 中的namespaced 資源(如 pod)

 (3)RoleBinding和ClusterRoleBinding

RoleBinding是將Role中定義的權限授予給用戶或用戶組。它包含一個subjects列表(users,groups ,service accounts),並引用該Role,Role有了權限,用戶也就有了權限。RoleBinding在某個namespace 內授權,ClusterRoleBinding適用在集群范圍內使用。

   RoleBinding可以引用相同namespace下定義的Role。

  Role和ClusterRole、RoleBinding和ClusterRoleBinding關系如下圖:

   

(4)

 使用RoleBinding去綁定ClusterRole:

如果有10個名稱空間,每個名稱空間都需要一個管理員,而這些管理員的權限都是一致的。那么此時需要去定義這樣的管理員,使用RoleBinding就需要創建10個Role,這樣顯得很麻煩。為此當使用RoleBinding去綁定一個ClusterRole時,該User僅僅擁有對當前名稱空間的集群操作權限,而不是擁有所有名稱空間的權限,所以此時只需要創建一個ClusterRole代替掉10個Role就解決了以上的需求。

 二、RBAC應用

 (1)Role --> User -->Rolebinding 

  用法:

   

  使用kubectl create進行創建角色(role),指定角色名稱,--verb指定權限,--resource指定資源或者資源組,--dry-run:此模式不會真的創建;

  a、

   [root@master ~]# kubectl create role pods-reader --verb=get,list,watch --resource=pods --dry-run -o yaml  #先用--dry-run模式看一下role的定義

   

  b、生成資源定義清單

  [root@master ~]# cd manifests/

  #導出yaml文件,稍微編輯一下就能用了
  [root@master manifests]# kubectl create role pods-reader --verb=get,list,watch --resource=pods --dry-run -o yaml >role-demo.yaml

  [root@master manifests]# vim role-demo.yaml

  

  c、創建

  

(2)RoleBinding角色綁定  

創建方法:

使用kubectl create進行創建角色綁定,指定角色綁定的名稱,--role|--clusterrole指定綁定哪個角色,--user指定哪個用戶;  

  a、導出rolebinding資源定義清單文件

  [root@master manifests]# kubectl explain role  #查看資源定義清單字段

  [root@master manifests]# kubectl explain rolebinding  #查看資源定義清單字段

  [root@master manifests]# kubectl create rolebinding magedu-read-pods --role=pods-reader --user=magedu --dry-run -o yaml > rolebinding-demo.yaml

   

  b、創建,將權限授權給用戶magedu

  [root@master manifests]# kubectl apply -f rolebinding-demo.yaml

  

  c、可見magedu已經綁定到了pods-reader角色上了;

  

   d、切換用戶訪問

  

  現在magedu已經有權限訪問了;

  以上操作role和rolebinding都是只對當前名稱空間生效;

   [root@master ~]# kubectl config use-context kubernetes-admin@kubernetes  #切換回kubernetes-admin用戶

 

(2)ClusterRole-->ClusterRoleBinding-->User

  [root@master manifests]# kubectl explain clusterrole  #查看資源定義清單字段

  [root@master manifests]# kubectl explain clusterrolebinding  #查看資源定義清單字段

  a、導出clusterrole的資源定義清單文件

  [root@master manifests]# kubectl create clusterrole cluster-read --verb=get,list,watch --resource=pods -o yaml >clusterrole-demo.yaml

  [root@master manifests]# vim clusterrole-demo.yaml

  

  b、創建clusterrole

  [root@master manifests]# kubectl apply -f clusterrole-demo.yaml 

   此時我們可以新建一個Linux系統賬戶,然后在這個系統賬戶下,將kubernetes的用戶切換到magedu下,隨后對magedu賦予clusterrole的權限;

  

  

  c、此時我們刪除之前創建的rolebinding 解除magedu的權限;

  

  可見此時magedu已經沒有了權限;

  

   d、創建clusterrolebinding

  導出yaml資源定義清單文件:

  [root@master ~]# kubectl create clusterrolebinding magedu-read-all-pods --clusterrole=cluster-read --user=magedu --dry-run -o yaml >manifests/clusterrolebinding-demo.yaml

  [root@master manifests]# vim clusterrolebinding-demo.yaml

  

  創建,將magedu綁定到clusterrole:

  [root@master manifests]# kubectl apply -f clusterrolebinding-demo.yaml

  

  查看,可見已經綁定到集群角色:

  

  

  e、此時我們切換到系統用戶為ik8s的窗口,並且kubernetes的用戶為maedu

  

  查看其他namespace的pod, 也是可以的:

  

  但是,現在是不能刪pod的,因為沒有授權:

  

以上可見,對用戶magedu進行集群角色綁定,用戶magedu將會獲取對集群內所有資源的(namespace)對應權限。

 (3)clusterrole --> rolebinding --> user

  將maedu通過rolebinding到集群角色clusterrole中,此時,magedu僅作用於當前名稱空間的所有pods資源的權限;

  a、刪除之前的clusterrolebinding

  

  b、導出yaml資源定義清單文件

  [root@master manifests]# kubectl create rolebinding magedu-read-pods --clusterrole=cluster-read --user=magedu --dry-run -o yaml >rolebinding-clusterrole-dmeo.yaml

  [root@master manifests]# vim rolebinding-clusterrole-dmeo.yaml

  

  c、創建rolebinding,將magedu綁定到clusterrole

  

  查看rolebinding

  

  可見magedu已經綁定到集群角色clusterrole上了;

  d、此時切換到系統用戶ik8s的窗口

  可見magedu可以訪問當前namespace的pod,但是不能訪問其他namespace的pod;

  因為這種綁定方式,clusterrole是被降級的;

  

 (4)RBAC的三種授權訪問方式

RBAC不僅可以對user進行訪問權限的控制,還可以通過group和serviceaccount進行訪問權限控制。user即單個用戶,group是對一個組內的user進行授權;

上一節學習了Pod可以通過 spec.serviceAccountName來定義其是以某個serviceaccount的身份進行運行,當我們通過RBAC對serviceaccount進行訪問授權時,就可以實現Pod對其他資源的訪問權限進行控制。也就是說,當我們對serviceaccount進行rolebinding或clusterrolebinding,會使創建Pod擁有對應角色的權限和apiserver進行通信。

             

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM