

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon EMR on EKS 安全最佳实践
<a name="security-best-practices"></a>

Amazon EMR on EKS 提供了在您开发和实施自己的安全策略时需要考虑的大量安全功能。以下最佳实践是一般指导原则，并不代表完整安全解决方案。这些最佳实践可能不适合环境或不满足环境要求，请将其视为有用的考虑因素而不是惯例。

**注意**  
有关更多安全最佳实践，请参阅 [Amazon EMR on EKS 安全最佳实践](#security-best-practices)。

## 采用最低特权原则
<a name="security-least-privilege"></a>

Amazon EMR on EKS 为使用 IAM 角色（如执行角色）的应用程序提供了精细的访问策略。这些执行角色通过 IAM 角色的信任策略映射到 Kubernetes 服务账户。Amazon EMR on EKS 在已注册的 Amazon EKS 命名空间中创建 Pod，用于执行用户提供的应用程序代码。运行应用程序代码的作业 pod 在连接到其他 Amazon 服务时扮演执行角色。我们建议向执行角色仅授予任务所需的最低权限集，例如覆盖应用程序和对日志目标的访问权限。我们还建议定期以及在应用程序代码发生变化时审核任务的权限。

## 终端节点的访问控制列表
<a name="security-access-control-list"></a>

只能为已配置的 EKS 集群创建托管式终端节点，以至少在 VPC 的私有子网上使用。此配置限制对托管式终端节点创建的负载均衡器的访问，以便只能从您的 VPC 访问它们。为了进一步增强安全性，我们建议您使用这些负载均衡器配置安全组，以便它们可以将传入流量限制到一组选定的 IP 地址。

## 获取自定义镜像的最新安全更新
<a name="security-custom-image"></a>

要通过 Amazon EMR on EKS 使用自定义镜像，您可以在镜像上安装任何二进制文件和库。您负责添加到镜像中的二进制文件的安全修补。Amazon EMR on EKS 镜像会使用最新的安全补丁程序进行定期修补。要获取最新映像，您必须在 Amazon EMR 的新基础映像版本发布时重新构建自定义映像。有关更多信息，请参阅[Amazon EMR on EKS 版本](emr-eks-releases.md)和[如何选择基础映像 URI 的详细信息](docker-custom-images-tag.md)。

## 限制 Pod 凭证访问
<a name="security-limit-pod"></a>

Kubernetes 支持将凭证分配给 Pod 的多种方法。预置多个凭证提供程序可能会增加您安全模型的复杂性。Amazon EMR on EKS 已采用[服务账户的 IAM 角色（IRSA）](https://docs.amazonaws.cn/eks/latest/userguide/iam-roles-for-service-accounts.html)作为注册 EKS 命名空间中的标准凭证提供程序。不支持其它方法，包括 [kube2iam](https://github.com/jtblin/kube2iam)、[kiam](https://github.com/uswitch/kiam) 并使用 EC2 实例的实例配置文件在集群上运行。

## 隔离不受信任的应用程序代码
<a name="security-isolate-untrusted"></a>

Amazon EMR on EKS 不检查系统用户提交应用程序代码的完整性。如果您运行的多租户虚拟集群是使用多个执行角色进行配置的，而运行任意代码的不受信任的租户可使用这些角色来提交任务，则会存在恶意应用程序升级其权限的风险。在这种情况下，请考虑将具有相似权限的执行角色隔离到不同的虚拟集群中。

## 基于角色的访问控制（RBAC）权限
<a name="security-practice-rbac"></a>

管理员应针对 Amazon EMR on EKS 托管式命名空间，来严格控制基于角色的访问控制（RBAC）权限。至少不应向 Amazon EMR on EKS 托管式命名空间中的任务提交者授予以下权限。
+ Kubernetes RBAC 具有修改 configmap 的权限，因为 Amazon EMR on EKS 使用 Kubernetes configmaps 来生成具有托管式服务账户名称的托管式 Pod 模板。此属性应不可变。
+ Kubernetes RBAC 具有可执行 Amazon EMR on EKS Pod 的权限，以避免对具有托管 SA 名称的托管 Pod 模板授予访问权限。此属性应不可变。此权限还可对挂载到 Pod 中的 JWT 令牌授予访问权限，然后可使用该令牌检索执行角色凭证。
+ Kubernetes RBAC 创建容器的权限——防止用户使用 Kubernetes 创建 Pod， ServiceAccount 该容器可能映射到权限比用户更多的 IAM 角色。 Amazon 
+ Kubernetes RBAC 部署变异 webhook 的权限——以防止用户使用变异的 webhook 来改变亚马逊 EMR 在 EKS 上创建的 pod 的 Kubernetes 名称。 ServiceAccount 
+ Kubernetes RBAC 具有读取 Kubernetes 机密信息的权限，以防止用户读取存储在这些机密中的机密性数据。

## 限制对节点组 IAM 角色或实例配置文件凭证的访问
<a name="security-practice-nodegroup"></a>
+ 我们建议您为节点组的 IAM 角色分配最低 Amazon 权限。通过使用 EKS 工作线程节点的实例配置文件凭证所运行的代码，这有助于避免权限升级。
+ 要完全阻止对 Amazon EMR on EKS 托管式命名空间中运行的所有 Pod 的实例配置文件凭证的访问，我们建议您在 EKS 节点上运行 `iptables` 命令。有关更多信息，请参阅[限制对 Amazon EC2 实例配置文件凭证的访问](https://docs.amazonaws.cn/eks/latest/userguide/restrict-ec2-credential-access.html)。但是，正确确定服务账户 IAM 角色的范围非常重要，以便您的 Pod 具有所有必要的权限。例如，为节点 IAM 角色分配了从 Amazon ECR 提取容器镜像的权限。如果未向某个 Pod 分配这些权限，则该 Pod 无法从 Amazon ECR 提取容器镜像。VPC CNI 插件也需要更新。有关更多信息，请参阅[演练：更新 VPC CNI 插件以便为服务账户使用 IAM 角色](https://docs.amazonaws.cn/eks/latest/userguide/iam-roles-for-service-accounts-cni-walkthrough.html)。