站長新書 站長開講 首頁 最新文章 站長著作及審校 FreeBSD 筆記 Linux 筆記 Windows 筆記 虛擬化筆記 網管人雜誌 遊山玩水 關於本站
站長新書 VMware vSphere ICM 團購開跑了!!

OpenLDAP-LDAP Server 基礎設定

前言

ACL (Access Control List):存取控制清單,基本上就是記住 誰 (Who)權限 (Permission) 能夠去存取 什麼 (What),而 ACL Rules 讀取規則為先讀取先載入 (First Match Wins)

 access to *                      //允許任何人 (*)
      by * read                   //都有讀取 (read) 的權限   
 access to attrs=userPassword     //允許存取使用者 (users) 密碼
      by self write               //認證成功的使用者有寫入 (write)的權限
      by * auth                   //只有當認證 (auth) 成功時

有關於 誰 (Who) 詳細說明可參考 [OpenLDAP Software 2.3 Administrator's Guide Configuring slapd]

Table 5.3: Access Entity pecifiers
SpecifierEntities
*All, including anonymous and authenticated users
anonymous Anonymous (non-authenticated) users
users Authenticated users
self User associated with target entry
dn[.<basic-style>]=<regex>Users matching a regular xpression
dn.<scope-style>=<DN>Users within scope of a DN

有關於 權限 (Permission) 詳細說明可參考 [OpenLDAP Software 2.3 Administrator's Guide Configuring slapd]

Table 5.4: Access Levels
LevelPrivilegesDescription
none=0no access
auth=xneeded to bind
compare=cxneeded to compare
search=scxneeded to apply search filters
read=rscxneeded to read search results
write=wrscxneeded to modify/rename

實作環境

安裝及設定

步驟1.安裝 openldap23-server 套件

切換至 Ports Tree 路徑安裝 openldap23-server 套件

 #cd /usr/ports/net/openldap23-server    //切換到安裝路徑
 #make install clean                     //安裝套件並清除安裝過程中產生不必要檔案

步驟2.設定 openldap 管理者密碼

使用者密碼常見加密 (編碼) 類型如下: (預設 採用 SSHA 編碼來保護 LDAP 密碼資訊)

OpenLDAP 的密碼允許多種格式如 MD5、SSHA、SHA、CRYPT 甚至是明碼都可以,OpenLDAP 設定檔 (slapd.conf) 內初始密碼為明碼 (secret),建議以 SSHA 編碼來保護 LDAP 密碼其語法為 slappasswd -h {加密類型}

 #slappasswd                              //預設使用 SSHA 編碼
 New password:                            //輸入密碼
 Re-enter new password:                   //再次輸入密碼以確認
 {SSHA}QIiKsA5a3IjCJWpK2vsPC6UMyjJU4ibt   //產生密碼並加密後的編碼 (請複製此行等一下貼到設定檔 slapd.conf 內)

步驟3.修改 openldap 說定檔 (slapd.conf)

修改 OpenLDAP Server 主要設定檔 (slapd.conf)

 #vi /usr/local/etc/openldap/slapd.conf   //修改設定檔內容如下
 #######################################################################
 # 以下為載入的綱要列表
 #######################################################################                        
 include         /usr/local/etc/openldap/schema/core.schema              
 include         /usr/local/etc/openldap/schema/corba.schema
 include         /usr/local/etc/openldap/schema/cosine.schema
 include         /usr/local/etc/openldap/schema/misc.schema
 include         /usr/local/etc/openldap/schema/inetorgperson.schema
 include         /usr/local/etc/openldap/schema/openldap.schema
 include         /usr/local/etc/openldap/schema/nis.schema
 #######################################################################
 # 以下為 ACL Rules 存取安全設定 (增加 Access Control 部份)
 # 合法的使用者能讀取 LDAP 資料庫,但不能讀/寫其它人的密碼
 #######################################################################
 access to attrs=userPassword
        by self write
        by anonymous auth
        by dn.base="cn=root,dc=weithenn,dc=org" write
        by * none
 #######################################################################
 # 為了讓 nss_ldap 機制能夠運作,必須開啟 anonymous 讀取的權限,但是限制它不能從任何 IP 讀取
 #######################################################################
 access to *
        by self write
        by users read
        by anonymous peername.IP=127.0.0.1 read
        by anonymous peername.IP=192.168.1.0%255.255.255.0 read
        by dn.base="cn=root,dc=weithenn,dc=org" write
        by * none
 #######################################################################
 # 產生 Log 檔參數
 #######################################################################
 loglevel        296                        
 pidfile         /var/run/openldap/slapd.pid
 argsfile        /var/run/openldap/slapd.args
 #######################################################################
 # BDB database definitions
 #######################################################################
 database        bdb
 suffix          "dc=weithenn,dc=org"                    //指定 Base DN
 rootdn          "cn=root,dc=weithenn,dc=org"            //指定 DN 管理帳號
 rootpw          {SSHA}QIiKsA5a3IjCJWpK2vsPC6UMyjJU4ibt  //指定 DN 管理密碼 (貼上步驟二產生的密碼編碼)
 directory       /var/db/openldap-data                   //指定存放路徑
 #######################################################################
 # 索引設定(有助於搜尋最佳化)
 #######################################################################
 index   objectClass     eq
 index   ou,cn,sn,mail,mobile,givenName          eq,pres,sub
 index   uid,uidNumber,gidNumber,loginShell      eq,pres

步驟4.修改系統 Log 設定檔 (syslog.conf)

修改系統 Log 設定檔 (syslog.conf),以便等一下 OpenLDAP 服務啟動後可將運作情況寫入至我們所指定的 Log 中對於日後除錯上很有幫助。

 #vi /etc/syslog.conf
 local4.*        /var/log/ldap.log     //加入此行以產生 LDAP 運作 Log
 #touch /var/log/ldap.log              //建立 ldap.log 空檔案
 #/etc/rc.d/syslogd restart            //重新啟動 syslog 服務 (重新載入 syslog.conf 設定) 以便等一下 LDAP 服務可開始寫入 Log

修改完 (syslog.conf) 之後記得修改 (newsyslog.conf) 來定期壓縮 ldap.log 除了存檔備查之外也可避免 Log 無限制的肥大 (之前忘了設定今天一查 Log 已經肥大到 420MB 了 *:(*)

  #vi /etc/newsyslog.conf
  /var/log/ldap.log                       640  30     *    @T00  JC           //加入此行定期壓縮 ldap.log

步驟5.啟動 slapd 服務

修改 /etc/rc.conf 以便系統重新開機時能自動啟動 slapd 服務

 #vi /etc/rc.conf                      //加入如下三行以便開機時自動帶起 LDAP 服務
 slapd_enable="YES"
 slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/"'
 slapd_sockets="/var/run/openldap/ldapi"

修改完成後鍵入如下指令來啟動 slapd 服務

 #/usr/local/etc/rc.d/slapd start      //啟動 slapd 服務

步驟6.測試 slpad 服務

啟動 slpad 服務完成後我們進行簡單的三項測試來確定 slpad 服務有正常運作。

 #ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts     //執行此指令來查尋 Base DN 是否設定成功 (應該出現類似如下訊息)
 # extended LDIF                                                   
 # LDAPv3
 # base <> with scope baseObject
 # filter: (objectclass=*)
 # requesting: namingContexts
 dn:
 namingContexts: dc=weithenn,dc=org                                //顯示您所設定的網域名稱則 LDAP Base DN 設定成功
 #search result
 search: 2
 result: 0 Success
 #numResponses: 2
 #numEntries: 1
 #sockstat |grep slapd
 ldap     slapd      2297  3  dgram  -> /var/run/logpriv
 ldap     slapd      2297  6  stream /var/run/openldap/ldapi
 ldap     slapd      2297  7  tcp4   *:389                 *:*
 #netstat -an | grep 389
 tcp4       0      0  *.389                  *.*                    LISTEN

步驟7.建立 BaseDN、RootDN、UserDN LDIF 檔案

LDIF (LDAP Interchange Format):LDAP 交換格式,簡單來說就是用來 新增 / 修改 / 刪除 LDAP 目錄內容,其語法必須遵守 Schema 規則,詳細內容可參考 [RFC2849],其 LDIF 設定檔內語法重點如下

  1. 井號 (#) 為註解
  2. 冒號 (:) 左邊為屬性,右邊為屬性值 (記得空一格)
  3. dn 即為該項目 (entry)
  4. 遇跨列時只需在下一列開頭加一空格即可,不用使用一般的倒斜線 \ 來接續下一行
 #vi /usr/local/etc/openldap/bdn.ldif     //建立 bdn.ldif 內容如下
 ### weithenn.org Base DN                 //BaseDN 內容
 dn: dc=weithenn,dc=org
 objectClass: dcObject
 objectClass: organization
 dc: weithenn
 o: Weithenn Personal Test
 ### Magager weithenn.org Root DN         //RootDN 內容
 dn: cn=root,dc=weithenn,dc=org
 objectClass: organizationalRole
 cn: root
 #vi /usr/local/etc/openldap/user.ldif   //建立 user.ldif 內容如下
 ### Organization People
 dn: ou=People,dc=weithenn,dc=org
 objectClass: organizationalUnit
 ou: People
 ### Test Account
 dn: uid=test,ou=People,dc=weithenn,dc=org
 uid: test
 cn: test
 objectClass: top
 objectClass: account
 objectClass: posixAccount
 userPassword: {crypt}x
 uidNumber: 18000
 gidNumber: 18000
 homeDirectory: /home/user/test
 loginShell: /bin/tcsh
 gecos: test user

步驟8.匯入 BaseDN、RootDN、UserDN LDIF 檔案

利用 ldapadd 指令來匯入剛才建立的 LDIF 檔案 (bdn.ldif、user.ldif)

 #ldapadd -x -D "cn=root,dc=weithenn,dc=org" -W -f bdn.ldif         //新增記錄至 LDAP 內
 Enter LDAP Password:                                               //輸入 slapd.conf 內 rootpw 設定的 passwd
 adding new entry "dc=weithenn,dc=org"                              //顯示新增記錄成功
 adding new entry "cn=root,dc=weithenn,dc=org"
 #ldapadd -x -D "cn=root,dc=weithenn,dc=org" -W -f user.ldif        //新增記錄至 LDAP 內
 Enter LDAP Password:                                               //輸入 slapd.conf 內 rootpw 設定的passwd
 adding new entry "ou=people,dc=weithenn,dc=org"                    //顯示新增記錄成功
 adding new entry "uid=test,ou=people,dc=weithenn,dc=org"

步驟9.查尋資料是否新增成功

匯入 LDIF 檔案成功之後我們可以利用 ldapsearch 指令來查尋剛才新增的記錄

 #ldapsearch -x                                                     //順利的話應該可以看到新增的記錄

若要將內容含有中文字的 LDIF 檔案匯入至 LDAP 內則必須先將該 LDIF 檔案格式轉成 [UTF-8] 編碼格式,安裝 [iconv] 套件之後將 user.ldif 檔案轉換成為 [UTF-8] 編碼格式,詳細內容可參考 [ FreeBSD Chinese HOWTO 在 LDAP 下使用中文]

 #cd /usr/ports/converters/libiconv                                 //安裝 iconv
 #iconv -l                                                          //查看 iconv 支援那些編碼格式
 #iconv -f BIG5 -t UTF-8 user.ldif > user.ldif.utf8                 //將 user.ldif 轉成 utf8 格式

當然除了以下所介紹的二套之外還有很多 GUI 圖形介面工具挑自已合用的吧 *:)*

參考

[OpenLDAP Software 2.3 Administrator's Guide: A Quick-Start Guide]

[ Your office backend on GNU/Linux; with single (source of) sign-on]

[ OpenLDAP 手冊日文版]

[ 理解與應用LDAP服務器]

[ Quick and dirty FreeBSD 5.x and nss_ldap mini-HOWTO]

[ FreeBSD.AT - Installation des LDAP Servers]

[ OpenLDAP快速指南]

[ LDAP Server─OpenLDAP]

[Bell 個人站 :: 討論區 OpenLDAP伺服器安裝]

[交大資工系計中 » 2006 » May]

[ LDAP-mini-HOWTO]

[ Enterprise Linux 實戰講座利用 LDAP 整合 Apache 網頁驗證]

[ LDAP 的詳細介紹]

[jnlin blog Install OpenLDAP on FreeBSD]

[LDAP Server-OpenLDAP 安裝]

[ Open Source Guide - LDAP for Rocket Scientists - Contents]

[ 使用 OpenLDAP 集中管理用戶帳號]

[ LDAP Implementation HOWTO]

[ LDAPv3 HOWTO on Debian]

[ FreeBSD Chinese HOWTO 在 LDAP 下使用中文]

[ jnlin blog Enable nss_ldap in FreeBSD]

[ OpenLDAP 跟 FreeBSD…(續)]

[永远的 UNIX > LDAP ]

[FreeBSD 5.3 OpenLDAP の 設定]

[ FreeBSD 5.1-RELEASE における新機能の概要と活用例 (2/6)]

[OpenLDAP の 設定]

Me FAQ

Q1.無法啟動 slapd 服務並出現說找不到 libldap_r-2.2.so.7?

Error Meaage:

當嘗試啟動 slapd 服務時出現如下錯誤訊息說找不到 libldap_r-2.2.so.7

 #/usr/local/etc/rc.d/slapd.sh start
 Starting slapd.
 /libexec/ld-elf.so.1: Shared object "libldap_r-2.2.so.7" not found, required by "slapd"

Ans:

原因出在 openldap client 及 openldap server 版本不合,此次實作安裝的 openldap server 版本是 2.2.x,但安裝 nss_ldap 時系統會提示要移除 openldap client 2.2.x 才能順利安裝,因此便移除了 openldap client 2.2.x 版本,但 nss_ldap 則是安裝更新版本的 openldap client 2.3.x,因此 slapd 服務便無法順利啟動,下列為啟動 slpad 服務失敗時 openldap client 及 openldap server 版本。

 openldap-server-2.2.30 Open source LDAP server implementation
 openldap-client-2.3.24 Open source LDAP client implementation

解決方法為安裝新版本 openldap server 2.3.x 之後就能順利啟動 slapd 服務了。

Q2.啟動 slapd 服務後系統沒反應?

Error Meaage:

啟動 slapd 服務之後雖然在 /var/run 下有看到 pid 檔案,但無法查看到聆聽的 Port 389 及 Process

 #/usr/local/etc/rc.d/slapd start  //啟動 slapd 服務
 Starting slapd.
 #cd /var/run/openldap ; ls        //有看到 pid 檔案
 ldapi      slapd.args slapd.pid

Ans:

將 /var/db/ports/openldap23 砍掉在重裝一次即可順利啟動。

Q3.bdb_db_open: Warning - No DB_CONFIG file found in directory /var/db/openldap-data?

Error Meaage:

啟動 slapd 服務後,查看 ldap.log 發現如下警告訊息

 Jul 19 10:19:34 ldap slapd[55696]: bdb_db_open: Warning - No DB_CONFIG file found in directory /var/db/openldap-data: (2) Expect poor performance for suffix dc=weithenn,dc=org.

Ans:

下列為解決步驟

 1. #cp /usr/local/etc/openldap/DB_CONFIG /var/db/openldap-data/
 2. #vim DB_CONFIG
   set_cachesize 0 268435456 1                     //設定 bdb 的 cache 大小單位為 Bytes (此例設為 256MB)
   set_lg_regionmax        1048576                 //設定存於 Memory Cache 大小
   set_lg_max              10485760                //設定操作 Log 最大值 (/var/db/openldap-data/log.0000000001)
   set_lg_bsize            2097152                 //設定操作 Log 時 Buffer Cache
   set_lg_dir              /var/db/openldap-data   //設定操作 Log 存放路徑
 3. #/usr/local/etc/rc.d/slapd stop
 4. #db_recover-4.3 -h /var/db/openldap-data
 5. #/usr/local/etc/rc.d/slapd start

詳細內容可參考

Q4.單一使用者要加入多個 Groups 該如何達成?

Ans:

想讓 LDAP User 加入多個 Groups 該如何達成例如使用者名稱 weithenn 欲加入 auditorial group

 #groups weithenn                                                        //weithenn 原本僅加入 it 這個 group
 it 

修改 auditorial group 檔

 #auditorial, Group,
 dn: cn=auditorial,ou=Group,dc=weithenn,org
 objectClass: posixGroup
 cn: auditorial
 gidNumber: 10200
 memberUid: weithenn                                                     //加入此行
 memberUid: user1
 memberUid: user2

利用指令 id 來測試使用者 weithenn 是否成功加入另一個群組 (auditorial group)

 #id weithenn
 uid=11103(weithenn) gid=11100(it) groups=11100(it), 10200(auditorial)   //加入成功

利用指令 groups 來測試使用者 weithenn 是否成功加入另一個群組 (auditorial group)

 #groups weithenn
 it auditorial                                                           //加入成功

Q5.ldap_bind - Invalid credentials (49)?

Error Meaage:

執行 ldapadd 時無法新增資料至 LDAP 中並且出現如下錯誤訊息

 Enter LDAP Password:
 ldap_bind: Invalid credentials (49)

Ans:

原因是自已耍小白 LDAP Manager 密碼打錯了 (不小心按到 Caps) *:p*

Go To Oddmuse OrgGo To FreeBSD OrgCreative Commons 2.5 Taiwansitestates.com