

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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 的 Apache Hive 服務定義。\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/ranger_service_mgr.png)


如果您在 Hadoop SQL 下沒有此服務的執行個體 (如上所示)，您可以建立執行個體。按一下 Hadoop SQL 旁邊的 **\$1**。

1. **服務名稱 (如果顯示)**：輸入服務名稱。建議的值為 **amazonemrhive**。請記下此服務名稱 – 建立 EMR 安全組態時需要此名稱。

1. **顯示名稱**：輸入要顯示的服務名稱。建議的值為 **amazonemrhive**。

![\[Hadoop SQL 的 Apache Hive 服務詳細資訊。\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/ranger_create_service.png)


Apache Hive 設定屬性用於透過 HiveServer2 建立與 Apache Ranger Admin 伺服器的連線，以在建立政策時實作自動完成。下面的屬性不需要準確 (如果您沒有持久性 HiveServer2 程序)，且可以填入任何資訊。
+ **使用者名稱**：輸入與 HiveServer2 執行個體的 JDBC 連線的使用者名稱。
+ **密碼**：輸入上面的使用者名稱的密碼。
+ **jdbc.driver.ClassName**：輸入 Apache Hive 連線的 JDBC 類別的類別名稱。您可以使用預設值。
+ **jdbc.url**：輸入連接至 HiveServer2 時要使用的 JDBC 連線字串。
+ **憑證的通用名稱**：憑證內的 CN 欄位用於從用戶端外掛程式連接至管理伺服器。此值必須與為外掛程式建立的 TLS 憑證中的 CN 欄位相符。

![\[Apache Hive 服務組態屬性。\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/ranger_config_props.png)


**測試連線**按鈕測試上面的值是否可用於成功連接至 HiveServer2 執行個體。成功建立服務後，Service Manager 應如下所示：

![\[已連接至 HiveServer2 執行個體\]](http://docs.aws.amazon.com/zh_tw/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 角色。不支援授權、撤銷陳述式。
+ 不支援 Hive CLI。JDBC/Beeline 是連接 Hive 的唯一授權方式。
+ `hive.server2.builtin.udf.blacklist` 組態應填入您認為不安全的 UDF。

# 適用於 Ranger 與 Amazon EMR 整合的 Apache Spark 外掛程式
<a name="emr-ranger-spark"></a>

Amazon EMR 整合了 EMR RecordServer，可為 SparkSQL 提供精細分級的存取控制。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 陳述式/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 中繼存放區內的資料表和政策的精細分級的存取控制。
+ Apache Ranger 政策可以包括對使用者和群組的授權政策和拒絕政策。
+ 稽核事件提交至 CloudWatch Logs。

## 重新部署服務定義以使用 INSERT、ALTER 或 DDL 陳述式
<a name="emr-ranger-spark-redeploy-service-definition"></a>

**注意**  
從 Amazon EMR 6.4 開始，您可以將 Spark SQL 與陳述式搭配使用：INSERT INTO、INSERT OVERWRITE 或 ALTER TABLE。從 Amazon EMR 6.7 開始，您可以使用 Spark SQL 建立或捨棄資料庫和資料表。如果您在 Apache Ranger 伺服器上已有安裝並部署了 Apache Spark 服務定義，請使用下列程式碼重新部署服務定義。  

```
# 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 版)。

![\["AMAZON-EMR-SPARK" 已在 Ranger Admin 中註冊。\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/ranger-amazon-emr-spark.png)


**步驟 5：建立 AMAZON-EMR-SPARK 應用程式的執行個體**

**服務名稱 (如果顯示)：**將使用的服務名稱。建議的值為 **amazonemrspark**。請記下此服務名稱，因為建立 EMR 安全組態時需要此名稱。

**顯示名稱：**要為此執行個體顯示的名稱。建議的值為 **amazonemrspark**。

**憑證的通用名稱**：憑證內的 CN 欄位用於從用戶端外掛程式連接至管理伺服器。此值必須與為外掛程式建立的 TLS 憑證中的 CN 欄位相符。

![\[Ranger Admin 會建立服務。\]](http://docs.aws.amazon.com/zh_tw/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>

建立新政策時，要填入的欄位如下：

**政策名稱**：此政策的名稱。

**政策標籤**：您可以放在此政策上的標籤。

**資料庫**：此政策套用的資料庫。萬用字元 "\$1" 代表所有資料庫。

**資料表**：此政策套用的資料表。萬用字元 "\$1" 代表所有資料表。

**EMR Spark 資料欄**：此政策套用的資料欄。萬用字元 "\$1" 代表所有資料欄。

**描述**：此政策的描述。

![\[Ranger Admin 會建立 SparkSQL 政策詳細資訊。\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/ranger-create-policy-details.png)


若要指定使用者和群組，請在下方輸入使用者和群組以授予許可。您也可以為**允許**條件和**拒絕**條件指定排除。

![\[Ranger Admin SparkSQL 政策詳細資訊允許條件。\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/ranger-create-policy-allow-conditions.png)


在指定允許和拒絕條件之後，按一下**儲存**。

## 考量事項
<a name="emr-ranger-spark-considerations"></a>

EMR 叢集內的每個節點都必須能夠連接至連接埠 9083 上的主要節點。

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

以下是 Apache Spark 外掛程式的目前限制：
+ EMR RecordServer 將一律連接至在 Amazon EMR 叢集上執行的 HMS。視需要將 HMS 設定為連接至遠端模式。您不應將設定值放在 Apache Spark Hive-site.xml 組態檔案內。
+ 使用 CSV 或 Avro 上的 Spark 資料來源建立的資料表無法使用 EMR 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 引擎的 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_tw/emr/latest/ManagementGuide/images/ranger-create-service-EMRFS.png)


**步驟 4：建立 AMAZON-EMR-EMRFS 應用程式的執行個體**。

建立服務定義的執行個體。
+ 按一下 AMAZON-EMR-EMRFS 旁邊的 **\$1**。

填寫下列欄位：

**服務名稱 (如果顯示)**：建議的值為 **amazonemrs3**。請記下此服務名稱，因為建立 EMR 安全組態時需要此名稱。

**顯示名稱**：為此服務顯示的名稱。建議的值為 **amazonemrs3**。

**憑證的通用名稱**：憑證內的 CN 欄位用於從用戶端外掛程式連接至管理伺服器。此值必須與為外掛程式建立的 TLS 憑證中的 CN 欄位相符。

![\[Ranger Admin 會編輯 EMRFS S3 服務。\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/ranger-edit-service-EMRFS.png)


**注意**  
此外掛程式的 TLS 憑證應已在 Ranger Admin 伺服器上的信任存放區中註冊。如需詳細資訊，請參閱[Apache Ranger 與 Amazon EMR 整合的 TLS 憑證](emr-ranger-admin-tls.md)。

在建立服務時，Service Manager 包括 "AMAZON-EMR-EMRFS"，如下列影像所示。

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


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

若要在 Service Manager 的**建立政策**頁面中建立新政策，請填寫下列欄位。

**政策名稱**：此政策的名稱。

**政策標籤**：您可以放在此政策上的標籤。

**S3 資源**：以儲存貯體和選用字首開始的資源。如需有關最佳實務的資訊，請參閱 [EMRFS S3 政策使用須知](#emr-ranger-emrfs-considerations)。Ranger Admin 伺服器中的資源不應包含 **s3://**、**s3a://** 或 **s3n://**。

![\[Ranger Admin 顯示為 EMRFS S3 服務建立政策。\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/ranger-create-policy-EMRFS.png)


您可以指定要授予許可的使用者和群組。您也可以為**允許**條件和**拒絕**條件指定排除。

![\[Ranger Admin 顯示 EMRFS S3 政策的使用者/群組許可。\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/ranger-permissions-EMRFS.png)


**注意**  
每個政策最多允許三個資源。在 EMR 叢集上使用此政策時，新增超過 3 個資源可能會導致錯誤。新增超過三個政策會顯示有關政策限制的提醒。

## EMRFS S3 政策使用須知
<a name="emr-ranger-emrfs-considerations"></a>

在 Apache Ranger 內建立 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>

將 `PutObject` 和 `DeleteObject` 許可的政策寫入 EMRFS 上的檔案需要特別小心，因為與 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" 萬用字元。第二個萬用字元是 "\$1OWNER\$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>

Amazon EMR 上 Trino 的 Apache Ranger 外掛程式支援受精細分級的存取控制保護的 Trino 查詢引擎的所有功能。這包括資料庫、資料表、資料欄層級存取控制，以及資料列篩選和資料遮罩。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 伺服器外掛程式 (如果存在)。執行下列命令。如果出現「找不到服務」錯誤，則表示您的伺服器上未安裝 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_tw/emr/latest/ManagementGuide/images/ranger-create-service-trino.png)

1. 建立 `TRINO` 應用程式的執行個體，輸入下列資訊。

   **服務名稱**：您將使用的服務名稱。建議的值為 `amazonemrtrino`。請記下此服務名稱，因為建立 Amazon EMR 安全組態時需要此名稱。

   **顯示名稱**：要為此執行個體顯示的名稱。建議的值為 `amazonemrtrino`。  
![\[Ranger Admin 顯示名稱。\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/ranger-display-name-trino.png)

   **jdbc.driver.ClassName**：Trino 連線的 JDBC 類別的類別名稱。您可以使用預設值。

   **jdbc.url**：連接至 Trino 協調器時使用的 JDBC 連線字串。

   **憑證的通用名稱**：憑證內的 CN 欄位用於從用戶端外掛程式連接至管理伺服器。此值必須與為外掛程式建立的 TLS 憑證中的 CN 欄位相符。  
![\[Ranger Admin 通用名稱。\]](http://docs.aws.amazon.com/zh_tw/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>

在您建立新政策時，填寫下列欄位。

**政策名稱**：此政策的名稱。

**政策標籤**：您可以放在此政策上的標籤。

**型錄**：此政策套用的型錄。萬用字元 "\$1" 代表所有型錄。

**結構描述**：此政策套用的結構描述。萬用字元 "\$1" 代表所有結構描述。

**資料表**：此政策套用的資料表。萬用字元 "\$1" 代表所有資料表。

**資料欄**：此政策套用的資料欄。萬用字元 "\$1" 代表所有資料欄。

**描述**：此政策的描述。

對於 **Trino 使用者** (用於使用者模擬存取)、**Trino 系統/工作階段屬性** (用於改變引擎系統或工作階段屬性)、**函數/程序** (用於允許函數或程序呼叫) 和 **URL** (用於授予引擎對資料位置的讀取/寫入存取權)，也存在其他類型的政策。

![\[Ranger Admin 會建立政策詳細資訊。\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/ranger-create-policy-details-trino.png)


若要為特定使用者和群組授予許可，請輸入使用者和群組。您也可以為**允許**條件和**拒絕**條件指定排除。

![\[Ranger Admin 政策詳細資訊允許拒絕條件。\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/ranger-create-policy-allow-conditions-trino.png)


在指定允許和拒絕條件之後，選擇**儲存**。

## 考量事項
<a name="emr-ranger-trino-considerations"></a>

在 Apache Ranger 內建立 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 伺服器不支援自動完成。