2015年6月4日 星期四

CentOS 7 初探 Open LDAP


因為系上網管應徵需要的專案
前陣子摸索了下LDAP,把設定步驟寫下來做個筆記

0.初次見面


LDAP是Lightweight Directory Acesss Protocal的縮寫,這篇筆記記錄提供LDAP(協定)服務的伺服器OpenLDAP的設定。
關於LDAP的資料模型,每筆資料(或稱節點,Entry)是以目錄資訊樹(Directory Infomation Tree,簡稱DIT)為架構分層儲存的,與一般的關聯式資料庫不同,建成樹狀也為了使得查詢快速,也代表它有查詢頻繁、鮮少更新的用途。


1.安裝


安裝Open LDAP的Server以及Client
# yum install openldap-servers openldap-clients

2.基本設定檔,啟用服務


複製設定檔到/var/lib/ldap中,DB_CONFIG這個設定檔設定有關Berkeley DB這種資料庫的屬性,
主要為一些資料庫快取和其他效能的設定
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

更改DB_CONFIG設定檔的擁有者為LDAP
# chown ldap. /var/lib/ldap/DB_CONFIG

最後啟用LDAP
# systemctl start slapd
# systemctl enable slapd
這裡附註一下,slapd是standard alone ldap daemon的縮寫,新增或修改Ldap的結構等操作也倚賴此工具完成

3.設定LDAP管理者密碼


用來產生使用者(Root)密碼的工具,預設編碼方式為sha
# slappasswd

接下來用產生的碼來設定管理者的密碼,首先新增並編輯一個ldif文件(名稱是自訂的)
# vim chrootpw.ldif
LDAP中使用一種文件格式稱為LDIF,全名為LDAP Data Interchange format,
文件內的表示法為Key-Value的格式,其中changetype屬性宣告了現在這個段落要用來修改還是新增一個Entry。

chrootpw.ldif內容:
dn: olcDatabase={0}config,cn=config 
changetype: modify 
add: olcRootPW 
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx
一般來說都會先宣告哪個Entry要修改/新增,以dn (distingush name)表示
olc為Online-configuration的簡寫,意指寫進LDAP後不需要重新啟動來套用更新,查了下資料常常看到舊版的LDAP設定完slapd.conf就必須重新啟動的動作
有關設定檔的架構,它也使用了DIT的形式,在/etc/openldap/slap.d資料夾中會發現如此的樹狀結構。

changetype屬性可以設定的值有 add(新增), delete(刪除), modify(修改), modrdn(沒用過...)
宣告了要對一個Entry進行什麼動作。

add屬性宣告要對這個Entry新增什麼屬性,下一行的olcRootPW則是剛剛新增的屬性的值

最後以ldapadd指令將檔案中的操作寫入LDAP,有關ldapadd用法,見 man page
# ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif
Note: 如果系統回報有關wrong attributeType的錯誤,要記得回去看ldif檔每行的最後面有沒有多餘的空白

4.引入Schema


Schema(綱要檔)記錄著為了某特殊用途的架構以及架構所包含的屬性有哪些。
比如說nis.schema(跟Linux使用者登入有關)中就定義了像是login shell, homeDirectory的屬性
#ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif 
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

5.設定Domain


# slappasswd
產生加密後的碼後,建立一個名為chdomain的LDIF檔
# vim chdomain.ldif
chdomain.ldif 內容:
#底線留白的部分填上SHA加密後的亂碼以及domain name
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
  read by dn.base="cn=Manager,dc=__,dc=___,dc=___,dc=__" read by * none
#Access屬性用以定義目錄存取控制清單(Directory ACL),定義『誰』有甚麼樣的『權限』可以存取『什麼』

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=__,dc=__,dc=__,dc=__
#Root的根尾碼

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=__,dc=__,dc=__,dc=__
#定義有superuser權限的root的Distingush Name

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}_________________________
#定義root的密碼

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
  dn="cn=Manager,dc=csie,dc=ncu,dc=edu,dc=tw" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=___,dc=___,dc=__,dc=__" write by * read
寫入設定
# ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif

6.新增資料


#vim basedomain.ldif
basedomain.ldif內容:
dn: dc=__(1)___,dc=__(2)___
objectClass: top
objectClass: dcObject
objectclass: organization
o: ______
dc: ___(1)___

dn: cn=Manager,dc=____,dc=____
objectClass: organizationalRole
cn: Manager
description: Directory Manager

dn: ou=People,dc=_____,dc=_____
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=____,dc=_____
objectClass: organizationalUnit
ou: Group

大概就是用這種方式來新增或修改entry了
每一筆entry可以有多種objectClass,套用某一objectClass時,則連帶必須定義這個class要求的屬性(Must)
像是宣告objectClass為organization則必須定義屬性o,附上ObjectClass與Attributes總覽

參考資料

CentOS7 OpenLDAP Configuration
LDAP 入門
Linux目錄服務器
LDAP系統管理, 歐萊禮出版社