顯示具有 LDAP 標籤的文章。 顯示所有文章
顯示具有 LDAP 標籤的文章。 顯示所有文章

星期五, 11月 22, 2024

Replace ldap-utils with cURL

  • docker run -d --name openldap -p 1389:1389 bitnami/openldap:2.6.8
  • docker ps
    • openldap up and running
  • docker exec -it openldap ldapsearch -H ldap://localhost:1389 -x -b dc=example,dc=org
    • numEntries: 5
  • ldapsearch -H ldap://localhost:1389 -x -b dc=example,dc=org
    • ldapsearch: No such file or directory
  • curl ldap://localhost:1389/dc=example,dc=org??sub
    • numEntries: 5

星期六, 1月 07, 2023

Docker CAS 6.6.x with LDAP, not Anonymous

change

  • cas.authn.ldap[0].type=ANONYMOUS

to

  • cas.authn.ldap[0].type=AUTHENTICATED
  • cas.authn.ldap[0].bind-dn=CN=user01,ou=users,dc=example,dc=org
  • cas.authn.ldap[0].bind-credential=bitnami1

Docker CAS 6.6.x with LDAP

之前我們已確認了 Docker CAS 可以運作,預設帳密是 casuser / Mellon 這組,姑且稱之為「靜態帳密表」。接著利用這篇所述(注意版本,行文時已升到 2.6.3),來試試 CAS 如何與後端 LDAP 合作。首先開好 LDAP 與之前的 CAS,並進去確認連往 LDAP 的網路通暢:

  • docker run -d --name cas -p 8080:8080 -v ./cas.properties:/etc/cas/config/cas.properties apereo/cas:6.6.4
  • docker exec -it cas /bin/bash
    • echo < /dev/tcp/172.18.8.166/1389 && echo on || echo off
      • on

接著在 cas.properties 加入以下幾行:

  • cas.authn.ldap[0].ldap-url=ldap://172.18.8.166:1389
  • cas.authn.ldap[0].base-dn=ou=users,dc=example,dc=org
  • cas.authn.ldap[0].type=ANONYMOUS
  • cas.authn.ldap[0].search-filter=(&(objectClass=posixAccount)(cn={user}))

重啟帶有新設定的 CAS 雖然順利,但仍僅能驗證 casuser / Mellon 而不能驗證 LDAP user01 / bitnami1 這組帳密。注意看,log 裡面有這段:

  • user01 not found in backing map.

意思是 CAS 把輸入的 user01 / bitnami1 這組帳密交給「靜態帳密表」了。為防止混淆,可以關掉它。在 cas.properties 加入一行:

  • cas.authn.accept.users=

重啟之後情況不變?這時得把 log4j2.xml 抓出來改設定,看看發生了什麼問題?

  • docker cp cas:/etc/cas/config/log4j2.xml .
  • vi log4j2.xml
    • <Property name="cas.log.level">debug</Property>
  • vi cas.properties
    • logging.config=file:/etc/cas/config/log4j2.xml
  • docker stop cas
  • docker rm cas
  • lsof -i :8080
    • <PID>
  • kill <PID>
  • docker run -d --name cas -p 8080:8080 -v ./cas.properties:/etc/cas/config/cas.properties -v ./log4j2.xml:/etc/cas/config/log4j2.xml apereo/cas:6.6.4

在海一般的訊息之中,唯一有幫助的是這條:

  • <Authentication handler [HttpBasedServiceCredentialsAuthenticationHandler] does not support the credential type [UsernamePasswordCredential(username=user01, source=null, customFields={})].>

這意思很難懂?沒錯,它其實要表達的是「現在這個 Docker CAS 並不支援 LDAP」。我們得學習這篇的做法,在這裡挑 6.6 或你想要的分支下載,在 build.gradle 檔案中找到 dependencies 段落,在其中新增一行:

  • implementation "org.apereo.cas:cas-server-support-ldap"

這裡千萬要注意拼字是否正確?原文把 implementation 拼錯,複製貼上並不管用,也不會有錯誤訊息,我就這樣又去多走彎路了。然後在同目錄執行指令:

  • gradlew clean build

幾分鐘後,可以看到一個新的 cas.war 在 build/libs 目錄下,大小應該會比 Docker Image 裡面那個要大一些,我們要用這個新的:

  • docker run -d --name cas -p 8080:8080 -v ./cas.properties:/etc/cas/config/cas.properties -v ./log4j2.xml:/etc/cas/config/log4j2.xml -v ./cas.war:/docker/cas/war/cas.war apereo/cas:6.6.4

這次要有耐心一點,原本一分鐘就能開好的 CAS 可能要拉長到三分多鐘,不是壞了。能驗證 LDAP 的帳密,算是值得吧?

星期五, 4月 22, 2022

OpenLDAP on Docker

  • docker run -d --name openldap -p 1389:1389 [-e LDAP_USERS=user01,user02 -e LDAP_PASSWORDS=bitnami1,bitnami2] bitnami/openldap:2.6.1
  • ldapsearch -H ldap://localhost:1389 -x -b dc=example,dc=org 

星期三, 8月 22, 2018

LDAP for testing environment

想在測試環境管理另一套帳號,雖然 OpenLDAP 安裝不算太複雜,不過要寫小程式或準備 ldif 建帳號都有點麻煩,可以考慮 LDAP Admin。不像以前常用的 jxplorer 需要 Java,它可以直接裝在 Windows 上(不能跨平台就是了),可以直接視覺化看到目錄結構(這不希奇),可以直接增刪修查物件(厲害了吧),而且像新增使用者這麼多必填屬性的情況,只要 Second name 填好,其他有些欄位會連動,再補個 Home Directory 輸入正斜線就夠了。
為了資安與權限,還要讓使用者有機會修改預設密碼,雖然 ldappasswd 很簡單,但不是每個使用者都有 Linux 環境,也都願意下指令。替代方案是這個 Docker Image,一個最單純的啟動範例:
  • docker run -d -p 80:80 --name lssp
  • -e LDAP_HOST=172.16.1.2
  • -e LDAP_PORT=389
  • -e LDAP_BASE=dc=acme,dc=com
  • -e LDAP_USER=cn=Manager,dc=acme,dc=com
  • -e LDAP_PASS=xxxx
  • dtwardow/ldap-self-service-password
如此一來,使用者就有個容易使用的介面可以修改密碼了。特別要注意的是 LDAP_HOST,因為是從 docker container 往外看,真正的 DNS 不一定幫得上忙,用位址還是比較保險。
奉送一首小插曲:明明在 ubuntu 試過可以了,搬到 CentOS7 結果出個莫名其妙的狀況,「AH00534: apache2: Configuration error: No MPM loaded.」,似乎是檔案系統的問題。雖然看不太懂,不過以下解法有用(出處有些錯字,校正後如下):
  • docker stop lssp
  • systemctl stop docker
  • dd if=/dev/zero of=docker_fs bs=1G count=2(開 2G 的空間,不夠的話加大 count)
  • mkfs -t xfs -n ftype=1 docker_fs
  • mount -o loop docker_fs /var/lib/docker
  • 在 /etc/fstab 新增一行 /path/to/docker_fs /var/lib/docker xfs rw,loop,auto 0 0
  • systemctl start docker
  • docker start lssp

星期四, 1月 04, 2018

LDAP search result size limit

照預設的 OpenLDAP,查詢結果若很多時,會限制僅回傳 500 筆資料,這原本不是什麼大問題,不過最近遇到了查詢結果多於上限,且在交易中不得分批處理的問題。原來改變上限也不是什麼困難的事,可先準備以下的 changeSizeLimit.ldif:
  • dn: cn=config
  • changetype: modify
  • replace: olcSizeLimit
  • olcSizeLimit: nnn
再下指令執行:
  • sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f changeSizeLimit.ldif
更進一步,也可以把產 ldif 跟下指令都放在一個 shell script。

星期三, 1月 11, 2017

ldapsearch

在練習對 ldap 查詢時,可以好好利用這裡介紹的測試伺服器(雖然不一定活著?)。首先要確認域名解析是否成功?
  • ping ldap.forumsys.com
網路能否連上?
  • ldapsearch -h ldap.forumsys.com -x
如果回應看起來是連到了主機,但沒有結果,可能是上面的寫法隱含著 -s sub -b "" 的關係,所以先別貪心:
  • ldapsearch -h ldap.forumsys.com -x -s base
可以了,再指定搜尋起點往下挖:
  • ldapsearch -h ldap.forumsys.com -x -b dc=example,dc=com
若運氣不錯,會得到幾筆資料。但不是所有地方都接受匿名查詢,所以也許需要表明身分:
  • ldapsearch -h ldap.forumsys.com -D cn=read-only-admin,dc=example,dc=com -w password -b dc=example,dc=com
嫌資料太多嗎?可以過濾:
  • ldapsearch -h ldap.forumsys.com -x -b dc=example,dc=com ou=*
另外遇到過一些範例建議各項參數前後要包雙引號的,例如 -b "dc=example,dc=com";或者大小寫比較講究,像是 DC=example,DC=com;也有帳號是郵件位址的,類似 admin@example.com,因為才疏學淺實在不敢亂寫,就請讀者們多多嘗試一番。

[2017/02/17]
要確認密碼,可這麼做:
  • ldapwhoami -h ldap.forumsys.com -D cn=read-only-admin,dc=example,dc=com -w password

星期四, 4月 24, 2014

Jenkins 又一難題:LDAP

為了讓 Jenkins 的使用者由 LDAP 接 AD 驗證,參考別人的設定硬是不行。因為每一家的 LDAP 有什麼內容都不會一樣,所以這題也解很久:原來雖然驗證通過了,但後來找使用者所屬群組(其實似乎沒必要)出問題,會導致丟給 acegisecurity 的驗證物件是空的,不過並沒有拋出例外,只有驗證失敗的結果,乍看起來與密碼打錯沒什麼不同,但一直追到很細的記錄才看出些端倪。有圖為證:
其實當初也不懂這有什麼異常,不過先是區分出密碼打錯絕不是長這樣,再苦思、狂搜,最後靈感來自於,狀況類似,多設一個群組的搜尋起點就解決了。

[2019/04/09]
沒想到改用 Single-Sign On 後的多年,還是有機會需要這篇,而且補上兩點:
  • 當 Jenkins 安裝在很舊的 Windows 上,中文可能不是 UTF-8,當做任何欄位設定內容都可能出錯,要儘量避免,例如 Manager DN 就可改為電子郵件格式。
  • 即使沒用到群組,不設群組的相關條件也可能造成問題,可以考慮至少要放個純英文的條件,找不到任何群組也無妨。

星期一, 3月 31, 2014

Ubuntu 12.04 OpenLDAP nodomain

依據這篇說明的做法,在 Ubuntu 12.04 安裝的 OpenLDAP 會參考 /etc/hosts 所設的網域名稱,但實際的結果卻是無效?不論怎麼設,網域名稱都是 nodomain。後來找到解法如下:
http://superuser.com/questions/470825/openldap-slapd-conf-substitutions-ubuntu