Name Service Switch 是 Linux 幫助查詢與統整各式資料的協定,例如帳號、群組、主機名稱~
PAM 則是帳號認證的模組,讓你可以動態的換掉認證的方式。
透過 Ldap 資料庫跟這兩個模組的合併,對伺服器帳號統整管理有很大的威力~
這文章主要在介紹大致上需要安裝的流程與相關設定檔,並簡介 ldap 相關概念。
$ yum install ldap ldap-clients ldap-servers #client 設定檔 用於指令 ldapadd , ldapsearch .. $ vim /etc/openldap/ldap.conf #server 設定檔 , 用於 Server 運作設定檔. $ vim /etc/openldap/slapd.conf
主要設定 dn=Manager,dc=domain,dc=com 這些東西變成你自己的,還有密碼 rootpw 這東西~ 另外啟動的時後會出現如下的錯誤:
$service ldap start bdb_db_open: Warning - No DB_CONFIG file found in directory /var/lib/ldap: (2)
參考這個網頁 http://readthefuckingmanual.net/error/1256/ 提到要複製一個設定檔 ,CentOS 如下,重啟就ok了
$cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG $chown ldap:ldap /var/lib/ldap/DB_CONFIG
途中要新增時不斷遇到密碼錯誤的問題,結果是設定檔要求很嚴格…
ldap_bind: Invalid credentials (49)
passwd[tab]secret #ok passwd[tab][space]secret #error passwd[tab]secret #error
觀念:
- RDN:Relative Distinuished Name 每個 Node 都有一個名字再他自己的層級裡面是獨一無二的。例如 dn=Manager 這個 Manager 就是他自己同階層只有一個叫 Manager 的物件。
- DN:Distinuished Name 對整個樹狀結構來講,都是獨一無二的節點名稱,所以就要包括整個樹狀結構的層級了,例如 dn : cn = mlwmlw,o = antslabt.tw ,antslab 的 mlwmlw 就能定位到這個單位的 mlwmlw 這個人了,他的 rdn 就是 mlwmlw
- objcetclsss: 每個 node 都會有他的類別,每個類別都有很多屬性(attr),這種類別可以繼承,跟物件導向的概念差不多,ldap 有一些內建標準的類別,例如 organization 是公司的類別,就需要設定公司所需要的屬性,例如公司名字、電話、員工等等~, 這些內建的 schema 都放在 /etc/openldap/schema/.. 下面例如 core.ldif 的 organziational 一個 objectclass 的定義大概就是名稱(name)、描述(desc)、繼承自(sup)、必要屬性(must)、選用屬性(may)
olcObjectClasses: ( 2.5.6.5 NAME 'organizationalUnit' DESC 'RFC2256: an organizational unit' SUP top STRUCTURAL MUST ou MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $障 postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) )
attribute: 屬性,因為 objcetclass 會定義一個類別裡面會有什麼資料,而資料的型態跟內容就靠這個定義,
下面是一個範例,定義了 id、名稱、描述、型態,繼承自~
olcAttributeTypes: ( 2.5.4.10 NAME ( 'o' 'organizationName' ) DESC 'RFC2256: organization this object belongs to' SUP name )
例如上面的 organization 就需要(must)填 o (organziationName) 屬性
管理軟體:
試了 phpldapadmin 感覺不是很完整,按一按就出錯了~
後來改用 ldap-account-manager 感覺比精簡幹要~介面也比較和善~還有中文呢~
只是他是針對帳號管理設計的,對於完整設定的 objcetclass 較缺乏,可以用 ldapadmin 這個 桌面 gui 軟體來管理。
帳號整合:
因為要把所有 linux 帳號都轉到 ldap 資料庫內,所以需要一些工具輔助。
http://www.padl.com/OSS/MigrationTools.html
解壓縮以後裡面有一些工具跟設定檔,要改設定檔裡面 mirgate_common.ph 的 base dc ~
這樣指令就正常能運作了~
$ migrate_passwd.pl /etc/passwd users.ldif $ migrate_group.pl /etc/group group.ldif
這樣就能把使用的資料跟群組都轉出來了,這邊注意 passwd 要用 root 去轉,因為他會去讀 /etc/shawod 的資料,如果不是 root 會沒有權限,跑出來 userPasswd 都是 {crypt}x。
然後就用
ldapadd -x -f user.ldif -D "cn=Manager,dc=antslab,dc=tw" -W
導入到 ldap Server 裡面~
然後就可以用 ldap Server 來驗證使用者登入了,要設定 nsswitch 跟 pam_ldap,這東西都要先裝好~
只是小心不要裝太新的預設應該就有了…我手癢用 ius 裝太新的就出事了…針對 host 認證那邊一直卡住
$ authconfig --enableldap --enableldapauth --update
authconfig 好像修改認證方式的工具,還有 gui 的介面,這個是命令列的版本,這樣就能啟用 ldap 登入了~可以用 authconfig –test 來檢視看看 ldap 跟 pam_ldap 有沒有 enabled ,
如果有就ok囉~
登入限制:
如果要管理的伺服器有很多,想要限制特定的使用者才能登入伺服器,可以幫使用者加上 account 這個 classobject 他裡面有一個 host 的屬性,這個屬性可以是一個集合,也就是用來檢查這個使用者所能登入的伺服器,如果設 host: * 就代表不限制,然後啟用 ldap 的伺服器就要將 /etc/ldap.conf 裡面的參數打開
pam_check_host_attr yes
這樣就能針對 host 做登入限制了,但是 host 要填什麼呢?
可以填該主機的 hostname 例如 ldap server 本機就可以是 localhost ~
或者是伺服器查的到的 dns name ,例如 mlwmlw.org 有在 /etc/hosts 裡面建表 or dns 查的到,
按照 NSS 查 hosts 的順序查得到的都 ok。
可以用這個 host 指令來確認 例如 mlwmlw.org 會回傳 mlwmlw.org has address 140.133.76.27。
這樣 host 裡面的值就能打 mlwmlw.org 就能登入該台主機了。應該也可以用 ldap 來當作 hosts 的查詢來源,管理上會更完整。
另外一提有一個 inetOrgPerson 有類似通訊錄的屬性可以用,好像可以整合一些 outlook 的軟體,但是跟 account 有衝突,所以不能有通訊錄跟 host……參考資源[7] 裡面有對這部份做些中文描述,
參考[8] 也提出了比較完整的解法。
dokuwiki:
dokuwiki 也可以設定 用 LDAP 登入~
只要去改 conf/local.conf 加上下面的設定~
# 維基管理者 superuser , 也可以是一個群組 @wiki_admin $conf['superuser'] = 'mlwmlw'; $conf['useracl'] = 1; # 關閉註冊 $conf['openregister'] = 0; #驗證方式 $conf['authtype'] = 'ldap'; #伺服器 $conf['auth']['ldap']['server'] = 'ldap://ldap.antslab.tw:389'; #instead of the above two settings $conf['auth']['ldap']['usertree'] = 'ou=People, dc=antslab, dc=tw'; $conf['auth']['ldap']['grouptree'] = 'ou=Group, dc=antslab, dc=tw'; $conf['auth']['ldap']['userfilter'] = '(&(uid=%{user})(objectClass=posixAccount))'; $conf['auth']['ldap']['groupfilter'] = '(&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))';
參考資源:
- 中文 http://man.lupaworld.com/content/manage/ringkee/openldap.htm
- 英文 http://man.lupaworld.com/content/database/LDAP/guide.html
- skill 1st http://www.skills-1st.co.uk/papers/ldap-schema-design-feb-2005/ldap-schema-design-feb-2005.html
- phpldapadmin http://phpldapadmin.sourceforge.net/wiki/index.php/Main_Page
- ldap 實作筆記 酷學園 http://www.study-area.org/phorum/index.php?PHPSESSID=ar3e900fl9d4rsnfllaqm71e75&topic=26522.0
- 流程 http://life.iiietc.ncu.edu.tw/xms/read_attach.php?id=6252
- 限制host http://dominic16y.world.edoors.com/CjAAdrehFwiU
- 解釋了 ldap 與 pam 的整合 http://wiki.debian.org/LDAP/PAM
- http://www.vitki.net/book/page/nss-and-pam-ldap