[Power by FreeBSD]
顏國雄 2006/07/27
以 LDAP 整合帳號
2006/07/28 修改 

一般來說,FreeBSD 的主機預設是以本機 /etc 目錄中的密碼檔 (passwd, pwd.db, master.passwd, spwd.db) 和 /etc/group 來識別使用者身份及供作認證資料, 自 FreeBSD 5.x 開始引入了 NetBSD 中的 NSS (Name Service Switch) 機置,讓系統的認證方式更多元。

下面是利用 LDAP 集中認證資料於 LDAP Server 上,其它主機再利用 pam_ldap 及 nss_ldap 來向 LDAP Server 要資料並驗證使用者的帳號和密碼,以取得登入系統的權力。

1 LDAP Server 端

首先我們先架設一台 LDAP Server 來儲存使用者的帳號資料,供其它的 servers 來查詢,下面以 OpenLDAP 2.2 來說明安裝的流程。

1-1 安裝 OpenLDAP 2.2

最懶的、最快的方法當然是透過網路用 packages 來安裝囉!執行以下的指令:

# pkg_add -vr openldap22-server

不然就是用 ports 來自己編譯,確定已經更新好 ports tree 後執行底下指令:

# cd /usr/ports/net/openldap22-server
# make
# make install
# make clean

不論以前述的哪一種方法安裝,如果正常的話,應該都會安裝了 OpenLDAP 2.2 版的 server 和 client 端的程式。

 

1-2 設定 OpenLDAP Server

安裝完 OpenLDAP 以後,系統中應該會多一個叫 /usr/local/etc/openldap 的目錄,裡面有兩個我們需要修改的設定檔:

  • slapd.conf:服務程式 slapd 的設定檔,也是本小節的設定重點。
  • ldap.conf:這是用戶端程式會去讀取的設定檔。

 

1-2-1 修改 /usr/local/etc/openldap/slapd.conf

利用 FreeBSD 的 packages/ports 安裝完 OpenLDAP 會附上一個叫 slapd.conf.default 的檔案供我們參考,如果 sldapd.conf 不存在,可以先將 slapd.conf.default 複製成 slapd.conf 後,再執行以下的指令來修改 slapd 的設定檔:

# ee /usr/local/etc/openldap/slapd.conf

我們至少在裡面置入以下的內容:

include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/nis.schema

pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args

database bdb

suffix "dc=happy,dc=edu,dc=tw"
rootdn "cn=root,dc=happy,dc=edu,dc=tw"
rootpw {SSHA}/fnDhdeT/UN03QG4uq2d4HYXpFTBewd4


directory /var/db/openldap-data

index objectClass eq
index uid pres,eq,sub

 

其中的 suffix , rootdn , rootpw 請自行更換內容,這三個選項的意義如下:

  • suffix:假設我的 domain name 是 happy.edu.tw ,就放 "dc=happy,dc=edu,dc=tw"
  • rootdn:假設 OpenLDAP Server 的管理帳號叫 root (當然要叫 Manager 也可以啦!) ,加上前面的 suffix 就填入 "cn=root,dc=happy,dc=edu,dc=tw"
  • rootpw:是前述 rootdn 管理帳號的密碼,其內容可以用明碼,也可以用 slappasswd 來產生編過碼的內容再貼上,下面是利用 slappasswd 來將 123 編碼的過程

    # slappasswd
    New password: 123
    Re-enter new password: 123
    {SSHA}/fnDhdeT/UN03QG4uq2d4HYXpFTBewd4

注意:前述的設定內容少了 ACL 來控管資料的存取權限,也就是任何人都可能透過 LDAP 的查詢取得密碼,相當的危險,所以,測試完後別忘了要加上 ACL 的設定作管制。

 

1-2-2 建立基本的資料

假設以 happ.edu.tw 為例,我們先建立存放 user 帳號資料 (類似原來的 /etc/master.passwd的資料) 和 group 資料 (相當於原來的 /etc/group) 的 container 。

編輯一個叫 /root/container.ldif 的文字檔,裡面放入底下的內容:

dn: dc=happy,dc=edu,dc=tw
dc: happy
objectClass: top
objectClass: domain
objectClass: domainRelatedObject
associatedDomain: happy.edu.tw
structuralObjectClass: domain

dn:ou=Group, dc=happy,dc=edu,dc=tw
objectclass: top
objectclass: organizationalUnit
ou: Group
structuralObjectClass: organizationalUnit

dn:ou=People, dc=happy,dc=edu,dc=tw
objectclass: top
objectclass: organizationalUnit
ou: People
structuralObjectClass: organizationalUnit

藍色的部份請自行置換成自己的資料,存好檔後我們就可以準備匯入 LDAP Server 中,執行以下指令:

# slapadd -l /root/container.ldif

 

1-2-3 轉移系統帳號到 LDAP Server

如果想把現有的 /etc/master.passwd 和 /etc/group 匯入 LDAP Server 中,我們可以利用下面由 padl.com 所釋放出來的工具轉換後再匯入 LDAP Server 中:

先由 http://www.padl.com/OSS/MigrationTools.html 網頁中下載 MigrationTools.tgz ,將該檔案解開後先修改裡面的 migrate_common.ph ,配合前一節中 container.ldif 中的設定修改下面兩行:

$DEFAULT_MAIL_DOMAIN = "happy.edu.tw";

$DEFAULT_BASE = "dc=happy,dc=edu,dc=tw";

 

藍色部份請自行置換。

由於轉換密碼檔的程式 migrate_passwd.pl 並非針對 FreeBSD 寫的,所以我們也要稍作修改,將下面這行:

local($user, $pwd, $uid, $gid, $gecos, $homedir, $shell) = split(/:/);

改為下面的內容 (寫成一行哦!):

local($user, $pwd, $uid, $gid, $class, $change, $expired, $gecos, $homedir, $shell) = split(/:/);

主要是 /etc/maser.passwd 的欄位比一般的 passwd 檔的,多了三個欄位的關係。

接著我們就可以進行轉換了,在 MigrationTools 的目錄中執行:

# ./migrate_passwd.pl /etc/master.passwd /root/user.ldif
# ./migrate_group.pl /etc/group /root/group.ldif

下面是 /etc/master.passwd 轉完的其中一筆資料:

dn: uid=gsyan,ou=People,dc=happy,dc=edu,dc=tw
uid: gsyan
cn: G.S. Yan
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: {crypt}$1$abc7defg$hij8kLMnopqrSTUV445wxy
loginShell: /bin/csh
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/gsyan
gecos: G.S. Yan

注意:上面轉出的 objectClass 為 account , posixAccount , top ,這樣的資料可在 FreeBSD, Linux 上通用,如果 objectClass 有 shadowAccount ,FreeBSD 的 client 端的 nss_ldap ports 要經過修改後才可以抓到正確的密碼欄位。

下面是 /etc/group 轉完的其中一筆資料:

dn: cn=wheel,ou=Groups,dc=happy,dc=edu,dc=tw
objectClass: posixGroup
objectClass: top
cn: wheel
userPassword: {crypt}*
gidNumber: 0
memberUid: gsyan
memberUid: root

最後,再將 /root/user.ldif 和 /root/group.ldif 匯入 LDAP Server,執行:

# slapadd -l /root/user.ldif
# slapadd -l /root/group.ldif

 

1-2-4 啟動 OpenLDAP Server

和其它服務一樣,我們要啟動 OpenLDAP Server 要先在 /etc/rc.conf 中加入下面這行:

slapd_enable="YES"

然後就可以執行下面的指令來啟動 LDAP 服務:

/usr/local/etc/rc.d/slapd.sh start

要暫時停止服務當然就是執行:

/usr/local/etc/rc.d/slapd.sh stop

 

1-2-5 查詢 LDAP Server 中的資料

在 OpenLDAP 的 client 程式中有個叫 ldapsearch 的工具可以讓我們查詢 LDAP Server 中的資料,使用之前我們先修改 /usr/local/etc/openldap/ldap.conf ,假設我的 LDAP Server 主機叫 test.happy.edu.tw ,就在 ldap.conf 裡面加入底下的內容:

BASE dc=happy,dc=edu,dc=tw
URI ldap://test.happy.edu.tw/

藍色的部份請自行置換。

存好檔後我們就可以來測試一下囉:

# ldapsearch -x

如果不想改修改 /usr/local/etc/openldap/ldap.conf ,或是想查其它的 LDAP Server ,我們也可以執行下面的指令:

# ldapsearch -x -h test.happy.edu.tw -b 'dc=happy,dc=edu,dc=tw'

ldapsearch 詳細的用法請自行 man ldapsearch 。

執行完應該會看到之前匯入的資料顯示在螢幕上。確定可以進行查詢後,我們就可以測試由別台主機來查詢資料並進行認證的部份。

 

2 LDAP Client 端

在 LDAP Client 端的主機上我們至少要安裝 pam_ldap 和 nss_ldap 。

2-1 安裝 pam_ldap 和 nss_ldap

如果使用舊版的 nss_ldap ,由 LDAP Server 查詢到的使用者資料如果有 shadowAccount 的 objectClass ,對於密碼會有錯誤的處理,會因此而導致登入失敗,所以建議 nss_ldap 最好先更新 ports tree 後,利用 ports 來安裝最新版的程式,以免產生困擾。

安裝 net/nss_ldap:

# cd /usr/ports/net/nss_ldap
# make
# make install
# make clean

安裝 security/pam_ldap:

# cd /usr/ports/security/pam_ldap
# make
# make install
# make clean

 

2-2 設定 pam_ldap 和 nss_ldap

pam_ldap 和 nss_ldap 的設定檔內容其實是一樣的,檔案分別叫 /usr/local/etc/ldap.conf 和 /usr/local/etc/nss_ldap.conf,所以我們可以先修改 /usr/local/etc/ldap.conf (可別和 /usr/local/etc/oepnldap/ldap.conf 搞混了!) 然後再用 soft link 處理 nss_ldap.conf 。

執行以下指令修改 /usr/local/etc/ldap.conf:

# ee /usr/local/etc/ldap.conf

然後依 LDAP Server 的設定來修改以下的內容

uri ldap://192.168.1.10/

binddn cn=root,dc=happy,dc=edu,dc=tw

bindpw 123

nss_base_passwd ou=People,dc=happy,dc=edu,dc=tw?one
nss_base_shadow ou=People,dc=happy,dc=edu,dc=tw?one
nss_base_group ou=Groups,dc=happy,dc=edu,dc=tw?one

說明:

  • 假設我們前面構建好的 OpenLDAP Server IP 為 192.168.1.10,所以 LDAP 查詢的 URI 是 ldap://192.168.1.10/
  • binddn 和 bindpw 是依據前面 OpenLDAP Server 的 slapd.conf 設定內容而來的,但是 bindpw 必須用明碼。
  • nss_base_passwd , nss_base_shadow 和 nss_base_group 則是依據我們前面利用 /root/container.ldif 匯入 LDAP Server 的內容,也就是告訴主機:以後要查使用者的帳號密碼及所屬群組資料查詢的關鍵字(欄位)是什麼。

最後,建立一個 soft link 來產生 /usr/local/etc/nss_ldap.conf,執行以下指令:

# cd /usr/local/etc
# ln -s ldap.conf nss_ldap.conf

 

2-3 修改 /etc/nsswitch.conf

重頭戲來了,我們要修改 /etc/nsswitch.conf ,告訴系統使用 LDAP 來查使用者的資料,這個檔案有兩種改法,第一種方式要修改三個檔案,而第二種方法只要改一個檔案,自己選擇囉。

2-3-1 修改 /etc/nsswitch.conf 第一種方法

假設 FreeBSD 5.x , 6.x /etcnsswitch.conf 的原始內容為:

group: compat
group_compat: nis
hosts: files dns
networks: files
passwd: compat
passwd_compat: nis
shells: files

修改 group_compat 和 password_compat 的那兩行為底下的內容後存檔:

group_compat: ldap nis

passwd_compat ldap nis

再來如同架設 NIS 一樣,要修改密碼檔和 /etc/group。

1.執行 vipw 修改密碼檔,在最後面加上底下這行:

+:*::::::::

2.修改 /etc/group ,在最後面加上底下這行:

+:*::

上面兩個的冒號數可別算錯了,要是覺得麻煩,可以採用底下的第二種方法,只要修改 /etc/nsswitch.conf 即可。

 

2-3-2 修改 /etc/nsswitch.conf 第二種方法

第二種方法只要修改 /etc/nsswitch.conf 即可,假設原來的內容為:

group: compat
group_compat: nis

hosts: files dns
networks: files
passwd: compat
passwd_compat: nis

shells: files

我們將它改為底下的內容:

#group: compat
#group_compat: nis

hosts: files dns
networks: files
#passwd: compat
#passwd_compat: nis

shells: files
group: files ldap
passwd: files ldap

將原來紅色的那四行加上井字號註解掉,新增藍色的那二行。上面設定的意思是,先查本機的資料,如果沒有該使用者,再向 LDAP Server 查詢

 

2-3-3 測試

設定好 /etc/nsswitch.conf ,我們可以執行 id 這個指令來測試:

# id ming
uid=10010(ming) gid=10010(ming) groups=10010(ming)

上面的例子 ming 這個帳號是由 LDAP Server 提供的,再來也可以用 finger 帳號 來查詢 LDAP Server 上建立的帳號。最後可以測試 telnet , ssh , ftp ...... 等服務。

如果用前面的方法一修改 nsswitch.conf ,執行完 id 的結果只出現

# id ming
uid=10010(ming) gid=10010 groups=10010

可能是忘記在 /etc/group 後面加上 +:*:: 了,如果出現 "no such user" ,則可能是密碼檔的後面沒加 +:*::::::::

註:本來應該是要改 /etc/pam.d 中的檔案才可以測試 telnet , ssh , ftp ...... 的,可是我在 FreeBSD 5.4R 和 FreeBSD 6.1 R 上都是改完 /etc/nsswitch.conf 就可以登入囉!

 

3 其它

3-1 幫使用者自動產生 HOMEDIR

如果希望使用者在登入後可以自動建立他的 HOME 目錄,可以安裝下面 pam_mkhomedir 的 ports ,執行下面的指令:

# cd /usr/ports/security/pam_mkhomedir
# make
# make install
# make clean

然後,在 /etc/pam.d/login 或 /etc/pam.d/sshd 中加入底下的這行

session required /usr/local/lib/pam_mkhomedir.so

這樣,下次使用者用 telnet 或 ssh 登入時即可自動幫他建立好 HOME。

 

3-2 Linux 上的設定

在 Linux 主機上我們如果裝好 libpam-ldap 和 libnss-ldap ,設定好後就可以和 FreeBSD 共用使用者資料,再加上 pam_mkhomedir.so (以 Debian 為例),連使用者目錄都可以自動建立好。

以 Debian 來說,libpam-ldap 和 libnss-ldap 的設定檔路徑是:

  • /etc/libnss-ldap.conf
  • /etc/pam_ldap.conf

設定的內容和 FreeBSD 一樣。

而 /etc/nsswitch.conf 則將下面的三行改為:

passwd: compat ldap
group: compat ldap
shadow: compat ldap

基本上,改完上面的檔案,應該就可以執行 id , finger ..... 或進行本機登入、telnet 、ftp ...... ,如果想用 ssh 登入則需要再修改 /etc/pam.d/ssh 的設定,以 Debian 為例,先找到 auth required pam_env.so 這行,然後在它的下面加上這三行:

auth sufficient pam_ldap.so
account sufficient pam_ldap.so
session sufficient pam_ldap.so

改好存檔後即可用 ssh 來測試了。


 


 基礎: 書籤 - 簡介 - 安裝 - Slices - Unix基礎 - 基本指令 - 首次登入 - 目錄架構
 系統: 核心編譯 - 系統升級 - Packages - Ports - PicoBSD - Quota
 網路: 服務管理 - WWW - FTP - MAIL - DNS - Samba - NFS - DHCP - webmin - IMP - OpenWebmail
 其它: Backup - UPS - 系統安全 - ipfw&natd - 撥接服務 - 計時制ADSL - 雜記 - FAQ

北市文山區力行國小顏國雄