k8s-RBAC受權-十六

1、簡介html

基於角色的訪問控制(「RBAC」)node

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

(1)api

Kubernetes的受權是基於插件形式的,經常使用的受權插件有如下幾種:app

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

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

  

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

(2)Role和ClusterRole 插件

  Role是一系列的權限的集合,例如一個Role能夠包含讀取 Pod 的權限和列出 Pod 的權限, ClusterRole 跟 Role 相似,可是能夠在集羣中全局使用。3d

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

  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就解決了以上的需求。

 2、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進行通訊。

相關文章
相關標籤/搜索