- 基本概念
- LDAP树形结构的构成方式
- 使用ldapadd进行数据增加
- 创建内容
- 操作方式
- 命令介绍
- Option介绍
- 操作实例
- 添加Organisation Unit
- 使用ldapsearch进行数据查询
- 操作方式
- Option介绍
- 常见的查询
- 方式4: 使用模糊匹配
- 方式5: 指定返回信息
- 使用ldapmodify和ldapdelete进行修改或删除
- 操作方式
- Option介绍
- 修改信息:ldapmodify
- extended LDIF
- LDAPv3
- base
with scope subtree - filter: uid=bjensen
- requesting: ALL
- Barbara Jensen, example.org
- search result
- numResponses: 2
- numEntries: 1
- extended LDIF
- LDAPv3
- base
with scope subtree - filter: uid=bjensen
- requesting: ALL
- bjensen, People, example.org
- search result
- numResponses: 2
- numEntries: 1
LDAP一般用于SSO的单点登录
LDAP是 Lightweight Directory Access Protocol的缩写,直译过来是“轻量目录访问协议”,之所以称为“轻量”,就是有“重量级”的目录访问协议,那就是X.500协议,LDAP基于X.500并进行简化,也是IETF下的一项标准,目前最新的RFC为RFC4510,信息如下:
基本概念
E文 | 说明 |
---|---|
Directory | 目录,用于存放信息的单元 |
Entry | 条目,LDAP的基本信息单元 |
DN:Distinguished Name | 条目中用于唯一区别改条目的信息 |
LDIF:LDAP Interchange Format | 在RFC2849中定义的标准,用于规范LDAP的配置和目录内容等详细信息的保存,后续的例子中将会较多地使用LDIF进行增删改查的操作。 |
注:
- 每个Entry都可以有多个属性,而每个属性都有特定的类型和一个或多个取值,比如cn(Common Name)就是一个属性
- 因为LDAP概念很多,这里会根据例子展开相关的最小程度的概念,更为详细的可以查看上文的RFC的文档。
LDAP树形结构的构成方式
LDAP存储的信息以树形结构的方式进行组织,而设计LDAP结构一般有两种方式,比如为了说明一个人所处的详细信息,采用不同的方式的构成方式也会有所不同,而这些最终会体现到LDIF的详细信息上。
传统方式
传统方式聚焦于国别以及地理信息为上层构成,比如Barbara Jenson这个人,使用这种方式来确认,首先会看国别,美国还是英国,然后按照地理信息进行继续下行,是加州的Acme公司的销售部门的一个成员。
互联网域名方式
互联网域名则是基于域名,上层构成直接使用域名,能结合DNS相关的技术。在这种方式下,看一下babs这个人,是exmaple.com公司下的一个成员。
https://www.openldap.org/doc/admin24/
使用ldapadd进行数据增加
创建内容
这里我们将会聚焦于下图灰色部分的创建,这也是实际项目中使用的最多的一种,在这系列的文章中将会使用openldap的osixia的镜像所内置的缺省的dc: example.org(这里的信息是openldap官方例子的信息,在例子中我们实际使用的是example.org而不是example.com)。通过设定环境变量即可简单改变此处,因为此部分更多与LDAP基本服务设定相关,所以使用客户端的命令或者编程接口对其进行操作的部分主要聚焦于从Organisation开始的部分。
创建目标
在本文的例子中,将会在dc=example, dc=org下创建:
创建内容 | 类型 | 名称 | 定位方式 |
---|---|---|---|
部门 | Organisation Unit | People | 通过ou=People进行 |
部门 | Organisation Unit | Servers | 通过ou=Servers进行 |
部门 | Person | People | 通过uid=babs进行 |
操作方式
执行场所
对LDAP进行操作,场所不限,LDAP服务器上进行操作,也可以在可以连接LDAP服务的客户端进行
使用命令
常用的数据添加,可以使用ldapmodify命令也可以使用ldapadd
数据填充
命令介绍
使用ldapadd或者ldapmodify进行数据添加,很多情况下的客户端实现中,这两个是一个共通的实现,简单到可能只是一个软链接
liumiaocn:openldap liumiao$ which ldapadd
/usr/bin/ldapadd
liumiaocn:openldap liumiao$ ls -l /usr/bin/ldapadd
lrwxr-xr-x 1 root wheel 10 Oct 25 11:50 /usr/bin/ldapadd -> ldapmodify
liumiaocn:openldap liumiao$
Option介绍
命令的Option就不再分命令来介绍,常用的Option的信息和用途整理如下:
Option | 说明 |
---|---|
-H | ldapuri,格式为ldap://机器名或者IP:端口号,不能与-h和-p同时使用 |
-h | LDAP服务器IP或者可解析的hostname,与-p可结合使用,不能与-H同时使用 |
-p | LDAP服务器端口号,与-h可结合使用,不能与-H同时使用 |
-x | 使用简单认证方式 |
-D | 所绑定的服务器的DN |
-w | 绑定DN的密码,与-W二者选一 |
-W | 不输入密码,会交互式的提示用户输入密码,与-w二者选一 |
-f | 指定ldif文件作为输入 |
-a | 添加新的entry,ldapadd缺省使用,ldapmodify 可指定以达到同样作用 |
-c | 出错后忽略当前错误继续执行,缺省情况下遇到错误即终止 |
-n | 模拟操作但并不实际执行,用于验证,常与-v一同使用进行问题定位 |
-v | 显示详细信息 |
-d | 显示debug信息,可设定级别 |
-e | 设置客户端证书 |
-E | 设置客户端私钥 |
操作实例
用户Barbara的LDIF信息
使用最基础的方式添加一个用户Barbara,这也是man ldapmodify给出的例子,稍微做一下修改以保证能够正常添加进去。
liumiaocn:openldap liumiao$ cat barbara.ldif
dn: cn=Barbara Jensen,dc=example,dc=org
objectClass: inetOrgPerson
cn: Barbara Jensen
cn: Babs Jensen
sn: Jensen
title: the world's most famous mythical manager
mail: bjensen@example.com
uid: bjensen
liumiaocn:openldap liumiao$
使用ldapadd添加Barbara
liumiaocn:openldap liumiao$ ldapadd -H ldap://192.168.31.242:389 -D "cn=admin,dc=example,dc=org" -w admin -f barbara.ldif
adding new entry "cn=Barbara Jensen,dc=example,dc=org"
liumiaocn:openldap liumiao$
使用ldapsearch可以确认到添加的这个实际上最mythical的Barbara的详细信息:
liumiaocn:openldap liumiao$ ldapsearch -x -h 192.168.31.242 -b dc=example,dc=org -D "cn=admin,dc=example,dc=org" -w admin
...省略
# Barbara Jensen, example.org
dn: cn=Barbara Jensen,dc=example,dc=org
objectClass: inetOrgPerson
cn: Barbara Jensen
cn: Babs Jensen
sn: Jensen
title: the world's most famous mythical manager
mail: bjensen@example.com
uid: bjensen
# search result
search: 2
result: 0 Success
# numResponses: 4
# numEntries: 3
liumiaocn:openldap liumiao$
删除该用户
删除此用户,然后后面来验证使用ldapmodify是否可以同样进行操作
liumiaocn:openldap liumiao$ ldapdelete -x -h 192.168.31.242 -D "cn=admin,dc=example,dc=org" -w admin "cn=Barbara Jensen,dc=example,dc=org"
liumiaocn:openldap liumiao$
使用ldapmodify添加Barbara
在这里,由于ldapadd就是一个指向ldapmodify的软链接,再详细进行确认一下,可以得出这两个东西应该是完全一致的操作,所以一个很简单的问题:
ldapadd -H ldap://192.168.31.242:389 -D “cn=admin,dc=example,dc=org” -w admin -f barbara.ldif
- Question:中的ldapadd替换称ldapmodify是否能够完全一致的动作?
执行一下来确认结果:
liumiaocn:openldap liumiao$ ldapmodify -H ldap://192.168.31.242:389 -D "cn=admin,dc=example,dc=org" -w admin -f barbara.ldif
ldapmodify: modify operation type is missing at line 2, entry "cn=Barbara Jensen,dc=example,dc=org"
liumiaocn:openldap liumiao$
对应方法1: 使用-a的Option
仔细会看上文整理的Option,对-a的说明是这样的“添加新的entry,ldapadd缺省使用,ldapmodify 可指定以达到同样作用“,所以ldapmodify的话,添加-a就可以达到同样效果了。
liumiaocn:openldap liumiao$ ldapmodify -a -H ldap://192.168.31.242:389 -D "cn=admin,dc=example,dc=org" -w admin -f barbara.ldif
adding new entry "cn=Barbara Jensen,dc=example,dc=org"
liumiaocn:openldap liumiao$
对应方法2: 修改LDIF的写法
为了验证,重新把刚刚生成的Barbara再次删掉
liumiaocn:openldap liumiao$ ldapdelete -x -h 192.168.31.242 -D "cn=admin,dc=example,dc=org" -w admin "cn=Barbara Jensen,dc=example,dc=org"
liumiaocn:openldap liumiao$
修改LDIF的内容,添加一行信息内容为:changetype: add,修改后的全部信息如下:
liumiaocn:openldap liumiao$ cat barbara.ldif
dn: cn=Barbara Jensen,dc=example,dc=org
changetype: add
objectClass: inetOrgPerson
cn: Barbara Jensen
cn: Babs Jensen
sn: Jensen
title: the world's most famous mythical manager
mail: bjensen@example.com
uid: bjensen
liumiaocn:openldap liumiao$
这样就可以使用同样的命令行进行添加了
liumiaocn:openldap liumiao$ ldapmodify -H ldap://192.168.31.242:389 -D "cn=admin,dc=example,dc=org" -w admin -f barbara.ldif
adding new entry "cn=Barbara Jensen,dc=example,dc=org"
liumiaocn:openldap liumiao$
添加Organisation Unit
在添加用户的时候关键的objectclass是inetOrgPerson,而对于添加部门,关键信息则为organisationalUnit,添加两个OrganisationUnit的LDIF信息如下:
liumiaocn:openldap liumiao$ cat orgunits.ldif
dn: ou=People,dc=example,dc=org
objectclass: top
objectclass: organizationalUnit
ou: People
dn: ou=Servers,dc=example,dc=org
objectclass: top
objectclass: organizationalUnit
ou: Servers
liumiaocn:openldap liumiao$
通过这个例子可以对LDIF进一步理解到可以是多段信息的结合,而在实际的项目中,对LDAP数据在不是很复杂的情况下,使用LIDF进行备份和恢复也是常用的方式。
- 使用ldapadd进行信息的添加
liumiaocn:openldap liumiao$ ldapadd -H ldap://192.168.31.242:389 -D "cn=admin,dc=example,dc=org" -w admin -f orgunits.ldif
adding new entry "ou=People,dc=example,dc=org"
adding new entry "ou=Servers,dc=example,dc=org"
liumiaocn:openldap liumiao$
- 通过ldapsearch进行结果的查询
liumiaocn:openldap liumiao$ ldapsearch -x -h 192.168.31.242 -b dc=example,dc=org -D "cn=admin,dc=example,dc=org" -w admin
...省略
# People, example.org
dn: ou=People,dc=example,dc=org
objectClass: top
objectClass: organizationalUnit
ou: People
# Servers, example.org
dn: ou=Servers,dc=example,dc=org
objectClass: top
objectClass: organizationalUnit
ou: Servers
# search result
search: 2
result: 0 Success
# numResponses: 6
# numEntries: 5
liumiaocn:openldap liumiao$
使用ldapadd和ldapmodify结合ldif文件实现了对部门信息和人员的添加,但注意到部门和人员的信息还未进行关联,当然最简单的方式是先创建部门,然后在人员信息中添加相关内容即可。
使用ldapsearch进行数据查询
操作方式
执行场所
对LDAP进行操作,场所不限,LDAP服务器上进行操作,也可以在可以连接LDAP服务的客户端进行
使用命令
常用的数据的查询,可以使用ldapsearch
Option介绍
命令的Option就不再分命令来介绍,常用的Option的信息和用途整理如下:
Option | 说明 | |||
---|---|---|---|---|
-H | ldapuri,格式为ldap://机器名或者IP:端口号,不能与-h和-p同时使用 | |||
-h | LDAP服务器IP或者可解析的hostname,与-p可结合使用,不能与-H同时使用 | |||
-p | LDAP服务器端口号,与-h可结合使用,不能与-H同时使用 | |||
-x | 使用简单认证方式 | |||
-D | 所绑定的服务器的DN | |||
-w | 绑定DN的密码,与-W二者选一 | |||
-W | 不输入密码,会交互式的提示用户输入密码,与-w二者选一 | |||
-f | 指定输入条件,在RFC 4515中有更详细的说明 | |||
-c | 出错后忽略当前错误继续执行,缺省情况下遇到错误即终止 | |||
-n | 模拟操作但并不实际执行,用于验证,常与-v一同使用进行问题定位 | |||
-v | 显示详细信息 | |||
-d | 显示debug信息,可设定级别 | |||
-s | 指定搜索范围, 可选值:`base | one | sub | children` |
常见的查询
方式1: 指定ldapuri进行查询
使用示例:
ldapsearch -x -H ldap://192.168.31.242:389 -b dc=example,dc=org -D “cn=admin,dc=example,dc=org” -w admin
方式2: 指定hostname和端口号进行查询
使用示例:
ldapsearch -x -h 192.168.31.242 -p 389 -b dc=example,dc=org -D “cn=admin,dc=example,dc=org” -w admin
方式3: 指定过滤条件:按照dn进行过滤
使用示例:
ldapsearch -x -h 192.168.31.242 -p 389 -b dc=example,dc=org -D “cn=admin,dc=example,dc=org” -w admin
方式3: 指定过滤条件:按照dn进行过滤
可以通过dn进行过滤,因为dn能较为清晰的确定一条entry的信息,比如确认admin的详细,可以使用
使用示例:
ldapsearch -x -H ldap://192.168.31.242:389 -b cn=admin,dc=example,dc=org -D “cn=admin,dc=example,dc=org” -w admin
liumiaocn:openldap liumiao$ ldapsearch -x -H ldap://192.168.31.242:389 -b cn=admin,dc=example,dc=org -D "cn=admin,dc=example,dc=org" -w admin
# extended LDIF
#
# LDAPv3
# base <cn=admin,dc=example,dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# admin, example.org
dn: cn=admin,dc=example,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9TE5GaU0rZVZXNGlRR3FDdzQ5UzRMNjRlb2xjMjY5OU4=
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
liumiaocn:openldap liumiao$
同样查询上文中生成的People的这样一个部门的话,可以使用这样的语句:
liumiaocn:openldap liumiao$ ldapsearch -x -H ldap://192.168.31.242:389 -b ou=people,dc=example,dc=org -D "cn=admin,dc=example,dc=org" -w admin
# extended LDIF
#
# LDAPv3
# base <ou=people,dc=example,dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# People, example.org
dn: ou=People,dc=example,dc=org
objectClass: top
objectClass: organizationalUnit
ou: People
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
liumiaocn:openldap liumiao$
方式4: 使用模糊匹配
比如我们创建了People和Servers这两个ou,我们可以使用ou=*来一下查询出当前根下的ou的信息,比如可以使用如下的命令:
liumiaocn:openldap liumiao$ ldapsearch -x -h 192.168.31.242 -p 389 -b "dc=example,dc=org" -D "cn=admin,dc=example,dc=org" -w admin "ou=*"
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=org> with scope subtree
# filter: ou=*
# requesting: ALL
#
# People, example.org
dn: ou=People,dc=example,dc=org
objectClass: top
objectClass: organizationalUnit
ou: People
# Servers, example.org
dn: ou=Servers,dc=example,dc=org
objectClass: top
objectClass: organizationalUnit
ou: Servers
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2
liumiaocn:openldap liumiao$
常用的方式还可以使用cn=*或者cn=admin这样进行指定信息进行过滤
liumiaocn:openldap liumiao$ ldapsearch -x -h 192.168.31.242 -p 389 -b "dc=example,dc=org" -D "cn=admin,dc=example,dc=org" -w admin "cn=*"
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=org> with scope subtree
# filter: cn=*
# requesting: ALL
#
# admin, example.org
dn: cn=admin,dc=example,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9TE5GaU0rZVZXNGlRR3FDdzQ5UzRMNjRlb2xjMjY5OU4=
# Barbara Jensen, example.org
dn: cn=Barbara Jensen,dc=example,dc=org
objectClass: inetOrgPerson
cn: Barbara Jensen
cn: Babs Jensen
sn: Jensen
title: the world's most famous mythical manager
mail: bjensen@example.com
uid: bjensen
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2
liumiaocn:openldap liumiao$ ldapsearch -x -h 192.168.31.242 -p 389 -b "dc=example,dc=org" -D "cn=admin,dc=example,dc=org" -w admin "cn=admin"
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=org> with scope subtree
# filter: cn=admin
# requesting: ALL
#
# admin, example.org
dn: cn=admin,dc=example,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9TE5GaU0rZVZXNGlRR3FDdzQ5UzRMNjRlb2xjMjY5OU4=
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
liumiaocn:openldap liumiao$
当然这里只是给出了几个非常简单的使用例子进行过滤,可以结合>和<以及~匹配查找等方式实现更加快速和便捷地定位。
方式5: 指定返回信息
另外比较常用的一种方式类似与在SQL中写Select,我们可以指定返回的字段信息以及排序,在实际的集成中也是非常的有用,比如,我们只返回创建的uid的mail/uid/title/cn/sn,并按照我们期待的方式进行返回,具体使用示例如下:
liumiaocn:openldap liumiao$ ldapsearch -x -h 192.168.31.242 -p 389 -b "dc=example,dc=org" -D "cn=admin,dc=example,dc=org" -w admin "uid=*" sn cn title mail uid
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=org> with scope subtree
# filter: uid=*
# requesting: sn cn title mail uid
#
# Barbara Jensen, example.org
dn: cn=Barbara Jensen,dc=example,dc=org
cn: Barbara Jensen
cn: Babs Jensen
sn: Jensen
title: the world's most famous mythical manager
mail: bjensen@example.com
uid: bjensen
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
liumiaocn:openldap liumiao$
使用ldapmodify和ldapdelete进行修改或删除
操作方式
执行场所
对LDAP进行操作,场所不限,LDAP服务器上进行操作,也可以在可以连接LDAP服务的客户端进行
使用命令
常用的数据的删除,可以使用ldapmodify命令也可以使用ldapdelete
Option介绍
命令的Option就不再分命令来介绍,常用的Option的信息和用途整理如下:
Option | 说明 |
---|---|
-H | ldapuri,格式为ldap://机器名或者IP:端口号,不能与-h和-p同时使用 |
-h | LDAP服务器IP或者可解析的hostname,与-p可结合使用,不能与-H同时使用 |
-p | LDAP服务器端口号,与-h可结合使用,不能与-H同时使用 |
-x | 使用简单认证方式 |
-D | 所绑定的服务器的DN |
-w | 绑定DN的密码,与-W二者选一 |
-W | 不输入密码,会交互式的提示用户输入密码,与-w二者选一 |
-c | 出错后忽略当前错误继续执行,缺省情况下遇到错误即终止 |
-n | 模拟操作但并不实际执行,用于验证,常与-v一同使用进行问题定位 |
-v | 显示详细信息 |
-d | 显示debug信息,可设定级别 |
-e | 设置客户端证书 |
-E | 设置客户端私钥 |
注意:
常见的选项中-f,在ldapdelete和ldapmodify中有明显的不同, ldapdelete中主要是用于记录要删除的dn的信息,而ldapmodify的-f则指定的是要修改的ldif的文件内容。
修改信息:ldapmodify
事前确认
确认一下Barbara的现在的信息
liumiaocn:openldap liumiao$ ldapsearch -x -h 192.168.31.242 -p 389 -b "dc=example,dc=org" -D "cn=admin,dc=example,dc=org" -w admin uid=bjensen
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=org> with scope subtree
# filter: uid=bjensen
# requesting: ALL
#
# Barbara Jensen, example.org
dn: cn=Barbara Jensen,dc=example,dc=org
objectClass: inetOrgPerson
cn: Barbara Jensen
cn: Babs Jensen
sn: Jensen
title: the world's most famous mythical manager
mail: bjensen@example.com
uid: bjensen
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
liumiaocn:openldap liumiao$
修改Barbara的title
Barbara的title写的是“the world’s most famous mythical manager”,这有点不太谦虚了,修改称“one of the world’s most famous mythical manager”,因为毕竟官方文档的例子中还有一个叫babs的朋友。
- 准备用于修改的ldif文件
liumiaocn:openldap liumiao$ cat modifybarbara.ldif
dn: cn=Barbara Jensen,dc=example,dc=org
changetype: modify
replace: title
title: one of the world's most famous mythical manager
liumiaocn:openldap liumiao$
- 结果确认
liumiaocn:openldap liumiao$ ldapsearch -x -h 192.168.31.242 -p 389 -b "dc=example,dc=org" -D "cn=admin,dc=example,dc=org" -w admin uid=bjensen
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=org> with scope subtree
# filter: uid=bjensen
# requesting: ALL
#
# Barbara Jensen, example.org
dn: cn=Barbara Jensen,dc=example,dc=org
objectClass: inetOrgPerson
cn: Barbara Jensen
cn: Babs Jensen
sn: Jensen
mail: bjensen@example.com
uid: bjensen
title: one of the world's most famous mythical manager
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
liumiaocn:openldap liumiao$
给Barbara添加一个description的字段
事前准备ldif文件
liumiaocn:openldap liumiao$ cat modifybarbara.ldif
dn: cn=Barbara Jensen,dc=example,dc=org
changetype: modify
add: description
description: Barbara description
liumiaocn:openldap liumiao$
将ldif文件通过-f传给ldapmodify ``` liumiaocn:openldap liumiao$ ldapmodify -a -H ldap://192.168.31.242:389 -D “cn=admin,dc=example,dc=org” -w admin -f modifybarbara.ldif modifying entry “cn=Barbara Jensen,dc=example,dc=org”
liumiaocn:openldap liumiao$
- 结果确认
liumiaocn:openldap liumiao$ ldapsearch -x -h 192.168.31.242 -p 389 -b “dc=example,dc=org” -D “cn=admin,dc=example,dc=org” -w admin uid=bjensen
extended LDIF
#
LDAPv3
base with scope subtree
filter: uid=bjensen
requesting: ALL
#
Barbara Jensen, example.org
dn: cn=Barbara Jensen,dc=example,dc=org objectClass: inetOrgPerson cn: Barbara Jensen cn: Babs Jensen sn: Jensen mail: bjensen@example.com uid: bjensen title: one of the world’s most famous mythical manager description: Barbara description
search result
search: 2 result: 0 Success
numResponses: 2
numEntries: 1
liumiaocn:openldap liumiao$
<a name="EHnHr"></a>
## 将Barbara移动到ou=People中
- 事前准备ldif文件
liumiaocn:openldap liumiao$ cat modifybarbara.ldif dn: cn=Barbara Jensen,dc=example,dc=org changetype: modrdn newrdn: uid=bjensen deleteoldrdn: 0 newsuperior: ou=people,dc=example,dc=org liumiaocn:openldap liumiao$
- 将ldif文件通过-f传给ldapmodify
liumiaocn:openldap liumiao$ ldapmodify -a -H ldap://192.168.31.242:389 -D “cn=admin,dc=example,dc=org” -w admin -f modifybarbara.ldif modifying rdn of entry “cn=Barbara Jensen,dc=example,dc=org”
liumiaocn:openldap liumiao$
- 结果确认
liumiaocn:openldap liumiao$ ldapsearch -x -h 192.168.31.242 -p 389 -b “dc=example,dc=org” -D “cn=admin,dc=example,dc=org” -w admin uid=bjensen
extended LDIF
#
LDAPv3
base with scope subtree
filter: uid=bjensen
requesting: ALL
#
bjensen, People, example.org
dn: uid=bjensen,ou=People,dc=example,dc=org objectClass: inetOrgPerson cn: Barbara Jensen cn: Babs Jensen sn: Jensen mail: bjensen@example.com uid: bjensen title: one of the world’s most famous mythical manager description: Barbara description
search result
search: 2 result: 0 Success
numResponses: 2
numEntries: 1
liumiaocn:openldap liumiao$
<a name="WdX3u"></a>
##
<a name="K0gcH"></a>
# ldap用户密码确认和修改
ldap用户密码的修改可以使用ldappasswd命令,也可以使用万能的ldapmodify结合ldif文件来实现,但所修改的都是普通的用户,cn=admin的管理员用户的修改一般可以通过slappasswd来进行,由于本系列使用了openldap的docker镜像,此项功能已被封装,通过设定环境变量即可轻易实现。
<a name="cNOr7"></a>
# 修改密码的常用方式
- ldappasswd命令
- ldapmodify命令结合ldif文件
- slappasswd命令
<a name="xPkr2"></a>
# 管理员密码的设定
管理员密码的设定可以通过slappasswd,由于本系列文章的示例使用了osixia的openldap镜像,cn=admin的密码设定,只需要对环境变量LDAP_ADMIN_PASSWORD进行设定即可。
<a name="r16LD"></a>
# Option介绍
<a name="BvZ6k"></a>
## ldapmodify常用Option
ldapmodify常用的Option的信息和用途整理如下:
| Option | 说明 |
| --- | --- |
| -H | ldapuri,格式为ldap://机器名或者IP:端口号,不能与-h和-p同时使用 |
| -h | LDAP服务器IP或者可解析的hostname,与-p可结合使用,不能与-H同时使用 |
| -p | LDAP服务器端口号,与-h可结合使用,不能与-H同时使用 |
| -x | 使用简单认证方式 |
| -D | 所绑定的服务器的DN |
| -w | 绑定DN的密码,与-W二者选一 |
| -W | 不输入密码,会交互式的提示用户输入密码,与-w二者选一 |
| -c | 出错后忽略当前错误继续执行,缺省情况下遇到错误即终止 |
| -n | 模拟操作但并不实际执行,用于验证,常与-v一同使用进行问题定位 |
| -v | 显示详细信息 |
| -d | 显示debug信息,可设定级别 |
| -e | 设置客户端证书 |
| -E | 设置客户端私钥 |
<a name="E3YRy"></a>
## ldappasswd常用Option
ldappasswd常用的Option的信息和用途整理如下:
| Option | 说明 |
| --- | --- |
| -H | ldapuri,格式为ldap://机器名或者IP:端口号,不能与-h和-p同时使用 |
| -h | LDAP服务器IP或者可解析的hostname,与-p可结合使用,不能与-H同时使用 |
| -p | LDAP服务器端口号,与-h可结合使用,不能与-H同时使用 |
| -x | 使用简单认证方式 |
| -D | 所绑定的服务器的DN |
| -w | 绑定DN的密码,与-W二者选一 |
| -W | 不输入密码,会交互式的提示用户输入密码,与-w二者选一 |
| -n | 模拟操作但并不实际执行,用于验证,常与-v一同使用进行问题定位 |
| -v | 显示详细信息 |
| -d | 显示debug信息,可设定级别 |
| -S | 交互式进行密码的提示和输入以及Re-enter,与-s二者选一 |
| -s | 将指定内容设为密码,与-S二者选一 |
<a name="ObxJY"></a>
# 客户端工具:使用Apache Directory Studio进行操作
<a name="OK22H"></a>
# Apache Directory Studio
Apache Directory Studio 被设计用来和各种LDAP服务器进行交互操作,提供了一个使用方便的客户端操作平台。
- 官方网址:[http://directory.apache.org/studio/](http://directory.apache.org/studio/)
- 支持OS:跨平台,支持MacOS/Windows/Linux
- 下载地址:[http://directory.apache.org/studio/downloads.html](http://directory.apache.org/studio/downloads.html)
LDAP Account Manager<br />[https://www.ldap-account-manager.org/lamcms/changelog](https://www.ldap-account-manager.org/lamcms/changelog)
<a name="5RqCm"></a>
# 服务器端的工具phpLDAPadmin
![](https://cdn.nlark.com/yuque/0/2021/png/116294/1610178927837-90351a90-00d3-4a96-a480-4f731aded538.png#align=left&display=inline&height=1588&margin=%5Bobject%20Object%5D&originHeight=1588&originWidth=2810&size=0&status=done&style=none&width=2810)
OpenLDAP图形界面管理,开源组织也提供了GUI管理OpenLDAP软件,目前开源的产品有phpLDAPadmin、LDAP Account Manager、Apache Directory Studio、LDAP Admin等管理工具
![](https://cdn.nlark.com/yuque/0/2021/png/116294/1610176971361-abc54461-7f20-4192-953f-5dbfae5e17ba.png#align=left&display=inline&height=171&margin=%5Bobject%20Object%5D&originHeight=296&originWidth=1618&size=0&status=done&style=none&width=932)
![](https://cdn.nlark.com/yuque/0/2021/jpeg/116294/1610175749886-6ff0be44-7acc-4743-a60b-3b60cf47a3c8.jpeg#align=left&display=inline&height=544&margin=%5Bobject%20Object%5D&originHeight=544&originWidth=800&size=0&status=done&style=none&width=800)
<a name="B7Z0N"></a>
# 安装
yum install openldap openldap-clients openldap-servers yum install phpldapadmin
<a name="JRczQ"></a>
## 配置OpenLDAP
<a name="37rQ4"></a>
## 配置phpLDAPadmin
<a name="EshAc"></a>
# openldap功能介绍及什么是schema
**高级功能**
账户统一集中管理 权限控制管理(sudo) 密码控制策略管理 密码审计管理 密码控制策略 主机控制管理 同步机制管理 TLS/SASL加密传输 高可用负载均衡 自定义schema 各种应用平台集成帐号管理 ```
什么是schema
在openldap的目录树中,schema用来指定一个条目所包含的对象类(objectClass)以及每个对象类所包含的属性值(attribute),其中属性值又包含必要属性和可选属性
schema定义对象类,对象类包含属性的定义,对象类和属性组合成条目
schema是一个数据模型,添加数据条目时,会检查是否符合对象类(objectClass)及属性,通过则添加成功,否则打印错误信息
schema包含些什么
OID
objectClass
匹配规则
属性
通过LAM来管理OpenLDAP
https://www.ldap-account-manager.org/lamcms/releases
通过LDAP Admin管理OpenLDAP
http://www.ldapadmin.org/
LDAP Admin是一个免费的Windows LDAP客户端管理工具目录管理。这个应用可以让你浏览、搜索、修改、创建和删除对象的LDAP服务器。它还支持更复杂的操作,如目录复制和移动远程服务器之间的移动,并扩展了常见的编辑功能,以支持特定的对象类型(如组和帐户)。
接入Windows认证:需要安装pGina
Self Service Password 该服务使用户自助修改/找回密码得以实现,解决密码修改的难题
https://ltb-project.org/documentation/self-service-password%3E
https://www.cnblogs.com/woshimrf/archive/2004/01/13/ldap.html
https://blog.51cto.com/swiki/2491033
https://www.ilanni.com/?cat=1035