CDH5.10.0基於OpenLDAP配置 Hadoop GroupMapping

kerberos解決了認證的問題,sentry解決了授權的問題。但是sentry的授權是按照角色和組來的,不支持按用戶。所以我們還需要解決用戶和組的映射問題。使用哪種映射方式由hadoop的hadoop.security.group.mapping參數決定。該參數默認爲org.apache.hadoop.security.ShellBasedUnixGroupsMapping即基於操作系統的用戶和組映射。

在linux上由NameNode所在服務器執行bash -c groups命令決定。

詳見https://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/GroupsMapping.html

在開發環境,還可以直接在配置文件中使用hadoop.user.group.static.mapping.overrides參數來指定指定用戶和組的映射關係,例如:user1=group1,group2;user2=;user3=group2.如果在此處配置了用戶和組的關係,會覆蓋group mapping service provider提供的組映射。對於在此處存在的用戶和組關係會直接返回,而無需進一步查詢group mapping service provider。

而在生產環境中,通常採用LdapGroupsMapping。

本文以OpenLDAP爲例,講述配置過程。

有關LDAP的安裝及配置,後續有機會在分享,現在大家請自行解決。

遷移現有帳號

在切換爲LdapGroupsMapping之前,我們必須將CDH集羣已有的服務帳號(例如hive/hdfs/mapred等)導入LDAP中,否則相關服務無法正常工作。
好在我們可以使用migrationtools來導入,方法如下(需要root帳號或者擁有sudo權限的帳號):

安裝軟件包
#yum install migrationtools -y
修改默認域名
根據實際情況修改/usr/share/migrationtools/migrate_common.ph

# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "xxx.com";

# Default base
$DEFAULT_BASE = "dc=bi,dc=xxx,dc=com";

導出NameNode所在服務器的操作系統用戶和組列表
#cat /etc/passwd > people
#cat /etc/group > group
然後刪除不需要的用戶,只保留和CDH集羣相關的用戶,具體參見
https://www.cloudera.com/documentation/enterprise/5-10-x/topics/cm_sg_ldap_grp_mappings.html

生成用戶和組ldif文件
/usr/share/migrationtools/migrate_passwd.pl people people.ldif
/usr/share/migrationtools/migrate_group.pl group group.ldif
最終people.ldif中的內容如下:

dn: uid=mapred,ou=People,dc=bi,dc=xxx,dc=com
uid: mapred
cn: Hadoop MapReduce
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: {crypt}x
loginShell: /bin/bash
uidNumber: 491
gidNumber: 489
homeDirectory: /var/lib/hadoop-mapreduce
gecos: Hadoop MapReduce

可以看到用戶的objectClass爲posixAccount,組的objectClass爲posixGroup
接下來將用戶和組的ldif文件導入OpenLDAP中
將people.ldif和group.ldif文件上傳到OpenLDAP所在服務器,然後使用root或者擁有sudo權限的帳號執行
#ldapadd -x -W -D "cn=admin,dc=bi,dc=xxx,dc=com" -f people.ldif
#ldapadd -x -W -D "cn=admin,dc=bi,dc=xxx,dc=com" -f group.ldif
其中-D參數爲LDAP管理員的DN

配置GroupMapping

使用管理員帳號登錄cloudera manager管理界面,然後執行如下操作

點擊HDFS-Configuration-Security,然後修改如下配置項

Hadoop User Group Mapping Implementation: org.apache.hadoop.security.LdapGroupsMapping
Hadoop User Group Mapping LDAP URL: ldap://hdpdev17.xxx.com
Hadoop User Group Mapping LDAP Bind User Distinguished Name: cn=admin,dc=bi,dc=xxx,dc=com
Hadoop User Group Mapping LDAP Bind User Password: 輸入密碼
Hadoop User Group Mapping Search Base: dc=bi,dc=xxx,dc=com
Hadoop User Group Mapping LDAP User Search Filter: (&(objectClass=posixAccount)(uid={0}))
Hadoop User Group Mapping LDAP Group Search Filter: (objectClass=posixGroup)
Hadoop User Group Mapping LDAP Group Membership Attribute: memberUid
Hadoop User Group Mapping LDAP Group Name Attribute: cn注:LDAP的默認端口爲389,如果不是該端口URL應爲: ldap://hdpdev17.xxx.com:端口
Bind User是指LDAP管理員帳號,或者有查詢權限的帳號
Search Base是指在哪個節點下面搜索用戶和組
User Search Filter的意思是指通過uid屬性來查詢posixAccount類,以確認用戶是否在LDAP中存在。
注:有關filter的語法,詳見https://social.technet.microsoft.com/wiki/contents/articles/5392.active-directory-ldap-syntax-filters.aspx?Sort=MostUseful&Sort=MostUseful
只有在用戶存在的情況下,纔去獲取用戶所屬的組。
Group Search Filter用於限定組的類型

posixGroup使用memberUid屬性來維護成員列表(groupOfNames則是使用的member屬性),所以 Group Membership Attribute應該設置memberUid

修改完之後保存,並重啓HDFS服務。

登錄集羣中任意一臺服務器,執行

hdfs groups mapred 

你會發現只會得mapred的一個組mapred,然而mapred應該是有hadoop和mapred兩個組的。這是爲什麼呢?

通過查看hadoop-2.6.0-cdh5.10.0-src中\hadoop-common-project\hadoop-common\src\main\java\org\apache\hadoop\security\LdapGroupsMapping.java得知,由於memberUid中存的是uid而不是uidNumber,所以我們需要設置

hadoop.security.group.mapping.ldap.posix.attr.uid.name=uid來解決這個問題。

方法如下:

登錄cloudera manager管理界面,HDFS-Configuration

在Cluster-wide Advanced Configuration Snippet (Safety Valve) for core-site.xml中設置,保存重啓即可。

然後在執行

hdfs groups mapred ,你應該能得到如下輸出:

mapred : hadoop mapred

後續如果有在LDAP中更改了用戶的組,而hdfs groups 命令卻沒有生效的情況(因爲有緩存)可以執行

hdfs dfsadmin -refreshUserToGroupsMappings命令來刷新

至此,GroupMapping配置結束了,但是有一個問題值得我們思考,遷移的帳號和組我們使用posixAccount和posixGroup沒有問題。但是之後新增用戶和組時,我們沒必要使用posixGroup和posixAccount了呀;假設我們使用account和groupOfNames那麼我們上面的配置就有問題了。怎麼解決,大家可以結合源代碼自行思考一下。

最後給大家推薦一個LDAP客戶端,ApacheDirectoryStudio,可以方便的完成LDAP的增刪改查操作。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章