在閱讀本文前,為了避免概念模糊,閱讀障礙,請先看完Step by Step 實現基于 Cloudera 5.8.2 的企業級安全大數據平臺 - OpenLDAP的整合,因為很多參數和概念都是延續下來的。
直接綁定和搜索綁定
因為使用直接綁定方式,會導致集群無法被多個團隊的多個角色混用。舉個例子,我們有這樣的場景:
- 用戶 a1 屬于組 A,組 A 對應 Sentry 中的 dev 角色;
- 用戶 a2 屬于組 A,組 A 對應 Sentry 中的 dev 角色;
- 用戶 b1 屬于組 B,組 B 對應 Sentry 中的 ops 角色;
- 用戶 b2 屬于組 B,組 B 對應 Sentry 中的 ops 角色;
在直接綁定方式下,我們是達不到需求的,因為我們的 LDAP 目前沒有用戶和組的映射概念。為什么這么說?我們現在的 LDAP 節點關系在 ou
下,只有一層,直接就是用戶uid
了。假設我們定義了用戶 a1 的 dn
為 uid=a1,ou=people,dc=domain,dc=com
,同時我們也用一樣的方式定義了 a2, b1, b2 三個用戶。所以我們需要引入搜索綁定
,多定義一層組的概念,才可以完成需求。也就是說 dn
應該長這樣:uid=a1,cn=A,ou=groups,dc=domain,dc=com
,這里的 cn
就是組的概念。我們可以通過搜索綁定
結合 LDAP 的 posix group / user
,實現用戶和組的映射,達到細粒度的權限控制。目前筆者只做到了一級分組,也就是說當公司壯大了之后,層級繁多情況下,是需要多層級的分組的。不過就我在阿里的 HBASE 運維經驗來看,不同 BU 也可以做集群物理隔離。尤其是在 docker 日益火熱的當下,這也不是什么問題,甚至虛擬化也可以滿足我們的需求。再者,公司面對的私/專有云輸出用戶,一層權限細分在近1年場景下是絕對足夠的。
關于配置,很簡單,但是當時也是研究一些時間(被虐了3天左右),因為對 LDAP 不熟悉么,呵呵。在 Cloudera Mnager 中修改 HUE 配置,使用搜索綁定
進行認證:
Use Search Bind Authentication = true # 使用搜索綁定認證
LDAP Search Base = dc=domain,dc=com
LDAP Bind User Distinguished Name = uid=ldap,ou=people,dc=domain,dc=com
LDAP Bind Password = ${BIND_PASSWORD}
LDAP User Filter = (objectClass=posixAccount)
LDAP Username Attribute = uid
LDAP Group Filter = (|(objectClass=organizationalUnit)(objectClass=posixGroup))
LDAP Group Name Attribute = cn
LDAP Group Membership Attribute = memberUID # 非常重要,否則無法識別映射
這里的 ${BIND_PASSWORD}
是在 Step by Step 實現基于 Cloudera 5.8.2 的企業級安全大數據平臺 - OpenLDAP的整合 中 **LDAP 的部署 **這一節中創建的 ldap 用戶的密碼。在這一步中:
- 我們開啟了
搜索綁定
認證方式,搜索的基礎過濾字符串為dc=domain,dc=com
,表示我們只搜索 LDAP 中dc=com
節點下的dc=domain
節點下的dn (Distinguishied Name)
。 - 在搜索的時候,我們使用的 dn 為
uid=ldap,ou=people,dc=domain,dc=com
,這相當于是我們的超級管理員賬戶 - LDAP 預先定義了多種關于賬戶的
objectClass
,我們使用posixAccount
作為后續的賬戶對象, 因為它具備和組映射相關的屬性gidNumber
。 - 同時,我們使用
posixGroup
或organizationalUnit
作為對組過濾的條件,前者具備核心屬性gidNumber
可以和posixAccount
進行映射, 后者是因為我們之前在初始化的時候已經創建了一部分以organizationalUnit
為基礎的組(可以認為是公司的 BU 概念),是為了做到向后兼容。posixGroup
還有一個非常關鍵的屬性memberUid
,它可以定義該組下面的成員列表,方便我們后續在 HUE 中按照組維度批量導入其下所有用戶賬戶。
接下來我們談談如何正確的把 Unix / HDFS 用戶導入到 LDAP 再導入到 HUE中,打通四者賬戶體系。
Unix / HDFS / LDAP / HUE / Sentry 賬戶體系
對于對接了 LDAP 作為默認賬戶管理的 HUE 而言,首先要有概念,整個鏈路上包含5個賬戶體系:
- Unix 賬戶,大數據服務端集群必須存在對應的用戶/組,是基礎賬戶數據,目前HDFS賬戶對它是強依賴和一一對應;
- HDFS 賬戶,因為我們默認配置的是
ShellBasedUnixAccount
,所以和 Unix 賬戶是強映射的,大家可以仔細想下自己平時在終端怎么訪問 HDFS 的; - LDAP 賬戶,大數據 LDAP 服務,數據來自Unix賬戶;
- HUE賬戶,大數據前端分析平臺賬戶,數據來自 LDAP;
- Sentry賬戶,其實 Sentry 使用的還是 HDFS 賬戶,但是從權限角度講 Sentry 的 Role 對應了 HDFS 的組,這個概念映射要特別留意;
所以理論上的操作序列為:
- 在每一臺部署有大數據服務的機器上,初始化 Unix 賬戶,當然 Cloudera 已經在部署的時候幫我們初始化了一系列賬戶,比如 hdfs, yarn, hive, hbase 等;
- 把 Unix 賬戶信息同步至 OpenLDAP;
- 把 OpenLDAP 的賬戶信息同步至 HUE;
- 在 HUE 中進行 Sentry 的權限分配;
下面詳細說下如何操作, 我們需要的權限包括 Unix 服務器的 root 權限,用于創建用戶和組。 LDAP 服務器的超級管理員權限,用于數據導入。 HUE 的超級管理員權限, 用于用戶和組信息同步,和 Sentry 權限分配。
新建 Unix 組 / 賬戶
以用戶 yuanye
為例,他屬于 bigdata_ops
組, 在 bigdata
這個部門, 公司是 domain.com。我們在所有部署了 Cloudera Agent 的服務器上創建用戶 yuanye
, 從屬組為 bigdata_ops
, 假設 uid=1001
,gid=1000
。可以通過終端命令 id yuanye
查看 uid
和 gid
。創建用戶,并且使之從屬于 bigdata_ops
:
sudo useradd yuanye -g bigdata_ops # 請切記密碼,因為一會需要使用它登錄 HUE
id yuanye # 查看 uid 和 gid
出現如下信息表示創建成功:
uid=1001(yuanye) gid=1000(bigdata_ops) groups=1000(bigdata_ops)
使用初始密碼進行登錄,確認密碼是否配好:
su - yuanye
切記, Unix 賬戶、LDAP 賬戶的密碼必須一致,否則無法進行 Sentry 賦權。
如果可以正常登錄用戶,表示密碼是OK的。
導入 Unix 組 / 賬戶至 LDAP
我們當然可以使用 LDAP 的 GUI 工具進行工作,但是為了便于理解,我們使用 ldif 文件和 ldapadd
命令進行操作。
好,接下來我們嘗試往 LDAP 中添加一個測試組 bigdata_ops
,先修改 ldif 文件 /tmp/create_group_bigdata_ops.ldif
,其中定義了一個名為 bigdata 的ou,可以理解為大數據部門,定義了一個 bigdata_ops 的組,我們理解為大數據運維團隊:
dn: cn=bigdata_ops,ou=bigdata,dc=domain,dc=com
objectClass: top
objectClass: posixGroup
gidNumber: ${UNIX_GROUP_NUMBER}
memberUID: ${MEMBER_UID} # 非常重要,否則無法識別映射
description: ${DESCRIPTION_STIRNG}
使用 ldapadd
導入,ldap 超級管理員密碼是您之前在這篇中定義的 Step by Step 實現基于 Cloudera 5.8.2 的企業級安全大數據平臺 - OpenLDAP的整合:
sudo ldapadd -x -D "uid=ldap,ou=people,dc=domain,dc=com" -W -f /tmp/create_group_bigdata_ops.ldif -h 192.168.1.1
查看已經導入的用戶組 bigdata_ops
:
sudo ldapsearch -x -D "uid=ldap,ou=people,dc=domain,de=com" -W -b "cn=bigdata_ops,ou=bigdata,dc=domain,dc=com" -h 192.168.1.1
在 LDAP 中添加 yuenye
用戶,先創建 ldif 文件 /tmp/create_user_yuanye.ldif
,我們先不在這里定義密碼,因為這樣的話在執行 ldapsearch
的時候所得到的密碼屬性是明文,并不安全:
dn: uid=yuanye,cn=bigdata_ops,ou=bigdata,dc=domain,dc=com
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
givenName: ye
sn: yuan
cn: yuanye
mail: yuanye@domain.com
telephoneNumber: XXXXXXXXXXX
mobile: XXXXXXXXXXX
manager: whoami
uid: yuanye
uidNumber: 1001
gidNumber: 1000
homeDirectory: /home/yuanye
loginShell: /bin/bash
使用 ldapadd
導入:
sudo ldapadd -x -D "uid=ldap,ou=people,dc=domain,dc=com" -f /tmp/create_user_yuanye.ldif -h 192.168.1.1 -W
使用 ldapmodify
修改密碼:
sudo ldappasswd -x -D "uid=ldap,ou=people,dc=domain,dc=com" -W "uid=yuanye,cn=bigdata_ops,ou=bigdata,dc=domain,dc=com" -S -h 192.168.1.1
再執行 search 的時候會發現多了一行 userPassword
屬性,是加密后的密碼:
sudo ldapsearch -x -D "uid=ldap,ou=people,dc=domain,de=com" -W -b "uid=yuanye,cn=bigdata_ops,ou=bigdata,dc=domain,dc=com" -h 192.168.1.1
...
...
...
...
userPassword:: *****************
在已經存在的 LDAP 組添加用戶
假設我們現在在已經存在的 bigdata_ops
組里想添加一個新的用戶,我們該怎么做呢?以添加 zhouhua
用戶為例,假設我們已經創建了 Unix 賬戶, uid
為 1002,也是從屬于 bidata_ops
組。我們首先還是創建 ldif 文件 /tmp/create_user_zhouhua.ldif
:
dn: uid=zhouhua,cn=bigdata_ops,ou=bigdata,dc=domain,dc=com
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
givenName: hua
sn: zhou
cn: zhouhua
mail: zhouhua@domain.com
uid: zhouhua
uidNumber: 1002
gidNumber: 1000
homeDirectory: /home/zhouhua
loginShell: /bin/bash
創建 ldif 文件 /tmp/add_user_zhouhua_to_group_bigdata_ops.ldif
:
dn: cn=bigdata_ops,ou=bigdata,dc=domain,dc=com
changetype: modify
add: memberUid
memberUid: zhouhua
添加用戶至組:
sudo ldapadd -x -D "uid=ldap,ou=people,dc=domain,dc=com" -W -f /tmp/create_user_zhouhua.ldif -h 192.168.1.1
添加組和用戶的映射:
sudo ldapmodify -x -D "uid=ldap,ou=people,dc=domain,de=com" -W -f /tmp/add_user_zhouhua_to_group_bigdata_ops.ldif -h 192.168.1.1
至此,我們已經添加了兩個用戶 yuanye
zhouhua
至分組 bigdata_ops
。
同步 LDAP 組 / 賬戶至 HUE
請注意,LDAP 中的組對應 HUE 中的組,對應 Sentry 中的一個 Role。所有 LDAP 組下的用戶,都具備該組對應 Role 的權限,這樣就達到了同組用戶通角色的目的。
使用 admin 身份登錄 HUE,選擇 Manage Users
-> Add/Sync LDAP Group
,輸入組名稱 bigdata_ops
,勾選Import new members
,點擊Add/Sync group
,即完成導入,這個時候可以看到已經導入了 yuanye
和 zhouhua
兩個 用戶。
小結
至此,我們講完了基于搜索綁定
功能的用戶和組映射實現。我們可以利用此功能輕松實現 HUE 基于 LDAP 的權限控制,并且映射到 Sentry 的角色。接下來我們會聊聊,傳輸層加密的那點事兒。我們即使已經實現了 Kerberos 認證, 但是現在數據的平臺內外部傳輸,是通過明文,這仍然是有極大安全隱患的。