Ubuntu 設定 LDAP + PAM + NFS 實現多台電腦單一帳號驗證

最近 Mowd 因為工作需要
必須要利用一台 Ubuntu 8.04 進行單一帳號驗證
並且使用者在任何電腦登入後,都要可以看到自己原本的家目錄
上網 Survey 了一些解法之後決定利用 LDAP + PAM + NFS 來解決這個問題

LDAP 安裝與設定

在 LDAP 中會看到一些縮寫,待會在設定的時候會看到

dn: Distinguished name
dc: Domain Component
ou: Organizational Unit
cn: Common Name

在這邊我們假設 Server 端的 IP 是 10.0.0.1
Client 端的 IP 是 10.0.0.2
要架設的網域為 example.com

安裝 LDAP

$ aptitude install slapd ldap-utils

安裝時會要你設定一個 admin 密碼,結束後我們再輸入以下指令進行詳細設定

$ dpkg-reconfigure slapd

按照以下設定

Omit OpenLDAP server configuration? No
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

BASE dc=example, dc=com
URI ldap://10.0.0.1/

編輯 /etc/ldap/slapd.conf,加入下面這行

index uid eq

重新建立 index

$ /etc/init.d/slapd stop
$ slapindex
$ chown -R openldap:openldap /var/lib/ldap
$ /etc/init.d/slapd start

到這裡 LDAP 就已經建立完成,可以透過以下指令來測試LDAP 是否運作正常

$ ldapsearch -x

# extended LDIF
#
# LDAPv3
# base (default) with scope subtree
# 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

$ slapcat

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

dn: ou=People,dc=example,dc=com
ou: People
objectClass: organizationalUnit

dn: ou=Group,dc=example,dc=com
ou: Group
objectClass: organizationalUnit

加入我們剛剛建立的群組檔案到 LDAP 中

$ /etc/init.d/slapd stop
$ slapadd -c -v -l ou.ldif
$ /etc/init.d/slapd start

現在就可以透過指令查到我們剛剛建立在 LDAP 中的群組了

$ ldapsearch -x ou=people

# extended LDIF
#
# LDAPv3
# base (default) with scope subt
# 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

dn: cn=ldap,ou=group,dc=example,dc=com
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 中

$ ldapadd -c -x -D cn=admin,dc=example,dc=com -W -f user.ldif
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”

為使用者建立初始密碼

$ ldappasswd -x -D cn=admin,dc=example,dc=com -W -S 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 的使用者資料了

$ ldapsearch -x uid=ldap

# extended LDIF
#
# LDAPv3
# base (default) with scope subtree
# 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
id: ldap: No such user

必須安裝以下套件才可以達到我們想要的結果

$ aptitude install libnss-ldap nscd

按照以下設定

LDAP server URI: ldap://10.0.0.1/
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
將這兩項改成下列所示

passwd: files ldap
group: files ldap

然後先將快取服務暫停,以取得最新帳號資料

$ /etc/init.d/nscd stop
$ id ldap

uid=20000(ldap) gid=20000(ldap) groups=20000(ldap)

到此為只已經可以讓 Ubuntu 認得 LDAP 上的帳號了
不過要讓帳號登入還需要一些步驟

PAM 設定

修改 /etc/pam.d/common-account 成下列所示

account sufficient pam_unix.so
account required pam_ldap.so

修改 /etc/pam.d/common-auth 成下列所示

auth [success=1 default=ignore] pam_unix.so nullok_secure
auth required pam_ldap.so use_first_pass
auth required pam_permit.so

修改 /etc/pam.d/common-password 成下列所示

password sufficient pam_unix.so nullok obscure md5
password required pam_ldap.so use_first_pass

修改 /etc/pam.d/common-session成下列所示

session required pam_unix.so
session required pam_mkhomedir.so skel=/etc/skel/ umask=0022

完成了這些步驟之後,就可以透過 LDAP 上的使用者帳號及密碼來登入 Ubuntu 了
不過如果要讓使用者在任何機器上都可以使用同一個家目錄,還需要一些設定

NFS 安裝與設定

安裝 NFS

$ aptitude install nfs-common nfs-kernel-server

在裝有 LDAP 的 Server 端編輯 /etc/exports
加入下面一行

/home 10.0.0.1/255.255.255.0(rw)

在 Client 端編輯 /etc/fstab
加入下面一行

10.0.0.1:/home /home nfs defaults 1 1

如此一來,Client 在每次開機的時候就會載入 Server 端的家目錄到 /home 底下,所以能夠保證使用者資料能夠同步了

後記

起初 Mowd 是用 Ubuntu 10.04 安裝 OpenLDAP
不過新版的 OpenLDAP 針對設定檔的架構有了大幅度的修改
不再使用單一設定檔 slapd.conf 而是改用目錄架構
又因為網路上能夠找到的相關文章時在少之又少
所以先暫時用 Ubuntu 8.04 來安裝了
在安裝的過程中還因為不小心改爛了 nsswitch.conf 而重裝了一次系統 XD
只能說要修改登入機制的時候實在要特別小心啊

參考資料
http://techpubs.spinlocksolutions.com/dklar/ldap.html
http://server.zol.com.cn/127/1270885.html

在〈Ubuntu 設定 LDAP + PAM + NFS 實現多台電腦單一帳號驗證〉中有 4 則留言

  1. cnx

    您好请问一下pam如何通过ldap进行认证的?我现在的理解是通过ldapsearch查询用户,但是密码是作为什么参数传输的呢?

    回覆

發佈回覆給「xiaoma」的留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *