亚马逊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集成有三个因素。
- 安装并集成一个认证供应商
- 安装Ranger服务器和插件并与EMR集群集成
- 如果启用了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都是一项困难的工作;它很复杂,容易出错,而且很耗时,因为。
- 它要求操作者对Windows AD、OpenLDAP、Kerberos和SSL/TLS有一定的了解,这些都不是大数据工程师的核心技能。学习这些知识需要花费大量的时间。
- Ranger的架构很复杂,它包括两个服务器端的组件。Ranger Admin和Ranger UserSync,两个存储组件。 MySQL 和Solr,以及各种插件。插件也需要安装在集群节点上,所以完整的手动安装是一项繁重的工作。
- 它不是一个独立的工作,它通常需要与现有的Windows AD/OpenLDAP服务器或EMR集群整合。许多不确定的外部因素可能导致安装失败,即网络问题、不正确的特定环境配置等等。
- emr-native ranger解决方案强烈依赖于Kerberos和SSL/TLS;这大大增加了整合的复杂性。
- Ranger没有开箱即用的分发包。安装必须从编译源代码开始,这对非java工程师来说是个挑战。
上述因素的叠加使这项工作变得困难。
3.自动安装程序介绍
由于安装和集成EMR和Ranger是如此具有挑战性,所以最终用户和解决方案架构师对自动安装程序的要求也随之增加。大约一年半前,我们提供了一个可以安装开源Ranger的自动安装程序,当EMR集群原生Ranger功能发布后,我们对其进行了深度重构,将开源和emr-native Ranger结合在一起,使其完全支持四种高适用性场景(No.1, 2, 3, 4)。以下是自动安装程序的仓库地址。
| 项目名称
|
存储库地址
| | --- | --- | |
Ranger & EMR自动安装程序
|
|
这个安装程序同时支持四种情况(第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的深度整合
一般来说,安装程序会完成以下工作。
- 安装OpenLDAP
- 在EMR集群的所有节点上安装SSSD
- 将Kerberos后端数据库迁移到OpenLDAP,将两个系统的账户数据保存为一个记录
- 安装和配置SASL/GSSAPI,使Kerberos账户登录OpenLDAP。
- 配置OpenLDAP,将Kerberos账户映射到OpenLDAP账户。
- 启用saslauthd,统一OpenLDAP和Kerberos账户的密码
- 配置SSH,允许用户用OpenLDAP账户登录
- 配置SSH,通过GSSAPI让用户用Kerberos账户登录。
4.3 授权的细节
对于授权,Ranger是主角;如果我们深入研究,其架构看起来如下。
安装程序将完成以下工作。
- 安装MySQL作为Ranger的策略数据库
- 安装Solr作为Ranger的审计库
- 安装Ranger Admin
- 安装Ranger UserSync
- 安装EMRFS(S3)Ranger插件
- 安装Spark Ranger插件
- 安装Hive Ranger插件
- 安装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集群依赖的工件,然后指示用户用这些工件创建自己的集群,同时安装进度将被搁置,并持续监控目标集群的状态。一旦它准备好了,安装进度将恢复,并继续执行其他操作。
注:
- 安装程序会把本地主机当作Ranger服务器来安装Ranger的一切。对于非游侠操作,即安装OpenLDAP或迁移Kerberos DB,它将通过SSH启动远程操作。所以,你可以留在Ranger服务器上执行命令行;不需要在多个主机之间切换。
- 为了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集群开始创建,五个与集群相关的信息项目将被确定,它们是:。
- 集群ID。从web控制台的摘要标签中获取
- Kerberos境界。由你在 "认证和加密 "部分输入;见上面的快照。注意,对于地区
us-east-1,默认境界是EC2.INTERNAL;对于其他地区,默认境界是COMPUTE.INTERNAL - Kerberos KDCAdmin 密码:在 "Authentication and Encryption "部分由您输入;见上面的快照。
- Kerberos KDC 主机。从Web控制台的硬件标签中获取,通常是一个主节点
- 确认让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
全参数版本将为我们提供所有自定义选项的完整视角。在下面的情况下,你可以改变一些选项的值。
- 如果你想改变默认的组织名称
dc=example,dc=com或默认密码Admin1234!,请运行全参数版本,并用你自己的值来替换它们。 - 如果你需要与外部设施集成,例如,集中的OpenLDAP或现有的MySQL、Solr,请添加相应的
--skip-xxx-xxx选项,并将其设置为true. - 如果你有其他预设的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是一个树状路径;要创建它,我们必须创建路径中的所有节点;实现这样一个小而复杂的功能并不划算。 - 默认情况下,一体机安装将把集群的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.附录
以下是参数说明。
| 参数 | 评论 |
|---|---|
| --region | aws区域。 |
| --access-key-id | 你的IAM账户的aws访问密钥ID。 |
| --secret-access-key | 你的IAM账户的aws秘密访问密钥。 |
| --ssh-key | ssh私钥文件路径。 |
| --solution | 解决方案的名称,可接受的值为 "open-source "或 "emr-native"。 |
| --auth-provider | 认证提供者,接受值为'ad'或'openldap'。 |
| --openldap-host | openldap主机的FQDN。 |
| --openldap-base-dn | openldap的基本域名,例如:'dc=example,dc=com',根据你的环境改变它。 |
| --openldap-root-cn | 根账户的cn,例如:'admin',根据你的环境改变它。 |
| --openldap-root-password | 根账户的密码,例如:'Admin1234!',根据你的环境改变它。 |
| --ranger-bind-dn | ranger的绑定dn,例如:'cn=ranger,ou=services,dc=example,dc=com',这应该是OpenLDAP上现有的dn,根据你的环境改变它。 |
| --ranger-bind-password | ranger绑定dn的密码,例如:'Admin1234!',根据你的环境改变它。 |
| --openldap-user-dn-pattern | ranger在OpenLDAP上搜索用户的dn模式,例如:'uid={0},ou=users,dc=example,dc=com',根据你的环境改变它。 |
| --openldap-group-search-filter | ranger在OpenLDAP上搜索组的过滤器,例如:'(member=uid={0},ou=users,dc=example,dc=com)',根据你的环境改变它。 |
| --openldap-user-object-class | 用于Ranger搜索用户的用户对象类别,例如:'inetOrgPerson',根据你的环境改变它。 |
| --hue-bind-dn | hue的绑定dn,例如:'cn=hue,ou=services,dc=example,dc=com',这应该是OpenLDAP上现有的dn,根据你的环境改变它。 |
| --hue-bind-password | hue绑定dn的密码,例如:'Admin1234!',根据你的环境改变它。 |
| --example-users | 在OpenLDAP和Kerberos上创建的示例用户,以便演示ranger的功能,这个参数是可选的,如果省略,将不会创建示例用户。 |
| --ranger-bind-dn | ranger的绑定dn,例如:'cn=ranger,ou=services,dc=example,dc=com',这应该是OpenLDAP上现有的dn,根据你的环境改变它。 |
| --ranger-bind-password | 绑定dn的密码,例如:'Admin1234!',根据你的环境改变它。 |
| --hue-bind-dn | hue的绑定dn,例如:'cn=hue,ou=services,dc=example,dc=com',这应该是OpenLDAP上的一个现有dn,根据你的环境改变它。 |
| --hue-bind-password | hue绑定dn的密码,例如:'Admin1234!',根据你的环境改变它。 |
| --sssd-bind-dn | sssd的绑定dn,例如:'cn=sssd,ou=services,dc=example,dc=com',这应该是OpenLDAP上的一个现有dn,根据你的环境改变它。 |
| --sssd-bind-password | sssd绑定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"。 |