在CentOS 7 Linux中安装和配置OpenLDAP

时间:2020-01-09 10:41:11  来源:igfitidea点击:

LDAP教程:
了解术语和用法
安装和配置OpenLDAP
使用TLS证书配置OpenLDAP CentOS 7 Linux
配置LDAP客户端以通过LDAP进行身份验证服务器

安装和配置OpenLDAP

在上一篇文章中,我为我们提供了有关OpenLDAP及其术语的概述。

在开始本文以在Linux中安装和配置openldap之前,我们必须了解基本术语。
为了演示本文,我使用的是CentOS7. 在本文中,将介绍使用ldapmodify在Linux平台上安装和配置OpenLDAP的详细步骤。
在openldap的旧版本中,使用slapd.conf执行配置,但是现在该配置保存在cn = config数据库中。
因此我们将使用cn = configldapmodify安装和配置OpenLDAP。

安装OpenLDAP

要启动并运行OpenLDAP服务器和客户端组件,在Fedora,RHEL和CentOS系统上需要以下软件包:

  • openldap-2 * .rpm-提供OpenLDAP的配置文件和库。

  • openldap-clients * .rpm-提供访问和修改OpenLDAP目录所需的客户端程序。

  • openldap-servers * .rpm-提供配置和运行LDAP所必需的服务器(slapdslurpd)和其他实用程序。

说明:

如果我们仅配置客户端,则不需要openldap-servers * .rpm软件包。

说明:

在RHEL系统上,我们必须具有RHN的有效订阅权,或者可以配置本地脱机存储库,使用该软件包,yum软件包管理器可以安装提供的rpm及其依赖项。

[root@ldap-server ~]# yum -y install openldap-clients openldap-servers

我们确保将" slapd"服务配置为自动启动,然后启动该服务。

[root@ldap-server ~ ]# systemctl start slapd
[root@ldap-server ~ ]# systemctl enable slapd
ln -s '/usr/lib/systemd/system/slapd.service' '/etc/systemd/system/multi-user.target.wants/slapd.service'

检查服务状态

[root@ldap-server ~]# systemctl status slapd
● slapd.service - OpenLDAP Server Daemon
Loaded: loaded (/usr/lib/systemd/system/slapd.service; disabled; vendor preset: disabled)
Active: active (running) since Sat 2019-02-09 21:46:23 IST; 17min ago
Docs: man:slapd
man:slapd-config
man:slapd-hdb
man:slapd-mdb
file:///usr/share/doc/openldap-servers/guide.html
Process: 17350 ExecStart=/usr/sbin/slapd -u ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS (code=exited, status=0/SUCCESS)
Process: 17336 ExecStartPre=/usr/libexec/openldap/check-config.sh (code=exited, status=0/SUCCESS)
Main PID: 17352 (slapd)
Tasks: 3
Memory: 13.5M
CGroup: /system.slice/slapd.service
└─17352 /usr/sbin/slapd -u ldap -h ldapi:///ldap:///
Nov 09 22:01:32 ldap-server.example.com slapd[17352]: conn=1007 op=0 RESULT tag=97 err=0 text=
Nov 09 22:01:32 ldap-server.example.com slapd[17352]: conn=1007 op=1 MOD dn="olcDatabase={0}config,cn=config"
Nov 09 22:01:32 ldap-server.example.com slapd[17352]: conn=1007 op=1 MOD attr=olcRootDN
Nov 09 22:01:32 ldap-server.example.com slapd[17352]: ldif_read_file: checksum error on "/etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif"
Nov 09 22:01:32 ldap-server.example.com slapd[17352]: conn=1007 op=1 RESULT tag=103 err=0 text=
Nov 09 22:01:32 ldap-server.example.com slapd[17352]: conn=1007 op=2 MOD dn="olcDatabase={0}config,cn=config"
Nov 09 22:01:32 ldap-server.example.com slapd[17352]: conn=1007 op=2 MOD attr=olcRootPW
Nov 09 22:01:32 ldap-server.example.com slapd[17352]: conn=1007 op=2 RESULT tag=103 err=0 text=
Nov 09 22:01:32 ldap-server.example.com slapd[17352]: conn=1007 op=3 UNBIND
Nov 09 22:01:32 ldap-server.example.com slapd[17352]: conn=1007 fd=11 closed

定制安装

安装后,我们必须为" admin"用户生成一个密码。
在此示例中,我们使用一个简单的密码:"redhat"

[root@ldap-server cn=config]# slappasswd
New password:
Re-enter new password:
{SSHA}6zHtA20qkTmdLrJSfxo+VV3QLGS7m0CZ

说明:

以前,有一个名为`/etc/openldap/slapd.d/slapd.conf'的文件,其中保存了OpenLDAP服务器的配置。
但是现在配置保留在LDAP数据库本身中。

[root@ldap-server ~]# ls /etc/openldap/slapd.d/
cn=config cn=config.ldif

修改物件

替换olcSuffix和olcRootDN属性

实际上,OpenLDAP将其信息存储在存储后端中。
我们可以将这些后端视为OpenLDAP使用的数据库。
最常用的后端之一一直是" Berkeley DB后端",例如" bdb"或者更新的" hdb"。
可以在/etc/openldap/slapd.d/cn=config/olcDatabase= {2} hdb.ldif文件中找到hdb后端中存储的信息。

在LDIF文件中,我们首先确定要添加,更改等的元素。
为了唯一地标识元素,我们使用了dn(专有名称)属性,正是由于这个原因而创建的。
因此,我们的LDIF文件的第一行可能是这样的:

dn: olcDatabase={2}hdb,cn=config

接下来,我们指定是否要添加属性,对其进行修改等。

changeType: modify

如果要修改条目,则还必须阐明是否要替换属性,删除属性等。

replace: olcSuffix

最后,我们键入修改后的属性的新值。

olcSuffix: dc=example,dc=com

在整篇文章中,我们将看到许多LDIF示例,但是现在,让我们回到/etc/openldap/s-lapd.d/cn=config/olcDatabase= {2} hdb.ldif文件。
我们必须(至少)修改这两个条目:

olcSuffix: dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=my-domain,dc=com

要使用ldapmodify进行所有这些更改,我们必须准备一个LDIF文件,如下所示:

[root@ldap-server ~]# cat my_config.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=example,dc=com

第一行标识了我们将要更改的LDAP中的主要条目。
刚才,我们在/etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif文件中看到了参数olcSuffix
在此文件中,dn属性为dn:olcDatabase = {2} hdb,并且由于该文件位于config文件夹中,因此完整的dn属性为dn:olcDatabase = {2} hdb,cn = config 。

标识我们创建LDIF文件所需的数据的另一种可能更好的方法是使用ldapsearchcommand。

[root@ldap-server ~]# ldapsearch -Y EXTERNAL -H ldapi:///-b cn=config olcDatabase=\*
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
# extended LDIF
## LDAPv3
# base <cn=config> with scope subtree
# filter: olcDatabase=*
# requesting: ALL
## {-1}frontend, config
dn: olcDatabase={-1}frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend
# {0}config, config
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth" manage by * none
# {1}monitor, config
dn: olcDatabase={1}monitor,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {1}monitor
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth" read by dn.base="cn=Manager,dc=my-domain,dc=com" read by * none
# {2}hdb, config
dn: olcDatabase={2}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=my-domain,dc=com
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
# search result
search: 2
result: 0 Success
# numResponses: 5
# numEntries: 4

我们使用适当的名称(例如,my_config.ldif)保存LDIF文件,然后执行ldapmodify。

[root@ldap-server ~]# ldapmodify -Y EXTERNAL -H ldapi:///-f my_config.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"

添加olcRootPW属性

要添加新属性,我们使用add,然后使用属性名称,如下面的示例所示。

其中我们创建另一个LDIF文件(my_config2.ldif)来添加olcRootPW属性。

[root@ldap-server ~]# cat my_config2.ldif
dn: olcDatabase={2}hdb,cn=config
changeType: modify
add: olcRootPW
olcRootPW: {SSHA}6zHtA20qkTmdLrJSfxo+VV3QLGS7m0CZ

然后我们再次执行ldapmodify。

[root@ldap-server ~]# ldapmodify -Y EXTERNAL -H ldapi:///-f my_config2.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"

替换olcAccess属性

我们还必须允许刚刚在((cn = admin,dc = example,dc = com))之前指定的admin用户访问LDAP数据库。
如果我们看一下olcDatabase = {1} monitor.ldif文件,我们将看到以下行:

olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external, cn=auth" read by dn.base="cn=manager,dc=my-domain,dc=com" read by * none

我们必须编辑文件或者使用ldapmodify更改条目。
如果我们使用ldapmodify,则LDIF文件应如下所示:

[root@ldap-server ~]# cat my_config3.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=example,dc=com" read by * none

我们再次通过传递新的LDIF文件作为参数来执行ldapmodify。

[root@ldap-server ~]# ldapmodify -Y EXTERNAL -H ldapi:///-f my_config3.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}monitor,cn=config"

验证新的属性值

现在我们可以用" ldapsearch"检查该属性的值是否实际上已更改。

[root@ldap-server ~]# ldapsearch -Y EXTERNAL -H ldapi:///-b cn=config olcDatabase=\*
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
# extended LDIF
## LDAPv3
# base <cn=config> with scope subtree
# filter: olcDatabase=*
# requesting: ALL
## {-1}frontend, config
dn: olcDatabase={-1}frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend
# {0}config, config
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth" manage by * none
# {1}monitor, config
dn: olcDatabase={1}monitor,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {1}monitor
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external
, cn=auth" read by dn.base="cn=admin,dc=example,dc=com" read by * none
# {2}hdb, config
dn: olcDatabase={2}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
olcRootPW: {SSHA}6zHtA20qkTmdLrJSfxo+VV3QLGS7m0CZ
olcSuffix: dc=example,dc=com
olcRootDN: cn=admin,dc=example,dc=com
# search result
search: 2
result: 0 Success
# numResponses: 5
# numEntries: 4

如我们所见,该值已根据我们在LDIF文件中指定的值进行了更改。

我们可以用来检查配置的另一个工具是" slaptest"命令。

[root@ldap-server ~]# slaptest -u
config file testing succeeded

添加对象

现在,我们必须在LDAP服务器中为" dc = example,dc = com"手动创建一个条目。
最简单的方法是为此条目创建一个LDIF文件,并将其传递给ldapadd命令。

因此,我们创建一个名为example.ldif的文件,其内容如下:

[root@ldap-server ~]# cat example.ldif
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o: example

我们指定了一系列属性,例如专有名称(dn),域组件(dc)和组织(o)。
我们还将新条目定义为dcObject和organization类型的对象。

现在,我们执行ldapadd并将example.ldif文件作为参数传递给它。
我们用(-f)指定文件名,管理员用户(-D)和为该管理员用户定义的密码(-w)。

[root@ldap-server ~]# ldapadd -f example.ldif -D cn=admin,dc=example,dc=com -w redhat
adding new entry "dc=example,dc=com"

我们可以使用ldapsearch命令检查条目是否已成功创建。

[root@ldap-server ~]# ldapsearch -x -b dc=example,dc=com
# extended LDIF
## LDAPv3
# base <dc=example,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
## example.com
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o: example
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1

我们刚刚看到了如何将对象" dc = example,dc = com"添加到我们的LDAP中。
现在,我们将看到如何添加组织单位,组和用户。

添加组织单位

也许我们想拥有一个名为"用户"的组织单位(OU),用于存储所有LDAP用户。
为此,我们将创建一个名为users.ldif的新LDIF文件,其内容如下:

[root@ldap-server ~]# cat users.ldif
dn: ou=users,dc=example,dc=com
objectClass: organizationalUnit
ou: users

我们再次执行" ldapadd"以创建OU。

[root@ldap-server ~]# ldapadd -f users.ldif -D cn=admin,dc=example,dc=com -w redhat
adding new entry "ou=users,dc=example,dc=com"

添加用户

现在,我们可以在组织单位内包含一个用户。
该过程与我们到目前为止所看到的非常相似。
首先,我们创建一个名为archimedes.ldif的文件,其内容如下:

[root@ldap-server ~]# cat archimedes.ldif
dn: cn=Archimedes of Syracuse,ou=users,dc=example,dc=com
cn: Archimedes
sn: Syracuse
objectClass: inetOrgPerson
userPassword: eureka
uid: archimedes

然后我们再次执行" ldapadd"。

[root@ldap-server ~]# ldapadd -f archimedes.ldif -x -D cn=admin,dc=example,dc=com -w redhat
adding new entry "cn=Archimedes of Syracuse,ou=users,dc=example,dc=com"
ldap_add: Invalid syntax (21)
additional info: objectClass: value #0 invalid per syntax

此消息的意思是对象" inetOrgPerson"未加载到核心架构中,因此我们必须将其包括在内。
在/etc/openldap/schema文件夹中,有许多LDIF文件可以在需要时扩展架构。
我们可以看到有一个" inetorgperson.ldif"文件,其中包含" inetOrgPerson"对象的架构定义。

模式本身包含在LDAP数据库中,因此我们可以使用ldapadd命令向其添加新定义。
当我们要修改配置本身而不是数据时,我们将自己认证为外部root用户(-Y EXTERNAL`)。

[root@ldap-server ~]# ldapadd -Y EXTERNAL -H ldapi://-f /etc/openldap/schema/inetorgperson.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=inetorgperson,cn=schema,cn=config"
ldap_add: Other (e.g., implementation specific) error (80)
additional info: olcObjectClasses: AttributeType not found: "audio"

如我们所见,由于未定义属性类型audio,因此会出现错误。
因此,我们也必须在模式中包括此定义。

如果我们在/etc/openldap/schema /文件夹中的文件中搜索音频字符串,我们将看到音频属性在cosine.ldif文件中定义。
因此,我们首先使用该LDIF文件扩展架构。

[root@ldap-server ~]# ldapadd -Y EXTERNAL -H ldapi://-f /etc/openldap/schema/cosine.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=cosine,cn=schema,cn=config"

现在,我们对inetorgperson.ldif文件执行相同的操作。

[root@ldap-server ~]# ldapadd -Y EXTERNAL -H ldapi://-f /etc/openldap/schema/inetorgperson.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=inetorgperson,cn=schema,cn=config"

接下来,我们还添加nis.ldif文件

[root@ldap-server ~]# # ldapadd -Y EXTERNAL -H ldapi://-f /etc/openldap/schema/nis.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=nis,cn=schema,cn=config"

现在,我们可以为用户添加我们之前创建的" archimedes.ldif"文件。

[root@ldap-server ~]# ldapadd -f archimedes.ldif -x -D cn=admin,dc=example,dc=com -w redhat
adding new entry "cn=Archimedes of Syracuse,ou=users,dc=example,dc=com"

如果在某个时候我们必须看一下当前使用的模式,我们可以使用如下的slapcat命令:

[root@ldap-server ~]# slapcat -b "cn=schema,cn=config"
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/openldap/slapd.args
olcPidFile: /var/run/openldap/slapd.pid
olcTLSCACertificatePath: /etc/openldap/certs
olcTLSCertificateFile: "OpenLDAP Server"
olcTLSCertificateKeyFile: /etc/openldap/certs/password
structuralObjectClass: olcGlobal
entryUUID: 35694bfc-c0d9-1038-87ee-811b58b4e51a
creatorsName: cn=config
createTimestamp: 20190209170930Z
entryCSN: 20190209170930.732544Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20190209170930Z
-
-
<OUTPUT TRUNCATED>
-
-
dn: olcDatabase={2}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
structuralObjectClass: olcHdbConfig
entryUUID: 3569c776-c0d9-1038-87f4-811b58b4e51a
creatorsName: cn=config
createTimestamp: 20190209170930Z
olcRootPW:: e1NTSEF9NnpIdEEyMHFrVG1kTHJKU2Z4bytWVjNRTEdTN20wQ1o=
olcSuffix: dc=example,dc=com
olcRootDN: cn=admin,dc=example,dc=com
entryCSN: 20190209171424.210710Z#000000#000#000000
modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20190209171424Z

新增群组

要添加组,我们重复相同的过程。
首先,我们创建具有以下内容的group.ldif文件:

[root@ldap-server ~]# cat group.ldif
dn: cn=scientists,ou=users,dc=example,dc=com
cn: scientists
objectClass: groupOfNames
member: cn=Archimedes of Syracuse,ou=users,dc=example,dc=com

然后我们用ldapadd添加组。

[root@ldap-server ~]# ldapadd -f group.ldif -x -D cn=admin,dc=example,dc=com -w redhat
adding new entry "cn=scientists,ou=users,dc=example,dc=com"

删除物件

除了添加或者编辑之外,我们还可以从LDAP服务器中删除对象。
由于我们不必创建任何LDIF文件,因此该过程更加容易。
我们只用要删除的cn执行ldapdel。

[root@ldap-server ~]# ldapdelete "cn=Archimedes of Syracuse,ou=users,dc=example,dc=com" -D cn=admin,dc=example,dc=com -w redhat

我们可以检查该条目实际上是否被抑制。

[root@ldap-server ~]# ldapsearch -x -b "dc=example,dc=com" "(cn=Archimedes)"
# extended LDIF
## LDAPv3
# base <dc=example,dc=com> with scope subtree
# filter: (cn=Archimedes)
# requesting: ALL
## search result
search: 2
result: 0 Success
# numResponses: 1