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
- POST:
- 一部のリソースでは特別なverbを使用する
- Non-resource requestsの場合
- Resource requests以外
- HTTPメソッドを小文字にして指定する
- Resource requestsの場合
- 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