前言
OpenLDAP 是 LDAP 协议的一个开源实现(Lightweight Directory Access Protocol,LDAP)。多用于集中式用户身份信息管理和认证服务。本篇讲解OpenLDAP服务的安装配置和使用。
环境信息:
- CentOS 7
- OpenLDAP 2.4.44
安装和配置OpenLDAP
安装OpenLDAP
执行下面命令安装OpenLDAP:
yum install -y openldap openldap-clients openldap-servers
执行完毕后openldap服务端和客户端安装完成。
配置OpenLDAP的管理员和密码
和其他管理系统一样,OpenLDAP也需要设置一个管理员账户和密码。
这里我们将管理员用户配置为DN=cn=Manager,dc=paultech,dc=com
,密码设置为admin
。
执行:
[root@test ~]# slappasswd -s admin
{SSHA}EsELyIVzL20GOByTOsZcwg/Z92QObh4X
记下这串字符,接下来会用到。
修改/etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif
文件:
olcSuffix: dc=paultech,dc=com
olcRootDN: cn=Manager,dc=paultech,dc=com
olcRootPW: {SSHA}EsELyIVzL20GOByTOsZcwg/Z92QObh4X
这些配置项的含义为:
- olcSuffix: 前缀,一般为机器的域名。后面创建的所有对象都具有这个前缀。
- olcRootDN: 管理员DN。
- olcRootPW: 管理员密码,使用前面
slappasswd
生成的字符串。
然后修改/etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif
文件:
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth" read by dn.base="cn=Manager,dc=paultech,dc=com" read by * none
第二个dn.base修改为管理员DN。
然后校验配置文件:
[root@test cn=config]# slaptest -u
62f07254 ldif_read_file: checksum error on "/etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif"
62f07254 ldif_read_file: checksum error on "/etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif"
config file testing succeeded
这里显示配置文件测试成功。Checksum error 可以忽略。
启动服务
执行:
systemctl enable slapd
systemctl start slapd
systemctl status slapd
启动slapd服务。
配置openldap数据库
执行:
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap:ldap -R /var/lib/ldap
chmod 700 -R /var/lib/ldap
导入基本schema:
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
也可以导入全部/etc/openldap/schema/
中的schema,命令和上面的类似。
生成基础目录树
由于没有基础目录树,LDAP系统到目前为止是无法使用的。需要使用命令将他们创建出来。
创建一个base.ldif
文件,内容如下:
dn: dc=paultech,dc=com
dc: paultech
objectClass: top
objectClass: domain
dn: ou=people,dc=paultech,dc=com
ou: people
objectClass: top
objectClass: organizationalUnit
dn: ou=group,dc=paultech,dc=com
ou: group
objectClass: top
objectClass: organizationalUnit
然后执行:
ldapadd -x -D "cn=Manager,dc=paultech,dc=com" -W -f base.ldif
将上面的目录创建出来。
创建成功之后使用ldapsearch -x -LLL
查看创建出的目录。
注意,执行命令可能会遇到如下输出:
[root@paultech ~]# ldapsearch -x -LLL
No such object (32)
这种情况需要配置/etc/openldap/ldap.conf
文件,修改下面的内容:
BASE dc=paultech,dc=com
URI ldap://paultech
- BASE修改为前面配置的
olcSuffix
。 - URL修改为
ldap://{LDAP服务器的hostname或IP}
。
然后重新执行上面的命令。
使用migrationtools迁移系统用户到LDAP服务
进行完上面步骤OpenLDAP安装和部署已经完成,但是其中没有用户和组信息。可以通过手工创建objectclass为posixAccount
或inetorgperson
条目代表用户,创建objectclass为posixGroup
或者groupOfNames
代表分组。通过创建organizationalUnit
或organizationalRole
对条目划分部门等。
还有一种用户组信息的规划方案,就是和操作系统的用户体系保持同步。这就涉及到如何将操作系统用户和组信息迁移到LDAP服务中。本节主要讲解使用migrationtools迁移系统用户到LDAP服务的方法。
安装migrationtools
执行:
yum install -y migrationtools
修改配置
编辑/usr/share/migrationtools/migrate_common.ph
文件。修改如下内容:
# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "paultech.com";
# Default base
$DEFAULT_BASE = "dc=paultech,dc=com";
执行迁移
# 导出基础信息
/usr/share/migrationtools/migrate_base.pl > base.ldif
# 导出用户
/usr/share/migrationtools/migrate_passwd.pl /etc/passwd passwd.ldif
# 导出组
/usr/share/migrationtools/migrate_group.pl /etc/group group.ldif
# 导入上面的信息到LDAP服务
ldapadd -x -D "cn=Manager,dc=paultech,dc=com" -W -f base.ldif
ldapadd -x -D "cn=Manager,dc=paultech,dc=com" -W -f passwd.ldif
ldapadd -x -D "cn=Manager,dc=paultech,dc=com" -W -f group.ldif
注意,如果目标条目已存在,导入的时候会报错退出。可以在
ldapadd
命令中使用-c
参数忽略错误。
OpenLDAP命令使用
OpenLDAP 有如下常用客户端命令:
- ldapsearch:搜索目录树条目。
- ldapadd:通过ldif文件添加目录树条目。
- ldapdelete:删除目录树条目。
- ldapmodify:修改目录树条目。
- ldapwhoami:校验LDAP用户的身份信息。
- ldapmodrdn:修改目录树条目的DN。
- ldapcompare:判断两个条目是否为同一个。
- ldappasswd:重置LDAP用户条目的密码。
服务端命令常用的有:
- slaptest:验证OpenLDAP配置文件有效性。
- slapindex:创建LDAP目录树索引,提高检索效率。
- slapcat:将条目转换为ldif文件。多用于备份。
接下来分别介绍他们。
ldapsearch
ldapsearch
命令用来根据查询条件检索出符合条件的条目。
参数解释:
- -x: 使用简单认证。
- -b searchbase: 查找的节点。
- -D binddn: LDAP绑定的DN,使用时候指定OpenLDAP管理员的DN。
- -W: 命令执行之后需要数据管理员DN密码。
- -w password: 直接将管理员密码附在参数中。
- -h: LDAP服务所在hostname或者IP。
- -p: LDAP服务的端口号。配合
-h
参数使用。 - -H: 根据LDAP URL查询对应的LDAP服务。
- -L: 指定输出格式。输出格式为ldif(LDAP Data Interchange Format)。一个L代表限制输出格式为LDIFv1.A,两个L代表不输出注释,三个L表示不输出ldif版本信息。
如果查询的LDAP服务和执行命令的机器相同,可以不指定
-p
,-h
和-H
参数。
例如:
ldapsearch -x -b cn=users,cn=accounts,dc=paultech,dc=com -D uid=admin,cn=users,cn=accounts,dc=paultech,dc=com -W
这条命令查找DN=cn=users,cn=accounts,dc=paultech,dc=com
下面的所有条目的所有属性。
ldapsearch -x -b cn=users,cn=accounts,dc=paultech,dc=com uid cn displayName -D uid=admin,cn=users,cn=accounts,dc=paultech,dc=com -W
这条命令查找DN=cn=users,cn=accounts,dc=paultech,dc=com
下面的所有条目的uid, cn和displayName属性。
ldapsearch -x -b cn=users,cn=accounts,dc=paultech,dc=com "uid=paul" cn displayName -D uid=admin,cn=users,cn=accounts,dc=paultech,dc=com -W
这条命令查找DN=cn=users,cn=accounts,dc=paultech,dc=com
下面的uid为paul的所有条目的cn和displayName属性。
除了使用=
表示查询条件关系外,还可以使用>=
,<=
和~=
。
ldapadd
ldapadd
命令用来根据ldif文件添加目录树条目。相当于ldapmodify -a
命令。
对于以下ldif文件:
dn: dc=paultech,dc=com
dc: paultech
objectClass: top
objectClass: domain
dn: ou=people,dc=paultech,dc=com
ou: people
objectClass: top
objectClass: organizationalUnit
dn: ou=group,dc=paultech,dc=com
ou: group
objectClass: top
objectClass: organizationalUnit
执行:
ldapadd -x -D "cn=Manager,dc=paultech,dc=com" -W -f base.ldif
可以将上面的条目添加到LDAP。
ldapdelete
ldapdelete
从目录树中删除指定的条目,通过DN来匹配需要删除的条目。
参数解释:
-
-x: 使用简单认证。
-
-D binddn: LDAP绑定的DN,使用时候指定OpenLDAP管理员的DN。
-
-W: 命令执行之后需要数据管理员DN密码。
-
-w password: 直接将管理员密码附在参数中。
-
-y: 使用密码文件的方式认证。
-
-h: LDAP服务所在hostname或者IP。
-
-p: LDAP服务的端口号。配合
-h
参数使用。 -
-H: 根据LDAP URL查询对应的LDAP服务。
-
-r: 递归删除。
-
-n: 显示正在进行的操作,但实际上不修改,多用于测试命令。
-
-c: 持续操作模式,执行过程中间出错不中断。
例如:
ldapdelete -x -W -D cn=Manager,dc=paultech,dc=com "uid=paul,ou=People,dc=paultech,dc=com"
命令会删除DN为uid=paul,ou=People,dc=paultech,dc=com
的条目。
ldapmodify
ldapmodify
用来编辑目录树中的条目。
参数解释:
-
-x: 使用简单认证。
-
-D binddn: LDAP绑定的DN,使用时候指定OpenLDAP管理员的DN。
-
-W: 命令执行之后需要数据管理员DN密码。
-
-w password: 直接将管理员密码附在参数中。
-
-y: 使用密码文件的方式认证。
-
-h: LDAP服务所在hostname或者IP。
-
-p: LDAP服务的端口号。配合
-h
参数使用。 -
-H: 根据LDAP URL查询对应的LDAP服务。
-
-a: 增加条目。相当于
ldapadd
。 -
-f: 指定ldif文件。
下面给出一个例子。编辑modifyUser.ldif
文件,内容如下:
dn: uid=paul,ou=People,dc=paultech,dc=com
changetype: modify
replace: displayName
displayName: PaulJackson
然后执行:
ldapmodify -x -D cn=Manager,dc=paultech,dc=com -W -f modifyUser.ldif
可以修改DN为uid=paul,ou=People,dc=paultech,dc=com
的displayName
属性值。
ldapmodify
也可以删除属性值,例如:
dn: uid=paul,ou=People,dc=paultech,dc=com
changetype: modify
delete: displayName
ldapwhoami
用来验证用户和密码。
例如:
ldapwhoami -x -D uid=paul,ou=People,dc=paultech,dc=com -w 123456
uid=paul,ou=People,dc=paultech,dc=com
如果用户信息正确,会返回用户的DN。否则会报Invalid credentials(凭据无效)。
ldapmodrdn
修改目录条目的RDN,即修改DN。
其余参数和上面的命令基本相同,需要注意的是这个参数:
- -r: 删除老旧的RDN条目。默认情况会保留旧的值。
例如:
ldapmodrdn -x -D cn=Manager,dc=paultech,dc=com -W "uid=kate,ou=People,dc=paultech,dc=com" uid=mary
将uid=kate,ou=People,dc=paultech,dc=com
修改为uid=mary,ou=People,dc=paultech,dc=com
,同时保留uid=kate
。如果之后需要删除。可以编写如下ldif文件,然后使用ldapmodify
命令运行。
dn: uid=mary,ou=People,dc=paultech,dc=com
changetype: modify
delete: uid
uid: kate
ldapcompare
比较两个条目是否是同一个条目。
ldapcompare -x -D cn=Manager,dc=paultech,dc=com -W "uid=paul,ou=People,dc=paultech,dc=com" "uid:kate"
FALSE
ldappasswd
使用LDAP管理员修改LDAP用户的密码。
需要注意的是下面的参数:
- -A: 提示输入旧密码。
- -S: 提示输入新密码。
一个例子如下:
ldappasswd -x -D cn=Manager,dc=paultech,dc=com -w admin "uid=paul,ou=People,dc=paultech,dc=com" -S
slaptest
检测LDAP配置文件是否存在问题。例如:
slaptest -f /etc/openldap/slapd.conf
slapindex
创建LDAP数据库的索引,加快检索速度。执行的时候要求停止slapd
服务。
-
-f:指定 OpenLDAP 的配置文件(
slapd.conf
),并创建索引。 -
-F:指定 OpenLDAP 数据库目录,并创建索引。
slapcat
将数据条目转换为ldif文件。
- -a filter:添加过滤选项。只dump符合过滤条件的条目。
- -b suffix:指定 suffix。比如 dc=paultech,dc=com。
- -f:指定 OpenLDAP 的配置文件。
- -F:指定 OpenLDAP 的数据库文件目录。
- -c:出现错误时,忽略错误继续执行。
- -H:使用 LDAP 服务器的 URL 地址进行操作。
- -v:输出详细信息。
例如:
slapcat -v -l dump.ldif
图形化界面操作LDAP
命令方式查看目录树,搜索和修改等操作非常繁琐不直观。社区为我们提供了图形化界面操作LDAP的工具。下面我们分别介绍下Apache Directory Studio(客户端访问方式)和phpldapadmin(服务器端常驻服务)两种常用的图形化工具。
使用Apache Directory Studio
Apache Directory Studio是一个可运行在Windows,MacOS和Linux下的图形界面操作LDAP客户端。
下载地址:Index of /apache/directory/studio (tsinghua.edu.cn)。然后解压到任意目录。
注意:Apache Directory Studio要求JDK11以上,需要编辑安装目录下
ApacheDirectoryStudio.ini
文件,配置JDK11的java二进制文件地址,如下:-vm /path/to/jdk-11.0.14.1+1/bin/java
启动成功后点击File -> New。选择弹出窗口wizards中的LDAP Browser -> LDAP Connection。然后按照向导填入LDAP服务的hostname和端口号,Bind DN和密码(管理员DN及其密码)。即可连接到LDAP服务。
Apache Directory Studio左侧导航栏以树形结构展示了所有LDAP目录条目。点击任意一个条目,右侧会展示该条目的所有属性和值。创建条目和编辑属性的方法较为直观,这里不再介绍。
phpldapadmin
phpldapadmin是一个常驻web服务,提供了图形化操作LDAP目录树的能力。
安装配置
安装epel-release
源:
yum install -y epel-release
yum makecache
安装phpldapadmin
:
yum install phpldapadmin.noarch
接下来配置phpldapadmin。
编辑/etc/phpldapadmin/config.php
文件,修改Define your LDAP servers in this section
:
$servers->setValue('server','host','127.0.0.1');
$servers->setValue('server','port',389);
$servers->setValue('login','auth_type','cookie');
$servers->setValue('login','bind_id','cn=Manager,dc=paultech,dc=com');
$servers->setValue('login','bind_pass','admin');
$servers->setValue('server','tls',false);
SASL Authentication
部分修改如下配置:
$servers->setValue('login','attr','dn');
启动httpd服务:
systemctl start httpd
登录web管理页面
浏览器打开http://{ip}/ldapadmin
。登录用户名和密码分别使用管理员DNcn=Manager,dc=paultech,dc=com
和上面配置的密码admin
。
FAQ
This base cannot be created with PLA错误,无法创建任何条目
出现这个问题说明没有创建基础目录树。
创建base.ldif
文件,添加如下内容:
dn: dc=paultech,dc=com
dc: paultech
objectClass: top
objectClass: domain
然后执行:
ldapadd -D cn=Manager,dc=paultech,dc=com -x -f base.ldif -W
输入LDAP的管理员密码。创建出基础目录树。
网友评论