本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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 服务。](images/ranger-create-service-EMRFS.png)
步骤 4:创建 AMAZON-EMR-EMRFS 应用程序的实例。
创建服务定义的实例。
-
点击 AMAZON-EMR-EMRFS 旁边的 +。
填写以下字段:
Service Name (服务名称)(如果显示):建议的值为 amazonemrspark
。请记下此服务名称,创建 EMR 安全配置时将要用到。
显示名称:为此服务显示的名称。建议的值为 amazonemrspark
。
Common Name For Certificate (凭证的公用名称):凭证中的 CN 字段,用于从客户端插件连接到管理服务器。此值必须与为插件创建的 TLS 证书中的 CN 字段匹配。
![Ranger Admin 编辑 EMRFS S3 服务。](images/ranger-edit-service-EMRFS.png)
注意
此插件的 TLS 凭证应该已在 Ranger Admin 服务器的信任库中注册。有关更多信息,请参阅TLS 凭证。
创建服务时,服务管理器包含“AMAZON-EMR-EMRFS”,如下图所示。
![Ranger Admin 显示新的 EMRFS S3 服务。](images/ranger-new-service-EMRFS.png)
创建 EMRFS S3 策略
要创建新策略,请在服务管理器的 Create Policy(创建策略)页面填写以下字段。
Policy Name (策略名称):此策略的名称。
Policy Label (策略标注):您可以在此策略上放置的标注。
S3 Resource (S3 资源):以存储桶和可选前缀开头的资源。有关最佳实践的信息,请参阅EMRFS S3 策略使用说明。Ranger Admin 服务器中的资源不应包含 s3://
、s3a://
或 s3n://
。
![Ranger Admin 为 EMRFS S3 服务创建策略。](images/ranger-create-policy-EMRFS.png)
您可以指定要授予权限的用户和组。您还可以指定 allow(允许)条件和 deny(拒绝)条件的排除项。
![Ranger Admin 显示 EMRFS S3 策略的用户/组权限。](images/ranger-permissions-EMRFS.png)
注意
每个策略最多允许三个资源。在 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 上的文件编写策略PutObject
和DeleteObject
权限需要特别小心,因为与 GetObject权限不同,它们需要向前缀授予额外的递归权限。
例 策略 PutObject 和 DeleteObject 权限
例如,删除文件不仅annual-summary.parquet
需要实际文件的 DeleteObject 权限。
- S3 resource = "sales-reports/americas/year=2020/annual-summary.parquet" - permission = "DeleteObject" - user = "analyst"
还需要一个策略,以为其前缀授予递归 GetObject
和 PutObject
权限。
同样,修改文件 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 管理服务器不支持自动完成。