最近 Mowd 因為工作需要
必須要利用一台 Ubuntu 8.04 進行單一帳號驗證
並且使用者在任何電腦登入後,都要可以看到自己原本的家目錄
上網 Survey 了一些解法之後決定利用 LDAP + PAM + NFS 來解決這個問題
LDAP 安裝與設定
dc: Domain Component
ou: Organizational Unit
cn: Common Name
在這邊我們假設 Server 端的 IP 是 10.0.0.1
Client 端的 IP 是 10.0.0.2
要架設的網域為 example.com
安裝 LDAP
安裝時會要你設定一個 admin 密碼,結束後我們再輸入以下指令進行詳細設定
按照以下設定
DNS domain name: example.com
Organization name? example.com
Administrator password: PASSWORD
Confirm password: PASSWORD
Database backend to use: HDB
Do you want the database to be removed when slapd is purged? No
Allow LDAPv2 protocol? No
編輯 /etc/ldap/ldap.conf
URI ldap://10.0.0.1/
編輯 /etc/ldap/slapd.conf,加入下面這行
重新建立 index
$ slapindex
$ chown -R openldap:openldap /var/lib/ldap
$ /etc/init.d/slapd start
到這裡 LDAP 就已經建立完成,可以透過以下指令來測試LDAP 是否運作正常
# extended LDIF
#
# LDAPv3
# base
# filter: (objectclass=*)
# requesting: ALL
#
# example.com
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: example.com
dc: example
# admin, example.com
dn: cn=admin,dc=example,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: example.com
dc: example
structuralObjectClass: organization
entryUUID: 350a2db6-87d3-102c-8c1c-1ffeac40db98
creatorsName:
modifiersName:
createTimestamp: 20080316183324Z
modifyTimestamp: 20080316183324Z
entryCSN: 20080316183324.797498Z#000000#000#000000
dn: cn=admin,dc=example,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e2NyeXB0fVdSZDJjRFdRODluNHM=
structuralObjectClass: organizationalRole
entryUUID: 350b330a-87d3-102c-8c1d-1ffeac40db98
creatorsName:
modifiersName:
createTimestamp: 20080316183324Z
modifyTimestamp: 20080316183324Z
entryCSN: 20080316183324.804398Z#000000#000#000000
完成以後,首先必須在 LDAP 上面建立兩個群組:People 與 Group
分別對應到的是 /etc/passwd 與 /etc/group
建立一個 ou.ldif
ou: People
objectClass: organizationalUnit
dn: ou=Group,dc=example,dc=com
ou: Group
objectClass: organizationalUnit
加入我們剛剛建立的群組檔案到 LDAP 中
$ slapadd -c -v -l ou.ldif
$ /etc/init.d/slapd start
現在就可以透過指令查到我們剛剛建立在 LDAP 中的群組了
# extended LDIF
#
# LDAPv3
# base
# filter: ou=people
# requesting: ALL
#
# People, example.com
dn: ou=People,dc=example,dc=com
ou: People
objectClass: organizationalUnit
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
建完了群組,接下來建立使用者資料 user.ldif
cn: ldap
gidNumber: 20000
objectClass: top
objectClass: posixGroup
dn: uid=ldap,ou=people,dc=example,dc=com
uid: ldap
uidNumber: 20000
gidNumber: 20000
cn: LDAP
sn: LDAP
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
loginShell: /bin/bash
homeDirectory: /home/ldap
匯入使用者到 LDAP 中
Enter LDAP Password: PASSWORD
adding new entry “cn=ldap,ou=group,dc=example,dc=com”
adding new entry “uid=ldap,ou=people,dc=example,dc=com”
為使用者建立初始密碼
New password: NEW USER PASSWORD
Re-enter new password: NEW USER PASSWORD
Enter LDAP Password: ADMIN PASSWORD
Result: Success (0)
現在我們就可以利用指令查到我們剛剛加入到 LDAP 的使用者資料了
# extended LDIF
#
# LDAPv3
# base
# filter: uid=ldap
# requesting: ALL
#
# ldap, people, example.com
dn: uid=ldap,ou=people,dc=example,dc=com
uid: ldap
uidNumber: 20000
gidNumber: 20000
cn: LDAP
sn: LDAP
objectClass: top
objectClass: person
objectClass: posixAccount
loginShell: /bin/bash
homeDirectory: /home/ldap
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
在 LDAP 成功建立使用者之後,如何讓這個帳號也能在系統中 login 呢?
我們現在可以透過 LDAP 查詢到使用者,但是在 Ubuntu 中還是查詢不到
id: ldap: No such user
必須安裝以下套件才可以達到我們想要的結果
按照以下設定
Distinguished name of the search base: dc=example,dc=com
LDAP version to use: 3
Does the LDAP database require login? No
Make the configuration file readable/writeable by its owner only? No
Does the LDAP database require login? No
LDAP administrative account: cn=admin,dc=example,dc=com
LDAP administrative password: PASSWORD
Local crypt to use when changing passwords. md5
接下來修改 /etc/nsswitch.conf
將這兩項改成下列所示
group: files ldap
然後先將快取服務暫停,以取得最新帳號資料
$ id ldap
uid=20000(ldap) gid=20000(ldap) groups=20000(ldap)
到此為只已經可以讓 Ubuntu 認得 LDAP 上的帳號了
不過要讓帳號登入還需要一些步驟
PAM 設定
account required pam_ldap.so
修改 /etc/pam.d/common-auth 成下列所示
auth required pam_ldap.so use_first_pass
auth required pam_permit.so
修改 /etc/pam.d/common-password 成下列所示
password required pam_ldap.so use_first_pass
修改 /etc/pam.d/common-session成下列所示
session required pam_mkhomedir.so skel=/etc/skel/ umask=0022
完成了這些步驟之後,就可以透過 LDAP 上的使用者帳號及密碼來登入 Ubuntu 了
不過如果要讓使用者在任何機器上都可以使用同一個家目錄,還需要一些設定
NFS 安裝與設定
在裝有 LDAP 的 Server 端編輯 /etc/exports
加入下面一行
在 Client 端編輯 /etc/fstab
加入下面一行
如此一來,Client 在每次開機的時候就會載入 Server 端的家目錄到 /home 底下,所以能夠保證使用者資料能夠同步了
後記
不過新版的 OpenLDAP 針對設定檔的架構有了大幅度的修改
不再使用單一設定檔 slapd.conf 而是改用目錄架構
又因為網路上能夠找到的相關文章時在少之又少
所以先暫時用 Ubuntu 8.04 來安裝了
在安裝的過程中還因為不小心改爛了 nsswitch.conf 而重裝了一次系統 XD
只能說要修改登入機制的時候實在要特別小心啊
參考資料
http://techpubs.spinlocksolutions.com/dklar/ldap.html
http://server.zol.com.cn/127/1270885.html
你好呀~這篇我拿去收藏囉~謝謝
您好请问一下pam如何通过ldap进行认证的?我现在的理解是通过ldapsearch查询用户,但是密码是作为什么参数传输的呢?
在PAM設定這段有提到,是使用pam_ldap.so做驗證的
您好,你的ldap用户登录限制成功了吗???