目前釘釘已經成為很多企業日常處理流程的必備工具,但是由于釘釘并沒有開放鑒權接口,無法讓釘釘作為本地系統的統一鑒權系統使用,每次有同僚加入或者離開時,都需要人為的對本地系統進行維護,非常繁瑣。那麼有沒有一種方法可以讓釘釘作為本地的統一鑒權系統使用呢?
目前,在我們公司使用OpenLDAP服務作為各個服務統一鑒權的入口,使用的應用系統包括:Gerrit/Jenkins/Yapi/Wiki/進度跟蹤等,目前所有的系統都支援LDAP鑒權,是以如果能将釘釘的通訊錄定期同步至LDAP中就可以實作統一鑒權的需求。但是由于釘釘的密碼無法同步回本地,是以密碼層面仍然是獨立的。
本文章的實作思路參考了[《基于釘釘 + Virtual-LDAP + KeyCloak 的内網統一認證系統
》](
https://xujiwei.com/blog/2020/02/internal-authorize-based-on-dingtalk-virtual-ldap-keyclaok/) ,感謝原作者的思路及貢獻的virtual-ldap子產品,本文所有的優化都是基于此文章基礎上進行的優化。實作思路
簡單來說,我們希望能通過釘釘提供的LDAP作為統一鑒權方式,但是由于釘釘沒有開放這個能力,那麼我們需要将釘釘模拟一個LDAP服務。模拟出的LDAP環境,在内網環境中,我們對于LDAP資訊的使用基本上圍繞着使用者名和密碼,其他的資訊以釘釘為準。是以,除了開放LDAP接口外,我們還需要提供使用者界面,允許使用者在内網修改密碼。
整體的實作思路如下:
- 釘釘開發者平台:需要在釘釘開發者平台建立一個程式,擷取鑒權資訊後,賦予通訊錄同步權限,提供給VirtualLDAP進行資料同步
- VirtualLDAP:該元件是上面提到的作者開發的虛拟LDAP元件,主要功能為同步釘釘通訊錄,并以LDAP協定對外提供服務
- KeyCloak:對于這個場景過重,但是暫時沒有發現更好的方案,可以觸發自動同步并且可以讓内網使用者進行密碼修改
- 本地的全部系統按照LDAP配置方式即可實作鑒權

釘釘開發者平台
這裡我建立的是H5微應用,配置時有幾點需要注意:
- IP位址白名單:需要為你未來運作VirtualLDAP配置通路IP白名單,目前釘釘開發者平台對于同一個IP隻能給一個應用使用,但是可以通過通配符進行配置,例如:192.168.10.*的方式,那麼192.168.10網段所有位址均可以通路
- 權限:需要為該應用開放所有通訊錄隻讀權限即可
VirtualLDAP
這是基于Node.js開發的一款元件,主要用于同步釘釘通訊錄和模拟LDAP協定。基于原作者版本,為了滿足自身應用場景,進行了如下修改:
- 由于作者沒有提供Docker運作方式,是以在github的pull request中有人進行了改造
- 仍然是在同一個pull request中,增加了pinyin元件,在LDAP中增加了一個pinyin屬性,友善業務系統使用
- 登入名和密碼:為了防止公司人員重複,是以特别采用了全拼名稱+電話号碼後四位方式,作為唯一的使用者名,而初始密碼為全名名稱+電話号碼前四位,例如:張三的電話号碼為13812345678,則登入名稱為zhangsan5678,密碼為zhangsan1381,
- 在使用VirtualLDAP時,需要使用MySQL存儲持久化資料,例如使用者修改後的密碼,是以對鑒權規則進行了修改,先檢查資料庫密碼是否比對,再檢查LDAP
- 實作了整體元件的編排,增加了docker-compose.yaml,友善使用者使用,該編排檔案中包含了KeyCloak、VirtualLDAP和MySQL
KeyCloak
KeyCloak兩部分需要進行配置:
- 管理者在第一次使用時配置VirtualLDAP的資訊,用于使用者同步,友善新使用者修改密碼
- 新使用者自行修改密碼
正如之前所說,KeyCloak功能過于強大,這裡用到的功能非常有限,如果有新的應用場景,歡迎留言。
搭建方式
這裡提供了完整的編排檔案,直接使用即可完成整套環境的快速建立。
git clone https://github.com/xiaoquqi/virtual-ldap
cd virtual-ldap/docker-compose
docker-compose up -d0
配置檔案
- VirtualLDAP配置檔案修改。所有配置在virtual-ldap/docker-compose/config.js中進行修改,需要修改釘釘的appKey和appSecret,以及root DN的資訊,配置檔案有比較詳細的介紹,是以這裡不再贅述。
- KeyCloak的預設密碼修改在docker-compose.yaml中
登入相關資訊
- URL: ldap://ip:1389
- ManageDN: cn=admin,dc=oneprocloud,dc=com
- ManagePassword: password
- User Search Base: ou=People,o=department,dc=oneprocloud,dc=com
- User Search Filter: uid={0}
- Display Name LDAP attribute: cn
- Email Address LDAP attribute: mail
待優化
- 目前對于LDAP的組沒有充分利用,配置檔案中允許建立特定組,并且通過使用者email進行比對,如果需要可以進行配置
- 如果有外部使用者,暫時無方法進行建立,例如:如果需要在LDAP中增加一個非釘釘使用者暫時無法實作,需要進行開發實作