Description :
這邊記錄了我最近玩 OpenLDAP 的設定方式,使用 OpenLDAP 取代過去的 NIS ( Network Information Service ) 服務,讓 OpenLDAP 整合 FreeBSD User 帳號及密碼,達成統一管理 ( Single Sign In ) 的簡易管理機智,套一句我們老師常說的話『我們資訊人就是要化繁為簡』Single Sign-In 的機智確實達到化繁為簡了,使用者只要一組帳號密碼就大小通吃真的是很方便。
Environment :
硬體:i386 PC Intel P3 500
記憶體網卡:512M RAM + Intel 網卡
作業系統:FreeBSD 6.2 Release
Setp 1.
安裝 openldap23-server 及 slapd.conf 相關設定:
#cd /usr/ports/net/openldap-server23
#make install clean ; rehash # 先只選擇預 5 項設值,未來有需要用到其他的可透過 make config 再加選再 make install
Options for openldap-server 2.3.33
[X] SASL With (Cyrus) SASL2 support
[X] TCP_WRAPPERS With tcp wrapper support
[X] BDB With BerkeleyDB support
[X] DYNAMIC_BACKENDS Build dynamic backends
[X] SLURPD Build slurpd replication daemon
#vi /etc/rc.conf # 加入開機自動啟動
slapd_enable="YES"
slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/"'
slapd_sockets="/var/run/openldap/ldapi"
#slappasswd -h "{SSHA}" # 加密你要放在 slapd.conf 內中的 rootpw 密碼,一般常用的加密格式有 {CRYPT} {SMD5} {MD5} {SHA} Default 不指定會用 {SSHA}
New password: 1234
Re-enter new password: 1234
{SSHA}JLMNzr9BAyoTUX1s828D7gdPcvmf6oKg # 將這一串加密後的亂數值貼到 slapd.conf 中的 rootpw 後
#vi /usr/local/etc/openldap/slapd.conf
# 載入 openldap 內所定義的 schema
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/corba.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/misc.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/openldap.schema
include /usr/local/etc/openldap/schema/nis.schema
# 運作的 pid 存放位置
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
# 動態載入後端的 modules
modulepath /usr/local/libexec/openldap
moduleload back_bdb
# 設定 ldap 使用權限,讓 userPassword 這個屬性的使用者可寫
access to attrs=userPassword
by self write
by anonymous auth
by dn.base="cn=root,dc=ntut,dc=idv,dc=tw" write
by * none
# 開放 anonymous 可讀,不過只限制在 IP 127.0.0.1 本機及網段 192.168.1.0/24
access to *
by self write
by users read
by anonymous peername.IP=127.0.0.1 read
by anonymous peername.IP=192.168.1.0%255.255.255.0 read
by dn.base="cn=root,dc=ntut,dc=idv,dc=tw" write
by * none
# DBD 資料庫定義及設定 Base DN 及 base DN 管理帳號 root
database bdb
suffix "dc=ntut,dc=idv,dc=tw"
rootdn "cn=root,dc=ntut,dc=idv,dc=tw"
# 剛剛用 slappasswd 產生的加密密碼就貼於此
rootpw {SSHA}LrIJOVYUHLLaSSx+bfzbyc+XvsLfg3hT
# openldap 資料庫存放目錄
directory /var/db/openldap-data
# 設定索引
index objectClass eq
index ou,cn,sn,mail,mobile,givenName eq,pres,sub
index uid,uidNumber,gidNumber,loginShell eq,pres
#chmod 700 /var/log/openldap-data # 修改存放 openldap 資料目錄權限為 700
#cp /usr/local/etc/openldap/DB_CONFIG.example /var/db/openldap-data/DB_CONFIG
#vi /var/db/openldap-data/DB_CONFIG # 修改 DB_CONFIG 的內設定值
set_cachesize 0 268435456 1
set_lg_regionmax 1048576
set_lg_max 10485760
set_lg_bsize 2097152
set_lg_dir /var/db/openldap-data
#vi /etc/syslog.conf # 修改系統 log 讓 ldap 可產生 ldap.log
local4.* /var/log/ldap.log
#vi /etc/newsyslog.conf # ldap 的資料量蠻大的所以要設定 freebsd 定期壓縮 ldap.log
/var/log/ldap.log 640 7 * @TOO JC
#touch /var/log/ldap.log # 手動產生 ldap.log 檔
#/etc/rc.d/syslogd restart # 重新啟動 syslogd
#/etc/rc.d/newsyslog restart # 重新啟動 newsyslog
#/usr/local/etc/rc.d/slapd start # 啟動 openldap
#ps -ax | grep slapd # 確認 ldap 的 process 是否啟動
71692 ?? Ss 0:00.06 /usr/local/libexec/slapd -h ldapi://%2fvar%2frun%2fop
71720 p0 S+ 0:00.01 grep slapd
#netstat -na |grep LISTEN # 確認 389 Service 服務是否開啟
tcp4 0 0 *.389 *.* LISTEN
#vi /usr/local/etc/openldap/ldap.conf # 加入ldap client 搜尋路徑設定
BASE dc=ntut,dc=idv,dc=tw
URI ldap://ldap.ntut.idv.tw/
# ldapsearch -x # 當然也可使用 ldapsearch 來測試 ldap 是否啟動成功
# extended LDIF
#
# LDAPv3
# base <> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
.
.
Setp 2.
新增 OpenLDAP 名錄內容
#mkdir /usr/local/etc/openldap/ldif # 建立一個存放 *.ldif 文字檔目錄
#vi /usr/local/etc/openldap/ldif/bdn.ldif # 編寫一個基本 bdn 值
# Base DN ntut.idv.tw
dn: dc=ntut,dc=idv,dc=tw
objectClass: dcObject
objectClass: organization
o: Personal Test
dc: ntut
# Magager DN is root
dn: cn=root,dc=ntut,dc=idv,dc=tw
objectClass: organizationalRole
cn: root
# ldapadd -x -D "cn=root,dc=ntut,dc=idv,dc=tw" -W -f bdn.ldif # 加入基本 bdn 值
Enter LDAP Password:
adding new entry "dc=ntut,dc=idv,dc=tw"
adding new entry "cn=root,dc=ntut,dc=idv,dc=tw"
#vi /usr/local/etc/openldap/ldif/unixuser.ldif # 編寫一個 Unix User 的物件屬性值內容值
#Organization People
dn: ou=People,dc=ntut,dc=idv,dc=tw
objectClass: organizationalUnit
ou: People
#test account
dn: uid=test,ou=People,dc=ntut,dc=idv,dc=tw
uid: test
cn: test
objectClass: top
objectClass: account
objectClass: posixAccount
userPassword: {CRYPT}CMt6XH1nT/3I2
uidNumber: 18000
gidNumber: 18000
homeDirectory: /home/test
loginShell: /usr/local/bin/bash
gecos: Test User
# ldapadd -x -D "cn=root,dc=ntut,dc=idv,dc=tw" -W -f unixuser.ldif # 加入一個 test 帳號的基本資料
Enter LDAP Password:
adding new entry "ou=People,dc=ntut,dc=idv,dc=tw"
adding new entry "uid=test,ou=People,dc=ntut,dc=idv,dc=tw"
#ldapsearch -x -b "ou=People,dc=ntut,dc=idv,dc=tw" # 用 ldapsearch 可查到剛才新增的 test user 資料
Setp 3.
安裝以下3個套件可讓本機 或 client 的 FreeBSD Server 透過 NSS 及 PAM 溝通與 OpenLDAP Server 認證
#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
#cp /usr/local/etc/ldap.conf.dist ldap.conf
host 127.0.0.1
uri ldap://ldap.ntut.idv.tw
base dc=ntut,dc=idv,dc=tw
rootbinddn cn=root,dc=ntut,dc=idv,dc=tw
pam_filter objectclass=posixAccount
pam_login_attribute uid
bind_policy soft
#cd /usr/local/etc
#ln -s ldap.conf nss_ldap.conf # 把 ldap.conf 及 nss_ldap.conf 聯結在一起
#vi nss_ldap.secret # 填入管理密碼
#chmod 400 nss_ldap.secret # 因為此檔為明碼
#ln -s ldap.secret nss_ldap.secret # 同樣的 .secret 檔也需連結
#vi /etc/nsswitch.conf # 設定 nsswitch 加入 ldap
group: compat
group_compat: ldap nis # 加上ldap
hosts: files dns
networks: files
passwd: compat
passwd_compat: ldap nis # 加上ldap
shells: files
#vipw # 設定帳號登入允許
+:*::::::::
#vi /etc/group # 設定群組登入允許
+:*::
#id test # 查詢有無 test 帳號
uid=18000(test) gid=18000 groups=18000
#cd /etc/pam.d # 切換到 pam 設定目錄下設定有那些服務要透過 pam 認證的
#vi sshd # 改變 sshd 經由 pam 透過 ldap 認證,加入下面兩行,當一個 User login 到 Server 時即會透過 ldap 認證並且建立一個家目錄
auth sufficient /usr/local/lib/pam_ldap.so no_warn try_first_pass
session required /usr/local/lib/pam_mkhomedir.so
#ssh test@localhost # 測試 ssh 透過 ldap 認證
Password:
Last login: Fri Feb 9 12:41:10 2007 from 203.95.194.11
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD 6.2-RELEASE (GENERIC) #0: Fri Jan 12 10:40:27 UTC 2007
Welcome to FreeBSD!
#vi ftp # 同樣 ftp 要透過 ldap 認證也只要加這一行
auth sufficient /usr/local/lib/pam_ldap.so no_warn try_first_pass
# ftp test@localhost # 測試 ftp 是否透過 ldap 認證
Trying ::1...
ftp: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.ntut.idv.tw.
220 vh.ntut.idv.tw FTP server (Version 6.00LS) ready.
331 Password required for test.
Password:
230 User test logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
#vi telnetd # 同樣 telnet 若要透過 ldap 認證也只要加這一行
auth sufficient /usr/local/lib/pam_ldap.so no_warn try_first_pass
#telnet localhost # 測試 telnet 是否透過 ldap 認證
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.ntut.idv.tw.
Escape character is '^]'.
Trying SRA secure login:
User (root): test
Password:
[ SRA accepts you ]
FreeBSD/i386 (ldap.ntut.idv.tw) (ttyp1)
Last login: Fri Feb 9 12:44:35 from localhost.ntut.
Copyright (c) 1992-2007 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD 6.2-RELEASE (GENERIC) #0: Fri Jan 12 10:40:27 UTC 2007
Welcome to FreeBSD!
References.
http://www.weithenn.idv.tw
http://www.google.com
To Add.
※ 物件類別 ( objectclass ) 說明:
於 LDAP 中 Unix 在帳號管理會比 Linux 單純,因為我們用到的 posixAccount 這個物件類別(objectclass),Linux 中帳號管理上比較複雜,它必須要包括了 /etc/password、/etc/shadow、/etc/group 等三個物件。
posixAccount >> 屬性:必要: cn、uid、uidNumber、gidNumber、homeDirectory 選用: userPassword、loginShell、gecos、description
shadowAccount >> 屬性:uid、userPassword 、shadowLastChange 、shadowMin 、shadowMax 、shadowWarning 、shadowExpire 、shadowInactive 、shadowFlag
posixGroup >> 屬性:選用: userPassword、memberUid、description
※ FreeBSD 系統帳號轉移程式:
#cd /root # 運用轉移程式將原本系統帳戶轉為 ldap 格式
#fetch http://www.padl.com/download/MigrationTools.tgz # 取得 MigrationTools 的 perl 程式
#tar -xzvf MigrationTools.tgz # 解開 MigrationTools
#cd MigrationTools-47
#vi migrate_common.ph # 修改 migrate_common.ph 檔
$DEFAULT_MAIL_DOMAIN = "ntut.idv.tw";
$DEFAULT_BASE = "dc=ntut,dc=idv,dc=tw";
#vi migrate_passwd.pl # 修改 migrate_passwd.pl 檔 , 減掉上面那行改為下面那行
- local($user, $pwd, $uid, $gid, $gecos, $homedir, $shell) = split(/:/);
+ local($user, $pwd, $uid, $gid, $class, $change, $expired, $gecos, $homedir, $shell) = split(/:/);
#./migrate_passwd.pl /etc/master.passwd /root/user.ldif # 執行 user 轉換
#./migrate_group.pl /etc/group /root/group.ldif # 執行 group 轉換
#ldapadd -x -D "cn=root,dc=ntut,dc=idv,dc=tw" -W -f user.ldif # 新增使用者
#ldapsearch -x -b "uid=john,ou=People,dc=ntut,dc=idv,dc=tw" # 可查看 john 這個使用者有無新增進去