在CentOS 7 Linux中安装和配置OpenLDAP
LDAP教程:
了解术语和用法
安装和配置OpenLDAP
使用TLS证书配置OpenLDAP CentOS 7 Linux
配置LDAP客户端以通过LDAP进行身份验证服务器
安装和配置OpenLDAP
在上一篇文章中,我为我们提供了有关OpenLDAP及其术语的概述。
在开始本文以在Linux中安装和配置openldap之前,我们必须了解基本术语。
为了演示本文,我使用的是CentOS7. 在本文中,将介绍使用ldapmodify
在Linux平台上安装和配置OpenLDAP的详细步骤。
在openldap的旧版本中,使用slapd.conf
执行配置,但是现在该配置保存在cn = config
数据库中。
因此我们将使用cn = config
和ldapmodify
安装和配置OpenLDAP。
安装OpenLDAP
要启动并运行OpenLDAP服务器和客户端组件,在Fedora,RHEL和CentOS系统上需要以下软件包:
openldap-2 * .rpm
-提供OpenLDAP的配置文件和库。openldap-clients * .rpm
-提供访问和修改OpenLDAP目录所需的客户端程序。openldap-servers * .rpm
-提供配置和运行LDAP所必需的服务器(slapd
,slurpd
)和其他实用程序。
说明:
如果我们仅配置客户端,则不需要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