原文出自:https://www.cnblogs.com/yangruizeng/p/10172011.html
1. openldap介紹
1.1 什么是openldap
openldap是一款輕量級目錄訪問協議(Lightweight Directory Access Protocol,LDAP),屬於開源集中賬號管理架構的實現,支持眾多系統版本。
ldap具有兩個國家標准,x.500和LDAP。openldap是基於x.500標准的,而且去除了x.500復雜的功能並且可以根據自我需求定制額外擴展功能,可以理解為x.500的簡化版本。openldap支持tcp/ip協議。
LDAP提供並實現目錄服務的信息服務,目錄服務是一種特殊的數據庫系統,對於數據的讀取、瀏覽、搜索有很好的效果。目錄服務一般用來包含基於屬性的描述性信息並支持精細復雜的過濾功能,對搜索有很好的效果。目錄服務不支持通用數據庫的大量更新操作所需要的復雜的事物管理或回滾策略。
openldap默認以Berkeley DB作為后端數據庫,Berkeley DB數據庫主要以三列的數據類型進行數據存儲,如以鍵值對的方式進行存儲。Berkeley DB是一類特殊的數據庫,主要用於搜索、瀏覽、更新查詢操作,一般對於一次寫入數據、多次查詢和搜索有很好的效果。Berkeley DB數據庫是面向查詢進行優化,面向讀取進行優化的數據庫。不支持事務性數據庫所支持的高並發的吞吐量以及復雜的事務操作。
1.2 openldap目錄服務優點
- 是一個跨平台的標准互聯網協議,基於X.500協議
- 提供靜態數據查詢搜索,不需要像關系數據庫中那樣通過SQL語句維護數據庫信息
- 基於推和拉的機制實現節點間數據同步,簡稱復制(replication)並提供基於TLS/SASL的安全認證機制,實現數據加密傳輸以及Kerberos密碼驗證功能。
- 可以實現用戶的集中認證管理,所有關於賬號的變更,只需在openldap服務器端直接操作,無需到每個客戶端進行操作,影響范圍為全局
- 默認使用TCP/IP協議傳輸數據
- 支持各種應用平台:nginx/http/vsftpd/samba/svn/postfix/openstack/hadoop等都可以實現統一用戶管理
- openldap具有費用低、配置簡單、功能強大、管理容易、開源等特點
1.3 openldap適用場景
openldap可實現賬號集中式管理:不同的發行版UNIX系統、Windows系統以及各種平台,如Apache、Nginx、Zabbix、Postfix、Samaba、Git、Openvpn、OpenStack都可以接入。
1.4 OpenLdap目錄架構
openldap目錄架構分為兩種:一種是互聯網命名組織架構;另一種是傳統的企業級命名架構,生產中常用的是互聯網命名架構,如下圖:

LDAP的目錄信息是以樹形結構進行存儲的,在樹根一般定義為域名(dc=com),其次往往定義一個或多個組織單元(organization,ou)。一個組織單元可以包含員工、設備信息相關信息。如:uid=babs,ou=People,dc=example,dc=com

2. Openldap常用名詞介紹
2.1 schema
schema主要用於控制目錄中各種條目所擁有的對象類以及各種屬性的定義,可以理解成是一個數據模型。它定義了對象類,指定對象類中有哪些屬性,哪些屬性是必須的哪些是可選的,屬性應該是郵箱地址還是電話號碼,字符還是數字等。
比如說,openldap想支持sudo驗證,就需要加載sudo的schema文件,這樣有了sudo相關的對象類定義,我們在openldap中的條目中才能進行sudo相關的配置。就類似於系統中的庫,有了庫,我們所使用的方法、命令才能用。
2.2 objectClass
對象類是schema定義的,對象類規定了你可以在一個條目(下邊會解釋什么是條目)中設置哪些屬性,在配置員工信息、賬號信息時,我們需要在條目中需要添加對象類,然后才能設置相應的屬性。比如你有了person類,你才能定義cn、sn姓名等。如果不添加對象類,就沒辦法用這個對象類中的屬性。
2.3 常見的對象類
person
posixAccount
posixGroup
shadowAccount
uidObject
organizationalRole
organizationalUnit
organizationalPerson
inetOrgPerson
等等
2.4 objectClass對象類詳解
條目(Entry)相當於關系數據庫中的表的記錄
條目是具有分辨名DN(Distinguished Name)的屬性-值對(Attribute-value,簡稱AV)的集合
在Unix文件系統中,最頂層是根目錄(root),Ldap目錄通常也用root做根,通常稱為BaseDN
在openldap目錄樹中每個條目必須包含一個屬於自身條件的對象類,然后再定義其條目屬性及對應的值。條目中的屬性能否添加取決於它添加的對象類是否包含此屬性。如果條目添加的屬性不在它繼承的對象類中,那這個條目就無法添加。
2.5 屬性
屬性(Attribute)在目錄樹中主要用於描述條目相關信息,例如用戶條目的用途、聯系方式、郵件、uid、gid、密碼等輔助信息。屬性是由objectClass所控制,一個objectClass的節點具有一系列Attribute,Attribute可以理解成一個變量,每個變量都有對應的值,Attribute也是有對應的值。這些屬性的對應值表示每個對象的特點,有些屬性是必須指定的,有些不是必須的。在目錄中常用的Attribute有uid、sn、giveName、objectClass、dc、ou、cn、mail、telephoneNumber等。
2.5.1 常用屬性介紹
dn:唯一標志名,類似於linux文件系統中的絕對路徑,每個條目都有一個標識名,例如uid=zhangsan,ou=people,dc=baidu,dc=com,在整個openldap中是唯一的,類似於mysql表中的主鍵
rdn:通常指相對標識名,類似於linux文件系統中的相對路徑,如uid=zhangsan
uid: 通常指一個用戶的登陸名稱,例如:uid=zhangsan
sn:通常指一個人的姓氏,例如:sn: zhang
giveName: 通常指一個人的名字。giveName: zhangsan
objectClass: objectClass是特殊的屬性,用來指定條目包含哪些對象類。如 objectClass:person
dc:通常指定一個域名,例如 dc=baidu,dc=com
ou: 指定一個組織單元的名稱:
ou=people,dc=baidu,dc=com
ou=group,dc=baidu,dc=com
mail: 郵箱 mail: didi@baidu.com
2.6 LDIF文件
LDIF(LDAP Data Interchanged Format)輕量級目錄訪問協議交換數據格式的簡稱,是存儲LDAP配置信息及目錄內容的標准文本文件格式,通常用來完成openldap數據的導入、導出、修改。
2.6.1 LDIF文件特點
- 每行的結尾不允許有空格或制表符
- 允許相關屬性可以重復賦值並使用
- 文件以.ldif結尾命名
- 文件中以#號開頭的一行為注釋,可以作為解釋使用
- LDIF文件中所有賦值方式為:屬性:[空格]屬性值
- LDIF文件通過空行來定義一個條目,空行前為一個條目,空行后為另一個條目的開始
2.6.2 LDIF文件樣例
dn: uid=user2,ou=people,dc=baidu,dc=com # 唯一標識名,用來定位這個條目
objectClass: shadowAccount # 意思是條目集成了shadowAccount這個對象類了,可以使用這個對象類中定義的屬性了,也就是下邊定義的各種屬性,shadowMin、shadowMax等。
objectClass: top
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
cn: user2
gidNumber: 1005
homeDirectory: /home/user2
sn: user2
uid: user2
uidNumber: 1003
loginShell: /bin/bash
mail: user2@baidu.com
shadowLastChange: 17843
shadowMax: 99999
shadowMin: 0
shadowWarning: 7
userPassword:: e2NyeXB0fSQxJFRmY2NYODV6JDlqTzdlRUpYQjFjcG9sVFg1Y3ZSRC8=
