Openldap and phpldapadmin Note
reference:
- [https://webcache.googleusercontent.com/search?q=cache:5wu9gwWrysgJ:https://www.itread01.com/content/1565921044.html+&cd=1&hl=zh-TW&ct=clnk&gl=tw]
Note
【重要部分】
LDAP 的資訊模型是建立在"條目"(entries)的基礎上。一個條目是一些屬性的集合,並且具有一個全域性唯一的"可區分名稱"DN,一個條目可以通過 DN 來引用。每一個條目的屬性具有一個型別和一個或者多個值。型別通常是容易記憶的名稱,比如"cn"是通用名稱(common name) ,或者"mail"是電子郵件地址。條目的值的語法取決於屬性型別。比如,cn 屬性可能具有一個值"Babs Jensen" 。一個 mail 屬性可能包含"bbs@kevin.com" 。一個 jpegphoto 屬性可能包含一幅 JPEG(二進位制)格式的圖片。
LDAP 的 objectClass
LDAP 通過屬性 objectClass 來控制哪一個屬性必須出現或允許出現在一個條目中,它的值決定了該條目必須遵守的模式
規則。可以理解為關係資料庫的表結構。接下來會用到的 objectClass 有
- objectClass 含義
- olcGlobal 全域性配置檔案型別, 主要是 cn=config.ldif 的配置項
- top 頂層的物件
- organization 組織,比如公司名稱,頂層的物件
- organizationalUnit 重要, 一個目錄節點,通常是 group,或者部門這樣的含義
- inetOrgPerson 重要, 我們真正的使用者節點型別,person 型別, 葉子節點
- groupOfNames 重要, 分組的 group 型別,標記一個 group 節點
- olcModuleList 配置模組的物件
- LDAP 常用關鍵字列表
ldap 的 entry 是由各種欄位構成,可以理解為關係資料庫的欄位。
關鍵字 | 英文全稱 | 含義 |
---|---|---|
dc | Domain Component | 域名的部分,其格式是將完整的域名分成幾部分,如域名為 example.com 變成 dc=example,dc=com |
uid | User Id | 使用者 ID,如“tom” |
ou | Organization Unit | 組織單位,類似於 Linux 檔案系統中的子目錄,它是一個容器物件,組織單位可以包含其他各種物件(包括其他組織單元),如“market” |
cn | Common Name | 公共名稱,如“Thomas Johansson” |
sn | Surname | 姓,如“Johansson” |
dn | Distinguished Name | 惟一辨別名,類似於 Linux 檔案系統中的絕對路徑,每個物件都有一個惟一的名稱,如“uid= tom,ou=market,dc=example,dc=com”,在一個目錄樹中 DN 總是惟一的 |
rdn | Relative dn | 相對辨別名,類似於檔案系統中的相對路徑,它是與目錄樹結構無關的部分,如“uid=tom”或“cn= Thomas Johansson” |
c | Country | 國家,如“CN”或“US”等。 |
o | Organization | 組織名,如“Example, Inc.” |
這裡,我們把 dn 當做使用者唯一主鍵, cn 是 common name,應該等同於使用者名稱,因為使用者名稱必須唯一,通常為郵箱字首
,比如 ryan.miao. sn 作為姓氏, uid 作為使用者 id。通常使用者 id 也是唯一的。所以在使用 ldap 做認證的時候,
大概邏輯如下:
- 配置 ldap host, admin, admin pass
- 使用者登入時傳遞 username
- 讀取配置的 ldap 資訊,查詢 cn 或者 uid 等於 username 的資料
- 取出第一個記錄, 獲得 dn, 根據 dn 和 password 再次去 ldap 伺服器認證。即我們必須保證 cn 或 uid 是全域性唯一的,
- 認證通常需要進行兩次。原因就在於 dn 沒辦法根據使用者名稱計算出來。
fast startup script
use 2 docker images
- osixia/openldap:1.5.0
- osixia/phpldapadmin:0.9.0
#!/bin/bash -e
docker run --name ldap-service --hostname ldap-service -v ~/Desktop/ldap:/shared --detach -p 389:389/tcp -p 636:636/tcp --env LDAP_TLS_VERIFY_CLIENT=try osixia/openldap:1.5.0
docker run --name phpldapadmin-service --hostname phpldapadmin-service -v ~/Desktop/ldap:/shared -p 443:443/tcp --link ldap-service:ldap-host --env PHPLDAPADMIN_LDAP_HOSTS=ldap-host --detach osixia/phpldapadmin:0.9.0
PHPLDAP_IP=$(docker inspect -f "{{ .NetworkSettings.IPAddress }}" phpldapadmin-service)
echo "Go to: https://$PHPLDAP_IP"
echo "Login DN: cn=admin,dc=example,dc=org"
echo "Password: admin"
client tool test
TLS 是走 port 389,SSL 才是 port 636,也就是 TLS → ldap://xxx.xxx.tw SSL → ldaps://xxx.xxx.tw
- ldapadd
- ldapcompare
- ldapdelete
- ldapexop
- ldapmodify
- ldapmodrdn
- ldappasswd
- ldapsearch
- ldapurl
- ldapwhoami
- ldattach
ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config
ldapsearch -x -D cn=admin,dc=example,dc=org -w admin -b "dc=example,dc=org"
#SSL
export LDAPTLS_CACERT=/tmp/ca.crt;ldapwhoami -x -H ldaps://ldap-service -D cn=admin,dc=example,dc=org -w admin
#TLS
export LDAPTLS_CACERT=/tmp/ca.crt;ldapwhoami -x -H ldap://ldap-service -D cn=admin,dc=example,dc=org -w admin -Z
#RAW
ldapwhoami -x -H ldap://ldap-service -D cn=admin,dc=example,dc=org -w admin
Protocol and Password Compatibility
reference :
- [http://deployingradius.com/documents/protocols/compatibility.html]
- [https://stackoverflow.com/questions/48644059/freeradius-eap-peap-with-ldap]
因為 LDAP 存密碼的格式有 clear, md5, sha , ssha, sha512 … 等,
如下表所示,最適用協定為 EAP-TTLS with MSCHAPV2,但看stackflow 討論 EAP-TTLS with PAP 最通用。
Protocal\Password format | clear | md5 | sha | ssha | sha512 |
---|---|---|---|---|---|
EAP-TTLS with PAP | V | V | V | V | X |
EAP-TTLS with MSCHAPV2 | V | V | V | V | V |
EAP-PEAP with PAP | V | X | X | X | X |
EAP-PEAP with MSCHAPV2 | V | X | X | X | X |
What is LDAP used for?
- [https://stackoverflow.com/questions/239385/what-is-ldap-used-for]
I will focus on why using LDAP, not what is LDAP.
The use model is similar like how people use library cards or phonebooks. When you have a task that requires “write/update once, read/query many times”, you might consider using LDAP. LDAP is designed to provide extremely fast read/query performance for a large scale of dataset. Typically you want to store only a small piece of information for each entry. The add/delete/update performance is relatively slower compared with read/query because the assumption is that you don’t do “update” that often.
Imagine you have a website that has a million registered users with thousands of page requests per second. Without LDAP, every time users click a page, even for static page viewing, you will probably need to interact with your database to validate the user ID and its digital signature for this login session. Obviously, the query to your database for user-validation will become your bottleneck. By using LDAP, you can easily offload the user validation and gain significant performance improvement. Essentially, in this example, LDAP is another optimization layer outside your database to enhance performance, not replacing any database functions.
LDAP is not just for user validation, any task that has the following properties might be a good use case for LDAP:
- You need to locate ONE piece of data many times and you want it fast
- You don’t care about the logic and relations between different data
- You don’t update, add, or delete the data very often
- The size of each data entry is small
- You don’t mind having all these small pieces of data at a centralized place
Using script to quickly startup
/container/service/slapd/assets/certs/ca.crt
注意日期不要過期了,過期就得recreate docker
#!/bin/bash -e
docker run --name ldap-service --hostname ldap-service -v ~/Desktop/ldap:/shared --detach -p 389:389/tcp -p 636:636/tcp --env LDAP_TLS_VERIFY_CLIENT=try osixia/openldap:1.5.0
docker run --name phpldapadmin-service --hostname phpldapadmin-service -v ~/Desktop/ldap:/shared -p 443:443/tcp --link ldap-service:ldap-host --env PHPLDAPADMIN_LDAP_HOSTS=ldap-host --detach osixia/phpldapadmin:0.9.0
PHPLDAP_IP=$(docker inspect -f "{{ .NetworkSettings.IPAddress }}" phpldapadmin-service)
echo "Go to: https://$PHPLDAP_IP"
echo "Login DN: cn=admin,dc=example,dc=org"
echo "Password: admin"
#create
docker run -it --name ldap-service --hostname ldap-service -v ~/Desktop/ldap:/shared -p 389:389/tcp -p 636:636/tcp --env LDAP_TLS_VERIFY_CLIENT=try osixia/openldap:1.5.0 "bash"
#exec
docker start -ia ldap-service
#remove
docker rm ldap-service
#test
ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config
ldapsearch -x -D cn=admin,dc=example,dc=org -w admin -b "dc=example,dc=org"
#SSL-636
export LDAPTLS_CACERT=/tmp/ca.crt;ldapwhoami -x -H ldaps://ldap-service -D cn=admin,dc=example,dc=org -w admin
#TLS-389
export LDAPTLS_CACERT=/tmp/ca.crt;ldapwhoami -x -H ldap://ldap-service -D cn=admin,dc=example,dc=org -w admin -Z
#RAW
ldapwhoami -x -H ldap://ldap-service -D cn=admin,dc=example,dc=org -w admin