公司內的帳號系統一般使用openldap,openldap相對於把帳號存入mysql等關聯式資料庫中開發和維護成本都比較低,所以openldap成了公司內帳號體系最合適的選擇
可以通過下面的內容快速上手這個openldap帳號系統
名詞概念
這個ldap裡面使用了很多的別名,下面列出了常用的別名
dn: 區別名,類比mysql的主鍵id
cn: 常用名,類比使用者的呢稱(全名)
sn: 使用者的姓氏
giveName: 使用者名稱字(不包含姓)
dc: 所屬域名,類比名稱空間,一個使用者可以存在在多個dc中
uid: 登入使用的名稱
c: 所屬國家,比如CN表示中國
ou: 所屬組織
LDIF: openldap的資料描述格式,類比linux的/etc/passwd檔案格式,使用固定的格式來描述包含的資料
dn:uid=1,ou=firstunit,o=myorganization,dc=example,dc=org
objectclass:top
objectclass:person
objectclass:uidObject
objectclass:simpleSecurityObject
userPassword:123456
cn:第一個使用者
sn:su
uid:1
telephoneNumber:13288888888
複製程式碼
注意:很多objectClass都會提供額外的欄位,比如上面的telephoneNumber欄位就是person這個objectClass提供的
objectClass列表參考:www.zytrax.com/books/ldap/… 可以通過定義schema建立新的objectClass: www.openldap.org/doc/admin24…
搭建openldap伺服器
可以使用這個docker一鍵啟動openldap伺服器,參考:github.com/osixia/dock… 編寫docker-compose.yml如下
version: '3'
services:
ldap:
image: osixia/openldap:1.2.4
environment:
- TZ=PRC
ports:
- 389:389
- 636:636
admin:
image: osixia/phpldapadmin:0.8.0
volumes:
- ./data/admin/config:/container/service/phpldapadmin/assets/config
ports:
- 6443:443
links:
- ldap
複製程式碼
然後啟動
docker-compose up -d
複製程式碼
使用命令docker-compose ps
可以檢視啟動效果
這個docker建立的管理員帳號是:cn=admin,dc=example,dc=org 密碼:admin 預設的域名是:dc=example,dc=org
組織架構
使用者體系一般體現了公司的組織架構,常用的組織架構有下面兩種
- 網際網路命名的組織架構:根節點為國家,國家下為域名,域名下為組織/組織單元,再往下為使用者
- 企業命名的組織架構:根節點為域名,域名下面為部門,部門下面為使用者
下面就用企業命名的元件架構舉例
命令列操作
建立資料
構建ldif檔案,比如myo.ldif
dn:o=myorganization,dc=example,dc=org
objectclass:top
objectclass:organization
o:myorganization
description:我的組織
dn:ou=firstunit,o=myorganization,dc=example,dc=org
objectclass:top
objectclass:organizationalUnit
description:組織裡的第一個單位
dn:uid=1,ou=firstunit,o=myorganization,dc=example,dc=org
objectclass:top
objectclass:person
objectclass:uidObject
objectclass:simpleSecurityObject
userPassword:123456
cn:第一個使用者
sn:su
uid:1
複製程式碼
然後匯入到ldap伺服器裡面
docker-compose exec ldap bash
ldapadd -x -D "cn=admin,dc=example,dc=org" -W -f myo.ldif
複製程式碼
操作效果如下
可以看到資料已經成功匯入了搜尋資料
可以使用ldapsearch命令查詢資料,比如查詢這個域名: dc=example,dc=org 下的所有資料
ldapsearch -x -H ldap://localhost -b dc=example,dc=org -D "cn=admin,dc=example,dc=org" -w admin
複製程式碼
操作效果如下
可以看到查詢成功執行了
備份資料
使用slapcat -v -l mybackup.ldif
進行備份
操作效果如下
清空資料
可以使用ldapdelete -x -D "cn=admin,dc=example,dc=org" -w admin -r "dc=example,dc=org"
命令清空example,dc=org下的所有oepnldap的資料
操作效果如下:
注意並沒有刪除dc=example,dc=org這條記錄
恢復資料
注意:恢復前需要把備份檔案中的這些欄位先刪掉
- creatorsName
- modifiersName
- modifyTimestamp
- createTimestamp
- entryUUID
- entryCSN
- structuralObjectClass 然後刪掉這條記錄dn: dc=example,dc=org
使用命令ldapadd -x -D"cn=admin,dc=example,dc=org" -w admin -f mybackup.ldif
進行匯入
操作效果如下
使用ldapsearch命令進行驗證
可以看到資料已經成功匯入了客戶端
ldap目前有三個客戶端可以選擇
- jxplorer: jxplorer.org/
- Apache Directory Studio
- phpLDAPadmin
jxplorer有中文介面,並且簡單容易上手,Apache Directory Studio功能強大,建議先使用jxplorer上手,然後再使用Apache Directory Studio進行操作,phpLDAPadmin可以自行了解
程式客戶端
- java參考:docs.spring.io/spring-ldap…
- php參考:github.com/Adldap2/Adl…
- go參考:github.com/go-ldap/lda…
一些注意的點
定義有密碼使用者使用simpleSecurityObject這個objectClass,比如
dn: cn=suxiaolin,dc=example,dc=org
objectClass: organizationalRole
objectclass: simpleSecurityObject
cn: suxiaolin
userPassword:123456
複製程式碼
這個userPassword欄位的值就是使用者密碼