

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

# 适用于 Amazon EMR 集成场景的 Apache Ranger 插件
<a name="emr-ranger-plugins"></a>

Apache Ranger 插件根据 Apache Ranger 策略管理服务器中定义的授权策略验证用户的访问权限。

**Topics**
+ [

# 用于 Ranger 与 Amazon EMR 集成的 Apache Hive 插件
](emr-ranger-hive.md)
+ [

# 用于 Ranger 与 Amazon EMR 集成的 Apache Spark 插件
](emr-ranger-spark.md)
+ [

# 用于 Ranger 与 Amazon EMR 集成的 EMRFS S3 插件
](emr-ranger-emrfs.md)
+ [

# 用于 Ranger 与 Amazon EMR 集成的 Trino 插件
](emr-ranger-trino.md)

# 用于 Ranger 与 Amazon EMR 集成的 Apache Hive 插件
<a name="emr-ranger-hive"></a>

Apache Hive 是 Hadoop 生态系统中流行的执行引擎。Amazon EMR 提供了一个 Apache Ranger 插件，能够为 Hive 提供精细访问控制。该插件与开源 Apache Ranger Admin 服务器版本 2.0 及更高版本兼容。

**Topics**
+ [

## 支持的功能
](#emr-ranger-supported-features)
+ [

## 安装服务配置
](#emr-ranger-hive-service-config)
+ [

## 注意事项
](#emr-ranger-hive-considerations)
+ [

## 限制
](#emr-ranger-hive-limitations)

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

EMR 上 Hive 的 Apache Ranger 插件支持开源插件的所有功能，包括数据库、表、列级访问控制以及行筛选和数据掩码。有关 Hive 命令和关联 Ranger 权限的表，请参阅 [Hive 命令到 Ranger 权限映射](https://cwiki.apache.org/confluence/display/RANGER/Hive+Commands+to+Ranger+Permission+Mapping)。

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

Apache Hive 插件与 Apache Hive Hadoop SQL 中现有的 Hive 服务定义兼容。

![\[用于 Hadoop SQL 的 Hive 配置单元服务定义。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger_service_mgr.png)


如果您没有 Hadoop SQL 下的服务实例（如上所示），则可以创建一个实例。点击 Hadoop SQL 旁边的 **\$1**。

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

1. **Display Name (显示名称)**：输入要为服务显示的名称。建议的值为 **amazonemrhive**。

![\[Hadoop SQL 的 Apache Hive 服务详细信息。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger_create_service.png)


Apache Hive Config 属性用于建立与 Apache Ranger 管理服务器的连接，并在创建策略 HiveServer时使用 2 实现自动完成。如果您没有持续 HiveServer 2 进程，并且可以填充任何信息，则无需保证以下属性准确。
+ **用户名**：输入与 HiveServer 2 实例实例的 JDBC 连接的用户名。
+ **Password (密码)**：输入上述用户名所对应的密码。
+ **jdbc.driver。 ClassName**：输入 Apache Hive 连接的 JDBC 类的类名。可以使用默认值。
+ **jdbc.url**：输入连接到 2 时要使用的 JDBC 连接字符串。 HiveServer
+ **Common Name For Certificate (凭证的公用名称)**：凭证中的 CN 字段，用于从客户端插件连接到管理服务器。此值必须与为插件创建的 TLS 凭证中的 CN 字段匹配。

![\[Apache Hive 服务配置属性。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger_config_props.png)


“**测试连接**” 按钮用于测试是否可以使用上述值成功连接到 HiveServer 2 实例。成功创建服务后，服务管理器应如下所示：

![\[已连接到 HiveServer 2 实例\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger_config_connected.png)


## 注意事项
<a name="emr-ranger-hive-considerations"></a>

**Hive 元数据服务器**

Hive 元数据服务器只能由受信任的引擎访问，特别是 Hive 和 `emr_record_server`，以防未经授权的访问。Hive 元数据服务器也可以通过集群上的所有节点访问。所需的端口 9083 为所有节点提供了主节点的访问权限。

**身份验证**

默认情况下，Apache Hive 配置为使用 EMR 安全配置中所配置的 Kerberos 进行身份验证。 HiveServer2 也可以配置为使用 LDAP 对用户进行身份验证。有关信息，请参阅[在多租户 Amazon EMR 集群上为 Hive 实施 LDAP 身份验证](https://aws.amazon.com/blogs/big-data/implementing-ldap-authentication-for-hive-on-a-multi-tenant-amazon-emr-cluster/)。

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

以下是当前针对 Amazon EMR 5.x 上的 Apache Hive 插件的限制：
+ 当前不支持 Hive 角色。不支持 Grant、Revoke 语句。
+ 不支持 Hive CLI。 JDBC/Beeline 是连接 Hive 的唯一授权方式。
+ `hive.server2.builtin.udf.blacklist`配置中应填充您 UDFs 认为不安全的内容。

# 用于 Ranger 与 Amazon EMR 集成的 Apache Spark 插件
<a name="emr-ranger-spark"></a>

亚马逊 EMR 集成了 EMR，为 SparkSQL 提供了精细 RecordServer 的访问控制。EMR RecordServer 是一个在启用 Apache Ranger 的集群上的所有节点上运行的特权进程。当 Spark 驱动程序或执行器运行 SparkSQL 语句时，所有元数据和数据请求都会通过。 RecordServer要了解有关 EMR 的更多信息 RecordServer，请参阅页面。[适用于 Apache Ranger 的 Amazon EMR 组件](emr-ranger-components.md)

**Topics**
+ [

## 支持的功能
](#emr-ranger-spark-supported-features)
+ [

## 重新部署服务定义以使用 INSERT、ALTER 或 DDL 语句
](#emr-ranger-spark-redeploy-service-definition)
+ [

## 安装服务定义
](#emr-ranger-spark-install-servicedef)
+ [

## 创建 SparkSQL 策略
](#emr-ranger-spark-create-sparksql)
+ [

## 注意事项
](#emr-ranger-spark-considerations)
+ [

## 限制
](#emr-ranger-spark-limitations)

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


| SQL statement/Ranger 操作 | STATUS | 支持的 EMR 版本 | 
| --- | --- | --- | 
|  SELECT  |  支持  |  截至 5.32  | 
|  SHOW DATABASES  |  支持  |  截至 5.32  | 
|  SHOW COLUMNS  |  支持  |  截至 5.32  | 
|  SHOW TABLES  |  支持  |  截至 5.32  | 
|  SHOW TABLE PROPERTIES  |  支持  |  截至 5.32  | 
|  DESCRIBE TABLE  |  支持  |  截至 5.32  | 
|  INSERT OVERWRITE  |  支持  |  自 5.34 和 6.4 起  | 
| INSERT INTO | 支持 | 自 5.34 和 6.4 起 | 
|  ALTER TABLE  |  支持  |  截至 6.4  | 
|  CREATE TABLE  |  支持  |  自 5.35 和 6.7 起  | 
|  CREATE DATABASE  |  支持  |  自 5.35 和 6.7 起  | 
|  DROP TABLE  |  支持  |  自 5.35 和 6.7 起  | 
|  DROP DATABASE  |  支持  |  自 5.35 和 6.7 起  | 
|  DROP VIEW  |  支持  |  自 5.35 和 6.7 起  | 
|  CREATE VIEW  |  不支持  |    | 

使用 SparkSQL 时支持以下功能：
+ 对 Hive Metastore 中的表进行精细访问控制，并且可以在数据库、表和列级别创建策略。
+ Apache Ranger 策略可以包括对用户和组的授予策略和拒绝策略。
+ 审核事件已提交到 CloudWatch 日志。

## 重新部署服务定义以使用 INSERT、ALTER 或 DDL 语句
<a name="emr-ranger-spark-redeploy-service-definition"></a>

**注意**  
从 Amazon EMR 6.4 开始，您可以将 Spark SQL 与以下语句结合使用： INSERT INTO （插入）、INSERT OVERWRITE （插入覆盖）或更改 LTER TABLE （表格语句）。从 Amazon EMR 6.7 开始，您可以使用 Spark SQL 创建或删除数据库和表。如果您在部署了 Apache Spark 服务定义的 Apache Ranger 服务器上具有现有安装程序，请使用以下代码重新部署服务定义。  

```
# Get existing Spark service definition id calling Ranger REST API and JSON processor
curl --silent -f -u <admin_user_login>:<password_for_ranger_admin_user> \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-k 'https://*<RANGER SERVER ADDRESS>*:6182/service/public/v2/api/servicedef/name/amazon-emr-spark' | jq .id

# Download the latest Service definition
wget https://s3.amazonaws.com/elasticmapreduce/ranger/service-definitions/version-2.0/ranger-servicedef-amazon-emr-spark.json

# Update the service definition using the Ranger REST API
curl -u <admin_user_login>:<password_for_ranger_admin_user> -X PUT -d @ranger-servicedef-amazon-emr-spark.json \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-k 'https://*<RANGER SERVER ADDRESS>*:6182/service/public/v2/api/servicedef/<Spark service definition id from step 1>'
```

## 安装服务定义
<a name="emr-ranger-spark-install-servicedef"></a>

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

按照以下步骤安装 Apache Spark 服务定义：

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

例如：

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

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

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

```
mkdir /tmp/emr-spark-plugin/
cd /tmp/emr-spark-plugin/

wget https://s3.amazonaws.com/elasticmapreduce/ranger/service-definitions/version-2.0/ranger-spark-plugin-2.x.jar
wget https://s3.amazonaws.com/elasticmapreduce/ranger/service-definitions/version-2.0/ranger-servicedef-amazon-emr-spark.json
```

**步骤 3: 安装适用于 Amazon EMR 的 Apache Spark 插件**

```
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-spark
mv ranger-spark-plugin-2.x.jar $RANGER_HOME/ews/webapp/WEB-INF/classes/ranger-plugins/amazon-emr-spark
```

**步骤 4: 注册 Amazon EMR 的 Apache Spark 服务定义**

```
curl -u *<admin users login>*:*_<_**_password_ **_for_** _ranger admin user_**_>_* -X POST -d @ranger-servicedef-amazon-emr-spark.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-SPARK”的新服务，如下图所示（显示 Ranger 2.0 版）。

![\[在 Ranger Admin 中注册的“AMAZON-EMR-SPARK”。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-amazon-emr-spark.png)


**步骤 5：创建 AMAZON-EMR-SPARK应用程序的实例**

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

**Display Name (显示名称)：**要为此实例显示的名称。建议的值为 **amazonemrspark**。

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

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


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

## 创建 SparkSQL 策略
<a name="emr-ranger-spark-create-sparksql"></a>

创建新策略时，要填写的字段包括：

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

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

**Database (数据库)**：应用此策略的数据库。通配符“\$1”表示所有数据库。

**Table（表）**：应用此策略的表。通配符“\$1”表示所有表。

**EMR Spark Column (EMR Spark 列)**：应用此策略的列。通配符“\$1”表示所有列。

**Description (描述)**：策略的描述。

![\[Ranger Admin 创建 SparkSQL 策略详细信息。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-create-policy-details.png)


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

![\[Ranger Admin SparkSQL 策略详细信息允许条件。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-create-policy-allow-conditions.png)


指定允许和拒绝条件后，单击 **Save (保存)**。

## 注意事项
<a name="emr-ranger-spark-considerations"></a>

EMR 集群中的每个节点都必须能够通过端口 9083 连接到主节点。

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

以下是当前针对 Apache Spark 插件的限制：
+ Record 服务器将始终连接到 Amazon EMR 集群上运行的 HMS。如果需要，将 HMS 配置为连接到远程模式。您不应该将配置值放在 Apache Spark Hive-site.xml 配置文件中。
+ 使用 EMR 无法读取在 CSV 或 Avro 上使用 Spark 数据源创建的表。 RecordServer使用 Hive 创建和写入数据，并使用 Record 读取。
+ 不支持 Delta Lake、Hudi 和 Iceberg 表。
+ 用户必须有权访问默认数据库。这是 Apache Spark 的要求。
+ Ranger Admin 服务器不支持自动完成。
+ Amazon EMR 的 SparkSQL 插件不支持行筛选器或数据掩码。
+ 将 ALTER TABLE 与 Spark SQL 结合使用时，分区位置必须是表位置的子目录。不支持将数据插入分区位置与表位置不同的分区中。

# 用于 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 服务器不支持自动完成。

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

Trino（原 PrestoSQL）是一个 SQL 查询引擎，您可以用来对 HDFS、对象存储、关系数据库和 NoSQL 数据库等数据来源运行查询。这样就不需要将数据迁移到中心位置，并可以随时随地查询数据。Amazon EMR 提供了一个 Apache Ranger 插件，为 Trino 提供精细访问控制。该插件与开源 Apache Ranger Admin 服务器版本 2.0 及更高版本兼容。

**Topics**
+ [

## 支持的功能
](#emr-ranger-trino-features)
+ [

## 安装服务配置
](#emr-ranger-trino-service-config)
+ [

## 创建 Trino 策略
](#emr-ranger-trino-create-policies)
+ [

## 注意事项
](#emr-ranger-trino-considerations)
+ [

## 限制
](#emr-ranger-trino-limitations)

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

Trino 查询引擎受精细访问控制的保护，Amazon EMR 上 Trino 的 Apache Ranger 插件支持该引擎的所有功能。这包括数据库、表、列级别的访问控制以及行筛选和数据掩码。Apache Ranger 策略可以包括对用户和组的授予策略和拒绝策略。审计事件也会提交到 CloudWatch日志。

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

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

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

1. SSH 进入 Apache Ranger Admin 服务器。

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

   

1. 卸载 Presto 服务器插件（如有）。运行如下命令。如果出现“Service not found（未找到服务）”错误，则意味着您的服务器上未安装 Presto 服务器插件。继续执行下一步骤。

   ```
   curl -f -u *<admin users login>*:*_<_**_password_ **_for_** _ranger admin user_**_>_* -X DELETE -k 'https://*<RANGER SERVER ADDRESS>*:6182/service/public/v2/api/servicedef/name/presto'
   ```

1. 下载服务定义和 Apache Ranger Admin 服务器插件。在临时目录中，下载服务定义。此服务定义由 Ranger 2.x 版本支持。

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

1. 注册 Amazon EMR 的 Apache Trino 服务定义。

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

   如果此命令成功运行，您会在 Ranger Admin UI 中看到一个名为 `TRINO` 的新服务，如下图所示。  
![\[Ranger Admin 创建服务。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-create-service-trino.png)

1. 创建 `TRINO` 应用程序的实例，输入以下信息。

   **Service Name**（服务名称）：您将使用的服务名称。建议的值为 `amazonemrtrino`。请记下此服务名称，创建 Amazon EMR 安全配置时将要用到。

   **Display Name (显示名称)：**要为此实例显示的名称。建议的值为 `amazonemrtrino`。  
![\[Ranger Admin 显示名称。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-display-name-trino.png)

   **jdbc.driver。 ClassName**: 用于 Trino 连接的 JDBC 类的类名。您可以使用默认值。

   **jdbc.url**：连接到 Trino 协调器时要使用的 JDBC 连接字符串。

   **Common Name For Certificate (凭证的公用名称)**：凭证中的 CN 字段，用于从客户端插件连接到管理服务器。此值必须与为插件创建的 TLS 凭证中的 CN 字段匹配。  
![\[Ranger Admin 通用名称。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-common-name-trino.png)

   请注意，此插件的 TLS 凭证应该已在 Ranger Admin 服务器的信任库中注册。有关更多信息，请参阅 [TLS 证书](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-ranger-admin-tls.html)。

## 创建 Trino 策略
<a name="emr-ranger-trino-create-policies"></a>

创建新策略时，请填写以下字段。

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

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

**Catalog**（目录）：应用此策略的目录。通配符“\$1”表示所有目录。

**Schema**（架构）：应用此策略的架构。通配符“\$1”表示所有架构。

**Table（表）**：应用此策略的表。通配符“\$1”表示所有表。

**Column**（列）：应用此策略的列。通配符“\$1”表示所有列。

**Description (描述)**：策略的描述。

还存在其他类型的适用于 **Trino 用户**（用于用户模拟访问）、**Trino 系统/会话属性**（用于更改引擎系统或会话属性）、**函数/过程**（用于允许函数或过程调用）和 **URL**（用于向数据位置上的引擎授予读/写访问权限）的策略。

![\[Ranger Admin 创策略详细信息。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-create-policy-details-trino.png)


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

![\[Ranger Admin 策略详细信息允许拒绝条件。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-create-policy-allow-conditions-trino.png)


指定允许和拒绝条件后，选择 **Save**（保存）。

## 注意事项
<a name="emr-ranger-trino-considerations"></a>

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

**Hive 元数据服务器**

Hive 元数据服务器只能由受信任的引擎（特别是 Trino 引擎）访问，以防未经授权的访问。Hive 元数据服务器也可以通过集群上的所有节点访问。所需的端口 9083 为所有节点提供了主节点的访问权限。

**身份验证**

默认情况下，Trino 配置为使用 Amazon EMR 安全配置中配置的 Kerberos 进行身份验证。

**需要传输中加密**

Trino 插件要求您在 Amazon EMR 安全配置中启用传输中加密。要启用加密，请参阅 [传输中加密](emr-data-encryption-options.md#emr-encryption-intransit)。

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

以下是 Trino 插件的当前限制：
+ Ranger Admin 服务器不支持自动完成。