本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
EMRFS用于与 Amazon 集成 Ranger 的 S3 插件 EMR
为了更轻松地对多租户集群上的 S3 中的对象提供访问控制,EMRFSS3 插件在通过EMRFS访问时提供了对 S3 中数据的访问控制。您可以允许在用户和组级别访问 S3 资源。
为此,当您的应用程序尝试访问 S3 中的数据时,EMRFS会向 Secret Agent 进程发送证书请求,在该进程中,该请求将根据 Apache Ranger 插件进行身份验证和授权。如果请求获得授权,则秘密特工将IAM扮演具有受限策略的 Apache Ranger Engines 的角色,以生成只能访问允许访问的 Ranger 策略的证书。然后将凭证传回EMRFS以访问 S3。
支持的特征
EMRFSS3 插件提供存储级别授权。可以创建策略,以便向用户和组提供对 S3 存储桶和前缀的访问权限。仅针对进行授权EMRFS。
安装服务配置
要安装EMRFS服务定义,必须设置 Ranger 管理服务器。要设置服务器,请参阅设置 Ranger 管理服务器以与 Amazon 集成 EMR。
按照以下步骤安装EMRFS服务定义。
第 1 步:SSH进入 Apache Ranger 管理服务器。
例如:
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 管理界面中看到一个名为 “AMAZON-EMR-S3” 的新服务,如下图所示(显示的是 Ranger 版本 2.0)。
步骤 4:创建 AMAZON-EMR-EMRFS应用程序的实例。
创建服务定义的实例。
-
点击旁边的 + AMAZON-EMR-EMRFS。
填写以下字段:
Service Name (服务名称)(如果显示):建议的值为 amazonemrspark
。请注意此服务名称,因为创建EMR安全配置时需要使用该名称。
显示名称:为此服务显示的名称。建议的值为 amazonemrspark
。
Common Name For Certificate (凭证的公用名称):凭证中的 CN 字段,用于从客户端插件连接到管理服务器。此值必须与为插件创建的TLS证书中的 CN 字段匹配。
注意
此插件的TLS证书应已在 Ranger Admin 服务器的信任库中注册。有关更多信息,请参阅 TLSApache Ranger 与亚马逊集成的证书 EMR。
创建服务时,服务管理器包含 EMRFS “AMAZONEMR-”,如下图所示。
创建 EMRFS S3 策略
要创建新策略,请在服务管理器的 Create Policy(创建策略)页面填写以下字段。
Policy Name (策略名称):此策略的名称。
Policy Label (策略标注):您可以在此策略上放置的标注。
S3 Resource (S3 资源):以存储桶和可选前缀开头的资源。有关最佳实践的信息,请参阅EMRFSS3 策略使用说明。Ranger Admin 服务器中的资源不应包含 s3://
、s3a://
或 s3n://
。
您可以指定要授予权限的用户和组。您还可以指定 allow(允许)条件和 deny(拒绝)条件的排除项。
注意
每个策略最多允许三个资源。在EMR群集上使用此策略时,添加三个以上的资源可能会导致错误。添加三个以上的策略将显示有关策略限制的提醒。
EMRFSS3 策略使用说明
在 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 权限
为文件编写策略PutObject
和DeleteObject
权限EMRFS需要特别小心,因为与 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}” 通配符,它为所有用户提供访问权限。第二个通配符是 “{OWNER}”,它为特定对象的所有者提供访问权限或直接访问权限。但是,目前不支持 “{USER}” 通配符。
限制
以下是 EMRFS S3 插件的当前限制:
-
Apache Ranger 策略最多可以有三个策略。
-
对 S3 的访问必须通过 Hadoop 相关应用程序完成EMRFS,并且可以与 Hadoop 相关的应用程序一起使用。不支持以下内容:
– Boto3 库
- AWS SDK 和 AWK CLI
– S3A 开源连接器
-
不支持 Apache Ranger 拒绝策略。
-
目前不支持在 S3 上使用密钥进行操作 CSE-KMS 加密。
-
不支持跨区域支持。
-
不支持 Apache Ranger 的安全区功能。使用安全区域功能定义的访问控制限制不适用于您的 Amazon EMR 集群。
-
Hadoop 用户不会生成任何审计事件,因为 Hadoop 始终访问实例配置文件。EC2
-
建议您禁用 Amazon EMR 一致性视图。S3 具有强一致性,因此不再需要它。有关更多信息,请参阅 Amazon S3 强一致性
。 -
S EMRFS 3 插件会进行多次STS调用。建议您在开发账户上进行负载测试并监控STS通话量。还建议您STS申请提高 AssumeRole服务限制。
-
Ranger 管理服务器不支持自动完成。