Container Service for Kubernetes (ACK) コンソールに事前定義されている ClusterRole が要件を満たさない場合は、カスタムの Role と ClusterRole を作成できます。これにより、きめ細かいロールベースアクセス制御 (RBAC) を実装し、ニーズに合わせて権限を調整できます。このトピックでは、これらのカスタム権限を設定する方法について説明します。
カスタム RBAC ポリシー
Role と ClusterRole のカスタム YAML マニフェストを作成して、ご利用の ACK クラスター内のリソースに対するきめ細かいアクセス制御を実装できます。以下のリソースのポリシー情報をガイドとして使用してください。
Role (名前空間スコープ)
次の YAML の例では、my-role という名前の Role を定義しています。この Role は、デフォルトの名前空間内の Pod に対する読み取り専用権限を付与します。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: my-role
rules: # 権限ルールのリスト。
- apiGroups: [""] # リソースの API グループ。空の文字列 "" はコア API グループを示します。
resources: ["pods"] # ルールが適用されるリソースタイプ。
verbs: ["get", "list"] # リソースに対して許可される操作。
ClusterRole (クラスター-スコープ)
次の YAML の例では、my-clusterrole という名前の ClusterRole を定義しています。この ClusterRole は、クラスター全体にわたる Pod と Service に対する読み取り専用権限を付与します。
ClusterRole はクラスター-スコープのリソースです。YAML で名前空間を指定しても、それは無視されます。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# namespace: default # ClusterRole には名前空間は不要です。
name: my-clusterrole
rules: # 権限ルールのリスト。
- apiGroups: [""] # リソースの API グループ。
resources: ["pods"] # リソースタイプ。
verbs: ["get", "list"] # 許可される操作。
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "list"]
これにより、RAM ユーザーまたは RAM ロールにクラスターリソースに対するきめ細かいアクセス制御を付与できます。
一般的なリソースポリシー
-
読み取り権限
-
get:特定のリソースの詳細を読み取ります。 -
list:リソースのコレクションを一覧表示します。 -
watch:リソースの変更を監視し、リアルタイムの更新を受け取ります。
-
-
書き込み権限
-
create:新しいリソースインスタンスを作成します。 -
update:既存リソースを変更します。 -
patch:既存リソースに部分的な変更を適用します。 -
delete:指定されたリソースを削除します。
-
|
リソース名 |
リソースタイプ (resources) |
API グループ (apiGroups) |
権限(動詞) |
|
Pod |
resources: ["pods"] |
|
|
|
Service |
resources: ["services"] |
apiGroups: [""] |
|
|
ConfigMap |
resources: ["configmaps"] |
apiGroups: [""] |
|
|
Secret |
resources: ["secrets"] |
apiGroups: [""] |
|
|
PersistentVolume |
resources: ["persistentvolumes"] |
apiGroups: [""] |
|
|
PersistentVolumeClaim |
resources: ["persistentvolumeclaims"] |
apiGroups: [""] |
|
|
Namespace |
resources: ["namespaces"] |
apiGroups: [""] |
|
|
Deployment |
resources: ["deployments"] |
apiGroups: ["apps"] |
|
|
DaemonSet |
resources: ["daemonsets"] |
apiGroups: ["apps"] |
|
|
StatefulSet |
resources: ["statefulsets"] |
apiGroups: ["apps"] |
|
|
Ingress |
resources: ["ingresses"] |
apiGroups: ["networking.k8s.io"] |
|
|
NetworkPolicy |
resources: ["networkpolicies"] |
apiGroups: ["networking.k8s.io"] |
|
|
Job |
resources: ["jobs"] |
apiGroups: ["batch"] |
|
|
CronJob |
resources: ["cronjobs"] |
apiGroups: ["batch"] |
|
|
StorageClass |
resources: ["storageclasses"] |
apiGroups: ["storage.k8s.io"] |
|
|
HorizontalPodAutoscaler |
resources: ["horizontalpodautoscalers"] |
apiGroups: ["autoscaling"] |
|
操作手順
カスタム RBAC 権限は、ACK コンソールまたは kubectl を使用して適用できます。
Container Service for Kubernetes (ACK) コンソールは、カスタム ClusterRole のバインドのみをサポートしています。カスタム Role をバインドするには、kubectl コマンドラインツールを使用してください。
コンソール
ステップ 1:カスタム ClusterRole の作成
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 をクリックします。
-
役割 ページで、Cluster Role タブをクリックします。 次に、作成する をクリックします。
-
Create YAML パネルで、カスタムポリシーの YAML マニフェストを入力し、OK をクリックして ClusterRole を作成します。
このステップでは、ClusterRole (クラスター-スコープ) の YAML を例として使用します。ClusterRole が作成された後、Cluster Role タブでカスタム ClusterRole my-clusterrole を表示できます。
ステップ 2:カスタム ClusterRole の割り当て
ACK コンソールにログインします。左側のナビゲーションウィンドウで、承認 をクリックします。
承認 ページで権限を設定します。
RAM ユーザーに権限を付与する場合:RAM ユーザー タブをクリックし、対象の RAM ユーザーを見つけて、操作 列の アクセス権限の管理 をクリックして 権限管理 ページに移動します。
RAM ロールに権限を付与する場合:RAM ロール タブをクリックし、対象の RAM ロールを見つけて、アクセス権限の管理 をクリックして権限管理ページに移動します。
-
+権限の追加 をクリックします。ダイアログボックスで、ClusterRole を作成した クラスター と、権限を付与したい 名前空間 を選択します。権限管理 セクションで Custom を選択します。表示されるドロップダウンリストから my-clusterrole を選択し、送信 をクリックします。
kubectl
ステップ 1:カスタム ClusterRole の作成
-
次の YAML マニフェストを含む my-clusterrole.yaml という名前のファイルを作成します。
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: my-clusterrole # namespace: default # ClusterRole には名前空間は不要で、指定されても無視されます。 rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["services"] verbs: ["get", "list", "watch"] -
次のコマンドを実行して ClusterRole をデプロイします。
kubectl apply -f my-clusterrole.yaml
ステップ 2:サブジェクト ID の取得
-
RAM ユーザーに権限を付与するには、そのユーザー ID を取得する必要があります。詳細については、「RAM ユーザーの詳細の表示」をご参照ください。
-
RAM ロールに権限を付与するには、そのロール ID を取得する必要があります。詳細については、「RAM ロールの情報の表示」をご参照ください。
ステップ 3:カスタム ClusterRole の割り当て
-
次の YAML マニフェストを含む my-clusterrole-binding.yaml という名前のファイルを作成します。
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: my-clusterrole-binding subjects: - kind: User name: "20811XXXXXXXXX2288" # ステップ 2 で取得したサブジェクトのユーザー ID またはロール ID。 roleRef: kind: ClusterRole name: my-clusterrole apiGroup: rbac.authorization.k8s.io -
次のコマンドを実行して ClusterRoleBinding をデプロイします。
kubectl apply -f my-clusterrole-binding.yaml
対象の RAM ユーザーまたは RAM ロールにカスタム権限を付与した後、クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続して権限を検証します。
よくある質問
コンソールターミナルへのアクセスを許可する方法
デフォルトでは、RAM ユーザーまたは RAM ロールは、Pod に対する get および list の読み取り専用権限を持っていても、ACK コンソールからコンテナのターミナルにアクセスできません。この操作には、pods/exec Pod サブリソースに対する get および create 権限が必要です。
したがって、Role または ClusterRole の rules で pods/exec リソースに対する get および create 権限を付与し、そのロールを対象のユーザーまたはユーザーグループにバインドする必要があります。以下に例を示します。
ターミナルにアクセスするには:ACK コンソールにログインします。クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。Actions 列で、端末 をクリックします。
Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: ns-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
# 名前空間内の pods/exec に対する権限を付与します。
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["get", "create"]
ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# namespace: default
name: my-clusterrole
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "list"]
# クラスター内の pods/exec に対する権限を付与します。
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["get", "create"]