kubernetes筆記-RBAC

什么是RBAC?

基于角色的訪問控制讨韭,廣泛使用于各種計(jì)算機(jī)系統(tǒng)


image.png
怎么在k8s中使用RBAC能扒?

apiserver啟動(dòng)時(shí)增加 --authorization-mode=RBAC參數(shù),kubeadm創(chuàng)建的集群缺省添加有此參數(shù)

kube-apiserver --advertise-address=192.168.3.101 --allow-privileged=true --authorization-mode=Node,RBAC --client-ca-file=/etc/kubernetes/pki/ca.crt --enable-admission-plugins=NodeRestriction --enable-bootstrap-token-auth=true --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key --etcd-servers=https://192.168.3.101:2379,https://192.168.3.102:2379,https://192.168.3.103:2379 --insecure-port=0 --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key --requestheader-allowed-names=front-proxy-client --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-key-file=/etc/kubernetes/pki/sa.pub --service-cluster-ip-range=10.96.0.0/12 --tls-cert-file=/etc/kubernetes/pki/apiserver.crt --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
Role和ClusterRole

Role是命名空間內(nèi)權(quán)限的集合
ClusterRole是集群權(quán)限的集合齿坷,包含命名空間內(nèi)的權(quán)限和其他集群權(quán)限


image.png

以下是一個(gè)Role的例子桂肌,Role pod-reader在namespace default中具有g(shù)et/watch/list pods的權(quán)限

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]     # ""表示核心api group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

以下是一個(gè)ClusterRole的例子,ClusterRole secret-reader在所有namespace中具有g(shù)et/watch/list secrets的權(quán)限

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]
Aggregated ClusterRoles

Aggregated ClusterRoles可以將多個(gè)ClusterRoles的權(quán)限結(jié)合到一起,采用的是標(biāo)簽選擇器的方式

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: monitoring
aggregationRule:
  clusterRoleSelectors:
  - matchLabels:
      rbac.example.com/aggregate-to-monitoring: "true"
rules: []             # 由controller manager自動(dòng)填寫
權(quán)限

權(quán)限體現(xiàn)在api URL中針對(duì)各種資源的verbs永淌。有一些資源擁有子資源崎场,例如pod,擁有子資源log.

GET /api/v1/namespaces/{namespace}/pods/{name}/log

Role需要子資源的權(quán)限遂蛀,也需要在resources中聲明

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-and-pod-logs-reader
rules:
- apiGroups: [""]
  resources: ["pods", "pods/log"]
  verbs: ["get", "list"]

也可以使用resourceNames限制到具體的對(duì)象谭跨,常見的verbs有“get”、“delete”李滴、“update”和 “patch” 螃宙。當(dāng)聲明resourceNames,verb不能為list所坯、watch谆扎、create和deletecollection

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: configmap-updater
rules:
- apiGroups: [""]
  resources: ["configmaps"]
  resourceNames: ["my-configmap"]
  verbs: ["update", "get"]
RoleBinding和ClusterRoleBinding
image.png

Binding 就是 用戶和角色之間的綁定關(guān)系,也分為RoleBinding 和ClusterRoleBinding
以下是一個(gè)RoleBinding的例子芹助,用戶jane與Role pod-reader綁定

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: jane                # 用戶名大小寫敏感
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role                  #這里必須是Role或者ClusterRole
  name: pod-reader     #匹配Role或者ClusterRole
  apiGroup: rbac.authorization.k8s.io

以下是另一個(gè)RoleBinding的例子堂湖,用戶dave 與ClusterRole secret-reader綁定闲先。需要注意,RoleBinding是有namespace限制的无蜂,用戶只在 RoleBinding的namespace擁有ClusterRole的權(quán)限

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-secrets
  namespace: development 
subjects:
- kind: User
  name: dave 
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io

以下是一個(gè)ClusterRoleBinding的例子伺糠,用戶組 manager與ClusterRole secret-reader綁定

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: read-secrets-global
subjects:
- kind: Group
  name: manager 
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io

RoleBinding和ClusterRoleBinding中的roleRef不能修改,想要修改只能刪除重建斥季。

Subjects

Subjects可以是用戶训桶、用戶組和service account。


image.png

帶有‘system:’前綴的用戶和用戶組保留給系統(tǒng)使用酣倾,其他名字都可以用


image.png

在pod中不聲明spec.serviceAccountName渊迁,則pod會(huì)使用缺省的serviceaccount,一般是default

缺省Role和ClusterRole

所有缺省Role和ClusterRole都用kubernetes.io/bootstrapping=rbac標(biāo)簽灶挟,并使用’system:'前綴標(biāo)識(shí)琉朽。
每次啟動(dòng),apiserver都會(huì)使用缺省的Role和ClusterRole更新配置稚铣,可以修復(fù)意外修改造成的問題箱叁。

以heapster為例分析serviceAccount RBAC的使用

deployment heapster中使用serviceAccountName heapster

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: heapster
  namespace: kube-system
spec:
  replicas: 1
  template:
    metadata:
      labels:
        task: monitoring
        k8s-app: heapster
    spec:
      serviceAccountName: heapster
      containers:
      - name: heapster
        image: k8s.gcr.io/heapster-amd64:v1.5.4
        imagePullPolicy: IfNotPresent
        command:
        - /heapster
        - --source=kubernetes:https://kubernetes.default
        - --sink=influxdb:http://monitoring-influxdb.kube-system.svc:8086

ServiceAccount heapster綁定ClusterRole system:heapster

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
 {"apiVersion":"rbac.authorization.k8s.io/v1beta1","kind":"ClusterRoleBinding","metadata":{"annotations":{},"name":"heapster"},"roleRef":{"apiGroup":"rbac.authorization.k8s.io","kind":"ClusterRole","name":"system:heapster"},"subjects":[{"kind":"ServiceAccount","name":"heapster","namespace":"kube-system"}]}
  creationTimestamp: 2019-05-15T07:17:42Z
  name: heapster
  resourceVersion: "2275681"
  selfLink: /apis/rbac.authorization.k8s.io/v1/clusterrolebindings/heapster
  uid: 87623890-76e1-11e9-bc74-52540005f38a
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:heapster              
subjects:
- kind: ServiceAccount
  name: heapster
  namespace: kube-system

查看ClusterRole system:heapster的權(quán)限

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  creationTimestamp: 2019-04-30T06:52:29Z
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: system:heapster
  resourceVersion: "138722"
  selfLink: /apis/rbac.authorization.k8s.io/v1/clusterroles/system%3Aheapster
  uid: 85945bd1-6b14-11e9-bc74-52540005f38a
rules:
- apiGroups:
  - ""
  resources:
  - events
  - namespaces
  - nodes
  - pods
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - extensions
  resources:
  - deployments
  verbs:
  - get
  - list
  - watch
以kubectl為例分析userAccount RBAC的使用

新建用戶panmeng的證書

openssl genrsa -out panmeng.key 2048
openssl req -new -key panmeng.key -out panmeng.csr -subj "/CN=panmeng"
openssl x509 -req -in panmeng.csr -out panmeng.crt -sha1 -CA ca.crt -CAkey ca.key  -CAcreateserial -days 3650

新建role及rolebinding,使用戶panmeng 具有 list和get pod的權(quán)限

kubectl create role getpods --verb=get --verb=list --resource=pods
kubectl create rolebinding panmeng-getpods --role=getpods --user=panmeng --namespace=default

修改kubectl配置文件,并切換context

kubectl config set-credentials panmeng --client-certificate=/etc/kubernetes/pki/panmeng.crt --client-key=/etc/kubernetes/pki/panmeng.key  --username=panmeng --embed-certs=true
kubectl config set-context --cluster=kubernetes --user=panmeng
kubectl config use-context context-panmeng 

驗(yàn)證效果

# kubectl get nodes
Error from server (Forbidden): nodes is forbidden: User "panmeng" cannot list resource "nodes" in API group "" at the cluster scope
# kubectl get pods 
NAME            READY   STATUS             RESTARTS   AGE
gc-test         0/2     CrashLoopBackOff   1086       47h
testpod-5wtb7   1/1     Running            0          15d
testpod-646d8   1/1     Running            0          15d
testpod-qczvt   1/1     Running            0          15d
# kubectl delete pod gc-test
Error from server (Forbidden): pods "gc-test" is forbidden: User "panmeng" cannot delete resource "pods" in API group "" in the namespace "default"
# kubectl auth can-i list pods
yes
# kubectl auth can-i get pods 
yes
# kubectl auth can-i delete pods
no
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惕医,一起剝皮案震驚了整個(gè)濱河市耕漱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抬伺,老刑警劉巖螟够,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異峡钓,居然都是意外死亡妓笙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門能岩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寞宫,“玉大人,你說我怎么就攤上這事拉鹃”哺常” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵膏燕,是天一觀的道長钥屈。 經(jīng)常有香客問我,道長坝辫,這世上最難降的妖魔是什么篷就? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮阀溶,結(jié)果婚禮上腻脏,老公的妹妹穿的比我還像新娘鸦泳。我一直安慰自己银锻,他們只是感情好永品,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著击纬,像睡著了一般鼎姐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上更振,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天炕桨,我揣著相機(jī)與錄音,去河邊找鬼肯腕。 笑死献宫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的实撒。 我是一名探鬼主播姊途,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼知态!你這毒婦竟也來了捷兰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤负敏,失蹤者是張志新(化名)和其女友劉穎贡茅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體其做,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡顶考,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妖泄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片村怪。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖浮庐,靈堂內(nèi)的尸體忽然破棺而出甚负,到底是詐尸還是另有隱情,我是刑警寧澤审残,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布梭域,位于F島的核電站,受9級(jí)特大地震影響搅轿,放射性物質(zhì)發(fā)生泄漏病涨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一璧坟、第九天 我趴在偏房一處隱蔽的房頂上張望既穆。 院中可真熱鬧赎懦,春花似錦、人聲如沸幻工。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽囊颅。三九已至当悔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間踢代,已是汗流浹背盲憎。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胳挎,地道東北人饼疙。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像慕爬,于是被迫代替她去往敵國和親窑眯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容