Kubernetes - Using RBAC Authorization

前言

主要會針對官方文件進行翻譯, 並以原子化的概念, 即 Q&A 的方式將文件中的資訊記錄下來

# Using RBAC Authorization

Kubernetes RBAC authorization 是使用哪一個 API Group?

rbac.authorization.k8s.io

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    kube-apiserver --authorization-mode=Example,RBAC --other-options --more-options
  • Answer:
    指定 authorization mode 為 RBAC




# API objects

RBAC API 宣告了四種 kubernetes 物件
  • Role
  • ClusterRole
  • RoleBinding
  • ClusterRoleBinding


# Role and ClusterRole

Kubernetes RBAC 中, permission 是否有 deny 的規則?

沒有, permission 預設都是 deny 的, 規則只有添加

Kubernetes RBAC 中, 當我建立一個 Role, 是否需要指定 namespace?

需要

Kubernetes RBAC 中, 當我建立一個 ClusterRole, 是否需要指定 namespace?

不需要, ClusterRole 可存取跨 namespace 的資源

Kubernetes RBAC 中, ClusterRole 可以將權限定義在特定的 namespace 中嗎?

可以

ClusterRoles 有幾種使用方式:
  1. 定義 ClusterRole 具有某些 namespaced resources 的特定權限, 並且只在特定 namespace 中有效,
  2. 定義 ClusterRole 具有某些 namespaced resources 的特定權限, 並且在所有 namespace 都有效,
  3. 定義 該 ClusterRole 具有 cluster 範圍內所有資源的特定權限


# Role example

以下的 Kubernetes example code 的意思是?
  • Example

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

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
    namespace: default
    name: pod-reader
    rules:
    # "" 表示 core API Group
    - apiGroups: [""]
    # 允許操作對象為 "pods"
    resources: ["pods"]
    # 允許操作動作
    verbs: ["get", "watch", "list"]


# ClusterRole Example

Kubernetes RBAC 中, ClusterRole 也可用在 non-resource endpoints, 例如?

/healthz

以下的 Kubernetes example code 的意思是?
  • Example

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

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
    # 省略 "namespace", 因為 ClusterRoles
    name: secret-reader
    rules:
    - apiGroups: [""]
    # 允許存取對象為 secret, 換言之, 可存取所有 namespace 中的 secret
    resources: ["secrets"]
    # 允許存取動作
    verbs: ["get", "watch", "list"]


# RoleBinding and ClusterRoleBinding

Kubernetes 中, RoleBinding 可 bind 哪三種 subject?
  1. users
  2. groups
  3. service accounts


# RoleBinding examples

以下的 Kubernetes example code 的意思是?
  • Example

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
    name: read-pods
    namespace: default
    subjects:
    - kind: User
    name: jane # "name" is case sensitive
    apiGroup: rbac.authorization.k8s.io
    roleRef:
    kind: Role #this must be Role or ClusterRole
    name: pod-reader # this must match the name of the Role or ClusterRole you wish to bind to
    apiGroup: rbac.authorization.k8s.io
  • Answer

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
    name: read-pods
    namespace: default
    # subjects 表示要跟 role 連結的對象, 換言之, role 代表權限
    # 而通過 role binding 連結後, subject 即對象就有了該 role 的權限
    subjects:
    # subjects 可以指定多個
    - kind: User
    # jame 是大小寫敏感的
    name: jane
    apiGroup: rbac.authorization.k8s.io
    # "roleRef" 表示要連結的 role
    roleRef:
    # 可指定 Role 或 ClusterRole
    kind: Role
    # 也就是說, 我們已經有定義好一個 Role, name 為 pod-reader
    name: pod-reader
    apiGroup: rbac.authorization.k8s.io
以下的 Kubernetes example code 代表什麼意思?
  • Example:

    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
  • Answer:

    apiVersion: rbac.authorization.k8s.io/v1
    # 允許 user dave 具有 read secret 的權限, 但僅限於 "development" namespace
    # ClusterRole "secret-reader" 需事先定義
    kind: RoleBinding
    metadata:
    name: read-secrets
    # 在 RoleBinding 指定 namespace 限制了該權限作用的 namespace
    namespace: development
    subjects:
    - kind: User
    name: dave # name 是大小寫敏感的
    apiGroup: rbac.authorization.k8s.io
    roleRef:
    kind: ClusterRole
    name: secret-reader
    apiGroup: rbac.authorization.k8s.io


# ClusterRoleBinding examples

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    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
  • Answer:

    apiVersion: rbac.authorization.k8s.io/v1
    # 允許任何在 manager Group 中的 user, 可以 read 所有 namespace 的 secret
    kind: ClusterRoleBinding
    metadata:
    name: read-secrets-global
    subjects:
    - kind: Group
    name: manager # Name 大小寫敏感
    apiGroup: rbac.authorization.k8s.io
    roleRef:
    kind: ClusterRole
    name: secret-reader
    apiGroup: rbac.authorization.k8s.io
Kubernetes RBAC 中, 當我建立了一個 RoleBinding 之後, 可以變更 roleRef 裡頭的設定嗎?

不行

Kubernetes RBAC 中, 當我建立了一個 RoleBinding 之後, 預設不給變更 roleRef 的 binding, 那如果真有變更的需求, 該怎麼做?

建一個新的, 砍掉舊的


# Referring To resources

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    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"]
  • Answer:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
    namespace: default
    name: pod-and-pod-logs-reader
    rules:
    - apiGroups: [""]
    ## 允許 read pods, 以及 pods 的 log, log 為 pods 的 subresource
    ## API 像這樣 GET /api/v1/namespaces/{namespace}/pods/{name}/log
    resources: ["pods", "pods/log"]
    verbs: ["get", "list"]
以下的 Kubernetes example code 代表什麼意思?
  • Example:

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

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
    namespace: default
    name: configmap-updater
    rules:
    - apiGroups: [""]
    # 只允許存取名為 "my-configmap" 的 "configmaps" 資源
    resources: ["configmaps"]
    resourceNames: ["my-configmap"]
    verbs: ["update", "get"]


# Aggregated ClusterRoles

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
    name: monitoring
    aggregationRule:
    clusterRoleSelectors:
    - matchLabels:
    rbac.example.com/aggregate-to-monitoring: "true"
    rules: []
  • Answer:
    aggregated ClusterRole, 所有 label 符合 selector 的 ClusterRole 都會被附加到 aggregated ClusterRole

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
    name: monitoring-endpoints
    labels:
    rbac.example.com/aggregate-to-monitoring: "true"
    rules:
    - apiGroups: [""]
    resources: ["services", "endpoints", "pods"]
    verbs: ["get", "list", "watch"]
  • Answer:
    該 ClusterRole 會被附加到符合其 selector 的 aggregated ClusterRole, 如下:

    aggregationRule:
    clusterRoleSelectors:
    - matchLabels:
    rbac.example.com/aggregate-to-monitoring: "true"
以下的 Kubernetes example code 代表什麼意思?
  • Example:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
    name: aggregate-cron-tabs-edit
    labels:
    # Add these permissions to the "admin" and "edit" default roles.
    rbac.authorization.k8s.io/aggregate-to-admin: "true"
    rbac.authorization.k8s.io/aggregate-to-edit: "true"
    rules:
    - apiGroups: ["stable.example.com"]
    resources: ["crontabs"]
    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
    name: aggregate-cron-tabs-view
    labels:
    # Add these permissions to the "view" default role.
    rbac.authorization.k8s.io/aggregate-to-view: "true"
    rules:
    - apiGroups: ["stable.example.com"]
    resources: ["crontabs"]
    verbs: ["get", "list", "watch"]
  • Answer:
    只需要在預設的管理等級的 ClusterRole, 例如 admin, edit, 或 view 加上 selector, 那之後有新的 custom resource 時, 只需加上在 labels 加上 aggregated-to-對象, 這樣預設的管理等級 ClusterRole 就也擁有這個權限


# Role examples

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    rules:
    - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "list", "watch"]
  • Answer:
    允許 read pods 的權限

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    rules:
    - apiGroups: ["extensions", "apps"]
    #
    # at the HTTP level, the name of the resource for accessing Deployment
    # objects is "deployments"
    resources: ["deployments"]
    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
  • Answer:
    允許讀/寫 Deployment 資源, 範圍為 “extension” 以及 “apps” groups

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    rules:
    - apiGroups: [""]
    #
    # at the HTTP level, the name of the resource for accessing Pod
    # objects is "pods"
    resources: ["pods"]
    verbs: ["get", "list", "watch"]
    - apiGroups: ["batch", "extensions"]
    #
    # at the HTTP level, the name of the resource for accessing Job
    # objects is "jobs"
    resources: ["jobs"]
    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
  • Answer:
    允許 read pods, 範圍為 API group, 允許 read/write jobs, 範圍為 batch, extensions

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    rules:
    - apiGroups: [""]
    resources: ["configmaps"]
    resourceNames: ["my-config"]
    verbs: ["get"]
  • Answer:
    允許 read 名為 ‘my-config’ 的 ConfigMap 資源, 範圍 API group, 必須使用 RoleBinding 來限制單一 ConfigMap 單一 namespace

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    rules:
    - apiGroups: [""]
    resources: ["nodes"]
    verbs: ["get", "list", "watch"]
  • Answer:
    允許 read nodes 資源的權限, 範圍為 core group, 因為 nodes 屬於 cluster-scoped 的資源, 因此必須使用 ClusterRole 以及 ClusterRoleBinding

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    rules:
    - nonResourceURLs: ["/healthz", "/healthz/*"] # '*' in a nonResourceURL is a suffix glob match
    verbs: ["get", "post"]
  • Answer:
    允許對非資源類別的 endpoint /healthz 以及其所有子路徑發 GET 以及 POST 請求的權限, 需使用 ClusterROle 以及 ClusterRoleBinding


# Referring to subjects

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    subjects:
    - kind: User
    name: "alice@example.com"
    apiGroup: rbac.authorization.k8s.io
  • Answer:
    對象為名為 “alice@example.com“ 的 user

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    subjects:
    - kind: Group
    name: "frontend-admins"
    apiGroup: rbac.authorization.k8s.io
  • Answer:
    RoleBinding 的 subjects, 對象為 Group “frontend-admins” 內的所有對象

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    subjects:
    - kind: ServiceAccount
    name: default
    namespace: kube-system
  • Answer:
    RoleBinding 的 subjects, 對象為 ‘kube-system’ namespace 內的 ‘default’ service account

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    subjects:
    - kind: Group
    name: system:serviceaccounts:qa
    apiGroup: rbac.authorization.k8s.io
  • Answer:
    RoleBinding 的 subjects, 對象為 ‘qa’ namespace 中的所有 service accounts

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    subjects:
    - kind: Group
    name: system:serviceaccounts
    apiGroup: rbac.authorization.k8s.io
  • Answer:
    RoleBinding 的 subjects, 對象為任何 namespace 中的所有 service accounts

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    subjects:
    - kind: Group
    name: system:authenticated
    apiGroup: rbac.authorization.k8s.io
  • Answer:
    RoleBinding 的 subjects, 對象為所有的 authenticated user

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    subjects:
    - kind: Group
    name: system:unauthenticated
    apiGroup: rbac.authorization.k8s.io
  • Answer:
    RoleBinding 的 subjects, 對象為所有的 unauthenticated user

以下的 Kubernetes example code 代表什麼意思?
  • Example:

    subjects:
    - kind: Group
    name: system:authenticated
    apiGroup: rbac.authorization.k8s.io
    - kind: Group
    name: system:unauthenticated
    apiGroup: rbac.authorization.k8s.io
  • Answer:
    RoleBinding 的 subjects, 對象為所有 user




# Default roles and role bindings

Kubernetes RBAC 中, 修改有著 system: 前綴的 ClusterRole 以及 ClusterRoleBinding object 要特別小心, 為什麼?

可能會造成整個 cluster 功能失常


# Auto-reconciliation

Kubernetes RBAC 中, default ClusterRole 中的 rbac.authorization.kubernetes.io/autoupdate 代表的意思是?

又稱為 auto-reconciliation
預設 Kubernetes 會在每次啟動都更新 default cluster role 可能缺少的 permissions, 以及 default cluster role binding 可能缺少的 subjects, 如果設為 false, 則會停止這個動作, 可能會造成 cluster 失常


# API discovery roles

Kubernetes RBAC 中, 如果在 API server 加入 –anonymous-auth=false, 意思是?

預設的 role binding 會授權給 unauthenticated 以及 authenticated user 一些被認為可被公開存取的安全資訊, 若要完全拒絕 anonymous unauthenticated 存取, 便可設為 false
需注意, 每次 API server restart, auth-reconciliation 會覆寫設定, 因此要嘛就不要手動更改預設值, 要嘛就停用 auto-reconciliation


# User-facing roles

Kubernetes RBAC 中, 有著 system 前綴的 default role 跟沒有 system 前綴的 default role 差別在於?

前者為 cluster control plane 管理, 後者為使用者面向的 default role




# Privilege escalation prevention and bootstrapping

Kubernetes RBAC 中, 必須符合哪兩種條件, 該 user 才可以 create/update 一個 role 或 role binding object?
  1. 該 user 本身已經擁有 要賦予該 role 的權限, 即如果想建立一個 role 有 ‘watch’ 的權限, 該 user 要先擁有
  2. 特別指定 rbac.authorization.k8s.io 的資源建立權限給該 user
以下的 Kubernetes example code 代表什麼意思?
  • Example:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
    name: role-grantor
    rules:
    - apiGroups: ["rbac.authorization.k8s.io"]
    resources: ["rolebindings"]
    verbs: ["create"]
    - apiGroups: ["rbac.authorization.k8s.io"]
    resources: ["clusterroles"]
    verbs: ["bind"]
    # omit resourceNames to allow binding any ClusterRole
    resourceNames: ["admin","edit","view"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
    name: role-grantor-binding
    namespace: user-1-namespace
    roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: role-grantor
    subjects:
    - apiGroup: rbac.authorization.k8s.io
    kind: User
    name: user-1
  • Answer:

    apiVersion: rbac.authorization.k8s.io/v1
    ## 定義 cluster role, 擁有此 cluster role 權限的 user 將具有 建立 role binding 以及 bind role 的權限, 但沒有建立 role 的權限
    kind: ClusterRole
    metadata:
    name: role-grantor
    rules:
    ## 此 apiGroup 代表賦予該 role "RBAC" 相關權限
    - apiGroups: ["rbac.authorization.k8s.io"]
    ## 資源為 "rolebindings", 所以該 role 具有建立 role binding 的權限
    resources: ["rolebindings"]
    verbs: ["create"]
    - apiGroups: ["rbac.authorization.k8s.io"]
    ## 資源為 "rolebindings", 所以該 role 具有建立 bind role 的權限
    resources: ["clusterroles"]
    verbs: ["bind"]
    ## 若不指定 resourceNames, 則該 role 可 bind 任何 clusterRole
    # omit resourceNames to allow binding any ClusterRole
    resourceNames: ["admin","edit","view"]
    ---
    # 將上面定義的 role bind 到 user-1, 所以之後 user-1 就具有上述的權限
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
    name: role-grantor-binding
    namespace: user-1-namespace
    roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: role-grantor
    subjects:
    - apiGroup: rbac.authorization.k8s.io
    kind: User
    name: user-1




# Command-line utilities

# kubectl create role

以下的 Kubernetes example command 代表什麼意思?
  • Example:

    kubectl create role pod-reader --verb=get --verb=list --verb=watch --resource=pods
  • Answer:
    建立一個名為 pod-reader 的 role, 該 role 允許 users 對 pod 執行 get, watch, list 動作

以下的 Kubernetes example command 代表什麼意思?
  • Example:

    kubectl create role pod-reader --verb=get --resource=pods --resource-name=readablepod --resource-name=anotherpod
  • Answer:
    建立一個名為 pod-reader 的 role, 該 role 允許 users 對 pod 執行 get 動作, 並指定了 resource name

以下的 Kubernetes example command 代表什麼意思?
  • Example:

    kubectl create role foo --verb=get,list,watch --resource=replicasets.apps
  • Answer:
    建立一個名為 foo 的 role, 該 role 允許 users 對 replicasets 執行 get, watch, list 動作, 並指定 resource 的 api groups

以下的 Kubernetes example command 代表什麼意思?
  • Example:

    kubectl create role foo --verb=get,list,watch --resource=pods,pods/status
  • Answer:
    建立一個名為 foo 的 role, 該 role 允許 users 對 pods 以及 pod 的 subsource pods/status 執行 get, watch, list 動作

以下的 Kubernetes example command 代表什麼意思?
  • Example:

    kubectl create role my-component-lease-holder --verb=get,list,watch,update --resource=lease --resource-name=my-component
  • Answer:
    建立一個名為 my-component-lease-holder 的 role, 該 role 允許 users 對名為 my-componentlease 資源執行 get, watch, list, update 動作


# kubectl create clusterrole

以下的 Kubernetes example command 代表什麼意思?
  • Example:

    kubectl create clusterrole pod-reader --verb=get,list,watch --resource=pods
  • Answer:
    建立一個名為 pod-reader 的 cluster role, 該 cluster role 允許 user 對 pods 資源執行 get, watch, list 動作

以下的 Kubernetes example command 代表什麼意思?
  • Example:

    kubectl create clusterrole pod-reader --verb=get --resource=pods --resource-name=readablepod --resource-name=anotherpod
  • Answer:
    建立一個名為 pod-reader 的 cluster role, 該 cluster role 允許 users 對 pods 執行 get 動作, 並指定了 resource name

以下的 Kubernetes example command 代表什麼意思?
  • Example:

    kubectl create clusterrole foo --verb=get,list,watch --resource=replicasets.apps
  • Answer:
    建立一個名為 pod-reader 的 cluster role, 該 cluster role 允許 users 對 pods 執行 get 動作, 並指定了 resource name

Laravel - Digging Deeper - Collections Laravel - Digging Deeper - HTTP Client

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×