公司用的cdh版本爲5.14,sentry集成的步驟很簡單,參照官方文檔就能夠完成了:
https://www.cloudera.com/documentation/enterprise/5-14-x/topics/sentry.html
本文主要寫一些openldap的搭建和phpldap的使用,還有ldap和(hive,impala,hue)的整合。
ldap的具體概念能夠參照這篇文章
LDAP概念和原理介紹php
yum install openldap openldap-clients openldap-servers
安裝完直接啓動 ``` service slapd start ``` 設置管理員密碼 ``` slappasswd -h {SSHA} ``` 而後會讓你輸入一個明文密碼,返回給你一個加密的密碼,記住這個返回的密碼
使用ldapsearch命令查詢管理員的dn:html
ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config "olcRootDN=cn=Manager,dc=my-domain,dc=com" dn olcRootDN olcRootPW
這裏返回的dn是olcDatabase={2}hdb,cn=config,密碼等信息也都一併返回。這裏有用的是dn和密碼的加密方式,好比這裏是SSHA,dn是後面修改的Entry DN,而知道密碼的加密方式就可使用該加密方式生成新密碼。java
使用ldapmodify修改條目node
vim chrootpw.ldif
#這是第1步獲取的管理員dn dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcSuffix #你想要改爲的域名的後綴 olcSuffix: dc=xinniu,dc=com #olcSuffix這幾行必定要加,不然修改以後會出錯,後面重啓openldap都會失敗 dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcRootDN #你想要改爲的域名 olcRootDN: cn=admin,dc=xinniu,dc=com dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcRootPW #這裏就是剛纔保存下來的那個加密後的密碼 olcRootPW: {SSHA}uYnICxla0NrUC5b/ha4i1JeOTCoUchV+
如圖:
shell
使用下面的命令來修改管理員條目:數據庫
ldapmodify -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif
若是出現:apache
modifying entry "olcDatabase={2}bdb,cn=config"
重啓服務使修改生效vim
/etc/init.d/slapd restart
導入基本數據結構
咱們須要向 LDAP 中導入一些基本的 Schema。這些 Schema 文件位於 /etc/openldap/schema/ 目錄中,schema控制着條目擁有哪些對象類和屬性api
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/cosine.ldif ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/nis.ldif ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/collective.ldif ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/corba.ldif ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/core.ldif ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/duaconf.ldif ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/dyngroup.ldif ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/inetorgperson.ldif ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/java.ldif ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/misc.ldif ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/openldap.ldif ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/pmi.ldif ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/ppolicy.ldif
到此就設定好了管理員的密碼。能夠用客戶端去管理openldap了安全
打算使用phpldapadmin來管理openldap,這個工具使用的人較多,網上文檔多,出現問題容易解決。
首先安裝Apache和PHP:
yum -y install httpd php php-ldap php-gd php-mbstring php-pear php-bcmath php-xml
而後安裝phpldapadmin:
yum -y install phpldapadmin
httpd與phpldapadmin進行集成:
修改配置文件:
[root@localhost ~]# vim /etc/phpldapadmin/config.php
#397行取消註釋,398行添加註釋
$servers->setValue('login','attr','dn'); // $servers->setValue('login','attr','uid');
這裏須要修改,若是不修改,phpldapadmin會去用uid去搜索條目,不會用dn去搜索,致使報密碼錯誤。
[root@localhost ~]# phpldapadmin的ip過濾規則默認是拒絕全部ip訪問,先去修改一下規則,咱們才能夠訪問
vim /etc/httpd/conf.d/phpldapadmin.conf ##這是Apache2.2和之前的修改方法 // 修改配置 <IfModule mod_authz_core.c> </IfModule> 把下面的Deny from all 改成Allow from all ##這是apache2.4和之後的修改方法 #容許172.16.10.16訪問 Require ip 172.16.10.16 #容許172.16這個網段訪問 Require ip 172.16.0.0/16 #容許全部ip訪問 Require all granted 咱們能夠根據本身須要修改來 修改完以後啓動: service httpd restart
界面:
登錄
用戶名,默認是 cn=Manager,dc=my-domain,dc=com(這個也能夠改的,仿照修改密碼的步驟)
密碼就輸入剛開始設置的密碼
登錄進去後,個人管理界面報這個信息:
This base cannot be created with PLA
顯示結果以下:
通過查詢,緣由是根結點須要初始化後才能使用,最終處理以下:
一、建立一個initroot.ldif文件,爲建立初始化根節點作準備工做,以下所示:
dn: dc=xinniu,dc=com
#域名的後綴
o: ldap
objectclass: dcObject
objectclass: organization
二、執行ldapadd -f initroot.ldif -x -D cn=admin,dc=xinniu,dc=com -W 輸入以前配置OpenLDAP的密碼後,便可完成建立LDAP根節點,以下圖所示:
完成以上操做後,再回到phpldapadmin頁面,能夠看到,已經正常出現了根節點,並能夠建立相關OU、Group、Account等對象,以下圖所示:
先用phpldapadmin在ldap建立一個用戶去測試:
首先建立一個ou,叫users
而後再在users下建立一個用戶:jiandan
在建立新條目時,選擇Generic User Account,建立好之後會出現cn=jiandan這個條目。
而後點擊cn=jiandan這個條目,點擊改名,把cn=jiandan修改成uid=jiandan,由於hive後面會在ldap中默認去搜索uid,若是使用cn還須要額外去高級配置中配置一個自定義的屬性。
在cdh裏面修改一下配置:
這張圖用的別人的,若是按個人配置,BaseDN則寫:
ou=users,dc=my-domain,dc=com
而後用beeline進行測試
這樣就是經過ldap的驗證了,若是密碼不正確則會:
後來生產上hive整合ldap的時候遇到一個問題,hue和impala都不會出現,當使用其餘部門的LDAP而不是自建的LDAP時可能會出現。
那就是hive.server2.authentication.ldap.baseDN這個配置項,hive在ldap中驗證用戶時,會經過uid去匹配用戶,如:uid=xiaohuang,ou=users,dc=my-domain,dc=com。問題是有時候ldap並不必定是咱們部門本身搭建的,而是技術中心的運維那邊搭建的,他們在LDAP建立用戶條目時,並無給條目一個uid的屬性,而是建了一個CN的屬性,如:cn=xiaohuang,ou=users,dc=my-domain,dc=com這種,咱們使用了上面文檔的配置,必然會搜不到,致使驗證失敗。
這個時候咋辦?讓他們幫咱們從新建個咱們想要的條目?他們確定不鳥。。
然而我就這樣放棄了麼?不可能的,經過去官方文檔查看,找到這篇文章
https://cwiki.apache.org/confluence/display/Hive/User+and+Group+Filter+Support+with+LDAP+Atn+Provider+in+HiveServer2#UserandGroupFilterSupportwithLDAPAtnProviderinHiveServer2-hive.server2.authentication.ldap.userDNPattern
看到有個屬性,它也可使hive和imapla,hue同樣,經過通配符去設定,讓hive去LDAP中查找指定的條目。
這個屬性要在
hive-site.xml 的 Hive 服務高級配置代碼段(安全閥)
中配置
<property><name>hive.server2.authentication.ldap.userDNPattern</name><value>cn=%s,ou=users,dc=my-domain,dc=com</value><final>true</final></property>
這樣便可讓hive在作帳戶驗證的時候,去搜索CN開頭的條目,而不是UID開頭的條目
。巧妙地解決了這個問題。
修改配置,和hive相似:
不過要在高級代碼段裏面增長一個參數,由於咱們的密碼是明文傳輸,不然imapala啓動不了。
重啓impala後,咱們來測試
發現已經ok了。
首先須要配置這些
這個配置好之後,咱們就能夠登錄hue了,咱們看到登錄的界面已經多了個ldap
登錄已經能夠了,不過登錄進去後會報一些錯誤:
[文件]
咱們須要配置一些額外的參數從而讓hue用戶能夠代理其餘的用戶
1.在ldap中建立hue用戶
2.hue_safety_valve.ini 的 Hue 服務高級配置代碼段(安全閥)中配這些
[beeswax] close_queries=True use_sasl=False auth_username=hue auth_password=xxxxxxx [impala] server_host=datanode1 server_interface=hiveserver2 server_port=21050 query_timeout_s=100 impersonation_enabled=True auth_username=hue auth_password=xxxxxxx
在hive和i mpala的core-site.xml 的 Hive 服務高級配置代碼段(安全閥)中增長如下配置:
impala的Impala 命令行參數高級配置代碼段(安全閥)中再加上
--authorized_proxy_user_config=hue=*
而後就不會報這個錯誤了。
以上就基本完成了ldap和hive impala hue的整合。
在sentry的使用中,咱們發現,sentry的受權是基於角色的,而角色又是經過組來分配的,在實際hive/impala使用當中,咱們使用一個用戶,hive如何知道它有哪些權限呢?其實是經過user -> group -> role這麼一個映射關係來完成每一次權限的操做,group -> role的映射關係是經過sentry數據庫管理:
sentry經過sentry_role,sentry_group,sentry_role_group_map這3個庫管理了group和role的mapping關係。
而user-group的映射關係是如何實現的?
hive中有個相關選項,默認使用了hadoop的用戶組信息,也就是說,hive中涉及到user->group這個映射關係是直接用的hdfs的,而hdfs的user->group這個映射信息來自於哪裏?
打開hdfs的配置,咱們發現:
有這麼一個配置項,hdfs的group信息默認實際是調用的本地shell的group信息!
細節明白之後,再說說實際的問題,若是咱們使用默認的配置,那麼hive和impala的時候,咱們去鏈接hiveserver,或者impalad,若是本地沒有相應的用戶,那麼sentry就無法獲取到 user->group 的信息,那麼就沒法完成權限認證的整條鏈路,就會報錯。
那麼咱們每次有新同事加入,就須要在每一個相關節點上建立相應的用戶,這樣實際上不只麻煩,並且很low(這是最主要的),即便你寫批量腳本。
那麼咱們能夠經過ldap來存儲這個user->group的映射關係,這樣hdfs就沒必要再去本地找這個映射關係了。 咱們先把當前系統上的用戶和組導入到ldap,須要用到一個工具:migrationtools
yum install -y migrationtools
.修改migrate_common.ph
vim /usr/share/migrationtools/migrate_common.ph Default DNS domain DEFAULT_MAIL_DOMAIN = "zpbigdata.com"; Default base DEFAULT_BASE = "dc=zpbigdata,dc=com";
利用pl腳本將/etc/passwd 和/etc/group生成LDAP能讀懂的文件格式
這裏導入一個etl用戶來測試
cat /etc/passwd | grep etl > /tmp/passwd cat /etc/group | grep etl > /tmp/group /usr/share/migrationtools/migrate_base.pl > /tmp/base.ldif /usr/share/migrationtools/migrate_passwd.pl /tmp/passwd > /tmp/passwd.ldif /usr/share/migrationtools/migrate_group.pl /tmp/group > /tmp/group.ldif
將文件導入到LDAP
ldapadd -x -D "cn=Manager,dc=zpbigdata,dc=com" -W -f /tmp/base.ldif ldapadd -x -D "cn=Manager,dc=zpbigdata,dc=com" -W -f /tmp/passwd.ldif ldapadd -x -D "cn=Manager,dc=zpbigdata,dc=com" -W -f /tmp/group.ldif
這樣就把people和group信息導入了
把hadoop.security.group.mapping的值改成org.apache.hadoop.security.LdapGroupsMapping
而後填寫Ldap的相關參數:
大體就是這麼多項配置須要填寫,僅供參考,具體的值仍是要參考你ldap中創建的group中和people中對象的具體屬性
配置完成後使用如下命令測試:
sudo -u hdfs hdfs groups xxx(username)
打印的group值若是和ldap中你配置的能夠對應上,那麼就證實完成了。後續添加新的group和user,只須要在ldap中添加就行了。