本文档介绍如何配置和管理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服务及其配置选项:
属性 | 服务 |
---|---|
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范围,可以限制来自特定机器的服务访问。每个服务的属性名称源自相应的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
文件,并通过分别向dfsadmin
和rmadmin
命令添加-refreshServiceAcl
参数,来通知NameNode和ResourceManager重新加载各自的配置。
刷新NameNode的服务级别授权配置:
$ bin/hdfs dfsadmin -refreshServiceAcl
刷新ResourceManager的服务级别授权配置:
$ bin/yarn rmadmin -refreshServiceAcl
当然,用户可以通过在$HADOOP_CONF_DIR/hadoop-policy.xml
中配置security.refresh.policy.protocol.acl
属性,来限制只有特定用户/组才能刷新服务级别的授权配置。
仅允许用户alice
、bob
以及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>