

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

# 将 Amazon EMR 与 Apache Ranger 集成
<a name="emr-ranger"></a>

从 Amazon EMR 5.32.0 开始，您可以启动与 Apache Ranger 在本地集成的集群。Apache Ranger 是一个开源框架，可跨 Hadoop 平台启用、监控和管理全面的数据安全。有关更多信息，请参阅 [Apache Ranger](https://ranger.apache.org/)。通过本机集成，您可以自带 Apache Ranger，在 Amazon EMR 上强制实施精细数据访问控制。

此部分从概念上简要介绍了 Amazon EMR 与 Apache Ranger 的集成。它还包含启动与 Apache Ranger 集成的 Amazon EMR 集群所需的先决条件和步骤。

将 Amazon EMR 与 Apache Ranger 集成提供了下列主要优势：
+ 对 Hive 元存储数据库和表的精细访问控制，使您能够为 Apache Spark 和 Apache Hive 应用程序在数据库、表和列级别定义数据筛选策略。Hive 应用程序支持行级过滤和数据屏蔽。
+ 能够将您现有的 Hive 策略直接用于 Hive 应用程序的 Amazon EMR。
+ 在前缀和对象级别对 Amazon S3 数据进行访问控制，这使您能够定义数据筛选策略以使用 EMR 文件系统访问 S3 数据。
+ 能够使用 CloudWatch 日志进行集中审计。
+ Amazon EMR 代表您安装和管理 Apache Ranger 插件。

# Apache Ranger 与 Amazon EMR 集成
<a name="emr-ranger-overview"></a>

Apache Ranger 是一个框架，可跨 Hadoop 平台启用、监控和管理全面的数据安全。

Apache Ranger 具有以下功能：
+ 集中式安全管理，用于在中央用户界面中或使用 REST 管理所有与安全相关的任务 APIs。
+ 使用 Hadoop 组件或工具执行特定操作或操作的精细授权，通过集中管理工具进行管理。
+ 跨所有 Hadoop 组件的标准化授权方法。
+ 增强了对各种授权方法的支持。
+ 在 Hadoop 的所有组件中对用户访问和管理操作（安全相关）进行集中审计。

Apache Ranger 使用两个关键组件进行授权：
+ **Apache Ranger 策略管理服务器** - 此服务器允许您定义 Hadoop 应用程序的授权策略。与 Amazon EMR 集成时，您可以为 Apache Spark 和 Hive 定义和实施策略以访问 Hive Metastore，并访问 Amazon S3 数据[ EMR 文件系统](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-fs)。您可以设置新的或使用现有的 Apache Ranger 策略管理服务器与 Amazon EMR 集成。
+ **Apache Ranger 插件**：此插件根据 Apache Ranger 策略管理服务器中定义的授权策略验证用户的访问权限。Amazon EMR 会为在 Apache Ranger 配置中选择的每个 Hadoop 应用程序自动安装和配置 Apache Ranger 插件。

**Topics**
+ [Amazon EMR 与 Apache Ranger 集成的架构](emr-ranger-architecture.md)
+ [适用于 Apache Ranger 的 Amazon EMR 组件](emr-ranger-components.md)

# Amazon EMR 与 Apache Ranger 集成的架构
<a name="emr-ranger-architecture"></a>

![\[Amazon EMR 和 Apache Ranger 架构图。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/emr-ranger-architecture.png)


# 适用于 Apache Ranger 的 Amazon EMR 组件
<a name="emr-ranger-components"></a>

Amazon EMR 通过以下组件支持 Apache Ranger 的精细访问控制。有关这些 Amazon EMR 组件与 Apache Ranger 插件的可视化表示，请参阅[架构图](emr-ranger-architecture.md)。

**私有代理**：私有代理安全存储密钥并将密钥分发到其它 Amazon EMR 组件或应用程序。密钥可以包括临时用户凭证、加密密钥或 Kerberos 票证。私有代理在集群中的每个节点上运行并拦截对实例元数据服务的调用。对于对实例配置文件角色凭证的请求，在使用 EMRFS S3 Ranger 插件授权请求后，私有代理根据请求用户和请求的资源提供凭证。秘密代理以*`emrsecretagent`*用户身份运行，并将日志写入/ emr/secretagent/log 目录。该过程依赖于一组特定 `iptables` 规则来发挥作用。务必要确保 `iptables` 没有被禁用。如果您自定义 `iptables` 配置，则必须保留 NAT 表规则并保持不变。

**EMR 记录服务器**：记录服务器接收从 Spark 访问数据的请求。然后，它通过将请求的资源转发到适用于 Amazon EMR 的 Spark Ranger 插件来授权请求。记录服务器从 Amazon S3 读取数据，并根据 Ranger 策略返回用户有权访问的筛选数据。记录服务器以 emr\$1record\$1server 用户的身份在群集中的每个节点上运行，并将日志写入/-record-server 目录。var/log/emr

# 将 Amazon EMR 与 Apache Ranger 结合使用的注意事项
<a name="emr-ranger-app-support"></a>

## 将 Amazon EMR 与 Apache Ranger 结合使用时支持的应用程序
<a name="emr-ranger-app-support-list"></a>

在 Amazon EMR 和 Apache Ranger 的集成中，EMR 安装了 Ranger 插件，目前支持以下应用程序：
+ Apache Spark（适用于 EMR 5.32 和 EMR 6.3 及更高版本）
+ Apache Hive（适用于 EMR 5.32 和 EMR 6.3 及更高版本）
+ 通过 EMRFS 访问 S3（适用于 EMR 5.32 和 EMR 6.3 及更高版本）

以下应用程序可以安装在 EMR 集群上，并且可能需要进行配置以满足您的安全需求：
+ Apache Hadoop（适用于 EMR 5.32 和 EMR 6.3 及更高版本，包括 YARN 和 HDFS）
+ Apache Livy（适用于 EMR 5.32 和 EMR 6.3 及更高版本）
+ Apache Zeppelin（适用于 EMR 5.32 和 EMR 6.3 及更高版本）
+ Apache Hue（适用于 EMR 5.32 和 EMR 6.3 及更高版本）
+ Ganglia（适用于 EMR 5.32 和 EMR 6.3 及更高版本）
+ HCatalog （适用于 EMR 5.32\$1 和 EMR 6.3\$1）
+ Mahout（适用于 EMR 5.32 和 EMR 6.3 及更高版本）
+ MXNet （适用于 EMR 5.32\$1 和 EMR 6.3\$1）
+ TensorFlow （适用于 EMR 5.32\$1 和 EMR 6.3\$1）
+ Tez（适用于 EMR 5.32 和 EMR 6.3 及更高版本）
+ Trino（可用于 EMR 6.7 及更高版本）
+ ZooKeeper （适用于 EMR 5.32\$1 和 EMR 6.3\$1）

**重要**  
上面列出的应用程序是目前唯一支持的应用程序。为了确保集群安全，启用 Apache Ranger 后，允许您仅使用上述列表中的应用程序创建 EMR 集群。  
当前不支持其它应用程序。为了确保集群的安全性，尝试安装其他应用程序会导致您的集群被拒绝。  
AWS 不支持 Glue 数据目录和开放表格式，例如 Apache Hudi、Delta Lake 和 Apache Iceberg。

**Apache Ranger 支持的 Amazon EMR 功能**  
将 Amazon EMR 与 Apache Ranger 结合使用时，支持以下 Amazon EMR 功能：
+ 静态和动态加密
+ Kerberos 身份验证（必需）
+ 实例组、实例集和竞价型实例
+ 在运行中的集群上重新配置应用程序
+ EMRFS 服务器端加密（SSE）

**注意**  
Amazon EMR 加密设置控制 SSE。有关更多信息，请参阅[加密选项](emr-data-encryption-options.md)。

## 应用程序限制
<a name="emr-ranger-app-support-limitations"></a>

集成 Amazon EMR 和 Apache Ranger 时，需要记住几个限制：
+ 您当前无法使用控制台创建在中指定 AWS Ranger 集成选项的安全配置。 AWS GovCloud (US) Region可以使用 CLI 完成安全配置。
+ Kerberos 必须安装在您的集群上。
+ 默认情况下，诸如 YARN 资源管理器用户界面、HDFS 用户界面和 Livy NameNode UI 之类的应用程序 UIs （用户界面）未设置身份验证。
+ 配置了 HDFS 默认权限 `umask`，以便创建的对象默认设置为 `world wide readable`。
+ Amazon EMR 不支持 Apache Ranger 的高可用性（多主）模式。
+ 有关其他限制，请参阅各个应用程序的具体限制。

**注意**  
Amazon EMR 加密设置控制 SSE。有关更多信息，请参阅[加密选项](emr-data-encryption-options.md)。

## 插件限制
<a name="plugin-limitations"></a>

每个插件都有特定的限制。有关 Apache Hive 插件的限制，请参阅 [Apache Hive 插件限制](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-ranger-hive.html#emr-ranger-hive-limitations)。有关 Apache Spark 插件的限制，请参阅 [Apache Spark 插件限制](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-ranger-spark.html#emr-ranger-spark-limitations)。有关 EMRFS S3 插件的限制，请参阅 [EMRFS S3 插件限制](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-ranger-emrfs.html#emr-ranger-emrfs-limitations)。

# 为 Apache Ranger 设置 Amazon EMR
<a name="emr-ranger-begin"></a>

在安装 Apache Ranger 之前，请查看本部分中的信息，以确保 Amazon EMR 已进行正确配置。

**Topics**
+ [设置 Ranger Admin 服务器，以便与 Amazon EMR 集成](emr-ranger-admin.md)
+ [用于与 Apache Ranger 本地集成的 IAM 角色](emr-ranger-iam.md)
+ [创建 EMR 安全配置](emr-ranger-security-config.md)
+ [将 TLS 证书存储在 AWS Secrets Manager](emr-ranger-tls-certificates.md)
+ [使用 Apache Ranger 启动 EMR 集群](emr-ranger-start-emr-cluster.md)
+ [为启用 Apache Ranger 的 Amazon EMR 集群配置 Zeppelin](emr-ranger-configure-zeppelin.md)
+ [Amazon EMR 集成的已知问题](emr-ranger-security-considerations.md)

# 设置 Ranger Admin 服务器，以便与 Amazon EMR 集成
<a name="emr-ranger-admin"></a>

对于 Amazon EMR 集成，Apache Ranger 应用程序插件必须使用 TLS/SSL 与 Admin 服务器通信。

**先决条件: Ranger Admin 服务器 SSL 启用**

Amazon EMR 上的 Apache Ranger 需要插件和 Ranger Admin 服务器之间的双向 SSL 通信。要确保插件通过 SSL 与 Apache Ranger 服务器通信，请在 Ranger 管理服务器的 ranger-admin-site .xml 中启用以下属性。

```
<property>
    <name>ranger.service.https.attrib.ssl.enabled</name>
    <value>true</value>
</property>
```

此外，还需进行以下配置。

```
<property>
    <name>ranger.https.attrib.keystore.file</name>
    <value>_<PATH_TO_KEYSTORE>_</value>
</property>

<property>
    <name>ranger.service.https.attrib.keystore.file</name>
    <value>_<PATH_TO_KEYSTORE>_</value>
</property>

<property>
    <name>ranger.service.https.attrib.keystore.pass</name>
    <value>_<KEYSTORE_PASSWORD>_</value>
</property>

<property>
    <name>ranger.service.https.attrib.keystore.keyalias</name>
    <value><PRIVATE_CERTIFICATE_KEY_ALIAS></value>
</property>

<property>
    <name>ranger.service.https.attrib.clientAuth</name>
    <value>want</value>
</property>

<property>
    <name>ranger.service.https.port</name>
    <value>6182</value>
</property>
```

# 用于 Apache Ranger 与 Amazon EMR 集成的 TLS 证书
<a name="emr-ranger-admin-tls"></a>

Apache Ranger 与 Amazon EMR 的集成要求使用 TLS 加密从 Amazon EMR 节点到 Ranger Admin 服务器的流量，并且 Ranger 插件使用双向 TLS 身份验证向 Apache Ranger 服务器进行身份验证。Amazon EMR 服务需要 Ranger Admin 服务器的公共凭证（在前面的示例中指定）和私有凭证。

**Apache Ranger 插件证书**

Apache Ranger 插件公共 TLS 凭证必须可供 Apache Ranger 管理服务器访问，以在插件连接时进行验证。执行此操作共有三种方式。

**方法 1: 在 Apache Ranger Admin 服务器中配置信任库**

在 ranger-admin-site .xml 中填写以下配置以配置信任库。

```
<property>
    <name>ranger.truststore.file</name>
    <value><LOCATION TO TRUSTSTORE></value>
</property>

<property>
    <name>ranger.truststore.password</name>
    <value><PASSWORD FOR TRUSTSTORE></value>
</property>
```

**方法 2: 将证书加载到 Java cacerts 信任库**

如果您的 Ranger Admin 服务器没有在其 JVM 选项中指定信任库，那么您可以将插件公共凭证放在默认的 cacerts 存储中。

**方法 3: 创建信任库并指定为 JVM 选项的一部分**

在 `{RANGER_HOME_DIRECTORY}/ews/ranger-admin-services.sh` 中，修改 `JAVA_OPTS`，使其包含 `"-Djavax.net.ssl.trustStore=<TRUSTSTORE_LOCATION>"` 和 `"-Djavax.net.ssl.trustStorePassword=<TRUSTSTORE_PASSWORD>"`。例如，在现有 JAVA\$1OPTS 之后添加以下行。

```
JAVA_OPTS=" ${JAVA_OPTS} -Djavax.net.ssl.trustStore=${RANGER_HOME}/truststore/truststore.jck -Djavax.net.ssl.trustStorePassword=changeit"
```

**注意**  
如果任何用户能够登录 Apache Ranger Admin 服务器并查看正在运行的进程，例如使用 `ps` 命令时，此规范可能会公开信任库密码。

**使用自签名证书**

不建议使用自签名凭证作为凭证。自签名凭证不得撤销，自签名凭证可能不符合内部安全要求。

# Ranger 与 Amazon EMR 集成的服务定义安装
<a name="emr-ranger-admin-servicedef-install"></a>

Ranger Admin 服务器使用服务定义来描述应用程序的策略属性。然后，将策略存储在策略存储库中以供客户端下载。

为了能够配置服务定义，必须对 Ranger Admin 服务器进行 REST 调用。有关下一节中的 APIs 必填内容，请参阅 [Apache Ranger Pub APIsv2](https://ranger.apache.org/apidocs/resource_PublicAPIsv2.html#resource_PublicAPIsv2_createServiceDef_POST) lic。

**安装 Apache Spark 的服务定义**

要安装 Apache Spark 的服务定义，请参阅[用于 Ranger 与 Amazon EMR 集成的 Apache Spark 插件](emr-ranger-spark.md)。

**安装 EMRFS 服务定义**

要安装 Amazon EMR 的 S3 服务定义，请参阅[用于 Ranger 与 Amazon EMR 集成的 EMRFS S3 插件](emr-ranger-emrfs.md)。

**使用 Hive 服务定义**

Apache Hive 可以使用 Apache Ranger 2.0 及更高版本附带的现有 Ranger 服务定义。有关更多信息，请参阅 [用于 Ranger 与 Amazon EMR 集成的 Apache Hive 插件](emr-ranger-hive.md)。

# 与 Amazon EMR 集成的网络流量规则
<a name="emr-ranger-network"></a>

当 Apache Ranger 与您的 EMR 集群集成时，该集群需要与其它服务器和 AWS通信。

所有 Amazon EMR 节点（包括核心节点和任务节点）都必须能够与 Apache Ranger Admin 服务器通信以下载策略。如果您的 Apache Ranger 管理员在 Amazon EC2 上运行，您需要更新安全组才能从 EMR 集群获取流量。

除了与 Ranger 管理服务器通信外，所有节点都需要能够与以下 AWS 服务进行通信：
+ Amazon S3
+ AWS KMS （如果使用 EMRFS SSE-KMS）
+ Amazon CloudWatch
+ AWS STS

如果您计划在私有子网中运行 EMR 集群，请配置 VPC 以能够使用《Amazon VPC 用户指南》**中的 [AWS PrivateLink 和 VPC 终端节点](https://docs.aws.amazon.com/vpc/latest/userguide/endpoint-services-overview.html)或使用《Amazon VPC 用户指南》**中的[网络地址转换（NAT）实例](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html)与这些服务进行通信。

# 用于与 Apache Ranger 本地集成的 IAM 角色
<a name="emr-ranger-iam"></a>

Amazon EMR 和 Apache Ranger 之间的集成依赖于您在启动集群之前应创建的三个关键角色：
+ 适用于 Amazon EMR 的自定义 Amazon EC2 实例配置文件。
+ Apache Ranger 引擎的 IAM 角色
+ 其他 AWS 服务的 IAM 角色

此部分概览了这些角色以及需要为每个 IAM 角色提供的策略。有关创建这些角色的信息，请参阅[设置 Ranger Admin 服务器，以便与 Amazon EMR 集成](emr-ranger-admin.md)。

# Amazon EMR 的 EC2 实例配置文件
<a name="emr-ranger-iam-ec2"></a>

Amazon EMR 使用 IAM 服务角色代表您执行操作以预置和管理集群。集群 EC2 实例的服务角色（又称为 Amazon EMR 的 EC2 实例配置文件）是一种特殊类型的服务角色，在启动时分配给集群中的每个 EC2 实例。

要定义 EMR 集群与 Amazon S3 数据以及受 Apache Ranger 和其他 AWS 服务保护的 Hive 元数据仓交互的权限，请定义一个自定义 EC2 实例配置文件来代替启动集群时使用。`EMR_EC2_DefaultRole`

有关更多信息，请参阅[集群 EC2 实例（EC2 实例配置文件）的服务角色](emr-iam-role-for-ec2.md)和[使用 Amazon EMR 自定义 IAM 角色](emr-iam-roles-custom.md)。

您需要将以下语句添加到 Amazon EMR 的默认 EC2 实例配置文件中，以便能够标记会话并访问存储 TLS AWS Secrets Manager 证书的。

```
    {
      "Sid": "AllowAssumeOfRolesAndTagging",
      "Effect": "Allow",
      "Action": ["sts:TagSession", "sts:AssumeRole"],
      "Resource": [
        "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<RANGER_ENGINE-PLUGIN_DATA_ACCESS_ROLE_NAME>",
        "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<RANGER_USER_ACCESS_ROLE_NAME>"
      ]
    },
    {
        "Sid": "AllowSecretsRetrieval",
        "Effect": "Allow",
        "Action": "secretsmanager:GetSecretValue",
        "Resource": [
            "arn:aws:secretsmanager:<REGION>:<AWS_ACCOUNT_ID>:secret:<PLUGIN_TLS_SECRET_NAME>*",
            "arn:aws:secretsmanager:<REGION>:<AWS_ACCOUNT_ID>:secret:<ADMIN_RANGER_SERVER_TLS_SECRET_NAME>*"
        ]
    }
```

**注意**  
对于 Secrets Manager 权限，不要忘记密钥名称末尾的通配符（“\$1”），否则您的请求将失败。通配符用于密钥版本。

**注意**  
将 AWS Secrets Manager 策略的范围限制为仅提供所需的证书。

# Apache Raner 的 IAM 角色
<a name="emr-ranger-iam-ranger"></a>

此角色为可信执行引擎（例如 Apache Hive 和 Amazon EMR 记录服务器）提供凭证以访问 Amazon S3 数据。如果您使用 S3 SSE-KMS，则仅使用此角色访问 Amazon S3 数据，包括任何 KMS 密钥。

此角色必须使用以下示例中所述的最低策略创建。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "CloudwatchLogsPermissions",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:logs:*:123456789012:log-group:CLOUDWATCH_LOG_GROUP_NAME_IN_SECURITY_CONFIGURATION:*"
      ]
    },
    {
      "Sid": "BucketPermissionsInS3Buckets",
      "Action": [
        "s3:CreateBucket",
        "s3:DeleteBucket",
        "s3:ListAllMyBuckets",
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket1",
        "arn:aws:s3:::amzn-s3-demo-bucket2"
      ]
    },
    {
      "Sid": "ObjectPermissionsInS3Objects",
      "Action": [
        "s3:GetObject",
        "s3:DeleteObject",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket1/*",
        "arn:aws:s3:::amzn-s3-demo-bucket2/*"
      ]
    }
  ]
}
```

------

**重要**  
必须包含 CloudWatch 日志资源末尾的星号 “\$1”，以提供写入日志流的权限。

**注意**  
如果您使用 EMRFS 一致性视图或 S3-SSE 加密，请添加对 DynamoDB 表和 KMS 密钥的权限，以便执行引擎可以与这些引擎交互。

Apache Ranger 的 IAM 角色由 EC2 实例配置文件角色代入。使用以下示例创建一个信任策略，允许 EC2 实例配置文件角色代入 Apache Ranger 的 IAM 角色。

```
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<EC2 INSTANCE PROFILE ROLE NAME eg. EMR_EC2_DefaultRole>"
      },
      "Action": ["sts:AssumeRole", "sts:TagSession"]
    }
```

# Amazon EMR 集 AWS 成的其他服务的 IAM 角色
<a name="emr-ranger-iam-other-AWS"></a>

如果需要，此角色为不受信任的执行引擎用户提供与 AWS 服务进行交互的凭证。不要使用此 IAM 角色来允许访问 Amazon S3 数据，除非它是所有用户都应该可以访问的数据。

此角色将由 EC2 实例配置文件角色代入。使用以下示例创建一个信任策略，允许 EC2 实例配置文件角色代入 Apache Ranger 的 IAM 角色。

```
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<EC2 INSTANCE PROFILE ROLE NAME eg. EMR_EC2_DefaultRole>"
      },
      "Action": ["sts:AssumeRole", "sts:TagSession"]
    }
```

# 验证您对 Amazon EMR 与 Apache Ranger 集成的权限
<a name="emr-ranger-iam-validate"></a>

请参阅[Apache Ranger 疑难解答](emr-ranger-troubleshooting.md)了解有关验证权限的说明。

# 创建 EMR 安全配置
<a name="emr-ranger-security-config"></a>

**为 Apache Ranger 创建 Amazon EMR 安全配置**

在启动与 Apache Ranger 集成的 Amazon EMR 集群之前，请创建安全配置。

------
#### [ Console ]

**创建指定 AWS Ranger 集成选项的安全配置**

1. 在 Amazon EMR 控制台中，依次选择 **Security configurations (安全配置)** 和 **Create (创建)**。

1. 键入安全配置的 **Name (名称)**。在创建集群时，使用此名称来指定安全配置。

1. 在 **AWS Ranger Integration (Ranger 集成)** 下，选择 **Enable fine-grained access control managed by Apache Ranger (启用由 Apache Ranger 管理的细粒度访问控制)**。

1. 选择您要应用的 **Apache Ranger 的 IAM 角色**。有关更多信息，请参阅[用于与 Apache Ranger 本地集成的 IAM 角色](emr-ranger-iam.md)。

1. 选择要应用的 **IAM role for otherr AWS services (其它亚马逊云科技服务的 IAM 角色)**。

1. 通过输入 Admin 服务器的 Secrets Manager ARN 和地址，将插件配置为连接到 Ranger Admin 服务器。

1. 选择应用程序以配置 Ranger 插件。输入包含插件私有 TLS 证书的 Secrets Manager ARN。

   如果您未配置 Apache Spark 或 Apache Hive，并将它们选为集群的应用程序，则请求将失败。

1. 根据需要设置其它安全配置选项，然后选择 **Create (创建)**。您必须启用使用集群专用 KDC 或外部 KDC 的 Kerberos 身份验证。

**注意**  
您当前无法使用控制台创建在中指定 AWS Ranger 集成选项的安全配置。 AWS GovCloud (US) Region可以使用 CLI 完成安全配置。

------
#### [ CLI ]

**要为 Apache Ranger 集成创建安全配置**

1. `<ACCOUNT ID>`替换为您的 AWS 账户 ID。

1. 将 `<REGION>` 替换为资源所在的区域。

1. 为 `TicketLifetimeInHours` 指定一个值，用于确定 KDC 发放的 Kerberos 票证的有效期间。

1. 为 `AdminServerURL` 指定 Ranger Admin 服务器的地址。

```
{
    "AuthenticationConfiguration": {
        "KerberosConfiguration": {
            "Provider": "ClusterDedicatedKdc",
            "ClusterDedicatedKdcConfiguration": {
                "TicketLifetimeInHours": 24
            }
        }
    },
    "AuthorizationConfiguration":{
      "RangerConfiguration":{
         "AdminServerURL":"https://_<RANGER ADMIN SERVER IP>_:6182",
         "RoleForRangerPluginsARN":"arn:aws:iam::_<ACCOUNT ID>_:role/_<RANGER PLUGIN DATA ACCESS ROLE NAME>_",
         "RoleForOtherAWSServicesARN":"arn:aws:iam::_<ACCOUNT ID>_:role/_<USER ACCESS ROLE NAME>_",
         "AdminServerSecretARN":"arn:aws:secretsmanager:_<REGION>_:_<ACCOUNT ID>_:secret:_<SECRET NAME THAT PROVIDES ADMIN SERVERS PUBLIC TLS CERTIFICATE WITHOUT VERSION>_",
         "RangerPluginConfigurations":[
            {
               "App":"Spark",
               "ClientSecretARN":"arn:aws:secretsmanager:_<REGION>_:_<ACCOUNT ID>_:secret:_<SECRET NAME THAT PROVIDES SPARK PLUGIN PRIVATE TLS CERTIFICATE WITHOUT VERSION>_",
               "PolicyRepositoryName":"<SPARK SERVICE NAME eg. amazon-emr-spark>"
            },
            {
               "App":"Hive",
               "ClientSecretARN":"arn:aws:secretsmanager:_<REGION>_:_<ACCOUNT ID>_:secret:_<SECRET NAME THAT PROVIDES Hive PLUGIN PRIVATE TLS CERTIFICATE WITHOUT VERSION>_",
               "PolicyRepositoryName":"<HIVE SERVICE NAME eg. Hivedev>"
            },
            {
               "App":"EMRFS-S3",
               "ClientSecretARN":"arn:aws:secretsmanager:_<REGION>_:_<ACCOUNT ID>_:secret:_<SECRET NAME THAT PROVIDES EMRFS S3 PLUGIN PRIVATE TLS CERTIFICATE WITHOUT VERSION>_",
               "PolicyRepositoryName":"<EMRFS S3 SERVICE NAME eg amazon-emr-emrfs>"
            }, 
	      {
               "App":"Trino",
               "ClientSecretARN":"arn:aws:secretsmanager:_<REGION>_:_<ACCOUNT ID>_:secret:_<SECRET NAME THAT PROVIDES TRINO PLUGIN PRIVATE TLS CERTIFICATE WITHOUT VERSION>_",
               "PolicyRepositoryName":"<TRINO SERVICE NAME eg amazon-emr-trino>"
            }
         ],
         "AuditConfiguration":{
            "Destinations":{
               "AmazonCloudWatchLogs":{
                  "CloudWatchLogGroup":"arn:aws:logs:<REGION>:_<ACCOUNT ID>_:log-group:_<LOG GROUP NAME FOR AUDIT EVENTS>_"
               }
            }
         }
      }
   }
}
```

 PolicyRespositoryNames 这些是在 Apache Ranger 管理员中指定的服务名称。

使用以下命令创建 Amazon EMR 安全配置。用您选择的名称替换 security-configuration。创建集群时，按名称选择此配置。

```
aws emr create-security-configuration \
--security-configuration file://./security-configuration.json \
--name security-configuration
```

------

**配置其它安全功能**

为将 Amazon EMR 与 Apache Ranger 安全集成，您还应该配置以下 EMR 安全功能：
+ 启用使用集群专用 KDC 或外部 KDC 的 Kerberos 身份验证。有关说明，请参阅[使用 Kerberos 通过 Amazon EMR 进行身份验证](emr-kerberos.md)。
+ （可选）启用传输中或静态加密。有关更多信息，请参阅[Amazon EMR 的加密选项](emr-data-encryption-options.md)。

有关更多信息，请参阅 [Amazon EMR 中的安全性](emr-security.md)。

# 将 TLS 证书存储在 AWS Secrets Manager
<a name="emr-ranger-tls-certificates"></a>

安装在 Amazon EMR 集群上的 Ranger 插件和 Ranger 管理服务器必须通过 TLS 进行通信，以确保发送的策略数据和其它信息在被拦截时无法读取。EMR 还要求插件通过提供自己的 TLS 凭证并执行双向 TLS 身份验证来对 Ranger Admin 服务器进行身份验证。此设置需要创建四个凭证：两对私有和公有 TLS 凭证。有关将凭证安装到 Ranger Admin 服务器的说明，请参阅[设置 Ranger Admin 服务器，以便与 Amazon EMR 集成](emr-ranger-admin.md)。要完成设置，安装在 EMR 集群上的 Ranger 插件需要两个凭证：管理服务器的公有 TLS 凭证，以及插件将用于对 Ranger 管理服务器进行身份验证的私有凭证。要提供这些 TLS 证书，它们必须在 EMR 安全配置中 AWS Secrets Manager 并提供。

**注意**  
强烈建议（但不是必需）为每个应用程序创建一个凭证对，以降低其中一个插件凭证遭到破坏时的影响。

**注意**  
您需要在凭证过期日期前跟踪和转动凭证。

## 凭证格式
<a name="emr-ranger-tls-cert-format"></a>

无论 AWS Secrets Manager 是私有插件证书还是公共 Ranger 管理员证书，将证书导入到都是一样的。在导入 TLS 凭证之前，必须确认凭证采用 509x PEM 格式。

公有凭证的示例格式如下：

```
-----BEGIN CERTIFICATE-----
...Certificate Body...
-----END CERTIFICATE-----
```

私有凭证的示例格式如下：

```
-----BEGIN PRIVATE KEY-----
...Private Certificate Body...
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
...Trust Certificate Body...
-----END CERTIFICATE-----
```

私有凭证还应包含信任凭证。

您可以通过运行以下命令验证是否采用的格式是否正确：

```
openssl x509 -in <PEM FILE> -text
```

## 将证书导入到 AWS Secrets Manager
<a name="emr-ranger-tls-cert-import"></a>

在 Secrets Manager 中创建 Secret 时，在 **secret type**（密钥类型）下选择 **Other type of secrets**（其他类型密钥）并将 PEM 编码的凭证粘贴到 **Plaintext**（明文）字段中。

![\[将证书导入到 AWS Secrets Manager。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-tls-cert-import.png)


# 使用 Apache Ranger 启动 EMR 集群
<a name="emr-ranger-start-emr-cluster"></a>

在使用 Apache Ranger 启动 Amazon EMR 集群之前，请确保每个组件都满足以下最低版本要求：
+ Amazon EMR 5.32.0 或更高版本，或者 6.3.0 或更高版本。建议您使用最新的 Amazon EMR 版本。
+ Apache Ranger Admin 服务器版本 2.x。

完成以下步骤：
+ 如果尚未安装 Apache Ranger，请安装它。有关更多信息，请参阅 [Apache Ranger 0.5.0 安装](https://cwiki.apache.org/confluence/display/RANGER/Apache+Ranger+0.5.0+Installation)。
+ 确保您的 Amazon EMR 集群和 Apache Ranger Admin 服务器之间存在网络连接。请参阅 [设置 Ranger Admin 服务器，以便与 Amazon EMR 集成](emr-ranger-admin.md)。
+ 创建必要的 IAM 角色。请参阅[用于与 Apache Ranger 本地集成的 IAM 角色](emr-ranger-iam.md)。
+ 为 Apache Ranger 安装创建 EMR 安全配置。有关更多信息，请参阅[创建 EMR 安全配置](emr-ranger-security-config.md)。

# 为启用 Apache Ranger 的 Amazon EMR 集群配置 Zeppelin
<a name="emr-ranger-configure-zeppelin"></a>

本主题介绍了如何为启用 Apache Ranger 的 Amazon EMR 集群配置 [Apache Zeppelin](https://zeppelin.apache.org/)，以便您可以将 Zeppelin 作为 Notebook 以进行交互式的数据探索。Zeppelin 包含在 Amazon EMR 发行版 5.0.0 及更高版本中。早期版本包括 Zeppelin 作为沙盒应用程序。有关更多信息，请参阅《Amazon EMR 发行版指南》**中的 [Amazon EMR 4.x 版本](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-release-4x.html)。

预设情况下，Zeppelin 配置了原定设置登录名和密码，但这在多租户环境中并不安全。

要配置 Zeppelin，请完成以下步骤：

1. **修改身份验证机制**。

   修改 `shiro.ini` 文件以实现您首选的身份验证机制。Zeppelin 支持 Active Directory、LDAP、PAM 和 Knox SSO。有关详细信息，请参阅 [Apache Zeppelin 的 Apache Shiro 身份验证](https://zeppelin.apache.org/docs/0.8.2/setup/security/shiro_authentication.html)。

1. **配置 Zeppelin 以模拟终端用户**

   如果允许 Zeppelin 模拟终端用户，则 Zeppelin 提交的任务可作为该终端用户运行。将以下配置添加到 `core-site.xml`：

   ```
   [
     {
       "Classification": "core-site",
       "Properties": {
         "hadoop.proxyuser.zeppelin.hosts": "*",
         "hadoop.proxyuser.zeppelin.groups": "*"
       },
       "Configurations": [
       ]
     }
   ]
   ```

   然后将以下配置添加至位于 `/etc/hadoop/conf` 的 `hadoop-kms-site.xml`：

   ```
   [
     {
       "Classification": "hadoop-kms-site",
       "Properties": {
         "hadoop.kms.proxyuser.zeppelin.hosts": "*",
         "hadoop.kms.proxyuser.zeppelin.groups": "*"
       },
       "Configurations": [
       ]
     }
   ]
   ```

   您还可以按照[在控制台中重新配置实例组](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps-running-cluster.html#emr-configure-apps-running-cluster-console)中的步骤，使用控制台将这些配置添加到您的 Amazon EMR 集群。

1. **允许 Zeppelin 作为终端用户执行指令**

   创建一个名为 `/etc/sudoers.d/90-zeppelin-user` 的文件，其中包含以下内容：

   ```
   zeppelin ALL=(ALL) NOPASSWD:ALL
   ```

1. **修改解释器设置以在它们自己的进程中运行用户任务**。

   配置所有解释器以在“隔离”进程中实例化“Per User”解释器。  
![\[Amazon EMR 和 Apache Ranger 架构图。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/per_user.png)

1. **修改 `zeppelin-env.sh`**

   将以下内容添加到 `zeppelin-env.sh` 以便 Zeppelin 以终端用户身份启动解释器：

   ```
   ZEPPELIN_IMPERSONATE_USER=`echo ${ZEPPELIN_IMPERSONATE_USER} | cut -d @ -f1`
   export ZEPPELIN_IMPERSONATE_CMD='sudo -H -u ${ZEPPELIN_IMPERSONATE_USER} bash -c'
   ```

   将以下内容添加到 `zeppelin-env.sh` 以将默认的 Notebook 权限改为仅对创建者只读：

   ```
   export ZEPPELIN_NOTEBOOK_PUBLIC="false"
   ```

   最后，将以下内容`zeppelin-env.sh`添加到第一`CLASSPATH`条语句之后添加 EMR RecordServer 类路径：

   ```
   export CLASSPATH="$CLASSPATH:/usr/share/aws/emr/record-server/lib/aws-emr-record-server-connector-common.jar:/usr/share/aws/emr/record-server/lib/aws-emr-record-server-spark-connector.jar:/usr/share/aws/emr/record-server/lib/aws-emr-record-server-client.jar:/usr/share/aws/emr/record-server/lib/aws-emr-record-server-common.jar:/usr/share/aws/emr/record-server/lib/jars/secret-agent-interface.jar"
   ```

1. **重新启动 Zeppelin。**

   运行以下命令以重新启动 Zeppelin：

   ```
   sudo systemctl restart zeppelin
   ```

# Amazon EMR 集成的已知问题
<a name="emr-ranger-security-considerations"></a>

**已知问题**

Amazon EMR 发行版 5.32 中存在一个已知问题，其中更改了 `hive-site.xml` 的权限，以便只有特权用户才能读取它，因为其中可能存储了凭证。这可能会阻止 Hue 读取 `hive-site.xml` 并导致网页不断重新加载。如果遇到此问题，请添加以下配置来修复此问题：

```
[
  {
    "Classification": "hue-ini",
    "Properties": {},
    "Configurations": [
      {
        "Classification": "desktop",
        "Properties": {
          "server_group":"hive_site_reader"
         },
        "Configurations":[
        ]
      }
    ]
  }
]
```

一个已知的问题是适用于 Apache Ranger 的 EMRFS S3 插件当前不支持 Apache Ranger 的安全区功能。使用安全区功能定义的访问控制限制不适用于您的 Amazon EMR 集群。

**应用程序 UIs**

默认情况下，应用程序 UI 不执行身份验证。这包括ResourceManager 用户界面、 NodeManager 用户界面、Livy 用户界面等。此外，任何能够访问的 UIs 用户都可以查看有关所有其他用户工作的信息。

如果不希望出现这种行为，则应确保使用安全组来限制用户对应用程序 UIs 的访问。

**HDFS 原定设置的权限**

默认情况下，用户在 HDFS 中创建的对象被授予全局可读权限。这可能会导致无权访问数据的用户也可以读取数据。要更改此行为，以便将默认文件权限设置为仅由任务创建者读取和写入，请执行以下步骤。

创建 EMR 集群时，请提供以下配置：

```
[
  {
    "Classification": "hdfs-site",
    "Properties": {
      "dfs.namenode.acls.enabled": "true",
      "fs.permissions.umask-mode": "077",
      "dfs.permissions.superusergroup": "hdfsadmingroup"
    }
  }
]
```

此外，运行以下引导操作：

```
--bootstrap-actions Name='HDFS UMask Setup',Path=s3://elasticmapreduce/hdfs/umask/umask-main.sh
```

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

# Apache Ranger 疑难解答
<a name="emr-ranger-troubleshooting"></a>

以下是一些与使用 Apache Ranger 相关的常见问题。

## 建议
<a name="emr-ranger-troubleshooting-recommendations"></a>
+ **使用单个主节点集群进行测试：**单节点主集群比多节点集群配置更快，这样可以减少每次测试迭代的时间。
+ **在集群上设置开发模式。**启动 EMR 集群时，请将 `--additional-info"` 参数设置为：

  `'{"clusterType":"development"}'`

  此参数只能通过 AWS CLI 或 AWS SDK 进行设置，不能通过 Amazon EMR 控制台进行设置。如果设置了此标志，并且主节点无法配置，则 Amazon EMR 服务会在将集群停用之前使集群保持活动状态一段时间。这个时间有助于在集群终止前探测各种日志文件。

# EMR 集群预置失败
<a name="emr-ranger-troubleshooting-cluster-failed"></a>

Amazon EMR 集群启动失败的原因有多种。以下是诊断问题的几种方式。

**检查 EMR 调配日志**

Amazon EMR 使用 Puppet 在集群上安装和配置应用程序。查看日志将提供有关在集群的配置阶段是否存在任何错误的详细信息。如果日志被配置为推送到 S3，则可以在集群或 S3 上访问日志。

日志存储在磁盘上的 `/var/log/provision-node/apps-phase/0/{UUID}/puppet.log` 和 `s3://<LOG LOCATION>/<CLUSTER ID>/node/<EC2 INSTANCE ID>/provision-node/apps-phase/0/{UUID}/puppet.log.gz.`

**常见错误消息**


| 错误消息 | 原因 | 
| --- | --- | 
|  Puppet（err）：系统启动失败了！ emr-record-server journalctl 日志：emr-record-server  |  EMR 记录服务器启动失败。请参阅下面的 EMR 记录服务器日志。  | 
|  Puppet（err）：系统启动失败了！ emr-record-server emrsecretagent 的 journalctl 日志：  |  EMR SecretAgent 启动失败。请参阅下面的检查 SecretAgent 日志。  | 
|  /Stage [main] /ranger\$1Plugins:: ranger\$1Hive\$1plugin/Ranger\$1plugins::Prepare\$1two\$1way\$1tls[configure 2-way TLS in Hive plugin]/Exec[create keystore and truststore for Ranger Hive plugin]/returns（注意）：140408606197664：错误：0906d06C：PEM 例程：pem\$1read\$1bio：没有起始行：pem\$1lib.c: 707: 期望：任何私钥  |  Secrets Manager 中用于 Apache Ranger 插件凭证的私有 TLS 凭证格式不正确或不是私有凭证。请参阅 [用于 Apache Ranger 与 Amazon EMR 集成的 TLS 证书](emr-ranger-admin-tls.md) 了解凭证格式。  | 
|  /Stage [main] /ranger\$1Plugins:: ranger\$1s3\$1 plugin/Ranger\$1plugins::Prepare\$1two\$1way\$1tls[configure 2-way TLS in Ranger s3 plugin]/Exec[create keystore and truststore for Ranger amazon-emr-s3 plugin]/returns (notice): An error occurred (AccessDeniedException) when calling the GetSecretValue operation: User: arn:aws:sts::XXXXXXXXXXX:assumed-role/EMR\$1EC2\$1DefaultRole/i-xxxxxxxxxxxx 无权表演：secretsManager：在资源上：arn: aws: secretsManager: us-east-1:xxxxxxxxx: Secret:-XXXXXXX: Secret：-XXXXXX GetSecretValue AdminServer  |  EC2 实例配置文件角色没有从 Secrets Agent 检索 TLS 凭证的权限。  | 

**查看 SecretAgent 日志**

SecretAgent 日志位于 EMR 节点上的 `/emr/secretagent/log/` 中，或位于 S3 中的 `s3://<LOG LOCATION>/<CLUSTER ID>/node/<EC2 INSTANCE ID>/daemons/secretagent/` 目录中。

**常见错误消息**


| 错误消息 | 原因 | 
| --- | --- | 
|  话题 “主” com.amazonaws.services.securitytoken.model 出现异常。 AWSSecurityTokenServiceException: 用户：arn: aws: sts:: xxxxxxxxxxxxxxxxxxx: 假设 role/EMR\$1EC2\$1DefaultRole/i-xxxxxxxxxxxxx无权在资源AssumeRole 上执行：sts：arn: aws: iam:: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx：\$1（服务：；状态码：403；错误代码：；；请求编号：xxxxxxxxx-xxxxxxxxxxxxxxxxxxxx；Proxxxxxxxxxxxxxxxx；Proxxxxxxxxx: 空 RangerPluginDataAccessRole) AWSSecurity TokenService AccessDenied  |  上述例外情况意味着 EMR EC2 实例配置文件角色无权担任该角色。**RangerPluginDataAccessRole**请参阅[用于与 Apache Ranger 本地集成的 IAM 角色](emr-ranger-iam.md)。  | 
|  ERROR qtp54617902-149: Web App Exception Occurred javax.ws.rs。 NotAllowedException: 不允许使用 HTTP 405 方法  |  这些错误可以忽略。  | 

**检查记录服务器日志（适用于 SparkSQL）**

<CLUSTER ID><EC2 INSTANCE ID>EMR R var/log/emr ecord Server 日志位于 EMR 节点上的 /-record-server/，也可以在 S3 的 s3: ////node/ /daemons<LOG LOCATION>//目录中找到。emr-record-server

**常见错误消息**


| 错误消息 | 原因 | 
| --- | --- | 
|  InstanceMetadataServiceResourceFetcher:105-[] 无法检索令牌 com.am azonaws。 SdkClientException: 无法连接到服务端点   |  EMR SecretAgent 未能出现或出现问题。检查 SecretAgent 日志中是否存在错误，并检查 puppet 脚本以确定是否存在任何配置错误。  | 

# Ranger 与 Amazon EMR 集成的查询意外失败
<a name="emr-ranger-troubleshooting-queries-failed"></a>

**查看 Apache Ranger 插件日志（Apache Hive、RecordServer EMR、 SecretAgent EMR 等，日志）**

本节在所有与 Ranger 插件集成的应用程序中都很常见，例如 Apache Hive、EMR Record Server 和 EMR。 SecretAgent

**常见错误消息**


| 错误消息 | 原因 | 
| --- | --- | 
|  错误:272 PolicyRefresher-[] (servic PolicyRefresher eName=Policy-Repository)：找不到服务。Will clean up local cache of policies (-1)   |  此错误消息意味着您在 EMR 安全配置中提供的服务名称与 Ranger Admin 服务器中的服务策略存储库不匹配。  | 

如果在 Ranger Admin 服务器中，您的 AMAZON-EMR-SPARK服务如下所示，则应输入**amazonemrspark**作为服务名称。

![\[Ranger 管理服务器显示 AMAZON-EMR-SPARK故障排除。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-amazon-emr-spark-troubleshooting.png)
