Hadoop 的代理用户(Proxy User) 功能解释
在$HADOOP_HOME/etc/hadoop下的core-site.xml 配置里,可以新增hadoop集群的代理用户。 在集成配置中,会经常用到。它属于 Hadoop 安全机制的一部分。
以下是对该配置效果的详细说明及示例:
配置效果
<!-- 允许用户 hadoop 从主机 hadoop01 代理用户 alice 和 bob -->
<property><name>hadoop.proxyuser.hadoop.hosts</name><value>hadoop01</value>
</property>
<property><name>hadoop.proxyuser.hadoop.users</name><value>alice,bob</value>
</property>
此配置允许 用户 hadoop
从 主机 hadoop01
发起请求,并模拟 用户 alice
或 bob
执行 Hadoop 集群操作(如读写 HDFS、提交 MapReduce/YARN 作业)。
实际场景示例
场景 1:HiveServer2 代理用户访问 HDFS
-
背景:
- HiveServer2 服务以
hadoop
用户运行在hadoop01
主机上。 - 用户
alice
通过 HiveServer2 提交查询,需要访问 HDFS 路径/user/alice/data
。
- HiveServer2 服务以
-
配置生效后的行为:
- HiveServer2 以
hadoop
用户的身份,模拟alice
用户 访问 HDFS。 - HDFS 会认为请求来自
alice
,并检查alice
的权限(而非hadoop
的权限)。
- HiveServer2 以
-
权限验证:
- 若
/user/alice/data
的权限为drwxr-x--- alice supergroup
:alice
用户有读写权限。hadoop
用户无权限,但通过代理机制可模拟alice
成功访问。
- 若
场景 2:用户 bob
提交 YARN 作业
-
背景:
- 用户
bob
通过客户端工具(如beeline
)连接到 HiveServer2,提交一个 Hive 查询,触发 MapReduce 作业。
- 用户
-
配置生效后的行为:
- HiveServer2 以
hadoop
用户身份,模拟bob
用户 向 YARN 提交作业。 - YARN 会记录作业的提交者为
bob
(而非hadoop
),并基于bob
的权限分配资源。
- HiveServer2 以
权限控制关键点
-
操作系统用户:
alice
和bob
必须在 Hadoop 集群的所有节点上存在(通过id alice
验证)。- 若用户不存在,HDFS 会拒绝访问。
-
HDFS 目录权限:
- 假设
alice
需要访问/user/alice/data
,需确保该目录权限为:hdfs dfs -ls /user/alice # 输出:drwxr-xr-x - alice supergroup 0 2023-10-01 /user/alice/data
- 若权限为
drwx------
,则只有alice
可访问(代理机制仍有效)。
- 假设
-
YARN 队列权限:
- 若 YARN 队列配置了
acl_submit_applications=alice,bob
,则只有这些用户可以提交作业。 - 通过代理机制,
hadoop
用户模拟bob
提交作业时,YARN 会允许。
- 若 YARN 队列配置了
安全风险与限制
-
最小化主机范围:
- 若
hosts=*
,任何主机上的hadoop
用户均可代理,存在安全风险。 - 生产环境应指定具体主机(如
hadoop01
)。
- 若
-
最小化用户范围:
- 若
users=*
,hadoop
可模拟任意用户,权限过大。 - 应仅授权必要用户(如
alice,bob
)。
- 若
-
代理用户与实际服务用户一致:
- 若 HiveServer2 以
hive
用户运行,配置应改为:<property><name>hadoop.proxyuser.hive.hosts</name><value>hadoop01</value> </property> <property><name>hadoop.proxyuser.hive.users</name><value>alice,bob</value> </property>
- 若 HiveServer2 以
总结
- 效果:用户
hadoop
可从hadoop01
主机代理alice
和bob
,以他们的身份安全访问 Hadoop 资源。 - 用途:适用于 HiveServer2、Oozie 等服务需代表不同用户执行操作的场景。
- 安全:严格限制
hosts
和users
范围,避免使用通配符*
。