服务级别授权指南

目的

本文档介绍如何配置和管理Hadoop的服务级别授权。

先决条件

确保Hadoop已正确安装、配置和设置。更多信息请参阅:

概述

服务级别授权是一种初始授权机制,用于确保连接到特定Hadoop服务的客户端具备预先配置的必要权限,并被授权访问给定服务。例如,MapReduce集群可以使用此机制允许配置的用户/组列表提交作业。

$HADOOP_CONF_DIR/hadoop-policy.xml 配置文件用于定义各种Hadoop服务的访问控制列表。

服务级别授权会在其他访问控制检查(如文件权限检查、作业队列访问控制等)之前执行。

配置

本节介绍如何通过配置文件$HADOOP_CONF_DIR/hadoop-policy.xml配置服务级授权。

启用服务级别授权

默认情况下,Hadoop的服务级授权功能处于禁用状态。如需启用,请在$HADOOP_CONF_DIR/core-site.xml中将配置属性hadoop.security.authorization设置为true。

Hadoop服务与配置属性

本节列出了各种Hadoop服务及其配置选项:

属性 服务
security.client.protocol.acl 用于ClientProtocol的访问控制列表(ACL),用户代码通过DistributedFileSystem使用该协议。
security.client.datanode.protocol.acl ClientDatanodeProtocol的访问控制列表(ACL),这是用于块恢复的客户端到数据节点协议。
security.datanode.protocol.acl DatanodeProtocol的访问控制列表(ACL),用于数据节点与名称节点之间的通信。
security.inter.datanode.protocol.acl InterDatanodeProtocol的访问控制列表(ACL),这是用于更新生成时间戳的数据节点间协议。
security.namenode.protocol.acl NamenodeProtocol的访问控制列表(ACL),这是secondary namenode与namenode通信时使用的协议。
security.job.client.protocol.acl JobSubmissionProtocol的访问控制列表(ACL),用于作业客户端与资源管理器通信以提交作业、查询作业状态等。
security.job.task.protocol.acl TaskUmbilicalProtocol的ACL,用于map和reduce任务与父节点管理器通信。
security.refresh.policy.protocol.acl RefreshAuthorizationPolicyProtocol的ACL,由dfsadmin和rmadmin命令用于刷新当前生效的安全策略。
security.ha.service.protocol.acl HAAdmin用于管理namenode活动状态和备用状态的HAService协议的访问控制列表(ACL)。

访问控制列表

$HADOOP_CONF_DIR/hadoop-policy.xml 为每个Hadoop服务定义了一个访问控制列表。每个访问控制列表都具有简单的格式:

用户列表和组列表均为逗号分隔的名称列表。两个列表之间用空格分隔。

示例:user1,user2 group1,group2.

如果仅需提供组列表,请在行首添加一个空格;同样地,若提供一个以逗号分隔的用户列表后跟一个空格或不跟任何内容,则表示仅针对给定用户集。

*的特殊值表示允许所有用户访问该服务。

如果未为服务定义访问控制列表,则应用security.service.authorization.default.acl的值。如果未定义security.service.authorization.default.acl,则应用*

被阻止的访问控制列表

在某些情况下,需要为服务指定禁止访问控制列表。该列表定义了未被授权访问服务的用户和群组。禁止访问控制列表的格式与访问控制列表相同。可以通过$HADOOP_CONF_DIR/hadoop-policy.xml文件来指定禁止访问控制列表,其属性名称是通过添加".blocked"后缀来生成的。

示例:security.client.protocol.acl的阻塞访问控制列表属性名称将为security.client.protocol.acl.blocked

对于一项服务,可以同时指定访问控制列表和阻止控制列表。如果用户在访问控制列表中且不在阻止访问控制列表中,则该用户被授权访问该服务。

如果未为服务定义阻止访问控制列表,则应用security.service.authorization.default.acl.blocked的值。如果未定义security.service.authorization.default.acl.blocked,则应用空的阻止访问控制列表。

基于IP地址、主机名和IP范围列表的访问控制

可以根据访问服务的客户端IP地址来控制对服务的访问。通过指定一组IP地址、主机名和IP范围,可以限制来自特定机器的服务访问。每个服务的属性名称源自相应的ACL属性名称。如果ACL的属性名称为security.client.protocol.acl,则主机列表的属性名称将为security.client.protocol.hosts。

如果未为服务定义主机列表,则应用security.service.authorization.default.hosts的值。如果未定义security.service.authorization.default.hosts,则应用*

可以指定一个主机黑名单。只有那些位于主机列表中但不在黑名单中的机器才会被授予服务访问权限。该属性名称是通过添加".blocked"后缀来生成的。

示例:security.client.protocol.hosts的阻塞主机列表属性名称将为security.client.protocol.hosts.blocked

如果未为服务定义阻止主机列表,则应用security.service.authorization.default.hosts.blocked的值。如果未定义security.service.authorization.default.hosts.blocked,则应用空的阻止主机列表。

刷新服务级别授权配置

NameNode和ResourceManager的服务级别授权配置可以在不重启Hadoop主守护进程的情况下进行修改。集群管理员可以在主节点上修改$HADOOP_CONF_DIR/hadoop-policy.xml文件,并通过分别向dfsadminrmadmin命令添加-refreshServiceAcl参数,来通知NameNode和ResourceManager重新加载各自的配置。

刷新NameNode的服务级别授权配置:

   $ bin/hdfs dfsadmin -refreshServiceAcl

刷新ResourceManager的服务级别授权配置:

   $ bin/yarn rmadmin -refreshServiceAcl

当然,用户可以通过在$HADOOP_CONF_DIR/hadoop-policy.xml中配置security.refresh.policy.protocol.acl属性,来限制只有特定用户/组才能刷新服务级别的授权配置。

示例

仅允许用户alicebob以及mapreduce组中的用户向MapReduce集群提交作业:

<property>
     <name>security.job.client.protocol.acl</name>
     <value>alice,bob mapreduce</value>
</property>

仅允许以属于datanodes组的用户身份运行的DataNode与NameNode通信:

<property>
     <name>security.datanode.protocol.acl</name>
     <value>datanodes</value>
</property>

允许任何用户作为DFSClient与HDFS集群通信:

<property>
     <name>security.client.protocol.acl</name>
     <value>*</value>
</property>