OpenLDAP - LDAP Server 基礎設定

1、前言

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






文章目錄

1、前言
2、實作環境
3、安裝及設定
          步驟1.安裝 openldap23-server 套件
          步驟2.設定 openldap 管理者密碼
          步驟3.修改 openldap 說定檔 (slapd.conf)
          步驟4.修改系統 Log 設定檔 (syslog.conf)
          步驟5.啟動 slapd 服務
          步驟6.測試 slpad 服務
          步驟7.建立 BaseDN、RootDN、UserDN LDIF 檔案
          步驟8.匯入 BaseDN、RootDN、UserDN LDIF 檔案
          步驟9.查尋資料是否新增成功
4、參考
5、Me FAQ
          Q1.無法啟動 slapd 服務並出現說找不到 libldap_r-2.2.so.7?
          Q2.啟動 slapd 服務後系統沒反應?
          Q3.bdb_db_open: Warning - No DB_CONFIG file found in directory /var/db/openldap-data?
          Q4.單一使用者要加入多個 Groups 該如何達成?
          Q5.ldap_bind - Invalid credentials (49)?

誰 (Who): 共有四種表示方式 * / self / anonymous / users。
  • *:任何使用者連線。
  • self:目前連線的 DN (假設認證已成功)。
  • anonymous:未經認證的使用者連線。
  • users:認證成功的使用者連線。

權限 (Permission): 共有六種表示方式 none / auth / compare / search / read / write (等級從左到右為最小權限 none 至最大權限 write)。
  • none:禁止存取。
  • auth:可進行認證 (DN 形式的登入名稱)。
  • compare:可比對屬性。
  • search:可使用搜尋功能。
  • read:可讀取搜尋結果 (ex. 可搜尋使用者帳戶資訊中手機號碼開頭為 0912*)。
  • write:可寫入屬性值 (ex. 變更使用者帳戶資訊中手機號碼)。

什麼 (What): 也就是說 ACL 能應用至哪些項目和屬性上。
範例1:
 access to *                   //允許任何人 (*)
      by * read                //都有讀取 (read) 的權限   

範例2:
 access to attrs=userPassword  //允許存取使用者 (users) 密碼
      by self write            //認證成功的使用者有寫入 (write)的權限
      by * auth                //只有當認證 (auth) 成功時

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


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






2、實作環境

  • FreeBSD 6.1-STABLE
  • openldap-server-2.3.24





3、安裝及設定

本文將實作下列項目
  • 安裝及設定 OpenLDAP Server。
  • 製作 LDIF 檔案並將內含中文的 LDIF 檔案由 Big5 編碼格式轉換為 UTF-8 編碼格式。

步驟1.安裝 openldap23-server 套件

切換至 Ports Tree 路徑安裝 openldap23-server 套件。
cd /usr/ports/net/openldap23-server   //切換到安裝路徑
make install clean                      //安裝套件並清除暫存檔案




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

使用者密碼常見加密 (編碼) 類型如下: (預設 採用 SSHA 編碼來保護 LDAP 密碼資訊)
  • CRYPT:LDAP 取代 NIS 時常會用到 crypt 加密演算法。
  • MD5:經過 Base64 編碼。
  • SHA:使用者密碼 160 位元 SHA-1 雜湊值經過 Base64 編碼。
  • SSHA:SHA-1 加強版建議使用此編碼保護 LDAP 密碼資訊。

OpenLDAP 的密碼允許多種格式如 MD5、SSHA、SHA、CRYPT 甚至是明碼都可以,OpenLDAP 設定檔 (slapd.conf) 內初始密碼為明碼 (secret),建議以 SSHA 編碼來保護 LDAP 密碼其語法為 slappasswd -h {加密類型},將密碼加密後的編碼結果請複製到設定檔 slapd.conf 內
slappasswd   //預設使用 SSHA 編碼
 New password:                            //輸入密碼
 Re-enter new password:                   //再次輸入密碼以確認
 {SSHA}QIiKsA5a3IjCJWpK2vsPC6UMyjJU4ibt   //產生加密後的編碼




步驟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) 之後記得修改 (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 服務有正常運作。

測試 1:查看 slapd.conf 內 Base DN 設定是否成功,執行 ldapsearch 指令配合參數 -x 使用簡單認證,及參數 -b 以 dn 為基礎來搜尋。當指令執行成功時便會出現相關訊息。
ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts
 # 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

測試 2:查看 slapd 服務是否成功啟動。
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                 *:*

測試 3:看是系統是否聆聽 slapd 服務 Port 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. 遇跨列時只需在下一列開頭加一空格即可,不用使用一般的倒斜線 \ 來接續下一行。

建立 BaseDN LDIF 及 RootDN LDIF 檔案 (bdn.ldif)
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

建立 UserDN LDIF (user.ldif)
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)。

匯入 BaseDN、RootDN LDIF 檔案 (bdn.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"

匯入 UserDN LDIF 檔案 (user.ldif)
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 工具:有沒有 GUI 圖形介面的工具讓我能簡單快速的 新增 / 修改 / 刪除 LDAP 記錄?
當然除了以下所介紹的二套之外還有很多 GUI 圖形介面工具挑自已合用的吧。





4、參考






5、Me FAQ

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

Error Message:
當嘗試啟動 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 Message:
啟動 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 Message:
啟動 slapd 服務後,查看 ldap.log 發現如下警告訊息?
Jul 19 10:19:34 ldap slapd55696: 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 大小 (此例為 256 MB)
   set_lg_regionmax        1048576                 //設定存於 Memory Cache 大小
   set_lg_max              10485760                //設定操作 Log 最大值
   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 Message:
執行 ldapadd 時無法新增資料至 LDAP 中並且出現如下錯誤訊息?
 Enter LDAP Password:
 ldap_bind: Invalid credentials (49)

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