

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# Amazon EKS における Kubernetes RBAC の強化
<a name="rbac-hardening"></a>

Kubernetes ロールベースのアクセスコントロール (RBAC) は、クラスター内で各 ID が実行できるアクションを制御します。CSI ドライバーや DaemonSets としてインストールされるその他のアドオンなど、多くのクラスターコンポーネントは、機能するために広範な権限を必要とします。これらのアクセス許可を見直し、範囲を明確にすることで、意図しないアクセスが発生する可能性を低減できます。

このトピックでは、一般的なクラスターコンポーネントのアクセス許可に関する考慮事項と、推奨される制御策について説明します。

## DaemonSet サービスアカウントのアクセス許可
<a name="_daemonset_service_account_permissions"></a>

DaemonSet Pod はクラスター内のすべてのノードで実行されるため、サービスアカウントトークンと、それらのトークンによって付与される RBAC アクセス許可はすべてのノードに存在します。

ノード上の不正なプロセスが、DaemonSet Pod を含む、同じノードで実行されている他の Pod のサービスアカウントトークンにアクセスできる可能性があります。aemonSet サービスアカウントに付与される RBAC アクセス許可は、クラスター内のすべてのノードで同じです。

DaemonSets として一般的にデプロイされるコンポーネントは、次のとおりです。
+ CSI ノードドライバー (`ebs-csi-node`、`efs-csi-node`、`mountpoint-s3-csi-node`)
+ Amazon VPC CNI プラグイン (`aws-node`)
+  `kube-proxy` 

DaemonSet Pod が EKS Pod Identity または IAM Roles for Service Accounts (IRSA) を介して AWS IAM 認証情報を持っている場合、同じノード上のコンテナ外からアクセスするプロセスも、これらの認証情報にアクセスできる可能性があります。これにより、影響の範囲が Kubernetes RBAC を超えて、DaemonSet の IAM ロールに付与された AWS API アクセス許可にまで拡張されます。

**重要**  
アクセス許可を確認するときは、Kubernetes RBAC アクセス許可とすべての DaemonSet サービスアカウントの IAM アクセス許可を、クラスター内のすべてのノードからアクセス可能として扱います。

## CSI ドライバー RBAC スコープ
<a name="_csi_driver_rbac_scope"></a>

CSI ドライバーは、ノード、永続ボリューム、ストレージ API とやり取りするため、一般的に広範な RBAC アクセス許可を保持しています。

### ノードオブジェクトのアクセス許可
<a name="_node_object_permissions"></a>

CSI ドライバーでは、テイントの削除やその他のノード管理タスクなどの機能をサポートするために、ノードオブジェクトを変更する際に RBAC アクセス許可が必要になる場合があります。Kubernetes RBAC の制限により、これらのアクセス許可は、ドライバーが実行されているローカルノードだけでなく、クラスター内の *すべて* のノードオブジェクトに適用されます。

EBS CSI ドライバーの場合、Helm チャートには、`ebs-csi-node` サービスアカウントからノード変更許可を削除するパラメータ (`node.serviceAccount.disableMutation`) が表示されます。これを有効にすると、テイント削除機能は無効になります。

### サービスアカウントトークンの漏洩
<a name="_service_account_token_exposure"></a>

CSI ドライバー Pod は、認証に投影されたサービスアカウントトークンを使用する場合があります。不正なプロセスがコンテナ外部にアクセスしたノードでは、これらのトークンはコンテナファイルシステムまたは kubelet API からアクセスできる場合があります。サービスアカウントが EKS Pod Identity または IRSA を介して IAM ロールにも関連付けられている場合、公開されたトークンを使用して AWS IAM 認証情報を取得できます。

## 推奨コントロール
<a name="_recommended_controls"></a>

### RBAC を最小特権にスコープ
<a name="_scope_rbac_to_least_privilege"></a>
+ CSI ドライバーと DaemonSet サービスアカウントにバインドされている ClusterRoles を確認します。ワークロードに不要なアクセス許可を削除します。
+ EBS CSI ドライバーでテイント削除機能を使用しない場合は、`node.serviceAccount.disableMutation` を `true` に設定します。
+ `kubectl auth can-i --list --as=system:serviceaccount:NAMESPACE:SERVICE_ACCOUNT` を使用して、有効なアクセス許可を監査します。

### Pod セキュリティ標準を適用
<a name="_enforce_pod_security_standards"></a>

組み込みの Pod Security Admission Controller またはポリシーエンジンを使用して、[Kubernetes Pod Security Standards](https://kubernetes.io/docs/concepts/security/pod-security-standards/) を適用します。少なくとも、`baseline` プロファイルをクラスター全体に適用し、`restricted` プロファイルをワークロード名前空間に適用します。これにより、システム名前空間外で特権コンテナを作成する機能が制限されます。

### ネットワークポリシーの使用
<a name="_use_network_policies"></a>

ネットワークポリシーを適用して、CSI ドライバーと DaemonSet Pod からの出力を、必要なエンドポイント (Kubernetes API サーバーと AWS サービスエンドポイントなど) のみに制限します。これにより、可能なアクションの範囲が縮小されます。

### RBAC アクティビティの監視
<a name="_monitor_rbac_activity"></a>

Kubernetes 監査ログを有効にし、DaemonSet サービスアカウントからの予期しない API コールを監視します。以下を探します。
+ CSI ドライバーサービスアカウントからのノードの変更
+ システム名前空間でのポッドの作成
+ シークレットに対する異常な `get` または `list` 呼び出し

詳細については、[コントロールプレーンログを CloudWatch Logs に送信する](control-plane-logs.md) を参照してください。