----------------------------------------------------------------------------------
(5) OpenLDAP的應用(導入現有的帳號資料)
----------------------------------------------------------------------------------
對于網絡管理員來說,LDAP最經常的用途是作為多種服務器共同的帳號數據庫. OpenLDAP非常
適合于用來統籌管理帳號信息, 讓管理員只做一次增加,刪除和修改等動作, 就可應用于整個
組織.
【引入所需模式】
要讓LDAP目錄能儲存帳號信息,還必須引入(include)具有合適對象類別的模式(schema),例如
要想使用原本儲存于/etc/passwd和/etc/shadow文件中的帳號,就必須先引入nis.schema模式,
因為該模式提供了posixAccount和shadowAccount兩個對象類(objectClass),可用以滿足上述
要求. 此外, 如果還想要儲存全公司通用的用戶帳號, 你還需要cosine.schema模式所定義的
account對象類. 檢查并修正前述的/etc/ladp/slapd.conf配置文件,確認包含如下選項:
cat /etc/ldap/slapd.conf; #帳號管理所需的模式等配置;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
index cn,uid eq
index uidNumber eq
index gidNumber eq
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(注: 可用egrep過濾查詢命令: cat /etc/ldap/slapd.conf | egrep '^index|^include';)
請注意: 上述三個索引(index)的作用是提高搜索速度.
【轉換現有的帳號數據】
PADL軟件公司提供了一組轉換工具,可從現有的/etc/passwd和/etc/shadow文件中取得數據并
將之轉換成LDIF格式的文件. 這個工具叫MigrationTools(一組Perl腳本),可從如下地址下載:
http://www.padl.com/OSS/MigrationTools.html
wget
http://www.padl.com/download/MigrationTools.tgz;
tar zxvf MigrationTools.tgz;
cd MigrationTools-47/;
執行任何轉換任務之前,必須先編輯migrate_common.ph這個配置文件,以便將幾個重要的變數
設定成符合您的系統的實際情況. 需要修改的參數大概是如下幾個:
$DEFAULT_MAIL_DOMAIN 缺省的DNS域名;
$DEFAULT_BASE 缺省的基本域名(即根的域名);
$DEFAULT_MAIL_HOST 缺省的
vim ./migrate_common.ph; #如下是適用于我的系統的設置;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$DEFAULT_MAIL_DOMAIN = "hung.mooo.com";
$DEFAULT_BASE = "dc=hung,dc=mooo,dc=com";
$DEFAULT_MAIL_HOST = "mail.hung.mooo.com";
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
./migrate_passwd.pl /etc/passwd /tmp/passwd.ldif; #轉換passwd文件;
cat /tmp/passwd.ldif; #
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
dn: uid=root,ou=People,dc=hung,dc=mooo,dc=com
uid: root
cn: root
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$1$pXy0ET57$QdbsSV0FGxcff80OjbZBQ/
shadowLastChange: 13814
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 0
gidNumber: 0
homeDirectory: /root
gecos: root
...(省略)...
dn: uid=testing,ou=People,dc=hung,dc=mooo,dc=com
uid: testing
cn: testing
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}cCiyk5hxetmRY
shadowLastChange: 13829
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1002
gidNumber: 1002
homeDirectory: /home/testing
gecos: testing
...(省略)...
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
從上述LDIF數據可看出,因為這些節點都是定義在ou=People這個節點下面的:
cat /tmp/passwd.ldif | grep 'dn:'; #看看所有需添加的節點的dn內容;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
dn: uid=root,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=daemon,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=bin,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=sys,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=sync,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=games,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=man,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=lp,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=mail,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=news,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=uucp,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=proxy,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=www-data,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=backup,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=list,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=irc,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=gnats,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=nobody,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=Debian-exim,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=statd,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=identd,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=bind,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=sshd,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=named,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=apache,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=testing,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=openldap,ou=People,dc=hung,dc=mooo,dc=com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
如果在之前的操作中并未添加過這個節點的話, 那么就必須先產生這個節點. 當然您可以自己
手工來添加這個節點, 但是有一個更方便的做法, 就是利用MigrationTools這組工具中附帶的
一個Perl腳本來自動生成. 這個腳本及其使用方法請參考如下:
./migrate_base.pl > /tmp/people.ldif;
cat /tmp/people.ldif; #看看
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
dn: dc=mooo,dc=com
dc: mooo
objectClass: top
objectClass: domain
dn: dc=hung,dc=mooo,dc=com
dc: hung
objectClass: top
objectClass: domain
...(省略)...
dn: ou=People,dc=hung,dc=mooo,dc=com
ou: People
objectClass: top
objectClass: organization**it
dn: ou=Group,dc=hung,dc=mooo,dc=com
ou: Group
objectClass: top
objectClass: organization**it
...(省略)...
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
請注意: 在上述命令所創建的LDIF內容中,除了第一個和第二個節點通常可能因為系統中已經
存在或者格式不合, 因此不能導入LDAP數據庫之外,其他節點應該都是具有全新dn內容的節點.
如果是為了學習目的,建議您將上述LDIF文件的整個文件的內容都導入到LDAP數據庫中, 當然
如果您不愿意添加太多節點到您的LDAP數據庫中的話,也可以編輯上述文件的內容, 但至少要
包含其中的 ou=People,dc=hung,dc=mooo,dc=com 和 ou=Group,dc=hung,dc=mooo,dc=com 這
兩個節點, 因為這兩個節點就是下一個導入步驟(后面還需要轉換/etc/group文件)中將需要
的父節點. 導入命令參考如下:
ldapadd -x -D "cn=admin,dc=hung,dc=mooo,dc=com" -W -f /tmp/people.ldif;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Enter LDAP Password:
adding new entry "ou=People,dc=hung,dc=mooo,dc=com"
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ldapsearch -x -b 'dc=hung,dc=mooo,dc=com' '(objectclass=*)' -LL; #看看所有樹節點;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
dn: dc=hung,dc=mooo,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: hung.mooo.com
dc: hung
dn: cn=admin,dc=hung,dc=mooo,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
dn: ou=People,dc=hung,dc=mooo,dc=com
ou: People
objectClass: top
objectClass: organization**it
dn: ou=Group,dc=hung,dc=mooo,dc=com
ou: Group
objectClass: top
objectClass: organization**it
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
請注意: 上述資料顯示現在ou=People和ou=Group這兩個節點已經添加進入LDAP數據庫中了;
ldapadd -x -D "cn=admin,dc=hung,dc=mooo,dc=com" -W -f /tmp/passwd.ldif;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Enter LDAP Password:
adding new entry "uid=root,ou=People,dc=hung,dc=mooo,dc=com"
adding new entry "uid=daemon,ou=People,dc=hung,dc=mooo,dc=com"
adding new entry "uid=bin,ou=People,dc=hung,dc=mooo,dc=com"
adding new entry "uid=sys,ou=People,dc=hung,dc=mooo,dc=com"
adding new entry "uid=sync,ou=People,dc=hung,dc=mooo,dc=com"
...(省略)...
adding new entry "uid=testing4,ou=People,dc=hung,dc=mooo,dc=com"
adding new entry "uid=openldap,ou=People,dc=hung,dc=mooo,dc=com"
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
上述命令執行后的信息顯示,所有節點都添加成功了! 現在在看看LDAP數據庫的目錄樹:
ldapsearch -x -b 'dc=hung,dc=mooo,dc=com' '(objectclass=*)' -LL | grep 'dn:';
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
dn: dc=hung,dc=mooo,dc=com
dn: cn=admin,dc=hung,dc=mooo,dc=com
dn: ou=People,dc=hung,dc=mooo,dc=com
dn: uid=root,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=daemon,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=bin,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=sys,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=sync,ou=People,dc=hung,dc=mooo,dc=com
...(省略)...
dn: uid=testing4,ou=People,dc=hung,dc=mooo,dc=com
dn: uid=openldap,ou=People,dc=hung,dc=mooo,dc=com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
參考前述的轉換和導入步驟,將/etc/group文件也轉換并導入LDAP數據庫:
./migrate_group.pl /etc/group /tmp/group.ldif;
ldapadd -x -D "cn=admin,dc=hung,dc=mooo,dc=com" -W -f /tmp/group.ldif;
----------------------------------------------------------------------------------