

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

# 用于 Ranger 与 Amazon EMR 集成的 EMRFS S3 插件
<a name="emr-ranger-emrfs"></a>

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

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

**Topics**
+ [支持的功能](#emr-ranger-emrfs-features)
+ [安装服务配置](#emr-ranger-emrfs-service-config)
+ [创建 EMRFS S3 策略](#emr-ranger-emrfs-create-policies)
+ [EMRFS S3 策略使用说明](#emr-ranger-emrfs-considerations)
+ [限制](#emr-ranger-emrfs-limitations)

## 支持的功能
<a name="emr-ranger-emrfs-features"></a>

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

## 安装服务配置
<a name="emr-ranger-emrfs-service-config"></a>

要安装 EMRFS 服务定义，必须设置 Ranger Admin 服务器。要设置服务器，请参阅 [设置 Ranger Admin 服务器，以便与 Amazon EMR 集成](emr-ranger-admin.md)。

按照以下步骤安装 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 服务。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-create-service-EMRFS.png)


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

创建服务定义的实例。
+ 点击旁边的 **\$1** AMAZON-EMR-EMRFS。

填写以下字段：

**Service Name (服务名称)**（如果显示）：建议的值为 **amazonemrs3**。请记下此服务名称，创建 EMR 安全配置时将要用到。

**显示名称**：为此服务显示的名称。建议的值为 **amazonemrs3**。

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

![\[Ranger Admin 编辑 EMRFS S3 服务。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-edit-service-EMRFS.png)


**注意**  
此插件的 TLS 凭证应该已在 Ranger Admin 服务器的信任库中注册。有关更多信息，请参阅[用于 Apache Ranger 与 Amazon EMR 集成的 TLS 证书](emr-ranger-admin-tls.md)。

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

![\[Ranger Admin 显示新的 EMRFS S3 服务。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-new-service-EMRFS.png)


## 创建 EMRFS S3 策略
<a name="emr-ranger-emrfs-create-policies"></a>

要创建新策略，请在服务管理器的 **Create Policy**（创建策略）页面填写以下字段。

**Policy Name (策略名称)**：此策略的名称。

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

**S3 Resource (S3 资源)**：以存储桶和可选前缀开头的资源。有关最佳实践的信息，请参阅[EMRFS S3 策略使用说明](#emr-ranger-emrfs-considerations)。Ranger Admin 服务器中的资源不应包含 **s3://**、**s3a://** 或 **s3n://**。

![\[Ranger Admin 为 EMRFS S3 服务创建策略。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-create-policy-EMRFS.png)


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

![\[Ranger 管理员显示了 EMRFS S3 user/group 策略的权限。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-permissions-EMRFS.png)


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

## EMRFS S3 策略使用说明
<a name="emr-ranger-emrfs-considerations"></a>

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

### 对多个 S3 对象的权限
<a name="emr-ranger-emrfs-considerations-s3objects"></a>

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

**Example 使用递归策略**  
假设您希望获得列出 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 权限
<a name="emr-ranger-emrfs-considerations-putobject"></a>

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

**Example 策略 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"
```

### 策略中的通配符
<a name="emr-ranger-emrfs-considerations-wildcards"></a>

有两个区域可以指定通配符。指定 S3 资源时，可以使用“\$1”和“?”。“\$1”提供针对 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/
```

### 用户中的通配符
<a name="emr-ranger-emrfs-considerations-wildcards-in-users"></a>

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

## 限制
<a name="emr-ranger-emrfs-limitations"></a>

以下是 EMRFS S3 插件的当前限制：
+ Apache Ranger 策略最多可以有三个策略。
+ 对 S3 的访问必须通过 EMRFS 完成，并且可以与 Hadoop 相关的应用程序配合使用。不支持以下内容：

  ：Boto3 库

  - AWS SDK 和 AWK CLI

  ：S3A 开源连接器
+ 不支持 Apache Ranger 拒绝策略。
+ 目前不支持使用具有 CSE-KMS 加密的密钥在 S3 上进行操作。
+ 不支持跨区域支持。
+ 不支持 Apache Ranger 的安全区功能。使用安全区功能定义的访问控制限制不适用于您的 Amazon EMR 集群。
+ Hadoop 用户不会生成任何审计事件，因为 Hadoop 始终访问 EC2 实例配置文件。
+ 建议您禁用 Amazon EMR 一致性视图。S3 具有强一致性，因此不再需要它。有关更多信息，请参阅 [Amazon S3 强一致性](https://aws.amazon.com/s3/consistency/)。
+ EMRFS S3 插件会进行大量的 STS 调用。建议您对开发账户进行负载测试并监控 STS 调用量。还建议您提出 STS 请求以提高 AssumeRole服务限制。
+ Ranger Admin 服务器不支持自动完成。