和前述一樣,我們還是在 CentOS 7.2 + JDK 1.8.0_73 環(huán)境下進(jìn)行部署。如果你還沒有完成 Kerberos 部署,請(qǐng)參看這一篇:實(shí)現(xiàn)基于Cloudera的企業(yè)級(jí)安全大數(shù)據(jù)平臺(tái)-Kerberos的整合。通過 Cloudera Manager 可以極其簡(jiǎn)單的部署 Impala,HUE,在這里不進(jìn)行復(fù)述。(當(dāng)然,你也需要部署它們依賴的 HDFS, Hive, Oozie, YARN 等服務(wù))
角色分布
OpenLDAP Server: 192.168.1.1
Kerberos KDC Server: 192.168.1.1
hive server2: 192.168.1.3
LDAP 的部署
假設(shè)我們的服務(wù)端為 192.168.1.1,以 admin 用戶登錄進(jìn)行操作:
sudo yum install db4 db4-utils db4-devel cyrus-sasl* krb5-server-ldap -y
sudo yum install openldap openldap-servers openldap-clients openldap-devel compat-openldap -y
創(chuàng)建 ldap 用戶,請(qǐng)牢記密碼,后面會(huì)作為 LDAP 數(shù)據(jù)庫(kù)超級(jí)管理員:
sudo useradd ldap
更新數(shù)據(jù)庫(kù)配置:
sudo rm -rf /var/lib/ldap/*
sudo cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
sudo chown -R ldap.ldap /var/lib/ldap
配置數(shù)據(jù)存儲(chǔ)位置即目錄:/etc/openldap/slapd.d (盡量不要直接編輯該目錄的文件,建議使用ldapadd, ldapdelete, ldapmodify等命令來修改),默認(rèn)配置文件保存在 /etc/openldap/slapd.d,將其備份:
sudo cp -rf /etc/openldap/slapd.d /etc/openldap/slapd.d.bak
添加一些基本配置,并引入 kerberos 和 openldap 的 schema:
KERBEROS_LDAP_VERSION=1.13.2
sudo cp /usr/share/doc/krb5-server-ldap-${KERBEROS_LDAP_VERSION}/kerberos.schema /etc/openldap/schema/
sudo touch /etc/openldap/slapd.conf
編輯配置文件/etc/openldap/slapd.conf如下:
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/duaconf.schema
include /etc/openldap/schema/dyngroup.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/java.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/ppolicy.schema
include /etc/openldap/schema/collective.schema
include /etc/openldap/schema/kerberos.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
更新slapd.d:
sudo slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
sudo chown -R ldap:ldap /etc/openldap/slapd.d
sudo chmod -R 700 /etc/openldap/slapd.d
CentOS 7.2 如果遇到 duplicated 相關(guān)的錯(cuò)誤,需要?jiǎng)h除重復(fù)的 ldif (視情況,沒有遇到千萬不要隨意刪除):
sudo rm -f /etc/openldap/slapd.d/cn=config/cn=schema/cn={0}core.ldif
啟動(dòng)服務(wù)記入開機(jī)啟動(dòng)項(xiàng):
# 啟動(dòng)服務(wù)命令
sudo /bin/systemctl start slapd
# 加入開機(jī)啟動(dòng)項(xiàng)
sudo /bin/systemctl enable slapd
查看狀態(tài),驗(yàn)證服務(wù)端口:
sudo ps aux | grep slapd | grep -v grep
sudo netstat -tunlp | grep :389
LDAP 集成 Kerberos
因?yàn)?192.168.1.1 本身就是 Kerberos KDC Server,所以無需部署客戶端。
設(shè)置 ldap 用戶通過 kerberos 驗(yàn)證啟動(dòng)服務(wù)。為了使 Kerberos 能夠綁定到 OpenLDAP 服務(wù)器,需要?jiǎng)?chuàng)建一個(gè)管理員用戶和一個(gè) principal,并生成 keytab 文件。設(shè)置該文件的權(quán)限為 LDAP 服務(wù)運(yùn)行用戶可讀(一般為ldap),操作在 OpenLDAP Server 上執(zhí)行,如果遇到 kadmin: Client not found in Kerberos database while initializing kadmin interface,嘗試kdestroy后執(zhí)行:
kdestroy
kinit cdh-master/admin
kadmin
kadmin > addprinc -randkey ldap/ldap_admin
kadmin > ktadd -k /tmp/ldap_ldap_admin.keytab ldap
sudo mv /tmp/ldap_ldap_admin.keytab /etc/openldap/
sudo chown ldap:ldap /etc/openldap/ldap_ldap_admin.keytab
sudo chmod 400 /etc/openldap/ldap_ldap_admin.keytab
使用 ldap 用戶獲取 ticket:
kinit -k -t /etc/openldap/ldap_ldap_admin.keytab ldap/ldap_admin
確保 LDAP 開機(jī)啟動(dòng)時(shí)使用上一步中創(chuàng)建的 keytab 文件,在/etc/sysconfig/ldap增加KRB5_KTNAME環(huán)境變量:
export KRB5_KTNAME=/etc/openldap/ldap_ldap_admin.keytab
重啟 slapd 服務(wù):
sudo systemctl restart slapd
LDAP初始化
初始化 LDAP 數(shù)據(jù)庫(kù),進(jìn)入到/etc/openldap/slapd.d目錄,查看cn=config/olcDatabase={2}hdb.ldif
可以看到一些默認(rèn)的配置,例如:
olcRootDN: cn=Manager,dc=my-domain,dc=com
olcRootPW: secret
olcSuffix: dc=my-domain,dc=com
建立/tmp/initial文件,內(nèi)容如下:
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=domain,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: uid=ldap,ou=people,dc=domain,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: domain
dn: cn=config
changetype: modify
replace: olcAuthzRegexp
olcAuthzRegexp: uid=([^,]*),cn=GSSAPI,cn=auth uid=$1,ou=people,dc=domain,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to dn.base="" by * read
olcAccess: {1}to * by dn="uid=ldap,ou=people,dc=domain,dc=com" write by * read
使用ldapmodify進(jìn)行數(shù)據(jù)庫(kù)初始化:
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/initial.ldif
這時(shí)候數(shù)據(jù)庫(kù)沒有數(shù)據(jù),我們可以手動(dòng)編寫 ldif 文件來導(dǎo)入一些用戶和組,或者使用 migrationtools 工具來生成 ldif 模板,創(chuàng)建/tmp/setup.ldif文件如下:
dn: dc=domain,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: domain com
dc: domain
dn: ou=people,dc=domain,dc=com
objectclass: organizationalUnit
ou: people
description: Users
dn: ou=group,dc=domain,dc=com
objectClass: organizationalUnit
ou: group
dn: uid=ldap,ou=people,dc=domain,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: LDAP admin account
uid: ldap
sn: ldap
uidNumber: 55 # 這里的 uid 需要和 Unix 賬戶的 uid 配置,可以通過 id ldap 命令進(jìn)行查看
gidNumber: 55 # 這里的 gid 需要和 Unix 賬戶的 gid 配置,可以通過 id ldap 命令進(jìn)行查看
homeDirectory: /home/ldap
loginShell: /bin/bash
使用ldapadd命令進(jìn)行導(dǎo)入:
sudo ldapadd -x -D "uid=ldap,ou=people,dc=domain,dc=com" -W -f /tmp/setup.ldif -h 192.168.1.1
Impala 集成 LDAP
通過 Cloudera Manager 進(jìn)行啟動(dòng)。Impala 中可以同時(shí)使用 Kerberos + LDAP 的認(rèn)證方式,所以在已經(jīng)啟用 Kerberos 的情況下啟用 LDAP 可以正常工作。在 Impala 配置頁(yè)中,進(jìn)行如下屬性的修改,并重啟 Impala 服務(wù):
Enable LDAP Authentication = true
Enable LDAP TLS = true
LDAP BaseDN = ou=people,dc=domain,dc=com
LDAP URI = ldap://192.168.1.1
我們通過 migrationtools 工具把系統(tǒng)中的 impala 賬戶信息導(dǎo)入到 OpenLDAP(Cloudera Manager 在創(chuàng)建 Impala 服務(wù)的過程中會(huì)自動(dòng)在 Unix 中創(chuàng)建 Impala帳戶)。
安裝migrationtools工具:
sudo yum install migrationtools -y
利用遷移工具生成模板,先修改默認(rèn)的配置:
sudo vim /usr/share/migrationtools/migrate_common.ph
#71行默認(rèn)的dns域名
DEFAULT_MAIL_DOMAIN = "doamin.com";
#74行默認(rèn)的base
DEFAULT_BASE = "dc=domain,dc=com";
生成模板文件(導(dǎo)入Linux用戶之后,必要時(shí),應(yīng)使用LDAP的密碼修改命令,進(jìn)行密碼的修改,因?yàn)?Clouder Manager 對(duì) impala 用戶的初始密碼我們不知道):
sudo /usr/share/migrationtools/migrate_passwd.pl /etc/passwd /opt/password.ldif
編輯/opt/password.ldif,我們只需要 impala 賬戶的信息,執(zhí)行導(dǎo)入命令:
sudo ldapadd -x -D "uid=ldap,ou=people,dc=domain,dc=com" -W -f /opt/password.ldif -h 192.168.1.1
sudo kinit ldap -k -t /etc/openldap/ldap_ldap_admin.keytab
# 進(jìn)行搜索驗(yàn)證是否已經(jīng)導(dǎo)入
sudo ldapsearch -x -D "uid=ldap,ou=people,dc=domain,dc=com" -W -b 'dc=domain,dc=com' -h 192.168.1.1 | grep impala
# 修改用戶密碼,改為自己知道的
ldappasswd -x -D 'uid=ldap,ou=people,dc=domain,dc=com' -W "uid=impala,ou=people,dc=domain,dc=com" -S -h 192.168.1.1
使用 Impala-shell 測(cè)試 LDAP 賬號(hào),首先需要得到 Kerberos 授權(quán),假設(shè)你已經(jīng)在 Kerberos 中創(chuàng)建了 impala/impala_admin 這個(gè) principal。不知道如何創(chuàng)建? 請(qǐng)參考 實(shí)現(xiàn)基于Cloudera的企業(yè)級(jí)安全大數(shù)據(jù)平臺(tái)-如何訪問Kerberos Enabled服務(wù)中CLI 訪問 HDFS的教程。
kinit impala/impala_admin
impala-shell -l -u impala --auth_creds_ok_in_clear -i {IMPALAD_HOSTNAME} # IMPALAD_HOSTNAME 為你的隨意一臺(tái) ImpalaD 服務(wù)器
這種模式鏈接會(huì)報(bào):LDAP credentials may not be sent over insecure connections. Enable SSL or set,說明連接沒有加密,后續(xù)需要進(jìn)行 TLS 加密部署,這里不復(fù)述。
使用 beeline 測(cè)試 LDAP 賬號(hào),其中IMPALA_PASSWORD為之前修改的 impala 用戶密碼:
HIVESERVER2_HOSTNAME=192.168.1.3
beeline -u "jdbc:hive2://${HIVESERVER2_HOSTNAME}:10000/default;principal=hive/${HIVESERVER2_HOSTNAME}@DOMAIN.COM;" -n impala -p ${IMPALA_PASSWORD}
HUE 集成 LDAP
HUE 可以通過 LDAP 來進(jìn)行用戶管理,原理如下圖所示:

在和 LDAP 打通之前,我們需要保證 HUE 的超級(jí)管理員必須可以訪問 Enable LDAP 之后的 HUE,我們需要做如下準(zhǔn)備工作:
- 保證所有 HUE 服務(wù)節(jié)點(diǎn)都有 admin 賬戶,即 Unix 賬戶體系中存在 admin 賬戶;
- 保證 LDAP 中也有 admin 相關(guān)DN;(可以參考前面的 migrationtools 方式導(dǎo)入 admin 賬戶)
- 在 HUE 中新建 admin 組,修改 HUE 的 admin 賬戶為 admin 組;
- 在 kerberos 中生成 admin/admin 這個(gè) principal;
以上都完成后才可以在 Cloudera Manager 中修改配置,其中BIND_PASSWORD為 **LDAP 的部署 **這一節(jié)中創(chuàng)建的 ldap 用戶的密碼:
Authentication Backend = desktop.auth.backend.LdapBackend
create_users_on_login = true
search_bind_authentication = false
ldap_url = ldap://192.168.1.1
ldap_username_pattern = uid=<username>,ou=people,dc=domain,dc=com
base_dn = dc=domain,dc=com
user_name_attr = uid
bind_dn = uid=ldap,ou=people,dc=domain,dc=com
bind_password = ${BIND_PASSWORD}
配置完成之后重啟Hue服務(wù)即可完成,之后可以通過管理員賬號(hào)在Hue的用戶管理中導(dǎo)入/同步LDAP賬號(hào)和組。
小結(jié)
基本的配置完成,我們使用默認(rèn)的直接綁定方式(search_bind_authentication = false,我們禁用了搜索綁定),可以粗糙的通過 sync / add 方式從 LDAP 中添加組,然后添加用戶至 HUE,且必須保證用戶名和組名一致。這是因?yàn)槲覀兌x的 LDAP 賬戶是沒有組的概念的,沒有用戶和組的映射關(guān)系。但是,真實(shí)的企業(yè)應(yīng)用過程中,一個(gè)組下面往往包含多個(gè)用戶,而我們的配置只是根據(jù) uid 去匹配 ou=people 節(jié)點(diǎn)下的用戶,目前的配置滿足不了這樣的情況,對(duì)權(quán)限的控制比較困難。同時(shí),我們也無法一次性導(dǎo)入一個(gè)組下面的所有用戶。那么怎么解決這些問題呢?在闡述如何整合 Sentry 之后,接下來的一篇中筆者會(huì)進(jìn)行高級(jí)配置相關(guān)的闡述。
遇到的問題
Q: Beeline 訪問 Impala 報(bào)錯(cuò):peer indicated failure gss initiate failed (state=08s01 code=0)。
A: HiveServer2 只能起一個(gè)。
Q: 在使用 admin 用戶登錄時(shí)報(bào)錯(cuò):Caught LDAPError while authenticating admin: INVALID_DN_SYNTAX({'info': 'invalid DN', 'desc': 'Invalid DN syntax'},)。
A: 搜索模板配置錯(cuò)誤, ldap_username_pattern應(yīng)為uid=<username>,ou=people,dc=domain,dc=com;
Q: 使用非 admin 賬戶登錄 HUE,查看日志總是報(bào) Kerberos 授權(quán)失敗。
A: 應(yīng)該是沒有完成賬號(hào)同步所致,需要在 Linux 中存在該用戶/組,然后 kerberos 生成對(duì)應(yīng) principal,最后再導(dǎo)入 ldap,并且同步給 HUE。
Q: 在 HUE 的 FileBrowser 中,文件瀏覽無法成功:Cannot access: /user/admin. Note: you are a Hue admin but not a HDFS superuser, "hdfs" or part of HDFS supergroup, "supergroup".
A: 需要在 HUE 打通 LDAP 后,使用 hdfs 用戶,當(dāng)然也是需要按照操作 把 Unix 中的 hdfs 賬戶導(dǎo)入到 LDAP 中,再通過同步的方式導(dǎo)入到 HUE 中。
Q: 使用 distinguished 方式 add/sync 用戶時(shí),報(bào)AttributeError: 'NoneType' object has no attribute 'upper'
A: 沒有配置 base_dn:dc=domain,dc=com;
Q: 使用 migrationtools 批量導(dǎo)入 LDAP 賬號(hào)密碼失敗,報(bào):Error in config validation by liboozie … UnsupportedOperationException
A: BUG[HUE-3528]:https://github.com/cloudera/hue/commit/18a114fb3aff5399ba509e130d1159375700306b,按照介紹,修改腳本后報(bào)錯(cuò)消失。
Q: Can not access /user/hdfs,因?yàn)?ticket expired 導(dǎo)致認(rèn)證401。
A: 查看日志發(fā)現(xiàn)是因?yàn)?ticket 過期,去對(duì)應(yīng)機(jī)器 kinit 發(fā)現(xiàn)無法更新,報(bào):Ticket expired while renewing credentials;發(fā)現(xiàn)最初安裝的時(shí)候生成 krbtgt ticket 時(shí)候,max_renew_life 設(shè)置為了 4w,意即4秒(而非4星期),所以一直過期,只有重新安裝整個(gè) Cloudera 后才可以解決,因?yàn)?Cloudera 未提供 Disable Kerberos 的功能。