11-kubernetes RBACおよび承認

16607 ワード

目次
  • RBAC
  • roleとclusterrole
  • rolebindingとclusterrolebinding
  • 共通権限clusterrole

  • user作成テスト
  • roleケースの作成
  • role
  • を作成する
  • rolebindingバインドtracyユーザ
  • tracy権限のテスト
  • clusterroleテスト
  • clusterrole
  • を作成
  • テストバインドtracyユーザー
  • tracy権限のテスト
  • テストrolebindingバインドclusterrole
  • clusterrole adminデフォルトロール
  • テストバインディング


  • RBAC


    ライセンスプラグイン:
  • Node
  • ABAC
  • RBAC
  • Webhook

  • RBACの主な機能はロールベースのアクセス制御許可(permission)を提供することである.
     :  (Role), (Role) , 。

    したがって、その後のすべての操作許可は、ユーザーに直接許可するのではなく、ロールに直接許可されます.
     
     
     , URL, ,

    あるオブジェクトに適用される行為は、Actionとなる.

    roleとclusterrole

    role , , role 。
     role , , 。
     , , 。

    役割は次の2つに分けられます.
    1. role          
    2. clusterrole   

    义齿


    バインディングは2つに分けられます.
    1. rolebinding           , 
    2. clusterrolebinding    , 

    質問:rolebindingを使用してuser1をバインドする場合、clusterroleの権限は?
    回答:user1の権限は名前空間に限られています.user1を使用してバインドされているので、名前空間を突破することはできません.

    共通権限clusterrole


    一般的なアプローチ
    実際の作業では、複数の名前空間があり、各名前空間は1つのプロジェクトに対応し、各プロジェクトは1つのプロジェクトグループに対応していることを想像します.この場合、各プロジェクトグループは対応するプロジェクトの名前空間に対する権限が同じです.では、同じ権限を各名前空間で定義するrolebindingが必要であり、roleを使用してプロジェクトユーザをバインドし、重複する操作がある.
    便利な方法
    このとき、rolebindingクラスタロールと対応する権限を定義し、clusterroleを使用してプロジェクトユーザにrolebindingロールをバインドすると、すべての名前空間で自分のclusterroleを定義することなく、roleを直接使用することができます.

    user作成テスト


    roleケースの作成


    ヘルプ:
    [root@master ~]# kubectl create role --help
    Create a role with single rule.
    
    Examples:
      # Create a Role named "pod-reader" that allows user to perform "get", "watch" and "list" on pods
      kubectl create role pod-reader --verb=get --verb=list --verb=watch --resource=pods
      
      # Create a Role named "pod-reader" with ResourceName specified
      kubectl create role pod-reader --verb=get --resource=pods --resource-name=readablepod --resource-name=anotherpod
      
      # Create a Role named "foo" with API Group specified
      kubectl create role foo --verb=get,list,watch --resource=rs.extensions
      
      # Create a Role named "foo" with SubResource specified
      kubectl create role foo --verb=get,list,watch --resource=pods,pods/status
  • は、clusterroleパラメータを介して、コマンドが実際に実行されないようにします.ただし、テストコマンドが正常かどうかをシミュレートします.
  • は、--dry-runを介してyaml形式で
  • を出力する.
    では、この2つのパラメータを使用してyaml形式のファイルをエクスポートします.
    [root@master rbac]# kubectl create role pods-reader --verb=get,list,watch --resource=pods --dry-run
    role.rbac.authorization.k8s.io/pods-reader created (dry run)
    [root@master rbac]# kubectl create role pods-reader --verb=get,list,watch --resource=pods --dry-run -o yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      creationTimestamp: null
      name: pods-reader
    rules:
    - apiGroups:
      - ""
      resources:
      - pods
      verbs:
      - get
      - list
      - watch
    [root@master rbac]# kubectl create role pods-reader --verb=get,list,watch --resource=pods --dry-run -o yaml > role-demo.yaml
    [root@master rbac]# ll
    total 4
    -rw-r--r-- 1 root root 193 Aug 21 16:56 role-demo.yaml
    [root@master rbac]# cat role-demo.yaml 
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      creationTimestamp: null
      name: pods-reader
    rules:
    - apiGroups:
      - ""
      resources:
      - pods
      verbs:
      - get
      - list
      - watch

    roleの作成

    [root@master rbac]# kubectl apply -f role-demo.yaml 
    role.rbac.authorization.k8s.io/pods-reader created
    [root@master rbac]# kubectl get role
    NAME          AGE
    pods-reader   2s
    [root@master rbac]# kubectl describe role pods-reader
    Name:         pods-reader
    Labels:       
    Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                    {"apiVersion":"rbac.authorization.k8s.io/v1","kind":"Role","metadata":{"annotations":{},"name":"pods-reader","namespace":"default"},"rules...
    PolicyRule:
      Resources  Non-Resource URLs  Resource Names  Verbs
      ---------  -----------------  --------------  -----
      pods       []                 []              [get list watch]    #  

    以前にユーザーtracyが作成され、作成したばかりのroleをバインドできます.

    rolebindingバインドtracyユーザー


    同じ方法を使用します.
    [root@master rbac]# kubectl create rolebinding tracy-read-pods --role=pods-reader --user=tracy --dry-run -o yaml > rolebinding-demo.yaml
    [root@master rbac]# cat rolebinding-demo.yaml 
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      creationTimestamp: null
      name: tracy-read-pods
    roleRef:            #   (role)
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: pods-reader     #  role 
    subjects:               #  
    - apiGroup: rbac.authorization.k8s.io
      kind: User
      name: tracy           #  

    作成:
    [root@master rbac]# kubectl apply -f rolebinding-demo.yaml 
    rolebinding.rbac.authorization.k8s.io/tracy-read-pods created
    [root@master rbac]# kubectl get rolebinding
    NAME              AGE
    tracy-read-pods   5s
    [root@master rbac]# kubectl describe rolebinding/tracy-read-pods
    Name:         tracy-read-pods
    Labels:       
    Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                    {"apiVersion":"rbac.authorization.k8s.io/v1","kind":"RoleBinding","metadata":{"annotations":{},"creationTimestamp":null,"name":"tracy-read...
    Role:
      Kind:  Role
      Name:  pods-reader
    Subjects:
      Kind  Name   Namespace
      ----  ----   ---------
      User  tracy

    tracy権限のテスト


    tracyユーザーの下でテスト権限に切り替えます.
    [root@master rbac]# kubectl config use-context tracy@kubernetes
    Switched to context "tracy@kubernetes".
    [root@master rbac]# kubectl get pods
    NAME          READY   STATUS    RESTARTS   AGE
    pod-sa-demo   1/1     Running   0          5d3h
    [root@master rbac]# kubectl delete pods/pod-sa-demo
    Error from server (Forbidden): pods "pod-sa-demo" is forbidden: User "tracy" cannot delete resource "pods" in API group "" in the namespace "default"
    [root@master rbac]# kubectl get pods -n kube-system
    Error from server (Forbidden): pods is forbidden: User "tracy" cannot list resource "pods" in API group "" in the namespace "kube-system"

    以上の説明から分かるように、名前空間が-o yamlであることを表示する権限のみがあり、削除する権限は他になく、他の名前空間のリソースも表示されません.

    clusterroleテスト


    定義方法はroleとほぼ同じで、ヘルプを表示すると次のようになります.
    [root@master ~]# kubectl create clusterrole --help
    Create a ClusterRole.
    
    Examples:
      # Create a ClusterRole named "pod-reader" that allows user to perform "get", "watch" and "list" on pods
      kubectl create clusterrole pod-reader --verb=get,list,watch --resource=pods
      
      # Create a ClusterRole named "pod-reader" with ResourceName specified
      kubectl create clusterrole pod-reader --verb=get --resource=pods --resource-name=readablepod
    --resource-name=anotherpod
      
      # Create a ClusterRole named "foo" with API Group specified
      kubectl create clusterrole foo --verb=get,list,watch --resource=rs.extensions
      
      # Create a ClusterRole named "foo" with SubResource specified
      kubectl create clusterrole foo --verb=get,list,watch --resource=pods,pods/status
      
      # Create a ClusterRole name "foo" with NonResourceURL specified
      kubectl create clusterrole "foo" --verb=get --non-resource-url=/logs/*
      
      # Create a ClusterRole name "monitoring" with AggregationRule specified
      kubectl create clusterrole monitoring --aggregation-rule="rbac.example.com/aggregate-to-monitoring=true"

    clusterroleの作成

    [root@master rbac]# kubectl create clusterrole cluster-reader --verb=get,list,watch --resource=pods --dry-run -o yaml > clusterrole-demo.yaml
    [root@master rbac]# cat clusterrole-demo.yaml 
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      creationTimestamp: null
      name: cluster-reader
    rules:
    - apiGroups:
      - ""
      resources:
      - pods
      verbs:
      - get
      - list
      - watch
    [root@master rbac]# kubectl apply -f clusterrole-demo.yaml 
    clusterrole.rbac.authorization.k8s.io/cluster-reader created
    [root@master rbac]# kubectl describe clusterrole/cluster-reader
    Name:         cluster-reader
    Labels:       
    Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                    {"apiVersion":"rbac.authorization.k8s.io/v1","kind":"ClusterRole","metadata":{"annotations":{},"creationTimestamp":null,"name":"cluster-re...
    PolicyRule:
      Resources  Non-Resource URLs  Resource Names  Verbs
      ---------  -----------------  --------------  -----
      pods       []                 []              [get list watch]

    tracyユーザーのバインドのテスト


    以前tracyはroleをバインドしていましたが、このrolebindingを削除し、clusterroleをバインドする必要があります.
    [root@master rbac]# kubectl create clusterrolebinding tracy-read-all-pods --clusterrole=cluster-reader --user=tracy --dry-run -o yaml > clusterrolebinding-demo.yaml
    [root@master rbac]# cat clusterrolebinding-demo.yaml 
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
      creationTimestamp: null
      name: tracy-read-all-pods
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-reader
    subjects:
    - apiGroup: rbac.authorization.k8s.io
      kind: User
      name: tracy
    [root@master rbac]# kubectl apply -f clusterrolebinding-demo.yaml 
    clusterrolebinding.rbac.authorization.k8s.io/tracy-read-all-pods created
    [root@master rbac]# kubectl describe clusterrolebinding/tracy-read-all-pods
    Name:         tracy-read-all-pods
    Labels:       
    Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                    {"apiVersion":"rbac.authorization.k8s.io/v1beta1","kind":"ClusterRoleBinding","metadata":{"annotations":{},"creationTimestamp":null,"name"...
    Role:
      Kind:  ClusterRole
      Name:  cluster-reader
    Subjects:
      Kind  Name   Namespace
      ----  ----   ---------
      User  tracy

    tracy権限のテスト


    tracyに切り替え、アクセステストを行います.
    [root@master rbac]# kubectl get pods
    NAME          READY   STATUS    RESTARTS   AGE
    pod-sa-demo   1/1     Running   0          5d4h
    [root@master rbac]# kubectl get pods -n kube-system
    NAME                                        READY   STATUS    RESTARTS   AGE
    coredns-5c98db65d4-8mzfz                    1/1     Running   0          43d
    coredns-5c98db65d4-spjx8                    1/1     Running   0          43d
    etcd-master.kubernetes                      1/1     Running   0          43d
    kube-apiserver-master.kubernetes            1/1     Running   0          43d
    kube-controller-manager-master.kubernetes   1/1     Running   0          43d
    kube-flannel-ds-amd64-4szk7                 1/1     Running   0          43d
    kube-flannel-ds-amd64-b4ssp                 1/1     Running   1          43d
    kube-flannel-ds-amd64-nmklz                 1/1     Running   0          43d
    kube-flannel-ds-amd64-wjczq                 1/1     Running   0          43d
    kube-proxy-8fqsz                            1/1     Running   0          43d
    kube-proxy-bkrw4                            1/1     Running   0          43d
    kube-proxy-n75g8                            1/1     Running   1          43d
    kube-proxy-rmckk                            1/1     Running   0          43d
    kube-scheduler-master.kubernetes            1/1     Running   0          43d
    kubernetes-dashboard-7d75c474bb-8kzrl       1/1     Running   0          9d
    [root@master rbac]# kubectl get service
    Error from server (Forbidden): services is forbidden: User "tracy" cannot list resource "services" in API group "" in the namespace "default"
    [root@master rbac]# kubectl get service -n kube-system
    Error from server (Forbidden): services is forbidden: User "tracy" cannot list resource "services" in API group "" in the namespace "kube-system"

    上記のテストから、
  • はdefaultネームスペースのpodsリソースにアクセスできますが、serviceリソースにはアクセスできません.
  • は、kube-systemネームスペースのリソースにアクセスしたり、kube-systemネームスペースserviceリソースにアクセスしたりすることはできません.

  • rolebindingバインドclusterroleのテスト


    まずtracyさっきbindingのclusterrolebindingを削除します
    [root@master rbac]# kubectl delete -f clusterrolebinding-demo.yaml 
    clusterrolebinding.rbac.authorization.k8s.io "tracy-read-all-pods" deleted
    [root@master rbac]# kubectl config use-context tracy@kubernetes
    Switched to context "tracy@kubernetes".
    [root@master rbac]# kubectl get pods
    Error from server (Forbidden): pods is forbidden: User "tracy" cannot list resource "pods" in API group "" in the namespace "default"

    clusterrolebindingを削除すると、tracyユーザーにはget権限がありません.
    次にrolebindingを使用してclusterroleをバインドします.
    [root@master rbac]# kubectl create rolebinding tracy-read-pods --clusterrole=cluster-reader --user=tracy --dry-run
    rolebinding.rbac.authorization.k8s.io/tracy-read-pods created (dry run)
    [root@master rbac]# kubectl create rolebinding tracy-read-pods --clusterrole=cluster-reader --user=tracy --dry-run -o yaml > rolebinding-clusterrole-demo.yaml
    [root@master rbac]# cat rolebinding-clusterrole-demo.yaml 
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding                           #  rolebinding
    metadata:
      name: tracy-read-pods
      namespace: default                        #  
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole                         #  clusterrole
      name: cluster-reader
    subjects:
    - apiGroup: rbac.authorization.k8s.io
      kind: User
      name: tracy                               #  
    [root@master rbac]# kubectl apply -f rolebinding-clusterrole-demo.yaml 
    rolebinding.rbac.authorization.k8s.io/tracy-read-pods created

    アクセスのテスト
    [root@master rbac]# kubectl get pods
    NAME          READY   STATUS    RESTARTS   AGE
    pod-sa-demo   1/1     Running   0          5d19h
    [root@master rbac]# kubectl get pods -n kube-system
    Error from server (Forbidden): pods is forbidden: User "tracy" cannot list resource "pods" in API group "" in the namespace "kube-system"

    テストはdefaultネームスペースのリソースにのみアクセスでき、他のネームスペースのリソースにはアクセスできません.

    clusterrole adminデフォルトロール


    clusterroleには、デフォルトのadminロールが2つあります.admin、cluster-admin
    どちらもクラスタロールの管理者であるため、クラスタに複数の名前空間がある場合、手動で管理者ロールを作成する必要がなく、adminのロールモデルrolebindingを直接使用することができ、多くの重複作業を省くことができます.

    バインディングのテスト


    テストはclusterroleのadminロールをtracyユーザーにバインドします.
    以前はclusterroleがバインドされていましたが、このとき再びバインドされ、影響を受けず、一人で多職を兼ねていることに相当します.
    [root@master rbac]# kubectl create rolebinding defult-ns-admin --clusterrole=admin --user=tracy
    rolebinding.rbac.authorization.k8s.io/defult-ns-admin created
    [root@master rbac]# kubectl config use-context tracy@kubernetes         #  tracy 
    Switched to context "tracy@kubernetes".
    [root@master rbac]# kubectl get pods                                    #  
    NAME          READY   STATUS    RESTARTS   AGE
    pod-sa-demo   1/1     Running   0          5d20h
    [root@master rbac]# kubectl delete pods pod-sa-demo
    pod "pod-sa-demo" deleted                                               #  
    [root@master rbac]# kubectl get pods
    No resources found.
    [root@master rbac]# kubectl get pods -n kube-system                     #  
    Error from server (Forbidden): pods is forbidden: User "tracy" cannot list resource "pods" in API group "" in the namespace "kube-system" 

    転載先:https://www.cnblogs.com/winstom/p/11394044.html