驱蚊器喵的翻译平台

Can you hear the gravity?

  1. 1. 服务器要求
  2. 2. docker-compose up
    1. 2.1. 当你输入完第一个 ‘up’ 时
    2. 2.2. 当你输入第二个 ‘up’ 时
  3. 3. 每个组件如何与 Ranger 进行集成
    1. 3.1. HDFS
      1. 3.1.1. HDFS 测试 1 - 阻止所有用户访问 HDFS 的根路径
      2. 3.1.2. HDFS 测试 2 — 允许 “hive” 用户(递归)访问
    2. 3.2. Hive
      1. 3.2.1. Hive 测试 1 — 阻止访问 Hive
  4. 4. 总结

通过 docker 方式启动 Hadoop 和 Ranger 集成环境。


原文地址:https://medium.com/swlh/hands-on-apache-ranger-docker-poc-with-hadoop-hdfs-hive-presto-814344a03a17
原文标题:Apache Ranger Docker POC With Hadoop(HDFS, Hive, Presto)
原文作者:Kaden Cho
原文写于:2020/12/23

译者:驱蚊器喵#ΦωΦ
翻译水平有限,有不通顺的语句,请见谅。


如果你像我一样在内部 Hadoop 数据平台上工作,你肯定遇到过平台中多个服务之间的授权和认证问题。目前,数据平台用 Apache Sentry 和内部 LDAP 的混合方式来处理授权和认证问题,但每当我们遇到需要 “满足一些非常规的需求” 或者是 “增加更多与当前结构不兼容的新服务时”,就需要一些手动操作。

因此,我在这里分享一个关于 Apache Ranger 的全面概述(和 docker 实践),这是我全面的 POC 的结果,以考虑上述问题的其他解决方案。希望它能帮助其他面临类似情况的人。

这里我们需要执行两次 “docker-compose up”:一次是用于启动 Ranger 集群,另一次用于启动 Hadoop 环境。我首先会分享了容器结构的简要概述,并展示 Hadoop(HDFS、Hive、Presto)的每个组件如何与 Ranger 一起工作。

服务器要求

  • Git
  • Docker 以及足够的内存 (推荐 — 至少是 12 GB)
  • 对于 Apache Ranger, Hadoop Stack 有基本的了解

docker-compose up

让我们把 git 仓库拉到本地,然后用 docker-compose 启动起来:

1
2
3
4
5
6
git clone https://github.com/kadensungbincho/apache-ranger-docker-poc.git
docker network create ranger-env
cd apache-ranger-docker-poc/docker-composes/ranger
docker-compose up -d
cd ../hadoop
docker-compose up -d

当你输入完第一个 ‘up’ 时

系统上会启动 4 个容器:

  • ranger-admin:这个容器有一个 Ranger 安全管理服务,提供 1)策略管理,2)审计日志查看,3)Ranger 用户管理功能与 Web UI 环境。正如你所看到的,Ranger 使用 MySQL 数据库作为数据存储(策略、用户),使用 ES 作为审计日志存储。
  • ranger-usersync: Ranger 用户同步服务(在这种情况下,它在容器中使用 unix用户,你可以有多个用户同步服务,比如同步来自 LDAP 的用户)。
  • ranger-db:MySQL 的容器。
  • ranger-es:ElasticSearch 的容器,用于存储服务(HDFS、Hive、Presto等)中客户端的审计日志。

当你输入第一个 docker-compose up -d

等待 30 ~ 60 秒后,你可以用默认的用户名/密码(admin/rangeradmin1)登陆 http://localhost:6080。

登陆页面

当你输入第二个 ‘up’ 时

系统启动了 Hadoop 栈,这样我们就可以尝试使用 HDFS、Hive 和 Presto 等服务进行集成测试。

当你输入第二个 docker-compose up -d

在上图中,我想说的要点是加粗的 3 个部分:

  • 插件 (Plugin): 每个使用 Apache Ranger 的服务都有一个专门针对每种情况的代理端(这里是指 HDFS, Hive, Presto
  • 到 ES 的审计日志 (Audit Logs to ES): 审计日志直接从代理端(插件)发送到审计存储(本例中为 ES)。
  • 通过 Ranger Security Admin 和应用进行策略检查: 代理端通过检查 Ranger Security Admin 上的策略来验证用户对资源的请求是否被授权(有时是检查服务器本地的策略缓存)。

每个组件如何与 Ranger 进行集成

现在,我们可以测试 Ranger 如何在上述环境中处理每个组件的请求。我们可以为每个组件进行配置,并验证 Ranger 是否按照我们的需求工作。

HDFS

Ranger 通过两个阶段来评估用户对特定资源(HDFS路径)的请求。

  • 检查是否有适用于该资源的策略,如果存在,就 “执行” 该策略(然后在下面的审计日志中显示 “ranger-acl”)。
  • 否则,执行 “hadoop-acl”。

下面我们检查第一种情况:如果我们在 HDFS 资源上设置一些策略会发生什么。

进入 “访问管理器(Access Manager)” -> “HDFS +” 后,让我们像下面的图片一样设置 HDFS 配置并保存:

HDFS 配置
  • 服务名称(Service Name): 我是通过改变这里来设置的,所以上面的设置应该与之匹配
  • 用户名和密码:在 HDFS 客户端中用来访问 Ranger admin 的账户(默认用户是 admin,我修改了之前提到的密码)。
  • Namenode URL。如果你熟悉 docker 的话,就不足为奇了。在这里进行了修改。

然后,你可以点击 “审计(Audit)”->”插件(Plugins)”,来确保 HDFS 插件被正确设置。

审计插件

HDFS 测试 1 - 阻止所有用户访问 HDFS 的根路径

那么,让我们在 Ranger Web UI 中修改 HDFS 策略并进行检查。首先,点击 “Hdfs” -> “添加新策略(Add New Policy)”

然后,像下面的图片那样设置策略。

现在,如果你进入’datanode’容器,并试图通过非所有者用户(hive)访问HDFS,你将会被阻止。

1
2
3
4
5
6
7
8
9
# 在你的终端
docker exec -it datanode bash

# 此时在 'datanode' 容器中是 root 用户
useradd hive
# 在 'datanode' 容器中切换到 hive 用户
su hive
/opt/hadoop-3.2.1/bin/hdfs dfs -ls /user/hive
ls: Permission denied: user=hive, access=EXECUTE, inode="/user/hive"

查看审计日志:

"hive" 用户对 HDFS 的访问被阻止了

HDFS 测试 2 — 允许 “hive” 用户(递归)访问

然后,我们可以在默认的 hive 仓库路径(/user/hive/warehouse)上为 “hive”用户开启访问权限。首先,我们在 Ranger 用户界面中创建一个用户,并为该用户添加一个策略。

在你通过 “设置(Settings)”->”用户/群组/角色(Users/Groups/Roles)”->”添加新用户(Add New User)”进入用户界面后,填写创建一个用户。


然后,创建一个策略。

为 /user/hive/warehouse* 创建一条策略

但是,如果你试图通过输入以下内容来访问:

1
2
3
4
5
6
7
# 在你的终端
docker exec -it datanode bash
# 在 'datanode' 容器中是 root 用户
su hive
# 在 'datanode' 容器中切换到 hive 用户
/opt/hadoop-3.2.1/bin/hdfs dfs -ls /user/hive/warehouse
ls: Permission denied: user=hive, access=EXECUTE, inode="/user/hive/warehouse"

你又得到了这个报错,因为之前创建的策略(blockRootAccess)的优先级更高( Deny 的优先级比 Allow 高)。

当前的策略

删除掉 ‘blockRootAccess’ 策略,然后你可以检查 Ranger 是否按我们的需求工作。所以,这里我们可以意识到,使用混合有 “拒绝(Deny)” 和 “允许(Allow)” 的策略需要仔细。

Hive

Hive 代理端处理诸如 “表”、”数据库” 等资源。表的数据基于存储(HDFS)之上,所以与 HDFS 不同,当 Hive 代理端访问表数据时,也会受到 HDFS 策略的影响。

Hive 也比 HDFS 有更多的访问级别(access-level),所以 Ranger 的 AccessType 聚合了 Hive 的一些访问级别,具体可以见下图:

访问这个链接查看更多 https://cwiki.apache.org/confluence/display/RANGER/Hive+Commands+to+Ranger+Permission+Mapping

然后,让我们来测试一些 Hive 的访问模式(适用于 Hive Server 而不是 Hive Metastore)。

Hive 测试 1 — 阻止访问 Hive

首先,我们需要注册 Hive 插件。通过 ‘访问管理器(Access Manager)’ -> ‘Hadoop SQL +’ 进入 Hadoop SQL 注册页面,然后像下面这样填写表格:

Hive Plugin Registration ( jdbc:hive2://hive-server:10000/;serviceDecoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2 )

在继续之前,请确保你的 Hive 插件已在审计页面注册。

Hive Audit Plugin

然后,以 “hive” 用户的身份用 beeline 方式连接到 Hive Server,检查 “hive” 用户是否可以访问数据库或表。

1
2
3
4
5
6
# 在你的终端
docker exec -it hive-server bash
# 在 'hive-server' 容器是 root 用户
/opt/hive/bin/beeline
# 进入 beeline 命令行
!connect jdbc:hive2://127.0.0.1:10000 hive hivehive1 (<-输入你创建 hive 用户的密码)

然后,你就会悲伤的得到这样的报错:

1
20/12/17 12:56:46 [main]: WARN jdbc.HiveConnection: Failed to connect to localhost:10000Error: Could not open client transport with JDBC Uri: jdbc:hive2://localhost:10000: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.ranger.authorization.hadoop.exceptions.RangerAccessControlException): Permission denied: user=hive, access=EXECUTE, inode="/tmp/hive" at org.apache.ranger.authorization.hadoop.RangerHdfsAuthorizer$RangerAccessControlEnforcer.checkPermission(RangerHdfsAuthorizer.java:466)

这意味着 Hive Server 尝试以登陆用户 “hive” 在 HDFS 的存储创建一个临时文件夹 “/tmp/hive”(因为我打开了 doAs 选项),但是失败了。我们应该为 “hive” 用户设置 HDFS 策略,使其能有权限创建临时 “文件夹”。在我们删除之前在 HDFS 上创建的 ‘blockAllAccess’ 策略后,我们检查可以正常连接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
!connect jdbc:hive2://127.0.0.1:10000 hive hivehive1(or type the password you put when you create hive user)Connecting to jdbc:hive2://127.0.0.1:10000
Connected to: Apache Hive (version 3.1.2)
Driver: Hive JDBC (version 3.1.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://127.0.0.1:10000> show databases;
...
INFO : OK
INFO : Concurrency mode is disabled, not creating a lock manager
DEBUG : Shutting down query show databases
+----------------+
| database_name |
+----------------+
| default |
+----------------+

1 row selected (1.072 seconds)

然后,让我们编辑 ‘all-databases, tables, columns’ 的默认策略,通过添加 ‘Deny’ 条件来阻止 ‘hive’ 用户的所有访问,如下所示:

编辑 'all-databases, tables, columns' 策略

添加一个拒绝条件

然后,你的访问就被正确地阻止了:

1
0: jdbc:hive2://127.0.0.1:10000> show databases;Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [hive] does not have [USE] privilege on [Unknown resource!!] (state=42000,code=40000)

总结

当我试图调试 Ranger 和 Hadoop 服务之间的问题时,我可以更加理解 HDFS 和 Hive 的底层结构(它们之间的关系相当紧密)。

希望这个简短的 POC 可以给你一个自由探索 Ranger 和 Hadoop 集群的环境。

本文作者 : meow
This blog is under a CC BY-NC-SA 4.0 Unported License
本文链接 : https://translation.meow.page/post/hands-on-apache-ranger-docker-poc-with-hadoop-hdfs-hive-presto/

本文最后更新于 天前,文中所描述的信息可能已发生改变