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===>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。