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

EMRFS S3 插件

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

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

支持的功能

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

安装服务配置

安装 EMRFS S3 服务定义要求设置 Ranger Admin 服务器。请参阅 设置 Ranger 管理服务器

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

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

例如:

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

步骤 2:下载 Amazon EMR 服务定义和 Apache Ranger Admin 服务器插件

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

mkdir /tmp/emr-emrfs-plugin/ cd /tmp/emr-emrfs-plugin/ wget https://s3.amazonaws.com/elasticmapreduce/ranger/service-definitions/version-2.0/ranger-servicedef-amazon-emr-emrfs.json wget https://s3.amazonaws.com/elasticmapreduce/ranger/service-definitions/version-2.0/ranger-emr-emrfs-plugin-2.x.jar

步骤 3:安装适用于 Amazon EMR 的 Apache EMRFS S3 插件

export RANGER_HOME=.. # Replace this Ranger Admin's home directory eg /usr/lib/ranger/ranger-2.0.0-admin mkdir $RANGER_HOME/ews/webapp/WEB-INF/classes/ranger-plugins/amazon-emr-emrfs mv ranger-emr-emrfs-plugin-2.x.jar $RANGER_HOME/ews/webapp/WEB-INF/classes/ranger-plugins/amazon-emr-emrfs

步骤 4:注册 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 服务。

步骤 5:创建 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 服务创建策略。

如下所示,您可以指定要授予权限的用户和组。EMR SparkSQL 目前仅支持 select (选择) 操作。您还可以指定 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}”通配符。

安全区域

将安全区域与 S3 Ranger 插件一起使用时,建议同时提供存储桶和前缀资源。例如:

- sthreeResource = "sales-reports" - sthreeResource = "sales-reports/*"

如果仅指定了存储桶或前缀,则 Apache Ranger 插件可能无法将提供的 S3 资源识别为安全区域的一部分。

其他注意事项和限制

以下为 EMRFS S3 插件的限制。

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

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

    – Boto3 库

    – Amazon SDK 和 Amazon CLI

    – S3A 开源连接器

  • 不支持 Apache Ranger 拒绝策略。

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

  • 不支持跨区域支持。

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

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

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