Step by Step 實現基于 Cloudera 5.8.2 的企業級安全大數據平臺 - OpenLDAP的整合

和前述一樣,我們還是在 CentOS 7.2 + JDK 1.8.0_73 環境下進行部署。如果你還沒有完成 Kerberos 部署,請參看這一篇:實現基于Cloudera的企業級安全大數據平臺-Kerberos的整合。通過 Cloudera Manager 可以極其簡單的部署 Impala,HUE,在這里不進行復述。(當然,你也需要部署它們依賴的 HDFS, Hive, Oozie, YARN 等服務)

角色分布

OpenLDAP Server: 192.168.1.1

Kerberos KDC Server: 192.168.1.1

hive server2: 192.168.1.3

LDAP 的部署

假設我們的服務端為 192.168.1.1,以 admin 用戶登錄進行操作:

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

創建 ldap 用戶,請牢記密碼,后面會作為 LDAP 數據庫超級管理員:

sudo useradd ldap

更新數據庫配置:

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

配置數據存儲位置即目錄:/etc/openldap/slapd.d (盡量不要直接編輯該目錄的文件,建議使用ldapadd, ldapdelete, ldapmodify等命令來修改),默認配置文件保存在 /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 相關的錯誤,需要刪除重復的 ldif (視情況,沒有遇到千萬不要隨意刪除):

sudo rm -f  /etc/openldap/slapd.d/cn=config/cn=schema/cn={0}core.ldif

啟動服務記入開機啟動項:

# 啟動服務命令
sudo /bin/systemctl start slapd
# 加入開機啟動項
sudo /bin/systemctl enable slapd

查看狀態,驗證服務端口:

sudo ps aux | grep slapd | grep -v grep
sudo netstat -tunlp | grep :389

LDAP 集成 Kerberos

因為 192.168.1.1 本身就是 Kerberos KDC Server,所以無需部署客戶端。

設置 ldap 用戶通過 kerberos 驗證啟動服務。為了使 Kerberos 能夠綁定到 OpenLDAP 服務器,需要創建一個管理員用戶和一個 principal,并生成 keytab 文件。設置該文件的權限為 LDAP 服務運行用戶可讀(一般為ldap),操作在 OpenLDAP Server 上執行,如果遇到 kadmin: Client not found in Kerberos database while initializing kadmin interface,嘗試kdestroy后執行:

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 開機啟動時使用上一步中創建的 keytab 文件,在/etc/sysconfig/ldap增加KRB5_KTNAME環境變量:

export KRB5_KTNAME=/etc/openldap/ldap_ldap_admin.keytab

重啟 slapd 服務:

sudo systemctl restart slapd

LDAP初始化

初始化 LDAP 數據庫,進入到/etc/openldap/slapd.d目錄,查看cn=config/olcDatabase={2}hdb.ldif

可以看到一些默認的配置,例如:

olcRootDN: cn=Manager,dc=my-domain,dc=com 
olcRootPW: secret 
olcSuffix: dc=my-domain,dc=com

建立/tmp/initial文件,內容如下:

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進行數據庫初始化:

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/initial.ldif

這時候數據庫沒有數據,我們可以手動編寫 ldif 文件來導入一些用戶和組,或者使用 migrationtools 工具來生成 ldif 模板,創建/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 命令進行查看
gidNumber: 55 # 這里的 gid 需要和 Unix 賬戶的 gid 配置,可以通過 id ldap 命令進行查看
homeDirectory: /home/ldap
loginShell: /bin/bash

使用ldapadd命令進行導入:

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 進行啟動。Impala 中可以同時使用 Kerberos + LDAP 的認證方式,所以在已經啟用 Kerberos 的情況下啟用 LDAP 可以正常工作。在 Impala 配置頁中,進行如下屬性的修改,并重啟 Impala 服務:

Enable LDAP Authentication = true
Enable LDAP TLS = true
LDAP BaseDN = ou=people,dc=domain,dc=com
LDAP URI = ldap://192.168.1.1

我們通過 migrationtools 工具把系統中的 impala 賬戶信息導入到 OpenLDAP(Cloudera Manager 在創建 Impala 服務的過程中會自動在 Unix 中創建 Impala帳戶)。

安裝migrationtools工具:

sudo yum install migrationtools -y

利用遷移工具生成模板,先修改默認的配置:

sudo vim /usr/share/migrationtools/migrate_common.ph
#71行默認的dns域名
DEFAULT_MAIL_DOMAIN = "doamin.com";
#74行默認的base
DEFAULT_BASE = "dc=domain,dc=com";

生成模板文件(導入Linux用戶之后,必要時,應使用LDAP的密碼修改命令,進行密碼的修改,因為 Clouder Manager 對 impala 用戶的初始密碼我們不知道):

sudo /usr/share/migrationtools/migrate_passwd.pl /etc/passwd /opt/password.ldif

編輯/opt/password.ldif,我們只需要 impala 賬戶的信息,執行導入命令:

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    
# 進行搜索驗證是否已經導入
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 測試 LDAP 賬號,首先需要得到 Kerberos 授權,假設你已經在 Kerberos 中創建了 impala/impala_admin 這個 principal。不知道如何創建? 請參考 實現基于Cloudera的企業級安全大數據平臺-如何訪問Kerberos Enabled服務CLI 訪問 HDFS的教程。

kinit impala/impala_admin
impala-shell -l -u impala --auth_creds_ok_in_clear -i {IMPALAD_HOSTNAME} # IMPALAD_HOSTNAME 為你的隨意一臺 ImpalaD 服務器

這種模式鏈接會報:LDAP credentials may not be sent over insecure connections. Enable SSL or set,說明連接沒有加密,后續需要進行 TLS 加密部署,這里不復述。

使用 beeline 測試 LDAP 賬號,其中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 來進行用戶管理,原理如下圖所示:


hue_ldap_conn.png

在和 LDAP 打通之前,我們需要保證 HUE 的超級管理員必須可以訪問 Enable LDAP 之后的 HUE,我們需要做如下準備工作:

  • 保證所有 HUE 服務節點都有 admin 賬戶,即 Unix 賬戶體系中存在 admin 賬戶;
  • 保證 LDAP 中也有 admin 相關DN;(可以參考前面的 migrationtools 方式導入 admin 賬戶)
  • 在 HUE 中新建 admin 組,修改 HUE 的 admin 賬戶為 admin 組;
  • 在 kerberos 中生成 admin/admin 這個 principal;

以上都完成后才可以在 Cloudera Manager 中修改配置,其中BIND_PASSWORD為 **LDAP 的部署 **這一節中創建的 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服務即可完成,之后可以通過管理員賬號在Hue的用戶管理中導入/同步LDAP賬號和組。

小結

基本的配置完成,我們使用默認的直接綁定方式(search_bind_authentication = false,我們禁用了搜索綁定),可以粗糙的通過 sync / add 方式從 LDAP 中添加組,然后添加用戶至 HUE,且必須保證用戶名和組名一致。這是因為我們定義的 LDAP 賬戶是沒有組的概念的,沒有用戶和組的映射關系。但是,真實的企業應用過程中,一個組下面往往包含多個用戶,而我們的配置只是根據 uid 去匹配 ou=people 節點下的用戶,目前的配置滿足不了這樣的情況,對權限的控制比較困難。同時,我們也無法一次性導入一個組下面的所有用戶。那么怎么解決這些問題呢?在闡述如何整合 Sentry 之后,接下來的一篇中筆者會進行高級配置相關的闡述。

遇到的問題

Q: Beeline 訪問 Impala 報錯:peer indicated failure gss initiate failed (state=08s01 code=0)。

A: HiveServer2 只能起一個。

Q: 在使用 admin 用戶登錄時報錯:Caught LDAPError while authenticating admin: INVALID_DN_SYNTAX({'info': 'invalid DN', 'desc': 'Invalid DN syntax'},)。

A: 搜索模板配置錯誤, ldap_username_pattern應為uid=<username>,ou=people,dc=domain,dc=com

Q: 使用非 admin 賬戶登錄 HUE,查看日志總是報 Kerberos 授權失敗。

A: 應該是沒有完成賬號同步所致,需要在 Linux 中存在該用戶/組,然后 kerberos 生成對應 principal,最后再導入 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 用戶,當然也是需要按照操作 把 Unix 中的 hdfs 賬戶導入到 LDAP 中,再通過同步的方式導入到 HUE 中。

Q: 使用 distinguished 方式 add/sync 用戶時,報AttributeError: 'NoneType' object has no attribute 'upper'

A: 沒有配置 base_dn:dc=domain,dc=com

Q: 使用 migrationtools 批量導入 LDAP 賬號密碼失敗,報:Error in config validation by liboozie … UnsupportedOperationException

A: BUG[HUE-3528]:https://github.com/cloudera/hue/commit/18a114fb3aff5399ba509e130d1159375700306b,按照介紹,修改腳本后報錯消失。

Q: Can not access /user/hdfs,因為 ticket expired 導致認證401。

A: 查看日志發現是因為 ticket 過期,去對應機器 kinit 發現無法更新,報:Ticket expired while renewing credentials;發現最初安裝的時候生成 krbtgt ticket 時候,max_renew_life 設置為了 4w,意即4秒(而非4星期),所以一直過期,只有重新安裝整個 Cloudera 后才可以解決,因為 Cloudera 未提供 Disable Kerberos 的功能。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容