Container Service for Kubernetes (ACK) の事前定義された ClusterRole で権限要件が満たされない場合は、カスタムの Role または ClusterRole を作成して、クラスターリソースに対してきめ細かいロールベースアクセス制御 (RBAC) を実現します。
カスタムロールを作成する前に、組み込みの ClusterRole (cluster-admin、admin、edit、view) がニーズを満たしているかどうかを確認してください。カスタムロールは、組み込みロールの権限が広すぎる、または制限が厳しすぎる場合にのみ必要です。
| 組み込み ClusterRole | アクセスレベル |
|---|---|
cluster-admin | クラスター全体のすべてのリソースへのフルアクセス |
admin | 名前空間内のほとんどのリソースへの読み取り/書き込みアクセス |
edit | 名前空間内のほとんどのオブジェクトへの読み取り/書き込みアクセス (RBAC リソースを除く) |
view | 名前空間内のほとんどのオブジェクトへの読み取り専用アクセス |
前提条件
開始する前に、以下が準備できていることを確認してください:
ACK クラスター
クラスターに接続するように設定された kubectl
クラスター内で RBAC リソースを作成するための十分な権限
基本概念
Kubernetes RBAC では、スコープが異なる 2 種類のロールを使用します:
Role:特定の名前空間内で権限を付与します。
ClusterRole:クラスターレベルで、すべての名前空間にわたって権限を付与します。ClusterRole の YAML マニフェストでは名前空間を指定できません。
どちらのロールタイプも、apiGroups、resources、verbs という同じ 3 つのフィールドからなるルール構造を使用します。
権限 verb
| カテゴリ | 動詞 | 説明 |
|---|---|---|
| 読み取り | get | 特定のリソースの詳細を取得 |
| 読み取り | list | リソースのコレクションを一覧表示 |
| 読み取り | watch | リソースの変更に関するリアルタイムの更新をストリーミング |
| 書き込み | create | 新しいリソースインスタンスを作成 |
| 書き込み | update | 既存のリソースを置換 |
| 書き込み | patch | 既存のリソースを部分的に変更 |
| 書き込み | delete | リソースを削除 |
resources または verbs でワイルドカード (["*"]) を使用しないでください。ワイルドカードは、現在および将来のすべてのリソースまたは verb (後で追加される新しいものを含む) へのアクセスを許可します。最小権限の原則に従うために、常に特定のリソースと verb をリストアップしてください。
サポートされるリソース
次の表を使用して、rules フィールドを構築します。各行は、リソースタイプをその resources の値、apiGroups の値、およびサポートする verb にマッピングします。
| リソース | resources | apiGroups | サポートされている動詞 |
|---|---|---|---|
| Pod | ["pods"] | [""] | get、list、watch、update、create、patch、delete、exec、proxy |
| Service | ["services"] | [""] | get、list、watch、update、create、patch、delete |
| ConfigMap | ["configmaps"] | [""] | get、list、watch、update、create、patch、delete |
| Secret | ["secrets"] | [""] | get、list、watch、update、create、patch、delete |
| PersistentVolume | ["persistentvolumes"] | [""] | get、list、watch、update、create、patch、delete |
| PersistentVolumeClaim | ["persistentvolumeclaims"] | [""] | get、list、watch、update、create、patch、delete |
| Namespace | ["namespaces"] | [""] | get、list、watch、update、create、patch、delete |
| Deployment | ["deployments"] | ["apps"] | get、list、watch、update、create、patch、delete |
| DaemonSet | ["daemonsets"] | ["apps"] | get、list、watch、update、create、patch、delete |
| StatefulSet | ["statefulsets"] | ["apps"] | get、list、watch、update、create、patch、delete |
| Ingress | ["ingresses"] | ["networking.k8s.io"] | get、list、watch、update、create、patch、delete |
| NetworkPolicy | ["networkpolicies"] | ["networking.k8s.io"] | get、list、watch、update、create、patch、delete |
| Job | ["jobs"] | ["batch"] | get、list、watch、update、create、patch、delete |
| CronJob | ["cronjobs"] | ["batch"] | get、list、watch、update、create、patch、delete |
| StorageClass | ["storageclasses"] | ["storage.k8s.io"] | get、list、watch、update、create、patch、delete |
| HorizontalPodAutoscaler | ["horizontalpodautoscalers"] | ["autoscaling"] | get、list、watch、update、create、patch、delete |
サブリソース
一部のリソースは、個別の権限付与が必要なサブリソースを公開します。サブリソースを指定するには、スラッシュ (/) を使用します。たとえば、Pod に加えて Pod のログの読み取りを許可するには、次のようにします:
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list"]一般的な Pod のサブリソース: pods/log、pods/exec、pods/portforward、pods/proxy。
カスタム RBAC ロールの作成とバインド
ACK コンソールは、カスタム ClusterRole のバインドのみをサポートしています。特定の名前空間にスコープが限定されたカスタム Role をバインドするには、kubectl を使用します。
コンソール
ステップ 1:ClusterRole の作成
次の手順では、クラスター全体の Pod と Service への読み取り専用アクセスを許可する my-clusterrole という名前の ClusterRole を作成します。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、対象のクラスターの名前をクリックします。左側のペインで、[セキュリティ] > [ロール] を選択します。
[ロール] ページで、[Cluster Role] タブを選択し、[OK] をクリックします。
[YAML の作成] パネルで、ClusterRole のマニフェストを入力し、[OK] をクリックします。次のマニフェストは、Pod と Service への読み取り専用アクセス (
get、list、watch) を許可します:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: my-clusterrole rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["services"] verbs: ["get", "list", "watch"]作成後、
my-clusterroleが [Cluster Role] タブに表示されます。
ステップ 2:ClusterRole を RAM ユーザーまたは RAM ロールにバインドする
左側のナビゲーションウィンドウで、[権限付与] をクリックします。
[権限付与] ページで、権限付与の対象を選択します:
RAM ユーザー:[RAM ユーザー] タブをクリックし、対象の RAM ユーザーを見つけて、[権限の変更] をクリックします。
RAM ロール:[RAM ロール] タブをクリックし、[RAM ロール名] フィールドに対象の RAM ロール名を入力または選択して、[権限の変更] をクリックします。
[権限管理] パネルで、[+ 権限の追加] をクリックします。[権限の追加] セクションで、次の操作を行います:
my-clusterroleに関連付けられている [クラスター] を選択します。対象の [Namespace] を選択します。
[権限管理] で [カスタム] を選択し、ドロップダウンリストから [my-clusterrole] を選択します。
[送信] をクリックします。
kubectl
ステップ 1:カスタムロールの作成
ClusterRole — クラスター全体に権限を付与します。
次のマニフェストは、Pod と Service への読み取り専用アクセス権を持つ my-clusterrole という名前の ClusterRole を作成します:
# my-clusterrole.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: my-clusterrole
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "list", "watch"]Role — 特定の名前空間内で権限を付与します。
次のマニフェストは、default 名前空間の Pod への読み取りアクセス権を持つ my-role という名前の Role を作成します:
# my-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: my-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]マニフェストを適用します:
kubectl apply -f my-clusterrole.yamlステップ 2:権限付与オブジェクト ID の取得
ロールを RAM ユーザーまたは RAM ロールにバインドするには、対応する ID が必要です:
ステップ 3:バインディングの作成
次のマニフェストは、my-clusterrole を RAM ユーザーまたは RAM ロールにバインドします。20811XXXXXXXXX2288 を前のステップで取得した UserId または RoleId に置き換えてください。
# my-clusterrole-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: my-clusterrole-binding
subjects:
- kind: User
name: "20811XXXXXXXXX2288" # ステップ 2 で取得した UserId または RoleId
roleRef:
kind: ClusterRole
name: my-clusterrole
apiGroup: rbac.authorization.k8s.ioバインディングを適用します:
kubectl apply -f my-clusterrole-binding.yaml権限の検証
バインド後、RAM ユーザーが期待どおりのアクセス権を持っていることを確認します。クラスターの kubeconfig を取得して kubectl を使用して接続し、ロールで許可されているコマンドを実行します:
kubectl get pods付与された権限外のアクセスが正しく拒否されることを確認するには、ロールでカバーされていないコマンドを実行します。たとえば、Pod アクセスのみが付与されている場合に Deployment を一覧表示します:
kubectl get deployments期待される出力は次のとおりです:
Error from server (Forbidden): deployments.apps is forbidden: User "20811XXXXXXXXX2288" cannot list resource "deployments" in API group "apps" at the cluster scopeこのエラーは、権限の境界が正しく機能していることを示しています。