美文网首页
kubernetes-基于RBAC的授权使用方案总结

kubernetes-基于RBAC的授权使用方案总结

作者: Firetheworld | 来源:发表于2018-12-27 11:06 被阅读0次

简介:在Kubernetes中,RBAC(基于角色的访问控制)。在RABC API中,通过如下的步骤进行授权:1)定义角色:在定义角色时会指定此角色对于资源的访问控制的规则;2)绑定角色:将主体与角色进行绑定,对用户进行访问授权。

关系图

目的:由于k8s对于资源管理的重要性,我们在进行构建k8s的dashboard的时候,需要对资源进行权限的控制,需要使用到kubernetsRBAC进行实现权限的控制。

方案:部署两套dashboard。每一套的权限都不一样。

  • 第一套:拥有超级权限,能够对k8s进行完全的增删查改资源的控制。
  • 第二套:只能进行资源的查看。

原理:第一套dashboard的实现原理:由于k8s官方提给给面向用户的角色中,其中有一个称为:Cluster-admin的超级用户权限。因此,我们直接将创建好的service account与超级用户权限进行绑定,我们通过service account访问dashbaord进行管理k8s的资源。
第二套dashboard的实现原理:
我们在创建集群角色规则的时候,对操作资源进行定义,让资源只拥有可访问的权限。在将此集群角色与创建的service account进行绑定,我们就能够实现资源的访问权限。
我们根据方案进行yaml文件的编写。(编写yaml文件后,进行构建,即可生成dashboard)

第一套的dashboard的代码以及注释如下k8s-common.yaml

# ------------------- Dashboard Secret ------------------- #创建字典,登陆dashboard的时候需要使用到字典生成的Token
apiVersion: v1  #调用api的版本
kind: Secret   #创建的类型
metadata:     
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-certs #自定义创建字典的名称
  namespace: kube-system            #指定命名空间
type: Opaque                              #字典类型

---

 # ------------------- Dashboard Service Account ------------------- #服务账号创建
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system

---
 # ------------------- Dashboard Role & ClusterRole Binding ------------------- #集群角色
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
  labels:
    k8s-app: kubernetes-dashboard
roleRef:                
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin      #k8s中默认的面向用户的角色的超级管理员权限。直接调用
subjects:
  - kind: ServiceAccount      #绑定创建的sa账户
    name: kubernetes-dashboard
    namespace: kube-system
---
# ------------------- Dashboard Deployment ------------------- #

kind: Deployment
apiVersion: apps/v1beta2
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: kubernetes-dashboard
  template:
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
    spec:
      nodeSelector:
        kubernetes.io/hostname: k8s-node10-18-223-243     #部署指定的k8s节点上
      containers:              #拉取dashboard的镜像
      - name: kubernetes-dashboard
        image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9090
          protocol: TCP
        args:
          - --auto-generate-certificates
          # Uncomment the following line to manually specify Kubernetes API server Host
          # If not specified, Dashboard will attempt to auto discover the API server and connect
          # to it. Uncomment only if the default does not work.
          # - --apiserver-host=http://my-address:port
          #- --heapster-host=http://heapster
        volumeMounts:
        - name: kubernetes-dashboard-certs
          mountPath: /certs
          # Create on-disk volume to store exec logs
        - mountPath: /tmp
          name: tmp-volume
      volumes:
      - name: kubernetes-dashboard-certs
        secret:
          secretName: kubernetes-dashboard-certs
      - name: tmp-volume
        emptyDir: {}
      serviceAccountName: kubernetes-dashboard
      # Comment the following tolerations if Dashboard must not be deployed on master
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule

---
# ------------------- Dashboard Service ------------------- #

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 9090
      nodePort: 30002    #暴露访问端口
  selector:
    k8s-app: kubernetes-dashboard

  • 生成dashboard:
# kubectl create -f k8s-common.yaml

第二套的dashboard的代码以及注释如下k8s-super.yaml:

# ------------------- Dashboard Secret ------------------- #创建字典
apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: grayson-ds
  name: grayson-ds-certs
  namespace: kube-system
type: Opaque

---

 # ------------------- Dashboard Service Account ------------------- #创建service account
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: grayson-ds
  name: grayson-ds
  namespace: kube-system
---
 # ------------------- ClusterRole  ------------------- #集群角色资源的操作定义
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: dashboard-viewonly
rules:
- apiGroups:
  - ""
  resources:
  - configmaps
  - endpoints
  - persistentvolumeclaims
  - pods
  - replicationcontrollers
  - replicationcontrollers/scale
  - serviceaccounts
  - services
  - nodes
  - persistentvolumeclaims
  - persistentvolumes
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - secrets 
  verbs:
  - get
  - list
  - watch
  - create
  - update
  - delete

- apiGroups:
  - ""
  resources:
  - bindings
  - events
  - limitranges
  - namespaces/status
  - pods/log
  - pods/status
  - replicationcontrollers/status
  - resourcequotas
  - resourcequotas/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - namespaces
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - apps
  resources:
  - daemonsets
  - deployments
  - deployments/scale
  - replicasets
  - replicasets/scale
  - statefulsets
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - autoscaling
  resources:
  - horizontalpodautoscalers
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - batch
  resources:
  - cronjobs
  - jobs
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - extensions
  resources:
  - daemonsets
  - deployments
  - deployments/scale
  - ingresses
  - networkpolicies
  - replicasets
  - replicasets/scale
  - replicationcontrollers/scale
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - policy
  resources:
  - poddisruptionbudgets
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - networking.k8s.io
  resources:
  - networkpolicies
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - storage.k8s.io
  resources:
  - storageclasses
  - volumeattachments
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - rbac.authorization.k8s.io
  resources:
  - clusterrolebindings
  - clusterroles
  - roles
  - rolebindings
  verbs:
  - get
  - list
  - watch

---
 # ------------------- Dashboard Role & Role Binding ------------------- #集群角色与service account的绑定
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: grayson-ds
  labels:
    k8s-app: grayson-ds
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: dashboard-viewonly
subjects:
  - kind: ServiceAccount
    name: grayson-ds
    namespace: kube-system

---

# ------------------- Dashboard Deployment ------------------- #

kind: Deployment
apiVersion: apps/v1beta2
metadata:
  labels:
    k8s-app: grayson-ds
  name: grayson-ds
  namespace: kube-system
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: grayson-ds
  template:
    metadata:
      labels:
        k8s-app: grayson-ds
    spec:
      nodeSelector:
        kubernetes.io/hostname: k8s-node10-18-223-132  
      containers:
      - name: grayson-ds
        image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8443
          protocol: TCP
        args:
          - --auto-generate-certificates
          # Uncomment the following line to manually specify Kubernetes API server Host
          # If not specified, Dashboard will attempt to auto discover the API server and connect
          # to it. Uncomment only if the default does not work.
          # - --apiserver-host=http://my-address:port
          #- --heapster-host=http://heapster
        volumeMounts:
        - name: grayson-ds-certs
          mountPath: /certs
          # Create on-disk volume to store exec logs
        - mountPath: /tmp
          name: tmp-volume
      volumes:
      - name: grayson-ds-certs
        secret:
          secretName: grayson-ds-certs
      - name: tmp-volume
        emptyDir: {}
      serviceAccountName: grayson-ds
      # Comment the following tolerations if Dashboard must not be deployed on master
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule

---
# ------------------- Dashboard Service ------------------- #

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: grayson-ds
  name: grayson-ds
  namespace: kube-system
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8443
      nodePort: 30443    #暴露访问端口。
  selector:
    k8s-app: grayson-ds

  • 生成dashboard:
# kubectl create -f k8s-super.yaml

下面是详细的k8s的rbac的介绍:

目录

  • RBAC API 概览
    • Role and ClusterRole
    • RoleBingding and ClusterRoleBingding
    • Referring to Resources
    • Referring to Subject
  • Command-line Utilities

RBAC API 概览

在Kubernetes中,RBAC(基于角色的访问控制)。从1.6版本起,Kubernetes 默认启用RBAC(Role Base Access Control)访问控制策略。从1.8开始,RBAC已作为稳定的功能。通过设置–authorization-mode=RBAC,启用RABC。在RABC API中,通过如下的步骤进行授权:1)定义角色:在定义角色时会指定此角色对于资源的访问控制的规则;2)绑定角色:将主体与角色进行绑定,对用户进行访问授权。

关系图

RBAC 权限定义部分主要有三个层级

  • apiGroups: 指定那个 API 组下的权限
  • resources: 该组下具体资源,如 pod namespace node
  • verbs: 指对该资源具体执行哪些动作 get list update delete

在RBAC API中,一个角色包含了一套表示一组权限的规则。 权限以纯粹的累加形式累积(没有”否定”的规则)。 角色可以由命名空间(namespace)内的Role对象定义,而整个Kubernetes集群范围内有效的角色则通过ClusterRole对象实现。

Role & ClusterRole

Role限定于单个namespace
一个Role对象只能用于授予对某一单一命名空间中资源的访问权限。 以下示例描述了”default”命名空间中的一个Role对象的定义,用于授予对pod的读访问权限:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""] # 空字符串""表明使用core API group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

ClusterRole对象可以授予与Role对象相同的权限,但由于它们属于集群范围对象, 也可以使用它们授予对以下几种资源的访问权限:

  • 集群范围资源(例如节点,即node)
  • 非资源类型endpoint(例如”/healthz”)
  • 跨所有命名空间的命名空间范围资源(例如pod,需要运行命令kubectl get pods --all-namespaces来查询集群中所有的pod)

下面示例中的ClusterRole定义可用于授予用户对某一特定命名空间,或者所有命名空间中的secret(取决于其绑定方式)的读访问权限:

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  # 鉴于ClusterRole是集群范围对象,所以这里不需要定义"namespace"字段
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

RoleBinding与ClusterRoleBinding

RoleBingding & ClusterRolerRoleBingding:角色绑定与集群角色绑定

角色绑定将一个角色中定义的各种权限授予一个或者一组用户。 角色绑定包含了一组相关主体(即subject, 包括用户——User、用户组——Group、或者服务账户——Service Account)以及对被授予角色的引用。 在命名空间中可以通过RoleBinding对象授予权限,而集群范围的权限授予则通过ClusterRoleBinding对象完成。

RoleBinding可以引用在同一命名空间内定义的Role对象。

RoleBinding对象也可以引用一个ClusterRole对象用于在RoleBinding所在的命名空间内授予用户对所引用的ClusterRole中 定义的命名空间资源的访问权限。这一点允许管理员在整个集群范围内首先定义一组通用的角色,然后再在不同的命名空间中复用这些角色。

例如,尽管下面示例中的RoleBinding引用的是一个ClusterRole对象,但是用户”dave”(即角色绑定主体)还是只能读取”development” 命名空间中的secret(即RoleBinding所在的命名空间)。

 以下角色绑定允许用户"dave"读取"development"命名空间中的secret。
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: read-secrets
  namespace: development # 这里表明仅授权读取"development"命名空间中的资源。
subjects:
- kind: User
  name: dave
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io

最后,可以使用ClusterRoleBinding在集群级别和所有命名空间中授予权限。

Referring to Resources

在Kubernets中,主要的资源包括:Pods、Nodes、Services、Deployment、Replicasets、Statefulsets、Namespace、Persistents、Secrets和ConfigMaps等。另外,有些资源下面存在子资源,例如:Pod下就存在log子资源:

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

也可以通过 resourceName 指定单个资源(而不是一类资源)。
注意,指定了单个资源后,verbs里就不能由 list, watch, create, or deletecollection 了,因为这几个verbs对应的API URL里不会出现resource name。

Referring to Subjects

RoleBinding、ClusterRoleBinding将Role、ClusterRole绑定到 subject。subject可以是 user,group,serviceAccount。

user:k8s并不管理user,而是authenticator(例如我们用的是dex)在管理。user可以是字符串(如”jane”),email(如bob@example.com),ID。这取决于管理员配置认证的时候,--oidc-username-claim配置的是什么。我们这里用的是name。system:开头的用户是保留给k8s用的。

group:group是由 Authenticator modules 在管理。可以是像user一样的普通group,也可以是 system:开头的k8s的组。

serviceaccount:由k8s管理。sa区别于user,其代表的是service,用来供service之间访问用,例如service A调用 service B的API,那么可以为service A创建一个 sa ,然后赋予该sa访问 service B API的权限。sa类似appid的概念。sa可以用 kubectl get sa来查看。

Command-line Utilities

创建某一namespace下的roleBinding。

kubectl create rolebinding bob-admin-binding --clusterrole=admin --user=bob --namespace=acme
kubectl create rolebinding myapp-view-binding --clusterrole=view --serviceaccount=acme:myapp --namespace=acme

创建clusterRoleBiding。

kubectl create clusterrolebinding root-cluster-admin-binding --clusterrole=cluster-admin --user=root
kubectl create clusterrolebinding kubelet-node-binding --clusterrole=system:node --user=kubelet
kubectl create clusterrolebinding myapp-view-binding --clusterrole=view --serviceaccount=acme:myapp

相对来说kubectl更方便一些。

相关文章

网友评论

      本文标题:kubernetes-基于RBAC的授权使用方案总结

      本文链接:https://www.haomeiwen.com/subject/flxrlqtx.html