LDAP?
接入第三方 LDAP 服務為 Doris 提供驗證登錄和組授權服務。
LDAP 驗證登錄?
LDAP 驗證登錄指的是接入 LDAP 服務的密碼驗證來補充 Doris 的驗證登錄。Doris 優先使用 LDAP 驗證用戶密碼,如果 LDAP 服務中不存在該用戶則繼續使用 Doris 驗證密碼,如果 LDAP 密碼正確但是 Doris 中沒有對應賬戶則創建臨時用戶登錄 Doris。
開啟 LDAP 后,用戶在 Doris 和 LDAP 中存在以下幾種情況:
LDAP 用戶 | Doris 用戶 | 密碼 | 登錄情況 | 登錄 Doris 的用戶 |
---|---|---|---|---|
存在 | 存在 | LDAP 密碼 | 登錄成功 | Doris 用戶 |
存在 | 存在 | Doris 密碼 | 登錄失敗 | 無 |
不存在 | 存在 | Doris 密碼 | 登錄成功 | Doris 用戶 |
存在 | 不存在 | LDAP 密碼 | 登錄成功 | Ldap 臨時用戶 |
開啟 LDAP 后,用戶使用 mysql client 登錄時,Doris 會先通過 LDAP 服務驗證用戶密碼,如果 LDAP 存在用戶且密碼正確,Doris 則使用該用戶登錄;此時 Doris 若存在對應賬戶則直接登錄該賬戶,如果不存在對應賬戶則為用戶創建臨時賬戶并登錄該賬戶。臨時賬戶具有具有相應對權限(參見 LDAP 組授權),僅對當前連接有效,doris 不會創建該用戶,也不會產生創建用戶對元數據。 如果 LDAP 服務中不存在登錄用戶,則使用 Doris 進行密碼認證。
以下假設已開啟 LDAP 認證,配置 ldap_user_filter = (&(uid={login})),且其他配置項都正確,客戶端設置環境變量 LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN=1
例如:
-
Doris 和 LDAP 中都存在賬戶:
存在 Doris 賬戶:
jack@'172.10.1.10'
,密碼:123456
LDAP 用戶節點存在屬性:
uid: jack
?用戶密碼:abcdef
使用以下命令登錄 Doris 可以登錄?
jack@'172.10.1.10'
?賬戶:mysql -hDoris_HOST -PDoris_PORT -ujack -p abcdef
使用以下命令將登錄失敗:
mysql -hDoris_HOST -PDoris_PORT -ujack -p 123456
-
LDAP 中存在用戶,Doris 中不存在對應賬戶:
LDAP 用戶節點存在屬性:
uid: jack
?用戶密碼:abcdef
使用以下命令創建臨時用戶并登錄 jack@'%',臨時用戶具有基本權限 DatabasePrivs:Select_priv,用戶退出登錄后 Doris 將刪除該臨時用戶:
mysql -hDoris_HOST -PDoris_PORT -ujack -p abcdef
-
LDAP 不存在用戶:
存在 Doris 賬戶:
jack@'172.10.1.10'
,密碼:123456
使用 Doris 密碼登錄賬戶,成功:
mysql -hDoris_HOST -PDoris_PORT -ujack -p 123456
LDAP 組授權?
DLAP 用戶 dn 是 LDAP 組節點的“member”屬性則 Doris 認為用戶屬于該組。LDAP 組授權是將 LDAP 中的 group 映射到 Doris 中的 role,并將所有對應的 role 權限授予登錄用戶,用戶退出登錄后 Doris 會撤銷對應的 role 權限。在使用 LDAP 組授權前應該在 Doris 中創建相應的 role,并為 role 授權。
登錄用戶權限跟 Doris 用戶和組權限有關,見下表:
LDAP 用戶 | Doris 用戶 | 登錄用戶的權限 |
---|---|---|
存在 | 存在 | LDAP 組權限 + Doris 用戶權限 |
不存在 | 存在 | Doris 用戶權限 |
存在 | 不存在 | LDAP 組權限 |
如果登錄的用戶為臨時用戶,且不存在組權限,則該用戶默認具有 information_schema 的 select_priv 權限
舉例:
LDAP 用戶 dn 是 LDAP 組節點的?member
?屬性則認為用戶屬于該組,Doris 會截取組 dn 的第一個 Rdn 作為組名。
例如用戶 dn 為?uid=jack,ou=aidp,dc=domain,dc=com
,組信息如下:
dn: cn=doris_rd,ou=group,dc=domain,dc=com
objectClass: groupOfNames
member: uid=jack,ou=aidp,dc=domain,dc=com
則組名為?doris_rd
。
假如 jack 還屬于 LDAP 組?doris_qa
、doris_pm
;Doris 存在 role:doris_rd
、doris_qa
、doris_pm
,在使用 LDAP 驗證登錄后,用戶不但具有該賬戶原有的權限,還將獲得 role?doris_rd
、doris_qa
?和?doris_pm
?的權限。
注意:
user 屬于哪個 group 和 LDAP 樹的組織結構無關,示例部分的 user2 并不一定屬于 group2 若想讓 user2 屬于 group2,需要在 group2 的 member 屬性中添加 user2
LDAP 示例?
更改 Doris 配置?
- 在 fe/conf/fe.conf 文件中配置認證方式為 ldap authentication_type=ldap。
- 在 fe/conf/ldap.conf 文件中配置 LDAP 基本信息,
- 設置 LDAP 管理員密碼:配置好 ldap.conf 文件后啟動 fe,使用 root 或 admin 賬號登錄 Doris,執行 sql
set ldap_admin_password = password('ldap_admin_password');
使用 mysql 客戶端登錄?
mysql -hDORIS_HOST -PDORIS_PORT -u user -p --enable-cleartext-plugin
輸入 ldap 密碼
注:使用其它客戶端登錄可以參考下文中 客戶端如何使用明文登錄
LDAP 信息緩存?
為了避免頻繁訪問 LDAP 服務,Doris 會將 LDAP 信息緩存到內存中,可以通過 ldap.conf 中的 ldap_user_cache_timeout_s 配置項指定 LDAP 用戶的緩存時間,默認為 12 小時;在修改了 LDAP 服務中的信息或者修改了 Doris 中 LDAP 用戶組對應的 Role 權限后,可能因為緩存而沒有及時生效,可以通過 refresh ldap 語句刷新緩存,詳細查看REFRESH-LDAP。
LDAP 驗證的局限?
- 目前 Doris 的 LDAP 功能只支持明文密碼驗證,即用戶登錄時,密碼在 client 與 fe 之間、fe 與 LDAP 服務之間以明文的形式傳輸。
常見問題?
-
怎么判斷 LDAP 用戶在 doris 中有哪些角色?
使用 LDAP 用戶在 doris 中登錄,
show grants;
能查看當前用戶有哪些角色。其中 ldapDefaultRole 是每個 ldap 用戶在 doris 中都有的默認角色。 -
LDAP 用戶在 doris 中的角色比預期少怎么排查?
- 通過
show roles;
查看預期的角色在 doris 中是否存在,如果不存在,需要通過?CREATE ROLE rol_name;
創建角色。 - 檢查預期的 group 是否在
ldap_group_basedn
對應的組織結構下。 - 檢查預期 group 是否包含 member 屬性。
- 檢查預期 group 的 member 屬性是否包含當前用戶。
- 通過
LDAP 相關概念?
在 LDAP 中,數據是按照樹型結構組織的。
示例(下文的介紹都將根據這個例子進行展開)?
- dc=example,dc=com- ou = ou1- cn = group1- cn = user1- ou = ou2- cn = group2- cn = user2- cn = user3
LDAP 名詞解釋?
- dc(Domain Component): 可以理解為一個組織的域名,作為樹的根結點
- dn(Distinguished Name): 相當于唯一名稱,例如 user1 的 dn 為 cn=user1,ou=ou1,dc=example,dc=com user2 的 dn 為 cn=user2,cn=group2,ou=ou2,dc=example,dc=com
- rdn(Relative Distinguished Name): dn 的一部分,user1 的四個 rdn 為 cn=user1 ou=ou1 dc=example 和 dc=com
- ou(Organization Unit): 可以理解為子組織,user 可以放在 ou 中,也可以直接放在 example.com 域中
- cn(common name):名字
- group: 組,可以理解為 doris 的角色
- user: 用戶,和 doris 的用戶等價
- objectClass:可以理解為每行數據的類型,比如怎么區分 group1 是 group 還是 user,每種類型的數據下面要求有不同的屬性,比如 group 要求有 cn 和 member(user 列表),user 要求有 cn,password,uid 等
客戶端如何使用明文登錄?
MySql Client?
客戶端使用 LDAP 驗證需要啟用 mysql 客戶端明文驗證插件,使用命令行登錄 Doris 可以使用下面兩種方式之一啟用 mysql 明文驗證插件:
-
設置環境變量?
LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN
?值 1例如在 linux 或者 mac 環境中可以使用:
echo "export LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN=1" >> ~/.bash_profile && source ~/.bash_profile
-
每次登錄 Doris 時添加參數?
--enable-cleartext-plugin
mysql -hDORIS_HOST -PDORIS_PORT -u user -p --enable-cleartext-plugin輸入 ldap 密碼
Jdbc Client?
使用 Jdbc Client 登錄 Doris 時,需要自定義 plugin。
首先,創建一個名為 MysqlClearPasswordPluginWithoutSSL 的類,繼承自 MysqlClearPasswordPlugin。在該類中,重寫 requiresConfidentiality() 方法,并返回 false。
public class MysqlClearPasswordPluginWithoutSSL extends MysqlClearPasswordPlugin {
@Override
public boolean requiresConfidentiality() {return false;}
}
在獲取數據庫連接時,需要將自定義的 plugin 配置到屬性中
即(xxx 為自定義類的包名)
- authenticationPlugins=xxx.xxx.xxx.MysqlClearPasswordPluginWithoutSSL
- defaultAuthenticationPlugin=xxx.xxx.xxx.MysqlClearPasswordPluginWithoutSSL
- disabledAuthenticationPlugins=com.mysql.jdbc.authentication.MysqlClearPasswordPlugin
eg:
jdbcUrl = "jdbc:mysql://localhost:9030/mydatabase?authenticationPlugins=xxx.xxx.xxx.MysqlClearPasswordPluginWithoutSSL&defaultAuthenticationPlugin=xxx.xxx.xxx.MysqlClearPasswordPluginWithoutSSL&disabledAuthenticationPlugins=com.mysql.jdbc.authentication.MysqlClearPasswordPlugin";