OpenLDAP - PAM NSS 設定

1、前言

PAM (Pluggable Authentication Modules): 可抽換式模組,是實作用來對 使用者的認證、授權機制,本次實作採用 PADL Software 的 pam_ldap 模組,而在 /etc/pam.d 內相關服務內容,則由模組類型、控制旗標、使用模組、引數等所決定。(RFC 2307)






文章目錄

1、前言
2、實作環境
3、安裝及設定
          步驟1.安裝所需套件
          步驟2.修改 PAM 設定檔 (lapd.conf)
          步驟3.修改 NSS 設定檔 (nss_lapd.conf)
          步驟4.修改 nsswitch.conf
          步驟5.修改 /etc/master.passwd 以及 /etc/group
          步驟6.測試使用者認證功能
          步驟7.設定 SSH 服務使用 PAM 進行認證
          步驟8.測試 SSH 登入
4、參考
5、Me FAQ
          Q1.nss_ldap/pam_ldap/nsswitch.conf 設定完成後重新啟動 slapd 服務超久?
          Q2.id 指令查詢 LDAP Account 發現 Log 有錯誤訊息?
          Q3.修改 slapd.conf 加入索引後 id 指令反而查不到 LDAP Account?

1. 模組類型 (Module-Type)

  • auth:使用者認證的功能 (master.passwd)。
  • account:使用者帳號管理功能 (su / 密碼到期...)。
  • session:session 管理功能 (check mail / mount home directory...)。
  • password:為使用者更新認證標記 (每個 auth 模組有相對應的 password 模組)。

2. 控制旗標 (Control-Flag)

  • required:此模組必須執行成功才能認證成功,並執行相關的應用程式。
  • sufficient:就算模組執行失敗仍繼續進行認證,不會因認證失敗而拒絕存取。
  • optional:無論模組執行成功或失敗都不影響。
  • requisite:如果模組執行失敗,則會立即回傳認證失敗給呼叫的應用程式。

3. 模組路徑 (Module-Path)

  • /usr/local/lib/pam_ldap.so:指定認證或授權的共享程式庫的絕對路徑。

4. 引數

  • debug:啟用除錯功能,送往標準輸出或 syslogd。
  • no_warn:停用認證失敗的登錄功能。
  • use_first_pass:使用前一個模組的密碼,若認證失敗就傳回失敗狀態碼。
  • try_first_pass:使用前一個模組的密碼,若認證失敗就提示使用者輸入密碼。

NSS (Name Server Switch): 是實作用來 取得使用者帳號、群組...等資訊,本次實作採用 PADL Software 的 nss_ldap 模組,以下是 nsswitch.conf 內常用到的選項說明。
  • nis:使用 NIS。
  • dns:使用 DNS。
  • files:使用本地端檔案(/etc/hosts, /etc/passwd..)。
  • compat:使用 NIS 的 compat 模式。
  • ldap:使用 PADL 的 nss_ldap。





2、實作環境

  • FreeBSD 6.1-STABLE
  • openldap-server-2.3.24
  • openldap-sasl-client-2.3.24
  • nss_ldap-1.250
  • pam_ldap-1.8.2
  • pam_mkhomedir-0.1





3、安裝及設定

本文將實作下列項目
  • 安裝及設定 PAM / NSS 用來取得使用者帳號、群組並加以認證的授權機制。
  • 修改系統使用者密碼及群組檔案將認證部份導至 OpenLDAP。
  • 設定 SSH 服務使用 PAM 進行認證 (透過 OpenLDAP 認證)。
  • SSH 登入後自動建立使用者家目錄。

步驟1.安裝所需套件

切換至 Ports Tree 路徑安裝 nss_ldap、pam_ldap、pam_mkhomedir 套件。
  1. nss_ldap:用來 取得使用者帳號、群組....等資訊
  2. pam_ldap:用來 認證使用者 的機制以及服務授權
  3. pam_mkhomedir:用來 當登入時自動建立使用者家目錄
cd /usr/ports/net/nss_ldap/           //切換到安裝路徑
make install clean                      //安裝套件並清除暫存檔案      
cd /usr/ports/security/pam_ldap       //切換到安裝路徑
make install clean                      //安裝套件並清除暫存檔案
cd /usr/ports/security/pam_mkhomedir  //切換到安裝路徑
# make install clean                      //安裝套件並清除暫存檔案        




步驟2.修改 PAM 設定檔 (lapd.conf)

修改 LDAP 設定檔 ldap.conf。
cp /usr/local/etc/ldap.conf.dist ldap.conf  //複製範例檔來修改
 host 127.0.0.1                          //指定 pam/nss 去哪裡找 LDAP Server
 uri ldap://ldap.weithenn.org            //指定 pam/nss 去哪裡找 LDAP Server
 base dc=weithenn,dc=org                 //定義搜尋的尾碼
 rootbinddn cn=root,dc=weithenn,dc=org   //指定 rootdn
 pam_filter objectclass=posixAccount     //使用 posixAccount物件來比較 login name
 pam_login_attribute uid                 //使用 DN 記錄內 uid 來比對 login name
 bind_policy soft                        //否則重新啟動將會卡住很久




步驟3.修改 NSS 設定檔 (nss_lapd.conf)

因為 pam_ldap/nss_ldap 設定檔內容一模一樣,所以我們只要修改好 PAM 設定檔後,利用 Symbol Link 的方式將 NSS 設定檔 (nss_ldap.conf) 連結至 PAM 設定檔 (ldap.conf)即可,當然若有需要用 pam/nss 一些進階參數也很好判別,分別都是各模組開頭 (ex.pam_min_uid....,nss_base_passwd.....)。
cd /usr/local/etc
ln -s ldap.conf nss_ldap.conf     //建立 Symbol Link 連結 PAM 及 NSS 設定檔

建立 nss_ldap.secret 填入 LDAP 管理者密碼 (此檔密碼為明碼,因此建議檔案權限設為 chmod 400)。
# vi nss_ldap.secret           //填入管理密碼
chmod 400 nss_ldap.secret   //因為此檔檔內容為明碼




步驟4.修改 nsswitch.conf

因為會使用到 nss_ldap 模組的服務,因此請修改此設定檔。
vi /etc/nsswitch.conf       //修改設定檔內容如下
 group: compat
 group_compat: ldap nis        //加上 ldap 認證選項
 hosts: files dns
 networks: files
 passwd: compat
 passwd_compat: ldap nis       //加上 ldap 認證選項
 shells: files




步驟5.修改 /etc/master.passwd 以及 /etc/group

修改系統使用者密碼及群組檔案,將認證部份導至 LDAP。
vipw               //修改使用者密碼檔案 (/etc/master.passwd)
 +:*::::::::        //加入此行 (允許任何人登入)
vi /etc/group    //修改群組檔 (/etc/group)
 +:*::              //加入此行




步驟6.測試使用者認證功能

相關設定修改完成後我們使用指令 id 及 finger 來測試系統是不是已經可以透過 LDAP 來進行使用者認證 (LDAP Account)。

測試一、使用 id 指令測試認證 LDAP 使用者帳號 test。
# id test                                 //看是否能認證剛才建立的 test 帳號
 uid=18000(test) gid=18000 groups=18000  //認證成功


測試二、使用 finger 指令測試認證 LDAP 使用者帳號 test。
# finger test        //看是否能認證剛才建立 test 的 LDAP 相關資訊
 Login: test                  Name: test user
 Directory: /home/user/test   Shell: /bin/tcsh
 No Mail.
 No Plan.

測試三、測試系統是不是也認得本機的使用者帳號 weithenn,以便 LDAP Server Crash 時還能利用本機帳號登入。
id weithenn        //確認本機帳號也可識別
 uid=1001(weithenn) gid=1001(weithenn) groups=1001(weithenn)

測試四、測試 LDAP 使用者帳號 test (uid) 能被系統識別,由下例可知將測試權限的 owner 改變為 LDAP 使用者帳號 test (uid) 18000,系統能正確辨認該 uid 18000 其 LDAP 使用者帳號名稱為 test。
touch testfile ; chown 18000 testfile   //建立測試檔案並指定擁有者為 uid 18000
ls -l                                       //系統可辨認 uid 18000 為使用者名稱 test
 -rw-r--r--  1 test    wheel         0  7 18 15:54 testfile

最後,查看 /var/log/ldap.log 可看到系統使用 rootbinddn 帳號去作查詢的動作,其中 mech=SIMPLE 代表目前 LDAP 認證方式為使用 明碼 傳輸。
Jul 20 17:44:00 ldap slapd61655: conn=0 fd=11 ACCEPT from IP=127.0.0.1:57562 (IP=0.0.0.0:389)
Jul 20 17:44:00 ldap slapd61655: conn=0 op=0 BIND dn="cn=root,dc=weithenn,dc=org" method=128
Jul 20 17:44:00 ldap slapd61655: conn=0 op=0 BIND dn="cn=root,dc=weithenn,dc=org" mech=SIMPLE ssf=0
Jul 20 17:44:00 ldap slapd61655: conn=0 op=0 RESULT tag=97 err=0 text=




步驟7.設定 SSH 服務使用 PAM 進行認證

/etc/pam.d 內有許多相關的網路服務,若想讓該網路服務能利用 pam_ldap 來進行認證處理就加上如下一行吧。
auth   sufficient  /usr/local/lib/pam_ldap.so  no_warn try_first_pass
目前已經確定系統能認證 LDAP Account 了,修改 SSH 服務驗證檔案使 LDAP Account 也能進行 SSH 登入。
vi /etc/pam.d/sshd
 #auth
 auth   required     pam_nologin.so              no_warn
 auth   sufficient   pam_opie.so                 no_warn   no_fake_prompts
 auth   requisite    pam_opieaccess.so           no_warn   allow_local
 #auth  sufficient   pam_krb5.so                 no_warn   try_first_pass
 #auth  sufficient   pam_ssh.so                  no_warn   try_first_pass
 auth   sufficient   /usr/local/lib/pam_ldap.so  no_warn   try_first_pass  //加上此行
 auth     required     pam_unix.so                     no_warn   try_first_pass

修改成功後雖然 LDAP Account 能透過 SSH 登入 LDAP Server,但新建立的使用者再 SSH 登入之後會出現訊息說找不到使用者家目錄,此時我們可使用剛才安裝的 pam_mkhomedir 套件讓使用者在進行 SSH 登入後能自動建立該使用者家目錄。
vi /etc/pam.d/sshd
 #session
 #session   optional    pam_ssh.so
 session    required    /usr/local/lib/pam_mkhomedir.so    //加上此行
 session    Required   pam_permit.so




步驟8.測試 SSH 登入

上述設定完成後進行測試看 LDAP Account 使用者帳號 test 能不能 SSH 登入到 LDAP Client 機器。
ssh test@localhost   //試試能不能 SSH 到本機
 Password:              //輸入 LDAP Account test 密碼

成功登入後再輸入 id 指令查看使用者資訊是否正確
 > id                    //LDAP Account 順利登入 LDAP Client Host
 uid=18000(test) gid=18000 groups=18000






4、參考






5、Me FAQ

Q1.nss_ldap/pam_ldap/nsswitch.conf 設定完成後重新啟動 slapd 服務超久?

Error Message:
設好後能用 id 及 finger 指令查建立的 user 但重新啟動 slapd 服務會非常久才啟動完成 (大約三分鐘) 且啟動後 Log 出現如下訊息?
tail /var/log/messages
 Jul 15 13:47:21 ldap slapd11059: nss_ldap: could not search LDAP server - Server is unavailable

LDAP Log 如下
tail /var/log/ldap.log
 Jul 14 11:46:58 ldap slapd2891: nss_ldap: failed to bind to LDAP server ldap://127.0.0.1: Can't contact LDAP server
 Jul 14 12:10:15 ldap id: nss_ldap: could not search LDAP server - Server is unavailable

Ans:
先在 ldap.conf 內加上 bind_policy soft 選項後,就能服務重新啟動成功(大約三十秒),我也有在 ldap.conf 內加入 rootbindn 並配合 nss_ldap.secret,或加上 binddn/bindpw 但似乎結果都一樣,以下為相關討論:



Q2.id 指令查詢 LDAP Account 發現 Log 有錯誤訊息?

Error Message:
使用 id 指令查詢建立的 LDAP Account 雖然能正確查到但查看 ldap.log 發現有一行錯誤訊息?
Jul 27 16:14:12 ldap slapd53185: <= bdb_equality_candidates: (uid) index_param failed (18)
Jul 27 16:14:12 ldap slapd53185: <= bdb_equality_candidates: (gidNumber) index_param failed (18)

Ans:
原來是因為我在 slapd.conf 沒有作 LDAP account 的相關索引所以出現這樣的訊息,修改 slapd.conf 建立使用者索引吧。
index   ou,cn,sn,mail,mobile                    eq,pres,sub
index   uid,uidNumber,gidNumber,loginShell      eq,pres




Q3.修改 slapd.conf 加入索引後 id 指令反而查不到 LDAP Account?

Error Message:
在 slapd.conf 加入相關索引後,這時使用 id 指令卻反而查不到 LDAP Account?

Ans:
更改索引設定後記得要重建索引使用 slapindex 指令即可 (記得使用此指令以前 slapd 服務要先停止)
/usr/local/etc/rc.d/slapd stop   //停止 slapd 服務
slapindex -f slapd.conf           //建立索引
/usr/local/etc/rc.d/slapd start  //啟動 slapd 服務