メモ置き場

Kubernetes RBACメモ

Kubernetes APIの認可モード

  • Node
    • kubeletに権限を付与するための特別な認証モード
  • ABAC: Attribute-based access control
    • 属性を組み合わせたポリシーを使ってアクセス権限を付与するモード?
  • RBAC: Role-based access control
    • ユーザ単位ではなく、ユーザに付与されたRole単位でアクセス権を判定するモード
  • Webhook
    • Webhook用?

Role, ClusterRole

  • 許可される権限を定義するリソース
    • デフォルトは拒否
  • Role: namespace単位の権限
  • ClusterRole: namespaceに属さないもの、全てのnamespaceの権限
  • apiGroups, resources, verbの組み合わせで権限を指定する
  • apiGroups: APIグループ
    • "apps""batch"など
    • 空文字の場合はコアAPIグループを指定
  • resources: リソース名
    • "pods""deployments"など
  • verbs: 実行内容を表す動詞
    • Resource requestsの場合
      • /api/v1/*, /apis/<group>/<version>/*へのリクエスト
      • HTTPメソッドと処理内容によって決定
        • POST: create
        • GET,HEAD: get, list, watch
        • PUT: update
        • PATCH: patch
        • DELETE: delete, deletecollection
      • 一部のリソースでは特別なverbを使用する
    • Non-resource requestsの場合
      • Resource requests以外
      • HTTPメソッドを小文字にして指定する
  • versionの指定はなし?
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: sample-role
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: sample-cluster-role
rules:
- apiGroups: ["apps"]
  resources: ["deployments"]
  verbs: ["get", "list"]

RoleBinding, ClusterRoleBinding

  • Role,ClusterRoleで定義された権限をSubjects(User, Group, ServiceAccount)へ付与するリソース
  • RoleBinding
    • 同じnamespaceのRoleの権限を付与
    • ClusterRoleを指定した場合、RoleBindingのnamespaceに限定した権限が付与される
  • ClusterRoleBinding
    • クラスタ全体の権限を付与
    • Roleを指定した場合、Roleのnamespaceが無視される
  • roleRefは変更不可
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: default
  name: sample-role-binding
subjects:
- kind: ServiceAccount
  name: app
  namespace: default
roleRef:
  kind: Role
  name: sample-role
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  namespace: default
  name: sample-role-binding
subjects:
- kind: ServiceAccount
  name: app
  namespace: default
roleRef:
  kind: ClusterRole
  name: sample-cluster-role
  apiGroup: rbac.authorization.k8s.io

その他

kubectl auth can-i ${チェックするコマンド}でコマンドの実行権限があるかチェックできる

# app ServiceAccountの権限で実行
$ kubectl auth can-i get pods
yes
$ kubectl auth can-i get pods -n kube-system
no
$ kubectl auth can-i get deployments
yes
$ kubectl auth can-i get deployments -n kube-system
yes

参考