OpenLDAP
簡述
OpenLDAP是一款輕量級目錄訪問協議(Lightweight Directory Access Protocol,LDAP),屬于開源集中賬號管理架構的實現,且支持眾多系統版本,被廣大互聯網公司所采用。
LDAP具有兩個國家標準,分別是X.500和LDAP。OpenLDAP是基于X.500標準的,而且去除了X.500復雜的功能并且可以根據自我需求定制額外擴展功能,但與X.500也有不同之處,例如OpenLDAP支持TCP/IP協議等,目前TCP/IP是Internet上訪問互聯網的協議。
OpenLDAP則直接運行在更簡單和更通用的TCP/IP或其他可靠的傳輸協議層上,避免了在OSI會話層和表示層的開銷,使連接的建立和包的處理更簡單、更快,對于互聯網和企業網應用更理想。LDAP提供并實現目錄服務的信息服務,目錄服務是一種特殊的數據庫系統,對于數據的讀取、瀏覽、搜索有很好的效果。目錄服務一般用來包含基于屬性的描述性信息并支持精細復雜的過濾功能,但OpenLDAP目錄服務不支持通用數據庫的大量更新操作所需要的復雜的事務管理或回滾策略等。
OpenLDAP默認以Berkeley DB作為后端數據庫,Berkeley DB數據庫主要以散列的數據類型進行數據存儲,如以鍵值對的方式進行存儲。Berkeley DB是一類特殊的數據庫,主要用于搜索、瀏覽、更新查詢操作,一般對于一次寫入數據、多次查詢和搜索有很好的效果。Berkeley DB數據庫是面向查詢進行優化,面向讀取進行優化的數據庫。Berkeley DB不支持事務型數據庫(MySQL、MariDB、Oracle等)所支持的高并發的吞吐量以及復雜的事務操作。
OpenLDAP目錄中的信息是按照樹形結構進行組織的,具體信息存儲在條目(entry)中,條目可以看成關系數據庫中的表記錄,條目是具有區別名(Distinguished Name,DN)的屬性(attribute),DN是用來引用條目,DN相當于關系數據庫(Oracle/MySQL)中的主鍵(primary key),是唯一的。屬性由類型(type)和一個或者多個值(value)組成,相當于關系數據庫中字段的概念
功能
實現賬號統一集中管理
權限控制管理(sudo)
密碼控制策略管理
密碼審計管理
密碼控制策略
主機控制管理
同步機制管理
TLS/SASL加密傳輸
高可用負載均衡架構
自定義schema
各種應用平臺集成賬號管理
概念
目錄樹
在一個目錄服務系統中,整個目錄信息集可以表示為一個目錄信息樹,樹中的每個節點是一個條目(Entry)
條目
條目,也叫記錄項,是LDAP中最基本的顆粒,就像字典中的詞條,或者是數據庫中的記錄。通常對LDAP的添加、刪除、更改、檢索都是以條目為基本對象
LDAP目錄的條目(entry)由屬性(attribute)的一個聚集組成,并由一個唯一性的名字引用,即專有名稱(distinguished name,DN)
對象類
對象類是屬性的集合,LDAP預想了很多人員組織機構中常見的對象,并將其封裝成對象類。比如人員(person)含有姓(sn)、名(cn)、電話(telephoneNumber)、密碼(userPassword)等屬性,單位職工(organizationalPerson)是人員(person)的繼承類,除了上述屬性之外還含有職務(title)、郵政編碼(postalCode)、通信地址(postalAddress)等屬性
屬性
每個條目都可以有很多屬性(Attribute),比如常見的人都有姓名、地址、電話等屬性。每個屬性都有名稱及對應的值,屬性值可以有單個、多個
屬性
基礎字段
dc (Domain Component)域名的部分,其格式是將完整的域名分成幾部分。如域名為cssp.com變成dc=cssp,dc=com
ou(Organization Unit)組織單位,組織單位可以包含其他各種對象(包括其他組織單元)
cn (Common Name)常用名稱,可用作分組的名字,或者用戶的全名
dn (Distinguished Name)每一個條目都有一個唯一的標識名,dn在ldap中全局唯一,相當于該條目的唯一ID。如上邊示例中的:cn=group,dc=cssp,dc=com就是該條目的dn
rdn (Relative dn)一般指dn逗號最左邊的部分。如cn=group,dc=cssp,dc=com的rdn就是 cn=group
Base DNLDAP目錄樹的最頂部就是根,比如上邊示例中的base dn為 dc=cssp,dc=com
description在不同類別中,對應不同類別的說明信息。比如用戶的說明信息,分組的說明信息
用戶字段
uid (User Id)用戶的用戶名,通常為中文拼音,或者用郵箱地址的用戶名部分。
sn (Surname)用戶的姓氏,對于中文環境下,可以直接用姓名填充。
givenName用戶的名字,不包含姓,對于中文語境下,可靈活運用該字段。
displayName用戶的顯示名字,全名。
mail用戶的郵箱。
title用戶的職位。
employeeNumber用戶的員工ID,也可以理解為工號。
employeeType用戶在單位中的角色。
departmentNumber用戶所在部門的名稱,通常為部門名,而非部門號。
businessCategory描述業務的種類,在中文語境中可靈活定義。
userPassword用戶密碼。
jpegPhoto用戶的個人資料照片。
photo用戶的照片,如上這兩個字段都可以用。
postalAddress用戶的郵政地址,也可以直接認為是用戶地址。
entryUuid此用戶專屬的固定通用標識符,類似union_id,通常用不到。
objectSid此用戶專屬的通用標識符,與 Windows 安全標識符兼容。
uidNumber用戶的 POSIX UID 號碼。如果為用戶設置了 POSIX ID,這里則會顯示此號碼。否則,這里會顯示專屬的固定標識符。
gidNumber用戶主要群組的 POSIX GID 號碼。如果為用戶設置了 POSIX GID,這里則會顯示此號碼。否則,則會顯示與用戶的 UID 相同的號碼。
homeDirectory用戶的 POSIX 主目錄。默認為/home/<用戶名>。
loginShell用戶的 POSIX 登錄 shell。默認為/bin/bash。
carLicense車牌,通常用不上這個字段。
homePhone家庭固定電話,通常用不上這個字段。
homePostalAddress郵編,通常用不上這個字段。
roomNumber房間號碼,通常用不上這個字段。
secretary秘書,通常用不上這個字段。
分組字段
displayName用戶可理解的群組顯示名稱。
description用戶可理解的群組詳細說明。
gidNumber群組的 POSIX GID 號碼。這是固定的專屬 ID,但無法通過此 ID 高效地查找群組。
entryUuid此群組專屬的固定通用標識符。
member此群組中成員的完全符合條件的名稱列表。
memberUid此群組中成員的用戶名列表。
部署
openldap+phpldapadmin
安裝openldap
yum安裝
#yum install -y openldap openldap-clients openldap-servers配置
1,復制一個默認配置到指定目錄下,并授權,這一步一定要做,然后再啟動服務,不然生產密碼時會報錯
#cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG2,ldap用戶授權
#chown -R ldap.ldap /var/lib/ldap/DB_CONFIG3,啟動
#systemctl start | enable | status slapd啟用memberof功能
從openldap2.4.23版本開始,所有配置都保存在/etc/openldap/slapd.d目錄下的cn=config文件夾內,不再使用slapd.conf作為配置文件。配置文件的后綴為 ldif,且每個配置文件都是通過命令自動生成的,任意打開一個配置文件,在開頭都會有一行注釋,說明此為自動生成的文件,請勿編輯,使用ldapmodify命令進行修改
安裝openldap后,會有三個命令用于修改配置文件,分別為ldapadd, ldapmodify, ldapdelete,顧名思義就是添加,修改和刪除。而需要修改或增加配置時,則需要先寫一個ldif后綴的配置文件,然后通過命令將寫的配置更新到slapd.d目錄下的配置文件中.
修改配置過程
1,生成管理員密碼,記錄下這個密碼,后面需要用到
#slappasswd -s 123456{SSHA}LSgYPTUW4zjGtIVtuZ8cRUqqFRv1tWpE
2,新增修改密碼文件,ldif為后綴,文件名隨意,不要在/etc/openldap/slapd.d/目錄下創建類似文件
3,生成的文件為需要通過命令去動態修改ldap現有配置
#vim /etc/openldap/slapd.d/changepwd.ldif----------------------------------------------------------------------dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}LSgYPTUW4zjGtIVtuZ8cRUqqFRv1tWpE
----------------------------------------------------------------------###第一行執行配置文件,這里就表示指定為 cn=config/olcDatabase={0}config 文件。/etc/openldap/slapd.d/目錄下就能找到此文件
###第二行 changetype 指定類型為修改
###第三行 add 表示添加 olcRootPW 配置項
###第四行指定 olcRootPW 配置項的值
###在執行下面的命令前,你可以先查看原本的olcDatabase={0}config文件,里面是沒有olcRootPW這個項的,執行命令后,你再看就會新增了olcRootPW項,而且內容是我們文件中指定的值加密后的字符串
4,執行命令,修改ldap配置,通過-f執行文件
#ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/slapd.d/changepwd.ldif查看olcDatabase={0}config內容,新增了一個olcRootPW項
#cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif切記不能直接修改/etc/openldap/slapd.d/目錄下的配置
5,向 LDAP 中導入一些基本的 Schema。這些 Schema 文件位于 /etc/openldap/schema/ 目錄中,schema控制著條目擁有哪些對象類和屬性,可以自行選擇需要的進行導入,
依次執行下面的命令,導入基礎的一些配置,我這里將所有的都導入一下,其中core.ldif是默認已經加載了的,不用導入
#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 #ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/collective.ldif #ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/corba.ldif #ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/duaconf.ldif #ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif #ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/java.ldif #ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/misc.ldif #ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/openldap.ldif #ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/pmi.ldif #ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif6,修改域名,新增changedomain.ldif, 這里我自定義的域名為 filesec.com,管理員用戶賬號為admin。
如果要修改,則修改文件中相應的dc=filesec,dc=com為自己的域名
#vim /etc/openldap/slapd.d/changepwd.ldif-------------------------------------------------------------------------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=admin,dc=filesec,dc=com" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=filesec,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=filesec,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}LSgYPTUW4zjGtIVtuZ8cRUqqFRv1tWpE
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=filesec,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=filesec,dc=com" write by * read
-------------------------------------------------------------------------
7,執行命令,修改配置
#ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/openldap/slapd.d/changepwd.ldif8,新增add-memberof.ldif
開啟memberof支持并新增用戶支持memberof配置
#vim /etc/openldap/slapd.d/add-memberof.ldif-------------------------------------------------------------dn: cn=module{0},cn=config
cn: modulle{0}
objectClass: olcModuleList
objectclass: top
olcModuleload: memberof.la
olcModulePath: /usr/lib64/openldap
dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfUniqueNames
olcMemberOfMemberAD: uniqueMember
olcMemberOfMemberOfAD: memberOf
-------------------------------------------------------------
9,新增refint1.ldif文件
#vim /etc/openldap/slapd.d/refint1.ldif-------------------------------------------------------------dn: cn=module{0},cn=config
add: olcmoduleload
olcmoduleload: refint
-------------------------------------------------------------
10,新增refint2.ldif文件
#vim /etc/openldap/slapd.d/refint2.ldif-------------------------------------------------------------dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: refint
olcRefintAttribute: memberof uniqueMember manager owner
-------------------------------------------------------------
11,依次執行下面命令,加載配置,順序不能錯
#ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /etc/openldap/slapd.d/add-memberof.ldif #ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f /etc/openldap/slapd.d/refint1.ldif #ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /etc/openldap/slapd.d/refint2.ldif創建用戶
在上述基礎上,我們來創建一個叫做 filesec company 的組織,并在其下創建一個 admin 的組織角色(該組織角色內的用戶具有管理整個 LDAP 的權限)和 People 和 Group 兩個組織單元
1,新增配置文件
#vim /etc/openldap/slapd.d/base.ldif----------------------------------------------------------dn: dc=filesec,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: filesec Company
dc: filesec
dn: cn=admin,dc=filesec,dc=com
objectClass: organizationalRole
cn: admin
dn: ou=People,dc=filesec,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=filesec,dc=com
objectClass: organizationalRole
cn: Group
----------------------------------------------------------
2,執行命令,添加配置, 這里要注意修改域名為自己配置的域名,然后需要輸入上面我們生成的密碼(明文)
#ldapadd -x -D cn=admin,dc=filesec,dc=com -W -f /etc/openldap/slapd.d/base.ldif其中基準 dc=filesec,dc=com 是該樹的根節點,其下有一個管理域 cn=admin,dc=filesec,dc=com 和兩個組織單元 ou=People,dc=filesec,dc=com 及 ou=Group,dc=filesec,dc=com安裝phpldapadmin
web界面
1,安裝php、php-ldap
#yum install -y php php-ldap2,安裝phpldapadmin
#rpm -ivh phpldapadmin-1.2.5-1.el7.noarch.rpm3,修改apache的phpldapadmin配置文件
修改如下內容,放開外網訪問,這里只改了2.4版本的配置,因為centos7 默認安裝的apache為2.4版本。所以只需要改2.4版本的配置就可以了
如果不知道自己apache版本,執行 rpm -qa|grep httpd 查看apache版本
vim /etc/httpd/conf.d/phpldapadmin.conf-----------------------------------------------------------------<IfModule mod_authz_core.c>
# Apache 2.4
Require all granted
</IfModule>
-----------------------------------------------------------------
4,修改配置用DN登錄ldap
#vim /etc/phpldapadmin/config.php-----------------------------------------------------------------#398行,默認是使用uid進行登錄,我這里改為cn,也就是用戶名
$servers->setValue('login','attr','cn');
#460行,關閉匿名登錄,否則任何人都可以直接匿名登錄查看所有人的信息
$servers->setValue('login','anon_bind',false);
#519行,設置用戶屬性的唯一性,這里我將cn,sn加上了,以確保用戶名的唯一性
$servers->setValue('unique','attrs',array('mail','uid','uidNumber','cn','sn'));
-----------------------------------------------------------------
5,啟動apache
#systemctl start httpd #systemctl enable httpd登錄phpldapadmin界面
http://${IP}:${port}/phpldapadmin
維護
總結
- 上一篇: 大数据平台安全培训.ppt
- 下一篇: 环境监测设备中ESD测试步骤