ユーザのクラスタアクセス権限を管理する
PFCP では、Kubernetes における Role/RoleBinding を用いた Role Based Access Control(RBAC)が利用できます。 RoleBinding を作成することで、Role に定義された権限をユーザやグループに付与できます。
以下を読み進める前に PFCP のロール を確認し、PFCP で利用可能なロールについて把握してください。
PFCP で標準提供するロールとグループ
以下の 3 つの ClusterRole1 が利用できます。
org-view
- ユーザのワークロードを閲覧するために必要な権限を有します。
org-edit
org-view
の権限に加えて、ユーザのワークロードを実行するために必要な権限を有します。
org-admin
org-edit
の権限に加えて、Role/RoleBinding 操作などの管理者権限を有します。
各 ClusterRole は Kubernetes 標準の view/edit/admin
ClusterRole を基として一部リソースの権限削除および PFCP で利用しているカスタムリソースの権限追加がされています。
具体的にどのリソースに対してどの操作が許可されているかについては下記コマンドで参照できます。
$ kubectl get clusterrole org-view org-edit org-admin -o yaml
また、以下の 2 つのグループが標準で提供されています。
org-<組織名>
(例:org-pfn
)- 組織管理者と一般ユーザの両方がこのグループに所属します。
- ルートネームスペースに対してのみ
org-edit
Role が与えられます。サブネームスペースに対しては Role が付与されません。
org-<組織名>/admin
(例:org-pfn/admin
)- 組織管理者が所属するグループです。
- ルートネームスペースおよびすべてのサブネームスペースに対して、
org-admin
ClusterRole が与えられます。
ルートネームスペースは、組織に属するすべてのユーザが org-edit
以上の権限を有しているため、初期設定のままご利用いただけます2。
新規に作成したサブネームスペースについては、一般ユーザは権限をもちません。一般ユーザに権限を付与するには、RoleBinding を作成します。
RoleBinding の作成
RoleBinding は、以下の 2 通りで作成できます。
- グループに対する RoleBinding の作成
- ユーザに対する RoleBinding の作成
サブネームスペースに対して、グループ・ユーザのそれぞれに org-edit
の ClusterRole2を付与する方法を説明します。
グループに対する RoleBinding の作成
すべてのユーザに対し、サブネームスペース(org-<組織名>--foo
)への権限を付与するには、以下の RoleBinding を作成します。
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: org-edit
namespace: org-<組織名>--foo
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: org-edit
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: oidc:org-<組織名>
また、組織のユーザを管理する で作成したユーザグループへ権限を付与できます。
ユーザグループ(ops
)に対し、サブネームスペース(org-<組織名>--foo
)への権限を付与するには、以下の RoleBinding を作成します。
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: org-edit-ops # name は任意です
namespace: org-<組織名>--foo
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: org-edit
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: oidc:org-<組織名>/ops # PFCP のユーザグループ名を指定します。
ユーザに対する RoleBinding の作成
特定のユーザ(alice@example.com
)に対し、サブネームスペース(org-<組織名>--foo
)への権限を付与するには、以下の RoleBinding を作成します。
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: org-edit-user-alice # name は任意です
namespace: org-<組織名>--foo
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: org-edit
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: oidc:org-<組織名>/alice@example.com
一般ユーザのルートネームスペースに対するワークロード実行権限を削除する
PFCP で標準提供するロールとグループ に記載のとおり、一般ユーザにはルートネームスペースへの org-edit
権限がデフォルトで付与されます。
一般ユーザに対するルートネームスペースへの org-edit
権限付与をやめる場合は、以下のコマンドを実行します。
$ kubectl -n org-<組織名> delete rolebindings org-edit
これにより、一般ユーザはルートネームスペースでの任意のリソース作成とワークロードの実行ができなくなります。
独自の Role を作成する
org-admin
ClusterRole には任意の Role をネームスペースに作成する権限が含まれており、組織管理者は独自の権限設定を持つ Role を作成し一般ユーザに付与できます。
例えば Pods の閲覧権限のみを許可する独自の Role は次のようになります。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-view
namespace: org-<組織名>--foo
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
参考リンク
FAQ
Q. 組織管理者権限を使用していますが、クラスタを操作するときは org-edit ロールを使用したいです
組織管理者に付与される org-admin
ロールではサブネームスペースや RoleBinding などを操作できる強い権限を持つため、学習ワークロードを実行する際は org-edit
ロールを使うことで、誤操作を防止できます。
これは、org-edit
ロールが付与された ServiceAccount を作り、その ServiceAccount としてふるまうことで実現できます。
org-<組織名>--foo
サブネームスペースを org-edit
ロールで操作する場合の手順を、以下に記します。
// `org-<組織名>--foo` ネームスペースに ServiceAccount を作ります。
$ kubectl -n org-<組織名>--foo create sa org-edit-sa
serviceaccount/org-edit-sa created
// 作成した ServiceAccount に `org-edit` ロールを付与します。
$ kubectl -n org-<組織名>--foo create rolebinding org-edit-sa --clusterrole=org-edit --serviceaccount=org-<組織名>--foo:org-edit-sa
rolebinding.rbac.authorization.k8s.io/org-edit-sa created
// `--as system:serviceaccount:<Namespace>:<ServiceAccount>` フラグを付与することで、対象 ServiceAccount になりすまして処理を行います。
// 対象 ServiceAccount になりすませていることを確認します。
$ kubectl --as system:serviceaccount:org-<組織名>--foo:org-edit-sa auth whoami
ATTRIBUTE VALUE
Username system:serviceaccount:org-<組織名>--foo:org-edit-sa
Groups [system:serviceaccounts system:serviceaccounts:org-<組織名>--foo system:authenticated]
// org-admin ロールであれば ResourceQuota を作成することができますが、なりすましているときは作成ができません。
$ kubectl auth can-i create resourcequotas -n org-<組織名>--foo
yes
$ kubectl --as system:serviceaccount:org-<組織名>--foo:org-edit-sa auth can-i create resourcequotas -n org-<組織名>--foo
no
--as
フラグを都度追加するのを避けたい場合は、kubeconfig の user フィールドに以下の通り設定を追加することで、デフォルトの設定にできます。
- name: pfcp-<組織名>-<クラスタ名>
user:
+ as: system:serviceaccount:<Namespace>:<ServiceAccount>
auth-provider:
config
-
ClusterRole はどの Namespace からでも利用できるロールです。 ↩
-
一般ユーザに対するルートネームスペースへの
org-edit
ClusterRole の付与が不要な場合には、オプトアウトできます。設定方法は 一般ユーザのルートネームスペースに対するワークロード実行権限を削除する を参照してください。 ↩ ↩2