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 套件。- nss_ldap:用來 取得使用者帳號、群組....等資訊
- pam_ldap:用來 認證使用者 的機制以及服務授權
- 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、參考
- jnlin blog Enable nss_ldap in FreeBSD
- OpenLDAP跟FreeBSD…(續)
- FreeBSD 5.3OpenLDAP の設定
- FreeBSD 5.1-RELEASEにおける新機能の概要と活用例 (2/6)
- 雄的 FreeBSD 筆記‧以 LDAP 整合帳號
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 服務