本文接上文:十年·杭研技术秀 | Hadoop数据平台自动化管理实践(上)
权限管理
用户组管理
HDFS的组需要通过外部的用户组关联(Group Mapping)服务来获取。用户到组的映射可以使用系统自带的方案(使用NameNode服务器上的用户组系统),也可以通过其他实现类似功能的插件(LDAP、Ranger等)方式来代替。在拿到用户名后,NN会通过用户组关联服务获取该用户所对应的用户组列表,并用于后续的用户组权限校验。
因为用户组与权限关联紧密,每当有权限变更时,我们都需要通过OP系统来提工单进行系统用户组的变更,费时费力。这个也是需要优化的一个环节。
ACL管理
为了解决HDFS的细粒度权限控制需求,HDFS提供了类似的POSIX ACL特性。一条ACL规则由若干ACL条目组成,每个条目指定一个用户或用户组的权限位。ACL条目由类型名,可选名称和权限字符串组成,以“:”为分隔符,如下所示:
{code}
user::rw-
user:bruce:rwx #effective:r–
group::r-x #effective:r–
group:sales:rwx #effective:r–
mask::r–
other::r–
{code}
第一部分由固定的类型名构成,有user、group、other、mask、default等选项。mask条目会过滤掉所有命名的用户和用户组,以及未命名的用户组权限。第二部分可以指定类型名称,如用户名,用户组名等(other类型不需要名称),这部分是可选项,若不指定特定的用户名或用户组,则表示只对该文件属主或目录的用户组生效。第三部分就是权限位。若该条规则应用到foo文件,foo文件的属主有读写权限,foo文件的用户组有只读和执行权限(对于目录),其他用户也是只读权限;但bruce用户的权限经过mask过滤后只有只读权限,sales组也是只读权限。
方案设计
为了实现自动化,我们使用LDAP作为外部的数据源。这样每次的用户组变更都可直接通过在LDAP数据库上完成即可,而不需要再经过OP工单系统。只需要在NN上开启以下配置:
{code:core-site.xml}
<property>
<name>hadoop.security.group.mapping</name>
<value>org.apache.hadoop.security.LdapGroupsMapping</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.bind.user</name>
<value>cn=manager,dc=hadoop,dc=ldap,dc=server,dc=org</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.bind.password</name>
<value>hadoop</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.url</name>
<value>ldap://ldap01.server.org:389/dc=hadoop,dc=ldap,dc=server,dc=org</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.base</name>
<value></value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.search.filter.user</name>
<value>(&(|(objectclass=person)(objectclass=applicationProcess))(cn={0}))</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.search.filter.group</name>
<value>(objectclass=groupOfNames)</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.search.attr.member</name>
<value>member</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.search.attr.group.name</name>
<value>cn</value>
</property>
{code}
调用关系如图2:
图2 调用关系
权限开通逻辑判断如下:
为不同的文件目录设置属主和权限位,将数据通过不同的用户权限隔离开来。
对于用户间共享的数据,优先使用用户组权限实现。一般来说,不同的目录对应到不同的用户组。在设置了用户组权限的目录下,新建文件和子目录会继承当前目录的用户组和权限位。
由于只设置需要共享目录的权限,该共享目录的上级或父目录需要通过递归方式添加只读ACL。这样可以避免开通不必要的其他组权限,导致数据权限出现安全隐患。
对于特定的共享目录,用户组中的用户可能有些有只读权限,有些是读写权限。这种情况下,用户的写权限通过ACL额外指定。所有用户的读权限通过用户组来指定接口。
如果上述权限还需要在子目录中继承下去,则需要设定用户写权限的default规则(尽量少用,做到一个账号写,多个账号读即可)。
用户组名与目录名绑定,这样可以方便在有其他人需要访问该目录时,可以通过变更用户组成员解决。
平台管理模块
按照之前的各个管理需求的方案设计说明,我们实现了一套自动化管理平台,包括一个前端RESTful服务器,一个HDFS Agent和若干个Scheduler Agent构成,架构如图3所示:
图3 自动化管理平台架构图
RESTful Server
此模块是整个平台管理的核心模块,用于接收和响应来自外部的请求。 当请求是查询平台元数据时,则直接从数据库中获取结果;若是用户相关操作(创建用户、变更权限)请求,则通过RPC方式请求HDFS Agent服务,在远端操作完成后返回;若是队列相关操作请求,则会遍历多个Scheduler Agent,通过RPC来更新RM上的调度配置文件,完成后返回。
平台支持多集群,所以该服务也配置了多集群的参数映射。所有的请求参数都会被正确替换后,发送到特定的集群,完成相关操作。
HDFS Agent
为了简化Agent的部署,我们将多个功能集中到了这个HDFS Agent上。它实现了用户创建、目录权限变更、存储配额修改等功能。几个主要的流程说明如下:
用户创建流程:
a.接受一个用户定义的principle名称,为其在AdminServer上创建相应的记录,同时返回keytab的文件字节流;
b.以principle的首部(如果是da/dev@HADOOP.APACHE.ORG,那么首部就是da)在LDAP服务器上创建一个新的LDAP账号和同名的用户组;
c. 在对应的集群上创建该用户的home目录。
目录权限变更流程:
a. 在获取到相应的集群、目录名、发起请求用户名,变更后用户组名;
b. 根据4.3方案设计中的权限实现细则实现对用户组、ACL的设置。
存储配额变更流程:
在获取到相应的集群、目录和配额参数后,通过调用脚本使用FS Shell的setSpaceQuota命令完成。
Scheduler Agent
该Agent部署在YARN的ResourceManager上,部署了HA模式的YARN就会有2个Agent。之所以部署在RM上,是其功能就是直接读取和修改RM上的调度配置文件。其主要功能如下:
接受用户队列配置信息查询。
支持队列的创建、变更和删除。
支持子队列配置格式。
结语
用户使用此管理平台,需要先绑定Mammut系统(猛犸大数据开发计算平台,一站式数据开发平台,覆盖数据传输、计算、任务调度全流程)的用户,然后进入用户管理页面,提交创建用户申请或变更队列配置请求。 该请求经过直接主管或关联业务主管审核确认后,平台管理员再完成操作。整个过程全部在Web端完成。
目前实现的自动化管理功能虽然仅完善了一部分,但减轻了运维人员的日常工作负担,极大地提高了响应速度和用户体验。后续平台将会从可视化和集群管理整合着手,进一步精细化平台管理,实现自动化和智能化。
参考资料(复制链接至浏览器查看):
https://en.wikipedia.org/wiki/Name_Service_Switch
http://web.mit.edu/kerberos/
http://zh.hortonworks.com/blog/hadoop-groupmapping-ldap-integration/
https://github.com/abajwa-hw/security-workshops/blob/master/Setup-OpenLDAP-KDC-integration.md
https://wiki.debian.org/LDAP/OpenLDAPSetup
https://www.howtoforge.com/how-to-install-openldap-server-on-debian-and-ubuntu
https://wiki.debian.org/LDAP
http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html
——金川
网易杭州研究院运维部