本人翻译自: http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/ServiceLevelAuth.html
译注:相对于kerberos等等而言,这个显得简单得多,但作用也不小。在无法知道用户密码或者无法接近主机的前提下,一个程序或者人是无法访问特定服务的。
但在实际应用中,可能主要控制对客户端的访问。
1.目的
描述如何配置和管理服务级别授权
2.要求
要求hadoop已经正确安装,并可用。
3.概览
服务级别授权是最初的授权机制,用于确保客户端是使用预配权限连接到特定的hadoop服务。例如,一个MR集群可以有自己的机制,允许特定用户/组可以连接,并提交作业。
$HADOOP_CONF_DIR/hadoop-policy.xml配置文件用于定义acl,以访问各种hadoop服务。
服务级别授权比其它的操作更早执行,这些操作包括文件权限检查,job队列存取控制等等。
4.配置
本章节描述如何配置hadoop-policy.xml来实现服务级别授权。
4.1启用服务级别授权
默认这个功能是关闭的。设置 hadoop.security.authorization =true (文件$HADOOP_CONF_DIR/core-site.xml)。
4.2 hadoop服务和配置属性
表1
Property | Service/可以访问的服务 | 中文说明 |
---|---|---|
security.client.protocol.acl | ACL for ClientProtocol, which is used by user code via the DistributedFileSystem. | 用于使用分布式文件系统的用户代码 |
security.client.datanode.protocol.acl | ACL for ClientDatanodeProtocol, the client-to-datanode protocol for block recovery. | 客户端到数据节点的块恢复协议 |
security.datanode.protocol.acl | ACL for DatanodeProtocol, which is used by datanodes to communicate with the namenode. | 数据节点和名称节点通讯的数据节点协议 |
security.inter.datanode.protocol.acl | ACL for InterDatanodeProtocol, the inter-datanode protocol for updating generation timestamp. | 数据节点之间的,用于更新时间戳 |
security.namenode.protocol.acl | ACL for NamenodeProtocol, the protocol used by the secondary namenode to communicate with the namenode. | 第二节点和主节点的协议 |
security.job.client.protocol.acl | ACL for JobSubmissionProtocol, used by job clients to communciate with the resourcemanager for job submission, querying job status etc. | 作业客户端和资源管理器之间 |
security.job.task.protocol.acl | ACL for TaskUmbilicalProtocol, used by the map and reduce tasks to communicate with the parent nodemanager. | mr任务和节点管理器之间 |
security.refresh.policy.protocol.acl | ACL for RefreshAuthorizationPolicyProtocol, used by the dfsadmin and rmadmin commands to refresh the security policy in-effect. | dfsadmin/rmadmin刷新安全策略 |
security.ha.service.protocol.acl | ACL for HAService protocol used by HAAdmin to manage the active and stand-by states of namenode. | HAADMIN用于管理名称节点状态 |
译注:以上就是用户可以访问的hadoop服务列表,为这些服务列表设定acl就可以通过acl控制了。
4.3acl
$HADOOP_CONF_DIR/hadoop-policy.xml defines an access control list for each Hadoop service. Every access control list has a simple format:
The list of users and groups are both comma separated list of names. The two lists are separated by a space.
$HADOOP_CONF_DIR/hadoop-policy.xml定义了每个hadoop服务的acl(存取控制列表,译注:这个不同于文件的acl)。
acl格式简单:用户,组之间使用逗号分隔,不同列表使用空格分开。
例如: user1,user2 group1,group2.
如果只是组,那么在行前面插入一个空格。
*表示所有用户都允许访问服务。
如果没有为某个服务定义acl,那么会使用 security.service.authorization.default.acl的acl(如果这个也没有设定,那么系统使用*,表示没有限制)
阻挡列表-黑名单
有的时候,需要阻止一些acl(相当于使用了黑名单)。阻挡列表格式同acl.设置方式,同样是在$HADOOP_CONF_DIR/hadoop-policy.xml。只要把表1中property后加上.blocked就可以了。
例如security.client.protocol.acl的黑名单就是 security.client.protocol.acl.block
对于特定的服务,有可能同时设定acl和黑名单。如果用户在acl,但不在黑名单,那么是可以访问服务的。换言之,黑名单优先。
如果服务没有定义黑名单,那么会使用security.service.authorization.default.acl.blocked的值,如果它的值没有定义,那么就是没有(不阻挡).
4.4刷新服务级别授权配置
刷新名称节点和资源管理器的服务级别授权配置,不需要重启hadoop主服务。集群管理员可以主节点上的$HADOOP_CONF_DIR/hadoop-policy.xml,然后同时名称节点和资源管理器重载对应的配置。它们的名称分别如下:
名称节点
$ bin/hdfs dfsadmin -refreshServiceAcl
资源管理器
$ bin/yarn rmadmin -refreshServiceAcl
当然,用户可以使用$HADOOP_CONF_DIR/hadoop-policy.xml中的security.refresh.policy.protocol.acl限制只有特定的用户/组可以执行这个刷新操作。
主机访问名单
除了控制用户的访问,也可以控制特定的主机对hadoop服务的访问。
属性名称的定义方式同黑名单,就是在acl属性后面添加.hosts.例如security.client.protocol.acl对应的就是security.client.protocol.acl.hosts
如果没有为服务定义主机列表,那么默认使用security.service.authorization.default.hosts,如果该属性没有设定,就是*(所有主机可以访问)。
主机访问黑名单
定义,不可访问的主机,定义方式同acl黑名单,就是在主机名单后面加.blocked
例如security.service.authorization.default.hosts对应的就是security.service.authorization.default.hosts.blocked
如果没有定义,那么就使用security.service.authorization.default.hosts.blocked,如果这个没有只,就不阻挡任意主机.
4.5例子
允许用户alice,bob mapreduce(组)可以可以提交作业给mr集群。
<property>
<name>security.job.client.protocol.acl</name>
<value>alice,bob mapreduce</value>
</property>
只有属于datanodes组的用户运行得datanode可以和名称节点通讯。
<property>
<name>security.datanode.protocol.acl</name>
<value>datanodes</value>
</property>
允许任意用户以DFS客户端的方式和HDFS集群通讯。
<property>
<name>security.client.protocol.acl</name>
<value>*</value>
</property>