LDAP介绍


发布于 2024-04-03 / 47 阅读 / 0 评论 /
LDAP基本功能

1.LDAP概述

LDAP全称Light Directory Access Protocol,是基于X.500标准的轻量级目录访问协议。

1.1.LDAP解决的问题

LDAP作为统一认证服务,可以解决以下几个问题:

(1)日常多个办公系统。

(2)每个系统都有独立的账号密码。

(3)每次新项目的开发,都需要重新开发和维护一套用户密码。

(4)维护多套系统的用户是一件非常繁琐的工作。

1.2.LDAP中的目录

目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样。

目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的,就好象它的名字一样。

LDAP目录服务是由目录数据库和一套访问协议组成的系统。

1.3.为什么要使用LDAP

LDAP是开放的Internet标准,支持跨平台的Internet协议,在业界中得到广泛认可的,并且市场上或者开源社区上的大多产品都加入了对LDAP的支持,因此对于这类系统,不需单独定制,只需要通过LDAP做简单的配置就可以与服务器做认证交互。“简单粗暴”,可以大大降低重复开发和对接的成本。

2.LDAP基本概念

LDAP中主要有以下概念。

2.1.目录树

目录树:在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。

条目:entry,每个条目就是一条记录,每个条目有自己的唯一可区别的名称(DN)。

对象类:与某个实体类型对应的一组属性,对象类是可以继承的,这样父类的必须属性也会被继承下来。

属性:描述条目的某个方面的信息,一个属性由一个属性类型和一个或多个属性值组成,属性有必须属性和非必须属性。

2.2.DC、UID、OU、CN、SN、DN、RDN

这些都是整个目录树的角色,具体说明如下表所示:

关键词

全称

说明

dc

Domain Component

域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com(一条记录的所属区域,指定属于哪一棵树)

uid

User Id

用户ID songtao.xu(一条记录的ID,与cn对应)

ou

Organization Unit

组织单位,组织单位可以包含其他各种对象(包括其他组织单元),如“oa组”(一条记录的所属组织,指定属于树中的哪个分支)

cn

Common Name

公共名称,如“Thomas Johansson”(一条记录的名称,与uid对应)

sn

Surname

姓,如“许”

dn

Distinguished Name

“uid=songtao.xu,ou=oa组,dc=example,dc=com”,一条记录的位置(唯一)

rdn

Relative dn

相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn= Thomas Johansson”

在寻址过程中,范围由大到小:dc===>ou===>cn/uid===>dn。

2.3.基本模型

主要有以下模型。

2.3.1.信息模型

LDAP中,信息以树状方式组织,在树状信息中的基本数据单元是条目,而每个条目由多个属性构成,属性中存储有属性值和类型。

2.3.2.命名模型

命名模型即条目定位方式。在LDAP中,每个条目都有自己的DN,DN是该条目在整个树中的唯一名称标识,如同文件系统中,带路径的文件名就是DN。

2.3.3.功能模型

LDAP中共有4类10种操作。

(1)查询类操作:如搜索、比较。

(2)更新类操作:如添加、删除、修改条目,修改条目名。

(3)认证类操作:如绑定、解绑定。

(4)其他操作:如放弃和扩展操作。

2.3.4.安全模型

LDAP中安全模型主要是通过身份认证、安全通道和访问控制来实现。

3.LDAP配置说明

LDAP的配置目录一般在/etc/openldap/,目录结构如下图所示:

下面对此目录下的文件及其子目录进行讲解。

3.1.ldap.conf配置文件

ldap.conf是服务的配置文件,内容例如下图所示:

根据linux的手册中介绍,ldap.conf配置文件用来设置一些系统级别的默认值,当ldap客户端运行时一般会读取此文件中的配置。

ldap.conf包含有:通用参数、SASL相关参数、GSSAPI相关参数、TLS相关参数、环境变量、可引入的配置文件地址(这些文件包含相关配置)。具体的介绍请参考https://man7.org/linux/man-pages/man5/ldap.conf.5.html。

如上图所示,TLS_CACERTDIR表示TLS证书所载的目录;“SASL_NOCANON ON”表示开启反向域名解析SASL域名。

3.2.sldap.conf配置文件

sldap.conf是LDAP Server的配置文件。

首先,配置系统管理员,需要配置以下三个参数:

(1)suffix:指的登录域

(2)rootdn:指创建一个管理域的管理员

(3)rootpw:指管理员的密码(这里可写明文,但很不安全所以用了加密)

例如下图所示:

具体的属性配置可参考https://man7.org/linux/man-pages/man5/slapd.conf.5.html。

3.3.schema目录

schema目录中定义了LDAP可使用的schema,每一个schema由两个文件定义——“.ldif”文件和”.schema”文件。ldif文件主要是配置账号信息。

schema是LDAP的重要组成部分,类似于数据库中的模式定义。LDAP的schema定义了LDAP目录所应遵循的结构和规则,比如一个objectclass会有哪些属性,这些属性又是什么结构等等。schema给LDAP服务器提供了LDAP目录中类别、属性等信息的识别方式,这些可以被LDAP服务器识别。

如果要让LDAP服务器识别此schema,需要在sldap.conf配置文件中include相应的schema文件。如下图所示:

LDAP的schema包含4个重要元素:objectclass、attributetype、syntax、matching rules。

3.3.1.Objectclass

objectclass定义了一个类,这个类会被不同的目录(LDAP中的一个entry)用到,它说明了该目录应该有哪些属性,哪些属性是必须的,哪些是可选的。

一个objectclass的定义包含以下信息:

(1)NAME:名称

(2)DESC:说明

(3)STRUCTURAL或AUXILARY:类型,分别表示是结构型的还是辅助型的

(4)MUST:必须属性

(5)MAY:可选属性

objectclass定义案例如下所示:

objectclass ( 2.5.6.12 NAME 'applicationEntity'
        DESC 'RFC2256: an application entity'
        SUP top STRUCTURAL
        MUST ( presentationAddress $ cn )
        MAY ( supportedApplicationContext $ seeAlso $ ou $ o $ l $ description ) )

案例中,“2.5.6.12”表示ID;“$”表示分隔符;“SUP top”表示没有继承的父类。

3.3.2.Attribute

attribute是objectclass中可能包含的属性,对其的定义包含名称、数据类型、单值还是多值、匹配规则等。

attribute定义案例如下所示:

attributetype ( 2.5.4.6 NAME ( 'c' 'countryName' )
        DESC 'RFC4519: two-letter ISO-3166 country code'
        SUP name
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.11
        SINGLE-VALUE )

attributetype ( 2.5.4.16 NAME 'postalAddress'
        DESC 'RFC2256: postal address'
        EQUALITY caseIgnoreListMatch
        SUBSTR caseIgnoreListSubstringsMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )

案例中,定义了两个属性organizationName(别名为“o”)和postalAddress。

匹配原则为EQUALITY,还有如SUBSTR是字符串匹配,ORDERING是顺序匹配

3.3.3.Syntax

syntax是LDAP中的语法,其实就是LDAP中会用到的数据类型和数据约束。语法遵循X.500中数据约束定义的。其定义需要有一个ID(遵从X.500)以及DESP(说明)。

Syntax定义例如下所示:

olcLdapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.5 DESC 'Binary' X-NOT-HUMAN-RE
 ADABLE 'TRUE' )
olcLdapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'Bit String' )
olcLdapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.7 DESC 'Boolean' )
olcLdapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.13 DESC 'Data Quality' )
olcLdapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'Directory String' )

案例中,共定义了四个属性。一串数字表示ID,这串数字包含了存储方式、所占空间大小等信息。

3.3.4.Matching Rules

matching rules是用来指定某属性的匹配规则,实际就是定义一个特殊的syntax别名,让LDAP服务器可以识别,并对定义的属性进行匹配。

4.LDAP操作命令

LDAP主要有以下操作命令:

(1)ldapsearch:搜索 OpenLDAP 目录树条目。

(2)ldapadd:通过 LDIF 格式,添加目录树条目。

(3)ldapdelete:删除 OpenLDAP 目录树条目。

(4)ldapmodify:修改 OpenLDAP 目录树条目。

(5)ldapwhoami:效验 OpenLDAP 用户的身份。

(6)ldapmodrdn:判断 OpenLDAP 目录树 DN 条目。

(7)ldapcompare:判断 DN 值和指定参数值是否属于同一个条目。

(8)ldappasswd:修改 OpenLDAP 目录树用户条目实现密码重置。

(9)slaptest:验证 slapd.conf 文件或 cn=配置目录。

(10)slapindex:创建 OpenLDAP 目录树索引,提供查询效率。

(11)slapcat:将数据小牧转换为 OpenLDAP 的 LDIF 文件。

下面对这些命令的使用方法做简单介绍。

4.1.ldapsearch

ldapsearch命令可根据用户定义的查询条件,对OpenLDAP目录树进行查找以及检索目录树相关entry。

使用案例一:以admin用户登录,密码为admin,查询“ou=People,dc=abc,dc=com”这个分支。

ldapsearch -h abc-10-1-0-134 -x -D "cn=admin,dc=abc,dc=com" -w admin -b "uid=aaaaa,ou=People,dc=abc,dc=com"

例如下图所示:

使用案例二:根据过滤条件查找entry,比如根据uid进行过滤。

ldapsearch -h abc-10-1-0-134 -x -D "cn=admin,dc=abc,dc=com" -w admin -b "ou=People,dc=abc,dc=com" ‘(uid=leo*)'

结果如下图所示:

匹配uid为leo开头的entry,结果如下图所示,共查找出3条entry。

4.2.slappasswd

slappasswd命令的作用是可以生成LDAP管理员密码。slappasswd命令支持多种加密方案如:CRYPT、MD5、SMD5、SSHA和SHA。

slappasswd -v -u -s 123@abc -h {crypt}

其中-h指定加密方案,它支持{CRYPT}、{MD5}、{SMD5}、{SSHA}和{SHA}等方式,默认值是{SSHA}。

4.3.ldapadd

根据ldif文件添加entry,命令为:

ldapadd -x -w <pwd> -D "cn=Manager,dc=xiaoming,dc=com" -f base.ldif

base.ldif内容如下所示:

dn: dc=xiaoming,dc=com
dc: xiaoming
objectClass: top 
objectClass: domain

dn: ou=People,dc=xiaoming,dc=com
ou: People
objectClass: top 
objectClass: organizationalUnit

dn: ou=Group,dc=xiaoming,dc=com
ou: Group
objectClass: top 
objectClass: organizationalUnit

共有3个entries。

4.4.ldapmodify

ldapmodify 命令是固定的,主要是通过配置文件实现不同的修改功能。

ldapmodify -x -D "cn=Manager,dc=xiaoming,dc=com" -w <pwd> -f modi.ldif

modi.ldif与上一节中的basic.ldif文件格式类似,下面根据不同的功能,看看modi.ldif的文件内容格式。

4.4.1.向条目下添加成员参数

modi.ldif 文件如下:

dn: cn=admin,ou=Group,dc=dc=xiaoming,dc=com
changetype: modify
add: memberUid
memberUid: xiaoming

表示向 admin 这个组中添加成员 xiaoming。

4.4.2.修改条目的某个值

modi.ldif 文件如下:

dn: uid=xiaoming,ou=People,dc=xiaoming,dc=com
changetype: modify
replace: uidNumber
uidNumber: 520

表示修改 uid=xiaoming 这个用户的 uidNumber 参数。

4.4.3.删除条目下某个参数

modi.ldif 文件如下:

dn: uid=xiaoming,ou=People,dc=xiaoming,dc=com
changetype: modify
delete: pwdAccountLockedTime

表示删除 uid=xiaoming 这个用户下 pwdAccountLockedTime 参数。

4.5.ldapdelete

从当前目录树中删除 uid 为 xiaoming 的用户,删除前需要使用 ldapsearch 查看 xiaoming 的 DN 名称。操作过程例如下所示:

# 查看uid=xiaoming的dn名称,然后执行删除操作
ldapsearch -x -b "dc=xiaoming,dc=com" '(uid=xiaoming)' 
ldapdelete -x -D cn=Manager,dc=xiaoming,dc=com -w <pwd> "uid=xiaoming,ou=People,dc=xiaoming,dc=com"

4.6.ldapcompare

判断DN值对应的entry中的属性值是否与指定的参数值一直。例如比对userPassword是否一致:

经过实验,如果userPassword是明文,则比对无法成功。

4.7.ldapwhoami

校验LDAP Server的用户身份。例如:

返回Success表示校验成功。

注意,此命令只用于校验LDAP Server的登录用户,而不是用于校验用户entry的userPassword。