EMRFS S3 插件 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

EMRFS S3 插件

为了更轻松地为多租户集群上的 S3 中的对象提供访问控制,EMRFS S3 插件在通过 EMRFS 访问 S3 中的数据时提供对这些数据的访问控制。您可以允许在用户和组级别访问 S3 资源。

为此,当您的应用程序尝试访问 S3 中的数据时,EMRFS 会向私有代理进程发送凭证请求,在该进程中该请求针对 Apache Ranger 插件进行身份验证和授权。如果请求获得授权,则私有代理将代入 Apache Ranger Engines 的 IAM 角色,并使用受限策略生成仅有权访问允许访问的 Ranger 策略的凭证。然后,凭证将传回 EMRFS 以访问 S3。

支持的特征

EMRFS S3 插件提供存储级别授权。可以创建策略,以便向用户和组提供对 S3 存储桶和前缀的访问权限。授权仅针对 EMRFS 进行。

安装服务配置

要安装 EMRFS 服务定义,必须设置 Ranger 管理服务器。要设置服务器,请参阅设置 Ranger 管理服务器

按照以下步骤安装 EMRFS 服务定义。

步骤 1:SSH 进入 Apache Ranger Admin 服务器

例如:

ssh ec2-user@ip-xxx-xxx-xxx-xxx.ec2.internal

步骤 2:下载 EMRFS 服务定义

在临时目录中,下载 Amazon EMR 服务定义。此服务定义由 Ranger 2.x 版本支持。

wget https://s3.amazonaws.com/elasticmapreduce/ranger/service-definitions/version-2.0/ranger-servicedef-amazon-emr-emrfs.json

步骤 3:注册 EMRFS S3 服务定义

curl -u *<admin users login>*:*_<_**_password_ **_for_** _ranger admin user_**_>_* -X POST -d @ranger-servicedef-amazon-emr-emrfs.json \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -k 'https://*<RANGER SERVER ADDRESS>*:6182/service/public/v2/api/servicedef'

如果此命令成功运行,您会在 Ranger Admin UI 中看到一个名为“AMAZON-EMR-S3”的新服务,如下图所示(显示 Ranger 2.0 版)。

Ranger Admin 创建 EMRFS S3 服务。

步骤 4:创建 AMAZON-EMR-EMRFS 应用程序的实例

创建服务定义的实例。

  • 点击 AMAZON-EMR-EMRFS 旁边的 +

填写以下字段:

Service Name (服务名称)(如果显示):建议的值为 amazonemrspark。请记下此服务名称,创建 EMR 安全配置时将要用到。

显示名称:为此服务显示的名称。建议的值为 amazonemrspark

Common Name For Certificate (凭证的公用名称):凭证中的 CN 字段,用于从客户端插件连接到管理服务器。此值必须与为插件创建的 TLS 证书中的 CN 字段匹配。

Ranger Admin 编辑 EMRFS S3 服务。
注意

此插件的 TLS 凭证应该已在 Ranger Admin 服务器的信任库中注册。有关更多信息,请参阅TLS 凭证

创建服务时,服务管理器包含“AMAZON-EMR-EMRFS”,如下图所示。

Ranger Admin 显示新的 EMRFS S3 服务。

创建 EMRFS S3 策略

要创建新策略,请在服务管理器的 Create Policy(创建策略)页面填写以下字段。

Policy Name (策略名称):此策略的名称。

Policy Label (策略标注):您可以在此策略上放置的标注。

S3 Resource (S3 资源):以存储桶和可选前缀开头的资源。有关最佳实践的信息,请参阅EMRFS S3 策略使用说明。Ranger Admin 服务器中的资源不应包含 s3://s3a://s3n://

Ranger Admin 为 EMRFS S3 服务创建策略。

您可以指定要授予权限的用户和组。您还可以指定 allow(允许)条件和 deny(拒绝)条件的排除项。

Ranger Admin 显示 EMRFS S3 策略的用户/组权限。
注意

每个策略最多允许三个资源。在 EMR 集群上使用此策略时,添加三个以上的资源可能会导致错误。添加三个以上的策略将显示有关策略限制的提醒。

EMRFS S3 策略使用说明

在 Apache Renger 中创建 S3 策略时,需要谨记一些使用注意事项。

对多个 S3 对象的权限

您可以使用递归策略和通配符表达式为具有公共前缀的多个 S3 对象授予权限。递归策略为所有具有公共前缀的对象授予权限。通配符表达式选择多个前缀。它们共同为具有多个公共前缀的所有对象授予权限,如以下示例所示。

例 使用递归策略

假设您希望获得列出 S3 存储桶中所有 Parquet 文件的权限,该存储桶的组织方式如下。

s3://sales-reports/americas/ +- year=2000 | +- data-q1.parquet | +- data-q2.parquet +- year=2019 | +- data-q1.json | +- data-q2.json | +- data-q3.json | +- data-q4.json | +- year=2020 | +- data-q1.parquet | +- data-q2.parquet | +- data-q3.parquet | +- data-q4.parquet | +- annual-summary.parquet +- year=2021

首先,考虑带有前缀 s3://sales-reports/americas/year=2000 的 Parquet 文件。您可以通过两种方式向所有GetObject 用户授予权限:

使用非递归策略:一种选择是使用两个单独的非递归策略,一个用于目录,另一个用于文件。

第一个策略向前缀 s3://sales-reports/americas/year=2020 授予权限(无尾随 /)。

- S3 resource = "sales-reports/americas/year=2000" - permission = "GetObject" - user = "analyst"

第二个策略使用通配符表达式授予所有带前缀 sales-reports/americas/year=2020/ 的文件的权限(请注意尾随 /)。

- S3 resource = "sales-reports/americas/year=2020/*" - permission = "GetObject" - user = "analyst"

使用递归策略:更方便的替代方法是使用单个递归策略并对前缀授予递归权限。

- S3 resource = "sales-reports/americas/year=2020" - permission = "GetObject" - user = "analyst" - is recursive = "True"

到目前为止,只有带有 s3://sales-reports/americas/year=2000 前缀的 Parquet 文件被包括在内。您现在还可以通过引入通配符表达式,将具有不同前缀 s3://sales-reports/americas/year=2020 的 Parquet 文件包含到相同的递归策略中,如下所示。

- S3 resource = "sales-reports/americas/year=20?0" - permission = "GetObject" - user = "analyst" - is recursive = "True"

策略PutObject 和 DeleteObject 权限

为 EMRFS 上的文件编写策略PutObjectDeleteObject权限需要特别小心,因为与 GetObject权限不同,它们需要向前缀授予额外的递归权限。

例 策略 PutObject 和 DeleteObject 权限

例如,删除文件不仅annual-summary.parquet需要实际文件的 DeleteObject 权限。

- S3 resource = "sales-reports/americas/year=2020/annual-summary.parquet" - permission = "DeleteObject" - user = "analyst"

还需要一个策略,以为其前缀授予递归 GetObjectPutObject 权限。

同样,修改文件 annual-summary.parquet 不仅需要对实际文件的PutObject 权限。

- S3 resource = "sales-reports/americas/year=2020/annual-summary.parquet" - permission = "PutObject" - user = "analyst"

还需要一个策略,以为其前缀授予递归 GetObject 权限。

- S3 resource = "sales-reports/americas/year=2020" - permission = "GetObject" - user = "analyst" - is recursive = "True"

策略中的通配符

有两个区域可以指定通配符。指定 S3 资源时,可以使用“*”和“?”。“*”提供针对 S3 路径的匹配,并匹配前缀后的所有内容。例如以下策略。

S3 resource = "sales-reports/americas/*"

这与以下 S3 路径匹配。

sales-reports/americas/year=2020/ sales-reports/americas/year=2019/ sales-reports/americas/year=2019/month=12/day=1/afile.parquet sales-reports/americas/year=2018/month=6/day=1/afile.parquet sales-reports/americas/year=2017/afile.parquet

“?”通配符匹配任意单个字符。例如,策略。

S3 resource = "sales-reports/americas/year=201?/"

这与以下 S3 路径匹配。

sales-reports/americas/year=2019/ sales-reports/americas/year=2018/ sales-reports/americas/year=2017/

用户中的通配符

为用户分配访问权限时,有两个内置通配符。第一个是为所有用户提供访问权限的“{USER}”通配符。第二个通配符是“{HOSTER}”,它提供对特定对象所有者的访问权限或直接访问权限。但是,目前尚不支持“{USER}”通配符。

限制

以下是 EMRFS S3 插件的当前限制:

  • Apache Ranger 策略最多可以有三个策略。

  • 对 S3 的访问必须通过 EMRFS 完成,并且可以与 Hadoop 相关的应用程序配合使用。不支持以下内容:

    – Boto3 库

    - Amazon SDK 和 AWK CLI

    – S3A 开源连接器

  • 不支持 Apache Ranger 拒绝策略。

  • 目前不支持使用具有 CSE-KMS 加密的密钥在 S3 上进行操作。

  • 不支持跨区域支持。

  • 不支持 Apache Ranger 的安全区功能。使用安全区功能定义的访问控制限制不适用于您的 Amazon EMR 集群。

  • Hadoop 用户不会生成任何审计事件,因为 Hadoop 始终访问 EC2 实例配置文件。

  • 建议您禁用 Amazon EMR 一致性视图。S3 具有强一致性,因此不再需要它。有关更多信息,请参阅 Amazon S3 强一致性

  • EMRFS S3 插件会进行大量的 STS 调用。建议您对开发账户进行负载测试并监控 STS 调用量。还建议您提出 STS 请求以提高 AssumeRole服务限制。

  • Ranger 管理服务器不支持自动完成。