歡迎轉載 . 轉載前請先以電子郵件或者書面方式告知. 如果有任何修改請來信通知小弟, 不得作為商業用途(包含轉變為任何形式的講義,書籍片段, 網頁文章, 或者教材, 本人會保留任何形式的訴訟權利), 轉載時並請保持此一宣告. 作者: 日京三子 <a843433{at}yahoo{dot}com>
在小弟上班的環境裡, 有個問題一直讓我很困擾. 因為之前Email系統採用的是by real_Account的方式建立.管理時除了不太方便之外, 也沒辦法靈活的運用系統其他資源來做整合, 一如samba, ftp等. 用真實帳號目錄有些許好處, 例如所有系統服務比較直接, 設定時不用想太多; 但缺點就是, 你沒有辦法讓其他主機在沒有建立該使用者帳號的狀態下使用任何服務. 採用LDAP的優點就在這時候出現了! 不論你是甚麼平台, 只要有一台當成主要的LDAP Server, 其他的只要設定正確能夠接收LDAP廣播, 就能夠立刻上線服務與使用.
話說回來, 小弟服務的公司, 之前曾經發生過FreeBsd的Email主機不小心被我砍掉啟動檔, 導致許多服務都不正常的情況. 而且, FreeBsd的系統對我來說, 實在很多地方不是那麼的順手. 當時曾經想過把所有服務都轉移到別台主機上來跑, 但卡在一個問題上, 那就是帳號與密碼. 是的, 帳號與密碼, 因為我公司約有一百名使用者, 部分在中國大陸, 也有客服人員會在國外各地遊走. 建立一百個帳號很簡單, 但要通知使用者更換密碼或者更換密碼的方法都是一件困難重重的事情. 在上面兩點的考慮下, 就開始了下面的LDAP + Account + Email Server + OpenWebMail的安裝教學筆記..
要先準備的工具:
1. MigrationTools.tgz. 請到 http://www.padl.com/OSS/MigrationTools.html 閱讀相關說明與下載.
2. Openldap. 請到 http://www.openldap.org 下載.
3. OpenWebmail. 請到 http://www.openwebmail.org 下載.
4. ldapBrowser282b2. 一個GUI介面, 用Java所寫的管理LDAP程式, 支援中文輸入. 請到 http://www.iit.edu/~gawojar/ldap/download.html 閱讀相關說明與下載.
(先說明一下, 我是按照旗標出版社所出版的"Linux網路管理實務"一書(註1)建構我整個的LDAP環境. 所以很多東西幾乎是直接抄襲人家的.)
我在腦海裡面建立的主要根( .root )模型是這樣的
dn: dc=your,dc=com
objectClass: top
objectClass: domain
dc: your
我把上面的宣告取名叫做base.ldif.
要注意的是最後面這個dc, 這個是指你的主要網域節點名稱, 以ibm.com來說, 這個後面的dc就是指ibm.再來, 是宣告主節點的樣式. 依照"網路管理實務"一書的思維, 我建立了主節點, 也就是主要的兩個類別:
dn: ou=People,dc=your,dc=com
objectClass: top
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=your,dc=com
objectClass: top
objectClass: organizationalUnit
ou: Group
我把上面的宣告, 取名叫做container.ldif. (註2)
準備好之後, 開始進行安裝. 因為我有一個先決環境, 已經有一台FreeBsd, 所以我要先利用 MigrationTools.tgz 裡面的各項工具程式把帳號密碼給dump出來. 在那之前, 先修改一下這支工具程式的設定檔.
$NETINFOBRIDGE = (-x "/usr/sbin/mkslapdconf");
if ($NETINFOBRIDGE) {
$NAMINGCONTEXT{'aliases'} = "cn=aliases";
$NAMINGCONTEXT{'fstab'} = "cn=mounts";
$NAMINGCONTEXT{'passwd'} = "cn=People";
$NAMINGCONTEXT{'netgroup_byuser'} = "cn=netgroup.byuser";
$NAMINGCONTEXT{'netgroup_byhost'} = "cn=netgroup.byhost";
$NAMINGCONTEXT{'group'} = "cn=Group";
$NAMINGCONTEXT{'netgroup'} = "cn=netgroup";
$NAMINGCONTEXT{'hosts'} = "cn=machines";
$NAMINGCONTEXT{'networks'} = "cn=networks";
$NAMINGCONTEXT{'protocols'} = "cn=protocols";
$NAMINGCONTEXT{'rpc'} = "cn=rpcs";
$NAMINGCONTEXT{'services'} = "cn=services";
} else {
$NAMINGCONTEXT{'aliases'} = "ou=Aliases";
$NAMINGCONTEXT{'fstab'} = "ou=Mounts";
$NAMINGCONTEXT{'passwd'} = "ou=People";
$NAMINGCONTEXT{'netgroup_byuser'} = "nisMapName=netgroup.byuser";
$NAMINGCONTEXT{'netgroup_byhost'} = "nisMapName=netgroup.byhost";
$NAMINGCONTEXT{'group'} = "ou=Group";
$NAMINGCONTEXT{'netgroup'} = "ou=Netgroup";
$NAMINGCONTEXT{'hosts'} = "ou=Hosts";
$NAMINGCONTEXT{'networks'} = "ou=Networks";
$NAMINGCONTEXT{'protocols'} = "ou=Protocols";
$NAMINGCONTEXT{'rpc'} = "ou=Rpc";
$NAMINGCONTEXT{'services'} = "ou=Services";
}
# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "your.com";
# Default base
$DEFAULT_BASE = "dc=your,dc=com";
各位要注意, 因為裡面有些部分是不同的. 起因是我的主節點是宣告為People 跟Group (大寫的, 原始的設定檔是小寫的people跟group). 還有在下面的那行宣告,
$DEFAULT_BASE , 這部分一定要修改, 因為這會影響到等等生成的使用者帳號檔案(你總不會想因為這點小錯誤, 導致你要修改一兩百個帳號吧! :x ) 當然, 你想看到詳細的說明部分, 請看旗標的"Linux網路管理實務"一書.
接著, 因為我要先從FreeBsd取得帳號與密碼, 所以就先在FreeBsd主機上面下這行命令.
./migrate_passwd.pl /etc/master.passwd /tmp/user.ldif
當然, 你也可以順便把群組一起轉出來. 但, 因為我先前的主機管理做的很差, 一個帳號就一個群組. 所以我選擇等等自己建立.
此時, 打開這個我們利用工具程式轉換出來的帳號檔案, 看看內容.
dn: uid=abcd,ou=People,dc=your,dc=com
uid: abcd
cn: abcd
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$1$ahz3dh5h$TrjekyZu/y5yKXwud5zWO/
shadowLastChange: 12481
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 514
gidNumber: 502
homeDirectory: /home/abcd
因為我真正要跑LDAP的主機是採用AMDx64_K8版本的Fedora_Core_2, 他上面所吃的格式有些許的不同, 所以我做了以下的修改:
dn: uid=abcd,ou=People,dc=your,dc=com
uid: abcd
cn: 這裡可以放中文使用者名稱
sn: abcd
objectClass: posixAccount
objectClass: top
objectClass: person
objectClass: inetOrgPerson
loginShell: /bin/bash
userPassword: {MD5}KgccP6INm+SIMD35+Lo1XA==
uidNumber: 1065
gidNumber: 10101
homeDirectory: /home/abcd
mail: abcd@your.com
基於方便, 我把帳號密碼檔案定名為user.ldif.
注意! 因為我後面有規劃讓ooutlook express的使用者用"通用通訊錄"的功能, 所以我在這邊建立了cn欄位 (放中文使用者名稱. 但, 請特別注意, 此地並不能接受你直接填入中文, 必須透過thiry party程式來協助建立與修改, 例如
ldapBrowser282b2), 與mail欄位 (放郵件帳號).
有了帳號與密碼, 下一個目標就是讓另外一台主機跑LDAP服務. 如果是RedHat系的, 在你安裝的時候預設就會塞進來, 就算你選最小安裝時也會自動安裝. 當然, 如果你不是RedHat系的, 經過檢查也沒發覺主機上有安裝相關套件的跡象, 此時, 請到
http://www.openldap.org 下載. 切記, 最新的不一定是好! (某 x京x子 的切身之痛 :x )
(請原諒我的無知, 因為我只專長於RedHat系的, 所以下面都是使用rpm格式安裝出來, 如果您不是採用RedHat系的, 請自行修改! )
在安裝完成之後, 首先, 確認安裝程式已經把相關的設定檔案放置在 /etc/openldap 目錄底下. 以我採用的Fedora_Core_2為例, 只有這兩個檔案ldap.conf , slapd.conf 與 ldif , schema 這兩個目錄. 接著, 動手修改sldap.conf, 設定你跑openldap的環境. 主要要修改的地方只有這裡
database ldbm
suffix "dc=your,dc=com"
rootdn "uid=root,ou=People,dc=your,dc=com"
rootpw secret
分別定義了你所使用的資料庫格式, 主dn宣告, 管理者帳號(rootdn, 很多軟體會叫你設定帳號, 千萬別忘記是他唷!), 還有密碼(rootpw, 很多軟體會叫你設定密碼, 別懷疑, 就是這兩個!! ). 當然, 密碼可以是明文(例如你打ABCD, 那密碼就是大寫的ABCD), 也可以利用slappasswd來編碼. 在修改好之後, 我們讓ldap跑起來.
/etc/rc.d/init.d/ldap start
, 然後依序匯入base.ldif, container.ldif, 與 user.ldif, 利用下面的格式:
ldapadd -x -f base.ldif -D "uid=root,ou=People,dc=your,dc=com" -W
(註3)輸入密碼(rootpw)之後, 你就會看到系統回應加入成功的訊息. 新增這三者(base, container, user)完成之後, 我們來檢查一下系統運作是否正常. 利用
ldapsearch -x -b "ou=People,dc=your,dc=com" uid=*
你應該會看到一堆文字飛過去, 就像下面這樣
# abcd, People, your.com
dn: uid=abcd,ou=People,dc=your,dc=com
uid: abcd
cn: abcd
sn: abcd
objectClass: posixAccount
objectClass: top
objectClass: person
objectClass: inetOrgPerson
loginShell: /bin/bash
userPassword:: e01ENX1LZ2NjUDZJTm0rU0lNRDM1K0xvMVhBPT0=
uidNumber: 1065
gidNumber: 10101
homeDirectory: /home/abcd
mail: abcd@your.com
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2
到此, 你就已經算是有個成功的開始了!
註1:
此書完整的名稱是. "LINUX 網路管理實務 調教, 帳號, 監控, 安全" , 施威銘研究室著, 旗標出版社, 編號F499, ISBN為957-442-111-2
註2:
如果一開始就看上面那本旗標的, 真的只會一知半解. 強烈建議另外買一本O'REILLY出版社的LDAP系統管理(LDAP System Administration, Gerald Carter著, 蔣大偉 編譯, 編號A130, ISBN為986-7794-21-4). 此書在一開始時立即把一些欄位的相關名詞的定義法則告訴各位.
註3:
RedHat安裝時預設是不加密模式, 也就是不啟動ssl, 所以你一定要特別下-x 指令關閉加密傳遞. 如果有這種需求, 必須自己編譯, 或者花錢買RHES(純聽說, 不確定是不是這個版本才有, 請洽詢你的軟體經銷商確認).
期待後面的部分吧~~
