亚马逊EMR和Apache Ranger的自动安装和集成解决方案

492 阅读22分钟

亚马逊EMR和Apache Ranger的自动安装和集成解决方案(1):OpenLDAP + EMR-Native Ranger

在这篇文章中,用户将使用逐步说明来执行亚马逊EMR和Apache Ranger的自动安装和集成方案。

系统安全通常包括两个核心主题。认证和授权。一个是解决 "他/她是谁 "的问题,另一个是解决 "他/她是否有权限执行操作 "的问题。在大数据领域,Apache Ranger是授权方面最受欢迎的选择;它支持所有主流的大数据组件,包括HDFS、Hive、HBase等。随着亚马逊EMR推出原生ranger(插件)功能,用户也可以管理EMRFS(S3)和Spark的授权。在认证方面,企业通常有自己的集中式认证基础设施,即Windows AD或OpenLDAP;但对于大多数大数据组件来说,Kerberos是唯一支持的认证机制,所以用户通常需要将Windows AD/OpenLDAP和Kerberos整合在一起,统一认证。

这是个系列文章。我们将重点介绍如何为Amazon EMR和Apache Ranger实现自动化安装和集成。这个系列由四篇文章组成;每篇文章将介绍针对不同技术栈的完整解决方案。

1.EMR和Ranger的安装和集成概述

安装Apache Ranger并与Amazon EMR集成有三个因素。

  1. 安装并集成一个认证供应商
  2. 安装Ranger服务器和插件并与EMR集群集成
  3. 如果启用了Kerberos,则配置所有相关组件

对于认证提供者来说,Windows AD和OpenLDAP是最广泛使用的;它们的安装和集成是非常不同的,所以它们应该算作两个独立的工作。

对于Ranger的安装,有两种可选的解决方案,一种是 "开源ranger服务器+emr-native ranger插件",我们称之为 "emr-native "ranger解决方案;另一种是 "开源ranger服务器+开源ranger插件",我们称之为 "开源 "ranger解决方案。安装这两个解决方案也是两个独立的工作。

对于Kerberos,如果启用的话,会给上述工作带来很多变化,所以启用或禁用Kerberos又是两个独立的工作。

综上所述,基于上述因素,有以下八种可能的方案(技术栈)。

本系列文章将介绍前四种方案。场景5和6是EMR不支持的(如果你不启用Kerberos,在EMR安全配置页面上创建基于ranger的授权会被阻止);如果场景5或6是必须的,你可以先完成场景1或2,然后从emr集群手动禁用Kerberos,但不建议这样做。考虑到选择方案7或8的用户较少,我们将不讨论这些方案。

注意:在写这篇文章的时候,Trino插件还没有上市,所以这个方案目前不支持Trino插件。

2.为什么安装Ranger是困难的

无论你以前是否成功做过,安装和整合Windows AD/OpenLDAP + Ranger + EMR都是一项困难的工作;它很复杂,容易出错,而且很耗时,因为。

  1. 它要求操作者对Windows AD、OpenLDAP、Kerberos和SSL/TLS有一定的了解,这些都不是大数据工程师的核心技能。学习这些知识需要花费大量的时间。
  2. Ranger的架构很复杂,它包括两个服务器端的组件。Ranger Admin和Ranger UserSync,两个存储组件。 MySQL 和Solr,以及各种插件。插件也需要安装在集群节点上,所以完整的手动安装是一项繁重的工作。
  3. 它不是一个独立的工作,它通常需要与现有的Windows AD/OpenLDAP服务器或EMR集群整合。许多不确定的外部因素可能导致安装失败,即网络问题、不正确的特定环境配置等等。
  4. emr-native ranger解决方案强烈依赖于Kerberos和SSL/TLS;这大大增加了整合的复杂性。
  5. Ranger没有开箱即用的分发包。安装必须从编译源代码开始,这对非java工程师来说是个挑战。

上述因素的叠加使这项工作变得困难。

3.自动安装程序介绍

由于安装和集成EMR和Ranger是如此具有挑战性,所以最终用户和解决方案架构师对自动安装程序的要求也随之增加。大约一年半前,我们提供了一个可以安装开源Ranger的自动安装程序,当EMR集群原生Ranger功能发布后,我们对其进行了深度重构,将开源和emr-native Ranger结合在一起,使其完全支持四种高适用性场景(No.1, 2, 3, 4)。以下是自动安装程序的仓库地址。

| 项目名称

|

存储库地址

| | --- | --- | |

Ranger & EMR自动安装程序

|

github.com/bluishglc/r…

|

这个安装程序同时支持四种情况(第1、2、3、4号)。换句话说,它支持Windows AD和OpenLDAP;它可以在所有AWS地区(包括中国地区)使用。对于3/4号场景,该安装程序可以安装在现有集群上,并支持多主机和单主机集群。对于每个步骤,该安装程序总是先检查连接性,然后决定是否进入下一步。这对于识别网络问题或服务故障非常有帮助,即Ranger或OpenLDAP没有启动。最后,实际的安装工作是一个试错的过程,用户总是需要尝试不同的参数值来找到适合用户环境的参数值,所以安装程序允许用户随时重新运行一体机的安装,而不会产生副作用,用户还可以进行分步运行来进行调试。以下是总结的主要特点。

我们知道在AWS博客上有一个现有的解决方案。在Amazon EMR上使用Apache Ranger实现授权和审计。但是,这个安装程序从设计到功能都与该方案有很大的不同;该方案只支持两个场景(2号、4号),而且只在us-east-1区域工作;对于3/4场景,该方案不能支持现有的或多主机集群,等等。

本系列文章就是基于这个工具来指导用户完成四个场景的安装,本文是针对场景1:"OpenLDAP+EMR-Native Ranger"。

4.OpenLDAP + EMR-Native Ranger解决方案概述

4.1 解决方案架构

在这个解决方案中,OpenLDAP扮演认证提供者。所有的用户账户数据都存储在上面,而Ranger则扮演授权控制器,因为我们选择的是EMR-原生Ranger解决方案,它非常依赖于Kerberos,所以需要一个Kerberos KDC。在这个解决方案中,我们建议选择由EMR创建的集群专用KDC,而不是外部KDC。这可以帮助我们节省安装 Kerberos 的工作。如果你有一个现有的 KDC,这个解决方案也支持它。

为了统一用户账户的数据,OpenLDAP和Kerberos必须被整合。有一系列的工作要做,即启用SASL/GSSAPI,映射两个系统的账户,启用直通式认证,等等。对于Ranger来说,它将同步来自OpenLDAP的账户数据,以针对OpenLDAP的用户账户授予权限。同时,EMR集群的需要安装一系列的ranger插件;这些插件会与ranger服务器进行检查,以确保当前用户有权限执行某项操作。EMR集群也会通过SSSD从OpenLDAP中同步账户数据,所以用户可以登录EMR集群的节点并提交工作。

4.2 认证的细节

让我们深入了解一下认证部分。OpenLDAP和Kerberos是两种相互独立的认证机制。整合它们就是认证的主题。有另一个系列的文章专门讨论这个话题,这个安装程序完全遵循这个系列的所有操作。

基于OpenLDAP和Kerberos的认证解决方案(1)。集成后端数据库
OpenLDAP和基于Kerberos的认证方案(2)。同步SSSD
OpenLDAP和基于Kerberos的认证方案(3)。与SASL/GSSAPI的深度整合

一般来说,安装程序会完成以下工作。

  1. 安装OpenLDAP
  2. 在EMR集群的所有节点上安装SSSD
  3. 将Kerberos后端数据库迁移到OpenLDAP,将两个系统的账户数据保存为一个记录
  4. 安装和配置SASL/GSSAPI,使Kerberos账户登录OpenLDAP。
  5. 配置OpenLDAP,将Kerberos账户映射到OpenLDAP账户。
  6. 启用saslauthd,统一OpenLDAP和Kerberos账户的密码
  7. 配置SSH,允许用户用OpenLDAP账户登录
  8. 配置SSH,通过GSSAPI让用户用Kerberos账户登录。

4.3 授权的细节

对于授权,Ranger是主角;如果我们深入研究,其架构看起来如下。

安装程序将完成以下工作。

  1. 安装MySQL作为Ranger的策略数据库
  2. 安装Solr作为Ranger的审计库
  3. 安装Ranger Admin
  4. 安装Ranger UserSync
  5. 安装EMRFS(S3)Ranger插件
  6. 安装Spark Ranger插件
  7. 安装Hive Ranger插件
  8. 安装Trino Ranger插件(在写这篇文章的时候还不能用)。

5.安装和集成

一般来说,安装和整合过程可以分为3个阶段。1.先决条件 -> 2.一体化安装 -> 3.创建EMR集群,下图详细说明了进度。

在第1阶段,我们需要做一些准备工作。在第2阶段,我们开始安装和整合,在这个阶段有两种选择:一种是由基于命令行的工作流程驱动的一体化安装。另一个是分步安装。对于大多数情况,一体式安装总是最好的选择;然而,你的安装工作流程可能会被不可预见的错误打断。如果你想从最后一个失败的步骤继续安装,请尝试分步安装。或者有时,你想用不同的参数值重新尝试一个步骤,以找到正确的步骤;分步安装也是一个更好的选择。在第三阶段,我们需要用第二阶段的输出工件,即IAM角色和EMR安全配置,自己创建一个EMR集群。

作为一个设计原则,安装程序不包括任何创建EMR集群的操作。你应该总是自己创建你的集群,因为EMR集群可能有任何不可预测的复杂设置,即特定于应用程序(hdfs、yarn等)的配置、步骤脚本、启动脚本等;不建议将ranger的安装与EMR集群的创建结合起来。

然而,在第二阶段和第三阶段之间的执行顺序有一点重合。在创建EMR集群(emr-native解决方案)时,需要提供一份安全配置和ranger特定的IAM角色。在创建EMR集群之前,它们必须是可用的,在集群创建期间,它还需要与ranger服务器进行交互(服务器地址在安全配置中分配)。另一方面,一体式安装中的一些操作需要在集群或KDC的所有节点上执行;这需要EMR集群准备好。为了解决这种循环依赖,安装程序首先输出一些由EMR集群依赖的工件,然后指示用户用这些工件创建自己的集群,同时安装进度将被搁置,并持续监控目标集群的状态。一旦它准备好了,安装进度将恢复,并继续执行其他操作。

注:

  1. 安装程序会把本地主机当作Ranger服务器来安装Ranger的一切。对于非游侠操作,即安装OpenLDAP或迁移Kerberos DB,它将通过SSH启动远程操作。所以,你可以留在Ranger服务器上执行命令行;不需要在多个主机之间切换。
  2. 为了Kerberos,所有主机地址必须使用FQDN。没有域名的IP和主机名都是不被接受的。

5.1 先决条件

5.1.1 创建EC2实例作为Ranger和OpenLDAP服务器

首先,我们需要准备两个EC2实例,一个作为Ranger的服务器,另一个作为OpenLDAP的服务器。在创建实例时,请选择Amazon Linux 2 镜像,并保证实例和将要创建的集群之间的网络连接是可达的。

作为一个最佳实践,建议将Ranger服务器添加到ElasticMapReduce-master 安全组中,因为Ranger与EMR集群非常接近;它可以被视为一个非EMR内置的主服务。对于OpenLDAP,我们必须确保它的端口389可以从Ranger和要创建的EMR集群的所有节点到达,或者简单点说,你也可以把OpenLDAP添加到ElasticMapReduce-master 安全组中。

5.1.2 下载安装程序

在EC2实例准备好后,选择Ranger服务器,通过ssh登录,并运行以下命令下载安装包。

Shell

sudo yum -y install git
git clone https://github.com/bluishglc/ranger-emr-cli-installer.git

5.1.3 上传SSH密钥文件

如前所述,安装程序是基于本地主机(ranger服务器)在OpenLDAP或EMR集群上执行远程安装操作的,需要SSH私钥,所以我们应该把它上传到ranger服务器,并记下文件路径,它将是变量SSH_KEY

5.1.4 导出特定环境的变量

在安装过程中,以下特定环境参数会被多次传递;建议先导出这些参数,然后所有的命令行都会引用这些变量,而不是字面意思。

外壳

export REGION='TO_BE_REPLACED'
export ACCESS_KEY_ID='TO_BE_REPLACED'
export SECRET_ACCESS_KEY='TO_BE_REPLACED'
export SSH_KEY='TO_BE_REPLACED'
export OPENLDAP_HOST='TO_BE_REPLACED'

以下是对上述变量的评论。

  • REGION:AWS区域,即cn-north-1,us-east-1,等等。
  • ACCESS_KEY_ID:你的IAM账户的AWS访问密钥ID。请确保你的账户有足够的权限,最好有管理员的权限
  • SECRET_ACCESS_KEY: 你的IAM账户的AWS秘密访问密钥。
  • SSH_KEY: 你刚刚上传的本地主机上的Ssh私钥文件路径
  • OPENLDAP_HOST: OpenLDAP服务器的FQDN

请根据你的环境仔细替换上述变量的值,并记住使用FQDN作为主机名,即OPENLDAP_HOST。下面是一个例子的副本。

Shell

export REGION='cn-north-1'
export ACCESS_KEY_ID='<change-to-your-aws-access-key-id>'
export SECRET_ACCESS_KEY='<change-to-your-aws-secret-access-key>'
export SSH_KEY='/home/ec2-user/key.pem'
export OPENLDAP_HOST='ip-10-0-14-0.cn-north-1.compute.internal'

5.2 一体化安装

5.2.1 快速启动

现在,让我们通过执行此命令行来开始一体式安装。

Shell

sudo sh ./ranger-emr-cli-installer/bin/setup.sh install \
    --region "$REGION" \
    --access-key-id "$ACCESS_KEY_ID" \
    --secret-access-key "$SECRET_ACCESS_KEY" \
    --ssh-key "$SSH_KEY" \
    --solution 'emr-native' \
    --auth-provider 'openldap' \
    --openldap-host "$OPENLDAP_HOST" \
    --openldap-base-dn 'dc=example,dc=com' \
    --openldap-root-cn 'admin' \
    --openldap-root-password 'Admin1234!' \
    --openldap-user-dn-pattern 'uid={0},ou=users,dc=example,dc=com' \
    --openldap-group-search-filter '(member=uid={0},ou=users,dc=example,dc=com)' \
    --openldap-user-object-class 'inetOrgPerson' \
    --example-users 'example-user-1,example-user-2' \
    --ranger-plugins 'emr-native-emrfs,emr-native-spark,emr-native-hive'

关于上述命令行的具体参数,请参考附录中的内容。如果一切顺利,命令行将执行工作流程图中的2.1到2.7步骤;这可能需要10分钟或更长时间,取决于你的网络带宽,然后它将暂停并指示用户用两个工件创建EMR集群。

A.一个名为EMR_EC2_RangerRole
的ec2实例配置文件 B. 一个名为EMRsecurity的配置Ranger@<YOUR-RANGER-HOST-FQDN>

它们是在步骤2.2和2.4中通过命令行创建的,你可以在创建集群时从EMR网络控制台找到它们。下面是此刻的命令行的快照。

接下来,我们应该切换到EMR web控制台创建集群,一定要选择命令行控制台中提示的ec2实例配置文件和安全配置,对于Kerberos KDC,填写并记下 "realm "和 "KDC admin password",它们很快会在命令行中使用。下面是此刻EMR网络控制台的一个快照。

一旦EMR集群开始创建,五个与集群相关的信息项目将被确定,它们是:。

  1. 集群ID。从web控制台的摘要标签中获取
  2. Kerberos境界。由你在 "认证和加密 "部分输入;见上面的快照。注意,对于地区us-east-1 ,默认境界是EC2.INTERNAL ;对于其他地区,默认境界是COMPUTE.INTERNAL
  3. Kerberos KDCAdmin 密码:在 "Authentication and Encryption "部分由您输入;见上面的快照。
  4. Kerberos KDC 主机。从Web控制台的硬件标签中获取,通常是一个主节点
  5. 确认让Hue与LDAP整合与否。如果是,集群准备好后,安装程序会用Hue的特定设置更新EMR配置,注意这个动作会覆盖现有的EMR配置。

现在,我们需要回到命令行终端,在 "你创建了集群吗?"的提示中输入 "y"。[y/n]:"(你不需要wart,集群就完全准备好了),然后命令行会要求你逐一输入上述四项信息,因为它们是下一阶段安装所需要的,然后再次输入 "y "确认,安装过程将恢复,如果分配的EMR集群还没有准备好,命令行会一直监控,直到它进入 "WAITING "状态,下面是此刻命令行的快照。

当集群准备好后(状态为 "等待"),命令行将继续执行工作流程中的第2.9至2.13步,最后以 "全部完成 "结束。

5.2.2 定制

现在一体机的安装已经完成,接下来,我们介绍更多关于自定义的内容。一般来说,这个安装程序遵循 "习惯重于配置 "的原则,大多数参数都被预设为默认值,上述命令行的完整参数列表的等同版本如下。

Shell

sudo sh ./ranger-emr-cli-installer/bin/setup.sh install \
    --region "$REGION" \
    --access-key-id "$ACCESS_KEY_ID" \
    --secret-access-key "$SECRET_ACCESS_KEY" \
    --ssh-key "$SSH_KEY" \
    --solution 'emr-native' \
    --auth-provider 'openldap' \
    --openldap-host "$OPENLDAP_HOST" \
    --openldap-base-dn 'dc=example,dc=com' \
    --openldap-root-cn 'admin' \
    --openldap-root-password 'Admin1234!' \
    --openldap-user-dn-pattern 'uid={0},ou=users,dc=example,dc=com' \
    --openldap-group-search-filter '(member=uid={0},ou=users,dc=example,dc=com)' \
    --openldap-user-object-class 'inetOrgPerson' \
    --example-users 'example-user-1,example-user-2' \
    --ranger-plugins 'emr-native-emrfs,emr-native-spark,emr-native-hive' \
    --java-home '/usr/lib/jvm/java' \
    --skip-install-mysql 'false' \
    --skip-migrate-kerberos-db 'false' \
    --skip-install-solr 'false' \
    --skip-install-openldap 'false' \
    --skip-configure-hue 'false' \
    --ranger-host $(hostname -f) \
    --ranger-version '2.1.0' \
    --mysql-host $(hostname -f) \
    --mysql-root-password 'Admin1234!' \
    --mysql-ranger-db-user-password 'Admin1234!' \
    --solr-host $(hostname -f) \
    --ranger-bind-dn 'cn=ranger,ou=services,dc=example,dc=com' \
    --ranger-bind-password 'Admin1234!' \
    --hue-bind-dn 'cn=hue,ou=services,dc=example,dc=com' \
    --hue-bind-password 'Admin1234!' \
    --sssd-bind-dn 'cn=sssd,ou=services,dc=example,dc=com' \
    --sssd-bind-password 'Admin1234!' \
    --restart-interval 30

全参数版本将为我们提供所有自定义选项的完整视角。在下面的情况下,你可以改变一些选项的值。

  1. 如果你想改变默认的组织名称 dc=example,dc=com 或默认密码 Admin1234!,请运行全参数版本,并用你自己的值来替换它们。
  2. 如果你需要与外部设施集成,例如,集中的OpenLDAP或现有的MySQL、Solr,请添加相应的 --skip-xxx-xxx 选项,并将其设置为 true.
  3. 如果你有其他预设的hue、ranger和ssd的绑定dn,请添加相应的 --xxx-bind-dn--xxx-bind-password 选项来设置它们。请注意,在安装OpenLDAP时,hue、ranger和ssd的绑定dn会被自动创建,但它们的命名模式是固定的 cn=hue|ranger|sssd,ou=services,<your-base-dn> 而不是"--xxx-bind-dn "选项的给定值,所以如果你用"--xxx-bind-dn "选项指定了其他dn,你必须事先自己创建这个dn。本安装程序不创建由"--xxx-bind-dn "选项指定的dn的原因是,dn是一个树状路径;要创建它,我们必须创建路径中的所有节点;实现这样一个小而复杂的功能并不划算。
  4. 默认情况下,一体机安装将把集群的Kerberos数据库迁移到OpenLDAP,以便更好地管理账户,但如果你运行一个外部Kerberos KDC,请确定你是否需要将外部KDC的数据库迁移到OpenLDAP,如果不需要,请在命令行中添加 --skip-migrate-kerberos-db 'true' 在命令行中跳过它。

5.3 一步一步的安装

作为一种选择,你也可以选择分步安装,而不是一体式安装。我们给出了每个步骤的命令行。至于每个参数的注释,请参考附录中的内容。

5.3.1 启动EC2

这一步将完成一些基本工作,即安装AWS cli、JDK等。

壳牌

sudo sh ./ranger-emr-cli-installer/bin/setup.sh init-ec2 \
    --region "$REGION" \
    --access-key-id "$ACCESS_KEY_ID" \
    --secret-access-key "$SECRET_ACCESS_KEY"

5.3.2 创建IAM角色

这一步将创建三个IAM角色,这是EMR需要的。

sudo sh ./ranger-emr-cli-installer/bin/setup.sh create-iam-roles \
    --region "$REGION"

5.3.3 创建Ranger Secrets

这一步将为Ranger创建SSL/TLS相关的密钥、证书和密钥存储,因为emr-native ranger需要SSL/TLS连接到服务器。这些工件将上传到AWS的秘密管理器,并由EMR安全配置引用。

外壳

sudo sh ./ranger-emr-cli-installer/bin/setup.sh create-ranger-secrets \
    --region "$REGION"

5.3.4 创建EMR安全配置

这一步将创建一个EMR安全配置的副本。该配置包括Kerberos和Ranger的相关信息。当创建集群时,EMR将读取它们并获得相应的资源,即秘密,并与Ranger服务器进行交互,该地址在安全配置中被分配。

外壳

sudo sh ./ranger-emr-cli-installer/bin/setup.sh create-emr-security-configuration \
    --region "$REGION" \
    --solution 'emr-native' \
    --auth-provider 'openldap'

5.3.5 安装OpenLDAP

如上所述,这一步将在给定的OpenLDAP主机上安装OpenLDAP;虽然这个操作是在OpenLDAP服务器上进行的,但你不需要登录OpenLDAP服务器;只要在本地主机(ranger服务器)上运行命令行即可。

外壳

sudo sh ./ranger-emr-cli-installer/bin/setup.sh install-openldap \
    --region "$REGION" \
    --access-key-id "$ACCESS_KEY_ID" \
    --secret-access-key "$SECRET_ACCESS_KEY" \
    --ssh-key "$SSH_KEY" \
    --solution 'emr-native' \
    --auth-provider 'openldap' \
    --openldap-host "$OPENLDAP_HOST" \
    --openldap-base-dn 'dc=example,dc=com' \
    --openldap-root-cn 'admin' \
    --openldap-root-password 'Admin1234!'

5.3.6 安装Ranger

这一步将安装Ranger的所有服务器端组件,包括MySQL、Solr、Ranger Admin和Ranger UserSync。

壳牌

sudo sh ./ranger-emr-cli-installer/bin/setup.sh install-ranger \
    --region "$REGION" \
    --access-key-id "$ACCESS_KEY_ID" \
    --secret-access-key "$SECRET_ACCESS_KEY" \
    --solution 'emr-native' \
    --auth-provider 'openldap' \
    --openldap-host "$OPENLDAP_HOST" \
    --openldap-base-dn 'dc=example,dc=com' \
    --ranger-bind-dn 'cn=ranger,ou=services,dc=example,dc=com' \
    --ranger-bind-password 'Admin1234!' \
    --openldap-user-dn-pattern 'uid={0},ou=users,dc=example,dc=com' \
    --openldap-group-search-filter '(member=uid={0},ou=users,dc=example,dc=com)' \
    --openldap-user-object-class 'inetOrgPerson'

5.3.7 安装Ranger插件

这一步将从ranger服务器端安装EMRFs、spark和hive插件。还有另一半工作,就是在代理端安装以下插件(EMR秘密代理、EMR记录服务器等);不过,在创建集群时,EMR会自动完成。

sudo sh ./ranger-emr-cli-installer/bin/setup.sh install-ranger-plugins \
    --region "$REGION" \
    --solution 'emr-native' \
    --auth-provider 'openldap' \
    --ranger-plugins 'emr-native-emrfs,emr-native-spark,emr-native-hive'

5.3.8 创建EMR集群

对于逐步安装来说,没有创建EMR集群的交互过程,所以请随时在EMR网络控制台中创建集群。然而,我们必须等待集群完全准备好(处于 "WAITING "状态),然后导出以下特定环境变量。

Shell

export EMR_CLUSTER_ID='TO_BE_REPLACED'
export KERBEROS_REALM='TO_BE_REPLACED'
export KERBEROS_KDC_HOST='TO_BE_REPLACED'

下面是一个例子的副本。

Shell

export EMR_CLUSTER_ID='j-8SRQM6X4ZVT8'
export KERBEROS_REALM='COMPUTE.INTERNAL'
export KERBEROS_KDC_HOST='ip-10-0-3-104.cn-north-1.compute.internal'

5.3.9 迁移 Kerberos 数据库

Kerberos 的默认数据库是基于文件并存储在 KDC 上的。这一步将把所有委托人的数据迁移到 OpenLDAP。请多加注意这一步。如果你运行一个外部的 KDC, 而且它不是专门用于你的 EMR 集群, 你可以跳过这一步, 除非你确定你需要将外部 KDC 迁移到你的 OpenLDAP。

sudo sh ./ranger-emr-cli-installer/bin/setup.sh migrate-kerberos-db \
    --region $REGION \
    --ssh-key "$SSH_KEY" \
    --kerberos-realm "$KERBEROS_REALM" \
    --kerberos-kdc-host "$KERBEROS_KDC_HOST" \
    --openldap-host "$OPENLDAP_HOST" \
    --openldap-base-dn 'dc=example,dc=com' \
    --openldap-root-cn 'admin' \
    --openldap-root-password 'Admin1234!'

5.3.10 启用 SASL/GSSAPI

这一步将启用SASL/GSSAPI;这是OpenLDAP和Kerberos集成的一个关键操作;它将对OpenLDAP、Kerberos KDC和EMR集群的每个节点执行远程操作。和以前一样,你需要在本地主机上运行它。

外壳

sudo sh ./ranger-emr-cli-installer/bin/setup.sh enable-sasl-gssapi \
    --region "$REGION" \
    --ssh-key "$SSH_KEY" \
    --kerberos-realm "$KERBEROS_REALM" \
    --kerberos-kdc-host "$KERBEROS_KDC_HOST" \
    --openldap-host "$OPENLDAP_HOST" \
    --openldap-base-dn 'dc=example,dc=com' \
    --openldap-root-cn 'admin' \
    --openldap-root-password 'Admin1234!' \
    --emr-cluster-id "$EMR_CLUSTER_ID"

5.3.11 安装 SSSD

这一步将在EMR集群的每个节点上安装和配置SSSD。与安装OpenLDAP相同。我们仍然应该保留本地主机来运行命令行;它将通过SSH在远程节点上执行。

外壳

sudo ./ranger-emr-cli-installer/bin/setup.sh install-sssd \
    --region "$REGION" \
    --ssh-key "$SSH_KEY" \
    --openldap-host "$OPENLDAP_HOST" \
    --openldap-base-dn 'dc=example,dc=com' \
    --sssd-bind-dn 'cn=sssd,ou=services,dc=example,dc=com' \
    --sssd-bind-password 'Admin1234!' \
    --emr-cluster-id "$EMR_CLUSTER_ID"

5.3.12 配置Hue

这一步将更新EMR的hue配置,在一体化安装中强调了这一点;如果你有其他定制的EMR配置,请跳过这一步,但你仍然可以手动将命令行生成的hue配置的json文件合并到自己的json中。

外壳

sudo sh ./ranger-emr-cli-installer/bin/setup.sh configure-hue \
    --region "$REGION" \
    --auth-provider 'openldap' \
    --openldap-host "$OPENLDAP_HOST" \
    --openldap-base-dn 'dc=example,dc=com' \
    --hue-bind-dn 'cn=hue,ou=services,dc=example,dc=com' \
    --hue-bind-password 'Admin1234!' \
    --openldap-user-object-class 'inetOrgPerson' \
    --emr-cluster-id "$EMR_CLUSTER_ID"

5.3.13 创建示例用户

这一步将创建两个示例用户,以方便下面的验证。

Shell

sudo sh ./ranger-emr-cli-installer/bin/setup.sh add-example-users \
    --region "$REGION" \
    --ssh-key "$SSH_KEY" \
    --solution 'emr-native' \
    --auth-provider 'openldap' \
    --kerberos-kdc-host "$KERBEROS_KDC_HOST" \
    --openldap-host "$OPENLDAP_HOST" \
    --openldap-base-dn 'dc=example,dc=com' \
    --openldap-root-cn 'admin' \
    --openldap-root-password 'Admin1234!' \
    --example-users 'example-user-1,example-user-2'

6.验证

安装和集成完成后,是时候检查ranger是否工作了。验证工作分为四个部分,分别针对hive、emrfs(s3)和spark。首先,让我们通过客户端登录OpenLDAP,即LdapAdmin或Apache Directory Studio,然后检查出所有的DN;它应该看起来如下。

接下来,打开ranger网络控制台;地址是。https://<YOUR-RANGER-HOST>:6182,默认的管理账户/密码是:admin/admin 。登录后,我们应该先打开 "Users/Groups/Roles "页面,检查OpenLDAP上的示例用户是否已经同步到了ranger,如下图所示。

6.1Hive访问控制验证

通常情况下,hive插件安装后会有一套预定义的策略。为了消除干扰,让验证变得简单,我们先把它们删除。

ranger网络控制台上的任何策略变化都会在30秒内同步到代理端(EMR集群节点)。我们可以在主节点上运行以下命令来检查本地策略文件是否被更新。

Shell

# run on master node of emr cluster
for i in {1..10}; do
    printf "\n%100s\n\n"|tr ' ' '='
    sudo stat /etc/hive/ranger_policy_cache/hiveServer2_hive.json
    sleep 3
done

一旦本地策略文件更新了,移除所有策略的操作就会生效,然后用安装程序创建的OpenLDAP账户 "example-user-1 "登录Hue,打开hive编辑器,输入以下SQL(记得用你自己的桶替换 "ranger-test"),创建一个测试表(把 "ranger-test "改为你自己的桶名)。

SQL

-- run in hue hive editor
create table ranger_test (
  id bigint
)
row format delimited
stored as textfile location 's3://ranger-test/';

然后,运行它,出现了一个错误。

它显示example-user-1被数据库相关的权限所阻挡。这证明了蜂巢插件在工作,然后我们回到ranger,添加一个名为 "所有-数据库、表、列 "的蜂巢策略,如下所示。

它授予example-user-1在所有数据库、表和列上的所有权限。接下来,用之前的命令行在主节点上再次检查策略文件。更新后,回到Hue,重新运行该SQL,这时我们会得到另一个错误。

如图所示,在读取 "s3://ranger-test "时,SQL被阻止了,实际上,example-user-1没有权限访问任何URL,包括 "s3://"。我们需要给这个用户授予与URL相关的权限,所以再次回到ranger,添加一个名为 "all - url "的蜂巢策略,如下所示。

它授予example-user-1任何URL的所有权限,包括 "s3://"。接下来,再次检查策略文件,并切换到Hue,第三次运行该SQL,其结果如下。

最后,为了准备下一次的EMRFS/Spark验证,我们需要在表中插入一些例子数据,并仔细检查example-user-1是否对该表有完全的读写权限。

SQL

insert into ranger_test(id) values(1);
insert into ranger_test(id) values(2);
insert into ranger_test(id) values(3);
select * from ranger_test;

执行的结果是。

至此,蜂巢访问控制验证通过。

6.2 EMRFS(S3)访问控制验证

用账号 "example-user-1 "登录Hue,打开scala编辑器,输入以下spark代码。

Scala

# run in scala editor of hue
spark.read.csv("s3://ranger-test/").show;

这行代码试图读取S3上的文件,但它会遇到以下错误。

它显示example-user-1在s3桶 "ranger-test "上没有权限。这证明了EMRFs插件是有效的;它成功地阻止了未经授权的s3访问。让我们登录ranger,添加一个名为 "all - ranger-test "的EMRFs策略,如下所示。

它将授予example-user-1在 "ranger-test "桶上的所有权限。与检查蜂巢策略文件类似,我们也可以运行以下命令来检查EMRFs策略文件是否已经更新。

Shell

# run on master node of emr cluster
for i in {1..10}; do
    printf "\n%100s\n\n"|tr ' ' '='
    sudo stat /emr/secretagent/ranger_policy_cache/emrS3RangerPlugin_emrfs.json
    sleep 3
done

更新后,回到Hue,重新运行之前的spark代码,就会成功,如下所示。

至此,EMRFs访问控制验证通过。

6.3 火花访问控制验证

用账号 "example-user-1 "登录Hue,打开scala编辑器,输入以下spark代码。

Scala

# run in scala editor of hue
spark.sql("select * from ranger_test").show

这行代码试图通过spark SQL进入ranger_test表,但会遇到以下错误。

它显示当前用户在默认数据库上没有权限。证明spark插件在工作,并且成功阻止了未经授权的数据库/表访问。

让我们登录ranger,添加一个名为 "所有-数据库、表、列 "的spark策略,如下所示。

它将授予example-user-1在所有数据库/表/列上的所有权限。与检查hive策略文件类似,我们也可以运行下面的命令来检查spark策略文件是否已经更新。

Shell

# run on master node of emr cluster
for i in {1..10}; do
    printf "\n%100s\n\n"|tr ' ' '='
    sudo stat /etc/emr-record-server/ranger_policy_cache/emrSparkRangerPlugin_spark.json 
    sleep 3
done

更新之后,回到Hue,重新运行之前的spark代码,就会成功,如下图。

至此,spark的访问控制验证通过了。

7.兼容性

下面是Ranger和EMR版本的兼容性表格。

对于Ranger 1,它可以与Hadoop 2一起工作。对于Ranger 2来说,它可以和Hadoop 3一起使用。安装程序是针对Ranger 2.1.0和2.2.0开发的,所以它只支持EMR 6.X,并且在Ranger 2.1.0上进行了全面测试。对于Ranger 2.2.0来说,它通过不完全的测试来工作,但是可能有一些潜在的错误还没有被发现。

8.常见问题

8.1 如何整合外部KDC?

保持一切如常,但是在创建EMR集群时,不要选择cli生成的安全配置;不要手动创建另一个安全配置,而是从生成的安全配置中复制所有值,除了 "验证 "部分。对于 "Authentication",选择 "External KDC "并填写你自己的值;当在命令行控制台输入Kerberos KDC主机或导出KERBEROS_KDC_HOST时,使用你的外部KDC主机名。最后,要确定你是否还需要将外部 Kerberos 数据库迁移到 OpenLDAP。如果不需要, 用--skip-migrate-kerberos-db true 跳过它。

8.2 我可以重新运行 All-In-One 安装命令行吗?

可以,而且你不需要执行任何清理操作。

9.附录

以下是参数说明。

参数评论
--regionaws区域。
--access-key-id你的IAM账户的aws访问密钥ID。
--secret-access-key你的IAM账户的aws秘密访问密钥。
--ssh-keyssh私钥文件路径。
--solution解决方案的名称,可接受的值为 "open-source "或 "emr-native"。
--auth-provider认证提供者,接受值为'ad'或'openldap'。
--openldap-hostopenldap主机的FQDN。
--openldap-base-dnopenldap的基本域名,例如:'dc=example,dc=com',根据你的环境改变它。
--openldap-root-cn根账户的cn,例如:'admin',根据你的环境改变它。
--openldap-root-password根账户的密码,例如:'Admin1234!',根据你的环境改变它。
--ranger-bind-dnranger的绑定dn,例如:'cn=ranger,ou=services,dc=example,dc=com',这应该是OpenLDAP上现有的dn,根据你的环境改变它。
--ranger-bind-passwordranger绑定dn的密码,例如:'Admin1234!',根据你的环境改变它。
--openldap-user-dn-patternranger在OpenLDAP上搜索用户的dn模式,例如:'uid={0},ou=users,dc=example,dc=com',根据你的环境改变它。
--openldap-group-search-filterranger在OpenLDAP上搜索组的过滤器,例如:'(member=uid={0},ou=users,dc=example,dc=com)',根据你的环境改变它。
--openldap-user-object-class用于Ranger搜索用户的用户对象类别,例如:'inetOrgPerson',根据你的环境改变它。
--hue-bind-dnhue的绑定dn,例如:'cn=hue,ou=services,dc=example,dc=com',这应该是OpenLDAP上现有的dn,根据你的环境改变它。
--hue-bind-passwordhue绑定dn的密码,例如:'Admin1234!',根据你的环境改变它。
--example-users在OpenLDAP和Kerberos上创建的示例用户,以便演示ranger的功能,这个参数是可选的,如果省略,将不会创建示例用户。
--ranger-bind-dnranger的绑定dn,例如:'cn=ranger,ou=services,dc=example,dc=com',这应该是OpenLDAP上现有的dn,根据你的环境改变它。
--ranger-bind-password绑定dn的密码,例如:'Admin1234!',根据你的环境改变它。
--hue-bind-dnhue的绑定dn,例如:'cn=hue,ou=services,dc=example,dc=com',这应该是OpenLDAP上的一个现有dn,根据你的环境改变它。
--hue-bind-passwordhue绑定dn的密码,例如:'Admin1234!',根据你的环境改变它。
--sssd-bind-dnsssd的绑定dn,例如:'cn=sssd,ou=services,dc=example,dc=com',这应该是OpenLDAP上的一个现有dn,根据你的环境改变它。
--sssd-bind-passwordsssd绑定dn的密码,例如:'Admin1234!',根据你的环境改变它。
--ranger-plugins要安装的ranger插件,多个值用逗号隔开。例如:'emr-native-emrfs,emr-native-spark,emr-native-hive',根据你的环境改变它。
--skip-configure-hue跳过配置色调,接受值为 "true "或 "false",默认值为 "false"。
--skip-migrate-kerberos-db跳过迁移kerberos数据库,接受值为 "true "或 "false",默认值为 "false"。