

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 在 Amazon EKS 中固化 Kubernetes RBAC
<a name="rbac-hardening"></a>

Kubernetes 基于角色的访问控制（RBAC）控制身份可以在集群内执行哪些操作。许多集群组件（包括作为 DaemonSet 安装的 CSI 驱动程序和其他附加组件）需要广泛的权限才能运行。对这些权限进行审查和限定范围可以减少任何意外访问的潜在范围。

本主题介绍常见集群组件的权限注意事项和建议的控件。

## DaemonSet 服务账户权限
<a name="_daemonset_service_account_permissions"></a>

DaemonSet 容器组（pod）在集群中的每个节点上运行，因此其服务账户令牌以及这些令牌授予的 RBAC 权限存在于每个节点上。

节点上未经授权的进程或许能够访问在同一节点上运行的其他容器组（pod）（包括 DaemonSet 容器组）的服务账户令牌。集群中每个节点上授予 DaemonSet 服务账户的 RBAC 权限都是相同的。

通常作为 DaemonSet 部署的组件包括：
+ CSI 节点驱动程序（`ebs-csi-node`、`efs-csi-node`、`mountpoint-s3-csi-node`）
+ Amazon VPC CNI 插件（`aws-node`）
+  `kube-proxy` 

如果 DaemonSet 容器组（pod）通过 EKS 容器组身份或服务账户的 IAM 角色（IRSA）拥有 Amazon IAM 凭证，则从同一节点上的容器外部获取访问权限的进程也可以访问这些凭证。这将 Kubernetes RBAC 之外的影响范围扩展到授予 DaemonSet IAM 角色的任何 Amazon API 权限。

**重要**  
在审查权限时，请将 Kubernetes RBAC 权限和每个 DaemonSet 服务账户的 IAM 权限视为可从集群中的每个节点访问。

## CSI 驱动程序 RBAC 范围
<a name="_csi_driver_rbac_scope"></a>

CSI 驱动程序通常拥有广泛的 RBAC 授权，因为它们与节点、持久卷和存储 API 进行交互。

### 节点对象权限
<a name="_node_object_permissions"></a>

CSI 驱动程序可能需要 RBAC 权限来修改节点对象，以支持污点移除等功能或其他节点管理任务。由于 Kubernetes RBAC 限制，这些权限适用于集群中的所有*所有*对象，而不仅仅是驱动程序运行所在的本地节点。

对于 EBS CSI 驱动程序，Helm 图表提供了一个参数（`node.serviceAccount.disableMutation`），可从 `ebs-csi-node` 服务账户中移除节点修改权限。启用此功能将禁用污点移除功能。

### 服务账户令牌泄露
<a name="_service_account_token_exposure"></a>

CSI 驱动程序容器组（pod）可以使用预计的服务账户令牌进行身份验证。在未经授权的进程已获得容器外部访问权限的节点上，或许可以通过容器文件系统或 kubelet API 访问这些令牌。如果服务账户还通过 EKS 容器组身份或 IRSA 与 IAM 角色关联，则可以使用暴露的令牌来获取 Amazon IAM 凭证。

## 推荐的控制措施
<a name="_recommended_controls"></a>

### 将 RBAC 范围限定为最低权限
<a name="_scope_rbac_to_least_privilege"></a>
+ 查看绑定到 CSI 驱动程序和 DaemonSet 服务账户的 ClusterRole。移除工作负载不需要的权限。
+ 对于 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）安全准入控制器或策略引擎应用 [Kubernetes 容器组（pod）安全标准](https://kubernetes.io/docs/concepts/security/pod-security-standards/)。至少在集群范围内强制执行 `baseline` 配置文件和为工作负载命名空间强制执行 `restricted` 配置文件。这限制了在系统命名空间外部创建特权容器的能力。

### 使用网络策略
<a name="_use_network_policies"></a>

应用网络策略，将 CSI 驱动程序和 DaemonSet 容器组（pod）的出口限制为仅它们需要的端点（例如，Kubernetes API 服务器和 Amazon 服务端点）。这减少了可能的操作范围。

### 监控 RBAC 活动
<a name="_monitor_rbac_activity"></a>

启用 Kubernetes 审核日志记录，并监控来自 DaemonSet 服务账户的意外 API 调用。查找：
+ 来自 CSI 驱动程序服务账户的节点修改
+ 系统命名空间中的容器组（pod）创建
+ 对密钥的异常 `get` 或 `list` 调用

有关更多信息，请参阅 [将控制面板日志发送到 CloudWatch Logs](control-plane-logs.md)。