此篇文章花費了好幾個晚上,大部分是軟件翻譯的英文文檔,加上本身的理解所寫,但願學習者能尊重每一個人的努力.html
我有句話想送給每一個看我文章的人:java
慢就是快,快就是慢!!!node
另外更但願更多人能從認真從原理學習,分享更多有質量的文章,而不是僅僅轉載別人的文章.數據庫
如下僅介紹了OpenLDAP的基本原理和基本配置,至於更高級的配置,還需自行學習,由於有了如下基礎,再去建樓,就會vim
更加容易,網上有太多文章都太老舊,實在難以讓初學者對OpenLDAP有一個全面的基礎認識,總搞的人云裏霧裏,這篇文章windows
但願對想學習OpenLDAP的人,打一個好的基礎,從而能深刻了解它.基本命令我就不貼出來了,但願想深刻學習的人,自行學習api
man手冊.安全
--------------馬幫弟子:zcfbash
LDAP:
原理:
http://www.javashuo.com/article/p-tseelloq-ec.html
LDAP:
它是用來作統一用戶身份認證的.即: 你訪問CSDN它說你能夠用微信登陸,你登陸微博,它也支持微信登陸等,
這就是一種目錄服務, 固然它們不必定用LDAP來作爲他們的目錄服務.
LDAP(Light Directory Access Portocol),它是基於X.500標準的輕量級目錄訪問協議。
Linux上實現LDAP的工具是 openladp, 經過配置ldap服務器,將用戶信息存儲在其中,就可使用ldap協議,
訪問用戶數據庫,來實現LDAP用戶認證.
基本概念:
目錄樹概念
1. 目錄樹:在一個目錄服務系統中,整個目錄信息集能夠表示爲一個目錄信息樹,樹中的每一個節點是一個條目。
2. 條目:每一個條目就是一條記錄,每一個條目有本身的惟一可區別的名稱(DN)。
3. 對象類:與某個實體類型對應的一組屬性,對象類是能夠繼承的,這樣父類的必須屬性也會被繼承下來。
4. 屬性:描述條目的某個方面的信息,一個屬性由一個屬性類型和一個或多個屬性值組成,屬性有必須屬性和非必須屬性。
名詞:
dn(Distinguished Name): 「uid=songtao.xu,ou=oa組,dc=example,dc=com」,一條記錄的位置(惟一)
uid(User Id): 用戶ID songtao.xu(一條記錄的ID)
ou(Organization Unit): 組織單位,組織單位能夠包含其餘各類對象(包括其餘組織單元),如「oa組」(一條記錄的所屬組織)
dc(Domain Component) :域名的部分,其格式是將完整的域名分紅幾部分,如域名爲example.com變成dc=example,dc=com(一條記錄的所屬位置)服務器
cn(Common Name): 公共名稱,如「Thomas Johansson」(一條記錄的名稱)
sn(Surname): 姓,如「許」
rdn(Relative dn): 相對辨別名,相似於文件系統中的相對路徑,它是與目錄樹結構無關的部分,如「uid=tom」或「cn= Thomas Johansson」
配置openLDAP有兩種方式:
slapd.conf
修改它,須要從新生成數據庫文件, 生成後須要從新賦予權限屬主屬組ldap.ldap .
接着從新加載slapd 進程, 配置纔會生效.若使用單機版,不推薦。
cn=config:
修改後,當即生效, 它屬於熱部署.
從16年開始OpenLDAP官方都不推薦使用slapd.conf來配置LDAP,由於它太繁瑣,修改完配置必須從新生成OpenLDAP數據庫,
這就意味着,OpenLDAP服務器必須停機!!
LDAP初始化
[root@rnode6 ~]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG #用何種方式都須要.
[root@rnode6 ~]# cp /usr/share/openldap-servers/slapd.ldif /etc/openldap/slapd.conf
[root@rnode6 ~]# chown -R ldap.ldap /etc/openldap/
[root@rnode6 ~]# chown -R ldap.ldap /var/lib/ldap/
/etc/openldap/
check_password.conf : 用於密碼生成
ldap.conf: 可支持匿名方式訪問LDAP
slapd.d : 此目錄就是cn=config方式管理LDAP所需的目錄.
slapd.ldif : 若須要使用slapd.conf管理LDAP,則須要將此ldif複製到這裏,更名爲slapd.conf
/etc/openldap/slapd.d/cn=config/
olcDatabase={2}hdb.ldif #CentOS6是bdb CentOS7是 hdb
編譯安裝:
1. yum install openssl-devel gcc libtool-ltdl-devel libtool-ltdl -y
2. 先編譯安裝Berkeley DB 5.3.28
Berkeley DBv6.0.20後不在被openldap支持, 由於Berkeley如今是Oracle公司的.
cd berkeley的安裝目錄/build_unix/ #必需要先進到此目錄下,不然編譯時會總報錯
../src/dbinc/configure --prefix=/usr/local/berkeley-db-5.3.28
make
make install
3. 編譯openldap
cd openldap源碼目錄/
./configure --enable-wrappers \ #啓用TCP-Wrapper
CPPFLAGS="-I/usr/local/berkeley-db-5.3.28/include" \
LDFLAGS="-L/usr/local/berkeley-db-5.3.28/lib -Wl,-rpath,/usr/local/berkeley-db-5.3.28/lib" \
--prefix=/usr/local/openldap2.4.44
make
make install
LDAP的目錄信息:
它一般就如上圖這樣組織, 它是倒樹結構, 樹根通常是 國家(如:c=CN) 或 域名(dc=zcf,dc=com),
其次通常定義一個或多個組織(Organization, 簡稱 o) 或 組織單元(Organization Unit, ou)
一個組織單元中可包含: 員工, 設備信息(PC/打印機等)相關信息.
Entry(條目):
uid=tom,ou=People,dc=example,dc=com #這稱爲一個DN, 也叫一個entry(條目)
目前比較知名的目錄服務產品:
SUN: SUNONE Directory Server, 特色: 基於文本數據的存儲,速度塊.
IBM: IBM Directory Server: 基於DB2數據庫存儲, 速度通常.
Oracle: Oracle Internet Directory: 基於Oracle的數據庫, 速度通常.
Mircrosoft:AD :基於Windows系統用戶, 數據管理/權限不靈活.
OpenLDAP: 開源項目,速度快,應用普遍.
Schema:
它是基本數據模式, LDIF語法, LDAP管理,是目錄中存儲數據的規則的集合, 它是一種規範, 或一種數據存儲標準.
Schema根據本身內部規範,保證整個目錄樹的完整性, 無非法數據, 當你須要在LDAP中添加一些自定義的屬性時,
你就須要自定義Schema了, 若使用默認Schema你就 沒法添加這些本身所獨有的屬性, 由於,若沒有Schema這些規範,
隨便添加屬性, 整個目錄樹將變的毫無章法,沒法管理!
Schema是一個標準,定義了OpenLDAP目錄樹讀寫和屬性存取方式,這也是OpenLDAP可以存儲什麼數據類型,
數據有何屬性等 均是根據Schema來定義的. OpenLDAP默認的schema文件通常在安裝在/etc/openldap/schema/下,
此目錄下每一個文件定義了不一樣的對象和不一樣的屬性. 若想使用schema只須要在配置文件中經過include包含便可.
grep '*.schema' /etc/openldap/slapd.conf
/etc/openldap/schema/
core.schema: OpenLDAP的核心schema.【它是必須加載的】
inetorgperson.schema : 它僅次於core, 咱們添加帳號時,不少要使用到它裏面定義的objectClass.
dyngroup.schema : 這是定義組時使用的schema,包括要使用sudo.schema時,也須要它。
ppolicy.schema: 若須要作密碼策略時,須要導入此schema.
nis.schema: 網絡信息服務(FYI),也是一種集中帳號管理實現.
java.schema: 若須要使用Java程序來操做openLDAP時,須要使用它,讓OpenLDAP支持Java.
cosine.schema : Cosine 和 Internet X.500 (比較有用, 不太懂.)
misc.schema : Assorted (experimental)
openldap.schema : OpenLDAP Project(experimental)
sudo.schema: 定義sudo規則
在OpenLDAP目錄樹中,Schema用來指定一個目錄中所包含的對象(Objects)的類型(ObjectClass),
以及每個對象類型(ObjectClass)中必須提供的屬性(Atrribute)和可選屬性及對應的屬性值.
在LDIF文件中的數據條目, 可理解爲一個具體的對象,是經過Schema來規劃建立的, 符合Schema
標準. 所以Schema是一個數據模型, 用來決定數據按什麼方式存儲, 並定義存儲在OpenLDAP目錄樹中
不一樣條目(entry)下的數據之間的關係,schema須要OpenLDAP配置文件(Slapd.conf 或 cn=config)來
指定. 以保證當前OpenLDAP服務器可在目錄樹中定義那些對象類型(objectClass).
ObjectClass:
在OpenLDAP目錄樹中, 每一個條目必須包含一個ObjectClass屬性,,或多個非必要的ObjectClass,及對應的值,
有且需至少給一個ObjectClass賦一個值!
每個值將用做每一個條目在目錄樹中存儲信息的標準,如 可包含哪些屬性信息, 咱們可將ObjectClass屬性值
理解爲一種模板,模板定義哪些信息可存取, 哪些信息不可在目錄樹中存儲.
ObjectClass和Attribute是由Schema文件來規定的, Schema文件規範ObjectClass的構成、Attribute格式
以及繼承關係.
ObjectClass可分爲三類:
1. 結構型(Structural) : person 和 organizationUnit
如person: 它可定義一我的的相關屬性,如:他的住址,電話,公司,職位等..
2. 輔助型(Auxiliary) : extensibeObject
如:之後若想限制登陸,就須要經過藉助此objectClass來定義.
3. 抽象型(Abstract): top, 抽象型的ObjectClass不能直接使用.
Attribute(屬性):
一個ObjectClass節點具備一系列的Attribute, Attribute可理解爲Linux系統當中的變量, 那麼變量都有
相應的值, 那麼Attribute也是由相關的值,這些屬性的對應值表示每一個對象的特色, 但有些條目當中的屬性
是必須指定的(如: 有MUST標記的), 有些是非必要的(如: 由MAY標記的).
在目錄樹中經常使用的Attribute有:
uid, sn, giveName, I, ObjectClass, dc, ou, cn, mail, telephoneNumber, c 等.
注意:
uid: 這裏的UID不是Linux系統上的UID,這裏的UID是用戶登陸LDAP的帳號.
sn: 只能寫姓.
giveName: 只能寫名字
ObjectClass示例:
objectClass: ( 2.5.6.6 NAME 'person'
SUP top STRUCTURAL
MUST (sn $ cn)
MAY (userPassword $ telephoneNumber $ seeAlso $ description))
說明:
2.5.6.6 : 這稱爲Object ID
若要定義 person 屬性, 頂級必須爲 top, 由於其屬性類型爲STRUCTURAL, 必須定義 sn 和 cn 屬性.
MAY定義的userPassword, telephoneNumber, seeAlse, description等4個屬性是無關緊要的.
若要定義郵件地址, 國家等屬性, 是不能夠定義的, 除非你本身定義了相關的
ObjectClass條目.
對於此person類型的ObjectClass,後期你要調用,就必須提供sn 和 cn, 查詢也同樣, 不然Schema檢查
將保錯.
ObjectClass案例2:
objectClass: (2.5.6.0 NAME 'top'
ABSTRACT
MUST (objectClass) )
objectClass: ( 2.5.6.6 NAME 'person'
SUP top STRUCTURAL
MUST (sn $ cn)
MAY (userPassword $ telephoneNumber $ seeAlso $ description))
說明:
此案例,若要定義 top 屬性, 必須定義一個objectClass屬性. 且此案例中還定義了person屬性, 因此要必須定義
sn 和 cn屬性, 以及可附加的屬性( userPassword, telephoneNumber, seeAlse, description), 因此此案例中
必需要定義 3 必要個屬性, 即objectClass, sn, cn .
此案例的下一級 objectClass 能夠繼承上一級的 objectClass 的屬性信息.
注:
ObjectClass類型定義的不一樣,則其屬性的相關值信息也是不一樣的.
Openldap配置:
Slapd.conf方式配置Openldap的步驟:
》slaptest :測試對slapd.conf的配置文件.
》service slapd restart
olcLogLevel: <日誌級別>
LDIF格式:
LDIF(LDAP Data Interchanged Format)的輕量級目錄交換格式.
它是存儲LDAP配置信息及目錄內容的標準文本文件格式, 之因此使用文本文件來存儲這些信息,是爲了方便
讀取和修改,這也是其它大多數服務配置文件所採用的格式.
LDIF一般用來交換數據並在OpenLDAP服務器之間互相交換數據, 而且可經過LDIF實現數據文件的導入,
導出及數據文件的增長, 修改, 重命名等一些操做, 這些信息須要按照LDAP中schema的規範進行操做, 並
會接受schema的檢查, 若不符合OpenLDAP Schema規範要求, 則會提示相關語法錯誤信息.
LDIF文件格式:
LDIF 文件每行的結尾是不容許有空格或者製表符存在.
LDIF 文件容許相關屬性可被重複賦值並使用.
LDIF 文件以 # 號行爲註釋行.
LDIF 文件全部賦值方式爲: 屬性:[空格]屬性值.
LDIF 文件經過空行來區分兩條條目.
注意: 若須要手動定義LDIF文件,添加相關條目,須要瞭解以上相關特色.
在OpenLDAP服務器中定義LDIF文件,每一個條目中必須包含一個ObjectClass屬性, 並賦值!!
ObjectClass屬性有頂級之分, 定義時要了解ObjectClass的相關依賴類型, 不然在添加或
修改時,也同樣會語法報錯!!
LDIF文件語法:
基本語法:
dn: <distinguished name> #首先要指定要修改那個DN(條目)
<attrdesc>: <attrvalue> #最經常使用的attrdesc是changetype: 其值最經常使用的是 modify
<attrdesc>: <attrvalue>
<attrdesc>:: <base64-encoded-value>
<attrdesc>:< <URL>
...
#: 井號開頭行爲註釋.
1. 可用空格或製表符開始一個新行
dn: cn=Barbara J Jensen,dc=exam
ple,dc=com #注意: example是分行寫了,必定要注意寫法,不要在它中間加任何非空字符!!
2. 多個屬性值在單獨的行中指定
cn: Barbara J Jensen
cn: Babs Jensen
3.以冒號+空格開頭的表示,這是一個Base64編碼的字符串.
cn:: IGJlZ2lucyB3aXRoIGEgc3BhY2U=
4.從文件中獲取屬性值,固然它還支持ftp,http等.
cn:< file:///tmp/value
下面是三個LDAP條目,每一個條目要用空行分割
dn: cn=Barbara J Jensen,dc=example,dc=com
cn: Barbara J Jensen
cn: Babs Jensen
objectclass: person
description:< file:///tmp/babs
sn: Jensen
dn: cn=Bjorn J Jensen,dc=example,dc=com
cn: Bjorn J Jensen
cn: Bjorn Jensen
objectclass: person
sn: Jensen
dn: cn=Jennifer J Jensen,dc=example,dc=com
cn: Jennifer J Jensen
cn: Jennifer Jensen
objectclass: person
sn: Jensen
jpegPhoto:: /9j/4AAQSkZJRgABAAAAAQABAAD/2wBDABALD
A4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQ
ERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVG
...
5.修改記錄格式
dn: <DistinguishedName>
changetype: <[modify|add|delete|modrdn]>
add |delete |replace: <attributetype>
dn: DN
changetype: add
<attrdesc1>: <value1>
<attrdesc1>: <value2>
...
<attrdescN>: <value1>
<attrdescN>: <value2>
...
- #注意: 他是Entry之間的分隔符!!!
示例:
dn: cn=Babs Jensen,dc=example,dc=com
changetype: add
objectclass: person
objectclass: extensibleObject
cn: babs
cn: babs jensen
sn: jensen
dn: DN
changetype: modify
add: <attributetype>
<attrdesc>: <value1>
<attrdesc>: <value2>
...
-
replace: <attributetype> #在進行替換操做時,若要替換的DN不存在,它會提示你添加.
<attrdesc>: <value1>
<attrdesc>: <value2>
...
-
delete: <attributetype> #若不提供<attributeType>則刪除整個dn屬性集.
<attrdesc>: <value1>
<attrdesc>: <value2>
...
-
示例:
dn: cn=Barbara J Jensen,ou=People,dc=example,dc=com
changetype: delete
以上add,replace,delete綜合示例:
dn: cn=Babs Jensen,dc=example,dc=com
changetype: modify
add: givenName
givenName: Barbara
givenName: babs
-
replace: description
description: the fabulous babs
-
delete: sn
sn: jensen
-
dn: DN
changetype: [modrdn | moddn]
newrdn: <newrdn>
deleteoldrdn: 0 | 1 #1:從條目中刪除舊的rdn,0:保留,但修該爲非區分屬性.
newsuperior: <DN> #若存在,則將條目移動到新上級.
...
-
示例:
dn: cn=Babs Jensen,dc=example,dc=com
changetype: modrdn
newrdn: cn=Barbara J Jensen
deleteoldrdn: 0
newsuperior: ou=People,dc=example,dc=com
dn: cn=Barbara J Jensen,ou=People,dc=example,dc=com
changetype: delete #這樣寫,將刪除dn這個準確名屬性集.
6.包含外部LDIF文件.
dn: dc=example,dc=com
objectclass: domain
dc: example
include: file:///tmp/example.com.ldif
dn: dc=example,dc=org
objectclass: domain
dc: example
服務端命令和客戶端命令:
slap[passwd|...] #凡是slap開頭的命令都是服務端命令.
ldap[passwd|add|..] #客戶端命令
LDIF 示例:
dn: uid=Green Tom,ou=people,dc=test,dc=com #DN描述項,在整個目錄樹上是惟一的.
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
ojbectClass: person
objectClass: inetOrgPerson
objectClass: hostObject
sn: Green
cn: Green Tom
telephoneNumber: 010 12345678
mail: dayong_guo@126.com
注:
冒號後面必須有一個空格, 而後纔是屬性值, schema規範定義要求很嚴格!!
openLDAP的使用
openLDAP它能夠幫助咱們構建本身的企業目錄服務, 所謂目錄服務,其實就是將一個組織的內部,
各個部門等,使用一種結構構建出來,方便咱們來管理整個公司內的全部事物, 包括員工, PC, 打印機
等等... 目錄服務幫咱們構建的組織架構就以下圖:
什麼是組織架構?
抽象圖:
第一張圖就是抽象概念,第二張圖就是實際工做中會使用的.
此圖是OpenLDAP的倒樹架構圖
樹根: dc=com 這是頂級域
dc=example 這是二級域,也就是咱們組織機構的根.
ou=People, ou=Servers 這都是組織內部的組織單元,可理解爲部門.
其中ou=Servers,它是一個特殊ou,通常使用它表示,它下面能夠有不少子ou.
uid=babs 這是一個用戶相關的條目
企業組織架構圖:
這張圖中是企業中真正使用的架構圖
dc=zcf,dc=com #這就是zcf.com域
它下面有不少ou, 每一個ou下面是具體的用戶.
注意:
在建立組織架構時, 用戶和組是分開的,就相似於MS AD(活動目錄).
使用yum安裝的openldap作基本初始化步驟
一. 首先配置主機名可被解析
#由於openLDAP執行命令時,它須要解析主機名, 若不能成功解析,它將一直等到解析超時纔會
#將命令的執行結果返回.
echo IP HostName >> /etc/hosts
二. 導入必要的schema:
cd /etc/openldap/slapd.d/cn=config/cn=schema
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
注:
additional info: olcObjectClasses: AttributeType not found: "audio"
若出現這個錯誤, 就是cosine.ldif尚未導入致使的.
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
注:
additional info: olcObjectClasses: AttributeType not found: "manager"
若出現這個錯誤, 就是cosine.ldif尚未導入致使的.
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif
ls #導入成功後,會有這些文件.
三. 修改域名, 管理員賬戶, 禁止匿名查詢
cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif
olcSuffix: dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=my-domain,dc=com
#要將這些信息修改成,本身的域名和RootDN, RootDN就是openldap的管理員帳號名.
cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}monitor.ldif
olcAccess: ....
#這裏定義了openldap的監控信息, 須要修改成適合本身須要的內容.
vim moddomain.ldif
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth" read by dn.base="cn=Manager,dc=zczf,dc=com" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=zczf,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=zczf,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}GqkPrqlMNqjZVxcRqHPcwqc3usvzYmyd
dn: cn=config
changetype: modify
add: olcDisallows
olcDisallows: bind_anon
注: 這裏修改了兩個文件, 分別是olcDatabase={1}monitor.ldif 和 olcDatabase={2}hdb.ldif
在monitor文件中修改了 olcAccess: 這個字段, 修改方式是替換(replace), 主要是修改值中的域名, 其它字段不變.
數據庫文件hdb中是修改了olcSuffix 和 olcRootDN, 修改類型也是替換, 主要是修改爲本身的域名.
因爲數據庫hdb中沒有root密碼字段, 因此要先添加 olcRootPW, 再賦值爲新密碼.
最後一個 olcDisallows 是定義禁止登陸, 這裏是設置匿名用戶不能登陸LDAP.
執行修改:
ldapadd -Y EXTERNAL -H ldapi:/// -f moddomain.ldif
四. 建立本身的組織架構
下面將建立的組織架構圖:
1. 建立先建立頂級域 和 兩個ou(people, group)組織架構:
vim newZCFcom.ldif
dn: dc=zcf,dc=com
objectClass: dcObject
objectClass: organization
dc: zcf
o: zcf.com
注: 這裏先定義了一個頂級域zcf.com
並配置了兩個objectClass, 這兩個對象要引用,必須提供dc 和 o 這兩個屬性.
由於包含它們的schema定義文件中是這麼定義的,你要引用該ObjectClass,
就必須遵照這些規則. 我看到objectClass一般寫一塊,而這些對象所必須的屬性
寫一塊, 因此,具體dc和o是被他倆誰要求,必須提供的,我還不清楚.
dn: ou=People,dc=zcf,dc=com
objectClass: organizationalUnit
objectClass: top
ou: People
dn: ou=Group,dc=zcf,dc=com
objectClass: organizationalUnit
ou: Group
dn: cn=Manager,dc=zcf,dc=com #Manger: 是默認管理員的cn名,建議修改.
objectClass: organizationalRole
cn: Manager #cn: 公共名, 須要注意:冒號前有空格, 結尾不能有空格
這裏定義管理員的RootDN.即管理員賬戶
dn: cn=appteam,ou=Group,dc=zcf,dc=com
objectClass: posixGroup
cn: Host
gidNumber: 1010
#這裏引用了一個posixGroup的對象, 它須要提供cn 和 gidNumber.
dn: cn=dbateam,ou=Group,dc=zcf,dc=com
objectClass: posixGroup
cn: Host
gidNumber: 1011
dn: cn=host,ou=Group,dc=zcf,dc=com
objectClass: posixGroup
cn: Host
gidNumber: 1012
#多加一個組,圖中沒畫出來, 它用來存放全部PC的信息.
2. 執行添加:
ldapadd -x -D cn=Manager,dc=zcf,dc=com -W -f newZCFcom.ldif
#-x: 使用SASL作簡單認證. -W: 提示輸入密碼 -D: 指明LDAP的管理員帳號名,即rootdn
3. 接下來對剛建立的組織架構作查詢 並 驗證:
建議每次配置完成後,都要作驗證!
查詢可經過GUI工具 或 命令.
1. 命令方式:
vim /etc/openldap/ldap.conf
BASE dc=zcf,dc=com
URI ldap:// #當前主機OpenLDAPServer的IP或主機名
ldapsearch -x -LLL #這樣就能夠直接獲取剛添加的條目信息了
2. GUI工具
ldapadmin #這是一個windows上的綠色小工具,它雖小,但功能卻很是強大!
4. 建立要添加的用戶:
cat addUser.ldif
dn: uid=zhangchaofeng,ou=People,dc=zcf,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
homeDirectory: /home/zhangchaofeng
userPassword: {SSHA}78DMFNXKLvUl+tjCi2haD+U0DASQ/MJK
loginShell: /bin/bash
cn: zhangchaofeng
uidNumber: 2000
gidNumber: 1010
sn: System Administrator
mail: zhangcf9988@aliyun.com
postalAddress: Beijing
mobile: 12345678900
dn: uid=ldap01,ou=People,dc=zczf,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
homeDirectory: /home/ldap01
userPassword: {SSHA}78DMFNXKLvUl+tjCi2haD+U0DASQ/MJK
loginShell: /bin/bash
cn: ldap01
uidNumber: 2001
gidNumber: 1011
sn: dba
mail: ldap01@aliyun.com
postalAddress: Beijing
mobile: 12345678901
注: 以上添加了兩個條目(entry), 條目和條目之間要用空行隔開!!
5. 執行添加:
ldapadd -x -D 'cn=Manager,dc=zcf,dc=com' -W -f addUser.ldif
6. 驗證是否添加成功
ldapsearch -x -D 'cn=Manager,dc=zcf,dc=com' -W -LLL 'uid=ldap01'
#具體語法參見下文
# -x: 使用SASL作簡單認證, SASL是將用戶名和密碼直接加到URL中傳輸,
只是它會預先使用共享密鑰對密碼作加密.
#-D 和 -W 要配合使用, -D指明以什麼身份登陸查詢,默認是匿名身份,但前面
經過cn=config方式關閉了匿名,因此必須指明身份, -W:提示輸入密碼.
#-LLL: 這是查詢級別, 分三級, -L, -LL, -LLL
五. 配置TLS方式對外提供目錄服務
測試環境爲RHEL7.4, 客戶端爲CentOS7.6 , 客戶端在鏈接服務端認證時,若不是安全鏈接,
將致使客戶端可以獲取 ldap用戶的賬戶信息, 但沒法獲取密碼,致使登陸失敗!!
OpenLDAP 向cn=config中添加TLS證書認證的方式:
A. 建立CA:
1. 建立的CA的私鑰
openssl genrsa -out cakey.pem 2048
2. 建立CA的自簽發證書
openssl req -new -x509 -key cakey.pem -out cacert.pem \
-subj /C=CN/ST=Beijing/L=Changping/O=zczf/CN=ca.zczf.com
3. 建立CA簽發證書的工做目錄:
mkdir certs newcerts crl private
echo 01 > serial ---->建立證書生成列表的序列號文件
echo 01 > crlnumber ---->建立證書吊銷列表的序列號文件;【注意:若不須要吊銷證書也可不建立】
mv cakey.pem private/
cp /etc/pki/tls/openssl.cnf .
vim openssl.cnf
dir = 當前目錄的絕對路徑.
B. 簽發證書:
4. 建立LDAPServer的私鑰
openssl genrsa -out ldap.key 2048
5. 建立LDAPServer向CA申請簽發證書的請求
openssl req -new -key ldap.key -out ldap.csr \
-subj /C=CN/ST=Beijing/L=Changping/O=zczf/CN=ldap.zczf.com
6. 使用CA的私鑰簽發此證書申請
openssl ca -in ldap.csr -out ldap.crt -days 365 -config openssl.cnf
C. 配置LDAP支持證書:
1.將生成的證書複製到:
cp ldap.key ldap.crt cacert.pem /etc/openldap/cacerts/
2. 編寫下面的LDIF文件:
如下內容主要是在/etc/openldap/slapd.d/cn=config.ldif 文件添加系統配置.
如下添加的了 OpenLDAP Server將啓用TLS功能, 告訴OpenLDAP Server
olcTLSCACertificatePath: CA的證書目錄在哪裏.
olcTLSCACertificateFile: CA的證書文件叫什麼, 這裏建議寫絕對路徑.
olcTLSCertificateFile: 指明OpenLDAP Server的證書在哪裏.
olcTLSCertificateKeyFile: 指明OpenLDAP Server的Key在哪裏
olcTLSVerifyClient: never: 表示歷來不對客戶端作證書驗證.
vim updateldapTLS.ldif
dn: cn=config
changetype: modify
replace: olcTLSCACertificatePath
olcTLSCACertificatePath: /etc/openldap/cacerts
-
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/openldap/cacerts/cacert.pem
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/cacerts/ldap.crt
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/cacerts/ldap.key
-
add: olcTLSVerifyClient
olcTLSVerifyClient: never
3.執行添加, 將自動將上面的條目添加/etc/openldap/slapd.d/cn=config.ldif
ldapmodify -Y EXTERNAL -H ldapi:/// -f updateldapTLS.ldif
注: -Y EXTERNAL :這個我還不清楚是什麼意思.
4. 修改slapd.service腳本的啓動參數文件
vim /etc/sysconfig/slapd
#若用不到非加密的方式,也能夠去掉 ldap:/// (389)
#添加ldaps:/// 後,slapd就會監聽默認TLS端口636.
# ldapi:// : 這個是Socket方式鏈接.
SLAPD_URLS="ldapi:/// ldaps:/// ldap:///"
5. 重啓slapd服務
systemctl restart slapd
6. TLS證書添加完成後,還須要在服務器端配置本地openldap 客戶端與slapd交互使用的TLS證書.
cat /etc/openldap/ldap.conf
BASE dc=zcf,dc=com
URI ldaps://ldap.zczf.com
TLS_CACERT /etc/openldap/cacerts/cacert.pem
TLS_CACERTDIR /etc/openldap/cacerts
TLS_REQCERT allow
注:
URI: 要使用ldaps://
TLS_CACERT: 指名CA的證書在哪裏.
TSL_CACERTDIR: 指明CA證書所在目錄
TLS_REQCERT:
allow: 若服務器端證書驗證失敗,也依然容許鏈接.
此配置文件修改好後:
ldapsearch -D 'cn=admin,dc=zcf,dc=com' -W -LLL
#輸入密碼後, 命令能執行成, 則說明ldaps已經配置成功。
以上全部配置就完成了LDAP Server端的配置.
D. 接下來就須要配置客戶端訪問了:
1. 安裝客戶端支持包
yum install openldap-clients nss-pam-ldapd authconfig
2. 在作如下配置前, 先作備份
由於openldap認證配置要修改不少系統文件, 爲了不配置錯誤,而致使手工查找這些
配置文件,去刪除,因此建議必定要備份!!
它大概會修改如下文件:
CentOS7.6和以前的版本修改的文件多少是不一樣!!!
相同的文件:
/etc/nslcd.conf
/etc/openldap/ldap.conf
/etc/pam.d/system-auth-ac
/etc/nsswitch.conf
不一樣的文件:
/etc/pam.d/password-auth-ac
還有些其餘文件, 我沒徹底測試到.
authconfig --savebackup=openldapconf.bak
#若須要恢復:
authconfig --restorebakcup=openldapconf.bak
或
authconfig --restorelastbakcup
#這是在第一次操做時忘記備份了,可用它來恢復到
最進一次操做前的狀態, 由於是第一次操做,最近
一次就是系統安裝好時的狀態!!
3. 接下來就能夠配置客戶端使用LDAP認證了.
authconfig --enableldap --enableldapauth \
--ldapserver=ldaps://ldap.zcf.com \
--ldapbasedn="dc=zcf,dc=com" \
--enableldaptls \
--ldaploadcacert=http://ldap.zczf.com/cacert.pem \
--enablemkhomedir \ #RHCE考試題,中不要加此選項!!
--update
注:
啓用LDAP, 啓用LDAP認證,是必需要有的.
雖而後面指明瞭要使用TLS,但ldapserver的地址依然不能直接寫,
必需要加上ldaps:// 這個協議頭部, 另外CA證書必須提供URL地址,
讓authconfig本身下載; enablemkhomedir: 若你須要使用autofs,
來自動管理用戶家目錄的建立,掛載,就不能使用此選項.
另注:
authconfig-gtk #這是authconfig的圖像工具, 也可以使用它來配置LDAP.
4. 在客戶端驗證是否學習到LDAP服務器上的用戶信息:
id ldapuser01
getent passwd ldapuser01
getent shadow ldapuser01 #這個好像不能在返回用戶密碼了.
另外: CentOS7.6上配置LDAP客戶端時,若不支持TLS或SSL,
將不容許LDAP用戶登陸系統.
5. 驗證登陸
ssh ldapuser01@IP
六. 配置容許用戶修改本身的密碼
vim allowModPasswd.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
dn="cn=admin,dc=zczf,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=zczf,dc=com" write by * read
ldapmodify -Y EXTERNAL -H ldapi:/// -f allowModPasswd.ldif
驗證用戶是否能夠修改本身的密碼.
七. 配置ldap用戶在登陸時, 使用autofs來自動掛載家目錄
NFS Server:
1. mkdir -pv /ldaphome/ldap0{1,2,3}
2. chmod o+w -R /ldaphome/
3, yum install nfs-utils
4, vim /etc/exports
/ldaphome/ldapadmin 192.168.10.0/24(rw,sync)
/ldaphome/ldap01 192.168.10.0/24(rw,sync)
/ldaphome/ldap02 192.168.10.0/24(rw,sync)
5. systemctl restart nfs
6. showmount -e localhost
Client:
1. yum install autofs sssd
注:
sssd: (System Security Services Dameon)
https://blog.csdn.net/liu16659/article/details/80997333
2. vim /etc/auto.master
/home/ldap /etc/auto.misc
3.mkdir /home/ldap #這個目錄必須存在!!!
4.vim /etc/auto.misc
* -rw,vers=3,soft,intr nfs.server.com:/userhome/&
注: &可匹配到的ldap用戶名,* 是前向引用.引用匹配到的用戶名.
-fstype=nfs,soft,intr,vers,sync都非必須,但rw是必須的!!
5. 配置LDAP認證
authconfig --savebackup=ldap.bak
authconfig --enableldap --enableldapauth \
--ldapserver=ldap://server.group8.example.com --ldapbasedn="dc=group8,dc=example,dc=com" \
--enableldaptls --ldaploadcacert=http://172.25.0.254/pub/cacert.pem --update
6. 測試su登陸
若能正常掛載NFS共享,並看到其中的文件,則說明成功.
7.若出現autofs掛載失敗的狀況,可參考:【坑好多,請注意!!!】
1. nfs導出配置是否正確, IP, 權限.
2. autofs中auto.master中填寫的目錄,必須存在.
3. auto.misc中的配置必定要有rw。
4. 系統時間是否同步
緣由不明:
autofs 服務啓動時報了一個錯誤:
automount[20951]: setautomntent: lookup(sss): setautomntent: No such file or directory
但網上查詢,沒有找到答案, 我在另外一臺別人配置好的VM中,查看,他的autofs也報這個錯誤,但ldap
用戶卻能夠正確自動掛載nfs共享的家目錄. 不清楚緣由.但最近作成功後,沒有這個錯誤了!!
以上配置完成後, openLDAP的基本使用已經完成!
OpenLDAP修改管理員密碼
1. 直接回車輸入密碼,它會生成密碼字符串.
slappasswd
注:
echo 123456 |xargs slappasswd -s
#-s: 指定要生成的明文密碼
2. 建立一個ldif 文件,來修改管理員密碼
vim modrootpw.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}xxxx
3. 執行修改命令
ldapadd -Y EXTERNAL -H ldapi:/// -f modrootpw.ldif
或
ldapmodify -a -Y EXTERNAL -H ldapi:/// -f modrootpw.ldif
#-a: 其實就是 ldapadd, 由於ldapadd是ldapmodify的硬連接
注:
[root@rnode6 ~]# cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 ba5c9427
dn: olcDatabase={0}config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth" manage by * none
structuralObjectClass: olcDatabaseConfig
entryUUID: ec40f8c2-e643-1038-8c1d-e1c3847c1ae1
.......
查看openldap的olcDatabase={0}config.ldif 這個配置文件,發現其中沒有olcRootPW字段,因此
要修改管理員密碼,須要先添加該字段才能夠.
如:
上面示例中:
dn: olcDatabase={0}config,cn=config
#這段是告訴,openLDAP,要操做的dn是 olcDatabase={0}config這個配置文件,
它的上級目錄是cn=config
changetype: modify # 這是告訴openLDAP,我要作修改操做.
add: olcRootPW # 這是告訴openLDAP,我要添加一個字段叫 olcRootPW
olcRootPW: {SSHA}xx # 這是給olcRootPW 字段 賦值,要注意: 屬性必需要有值!!
另外: 屬性名: 後必需要有一個空格!!
當執行完成後, cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif
就會發現修改了,並且時間戳也修改了.
ldap日誌:
查看日誌級別:
slapd -d ?
或
查看官網的說明.
debug level:
-1: 安裝調試時,開啓,輸出全部信息.
0: 關閉debug
1: 跟蹤函數調用
2:跟蹤一個包
啓用 OpenLDAP 的日誌功能:
1. 默認openLDAP使用的rsyslog來處理本身的日誌, 它會將日誌發送給 local4 這個設備, 來接受.
vim /etc/rsyslog.conf
local4.* /var/log/ldap.log
2. 使用cn=config方式來管理啓用日誌
默認openLDAP是不開啓日誌的, 須要須要首先添加在olcLoglevel對象,並給它賦值.
cat << EOF | ldapmodify -Y EXTERNAL -H ldapi:///
dn: cn=config
changetype: modify
add: olcLoglevel
olcLoglevel: -1
EOF
3. 重啓rsyslog 和 slapd便可.
注: 如果使用的是slapd.conf 則可以使用如下方式來開啓.
此方式僅作參考,它是slapd.conf配置openLDAP的方式,如今已不建議使用:
vim slapd.conf
loglevel [-1 | any]
slaptest -f /etc/openldap/slapd.conf #測試配置文件是否有語法錯誤. rm -rf /etc/openldap/slapd.d/* #從新生成slapd.d這些系統數據庫配置文件. slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/ chown -R ldap.ldap /etc/openldap #最後仍是重啓 rsyslog 和 slapd