【DevOps工具篇】 OpenLDAP的LDAP服务器(slapd)是什么?
@TOC
推荐超级课程:
OpenLDAP是一种使用LDAP(轻量目录访问协议)集中管理用户名和密码的开源软件的标准实现。它由LDAP服务器、用于访问LDAP的客户端、以及用于从各种程序访问LDAP的库等多个组件组成。在这里,我们将介绍OpenLDAP的LDAP服务器(slapd)。
OpenLAP的LDAP服务器(slapd)是什么
LDAP服务器(slapd)是附带OpenLDAP的LDAP服务器软件。它在互联网上被广泛使用。该LDAP服务器支持LDAP协议版本2和版本3。OpenLDAP的LDAP服务器(slapd)具有以下特点:
基本功能
OpenLDAP的LDAP服务器不仅支持简单身份验证,还支持SASL身份验证。此外,它提供了用于定义LDAP服务器上要使用的对象类和属性等架构的标准模式。此外,在OpenLDAP中,也可以从远程管理LDAP服务器。
安全性
OpenLDAP不仅支持对LDAP服务器的slapd进行IP访问控制,还可以对DN和属性进行细粒度的访问控制。此外,OpenLDAP支持通过SSL/TLS进行加密通信。
管理性
OpenLDAP的服务器配置可以动态进行,无需停止LDAP服务器。此外,OpenLDAP附带了用于备份和还原LDAP服务器数据的工具。
可靠性和可扩展性
OpenLDAP具有在负载较高的环境中使用LDAP服务器的可靠性。它还可以在LDAP服务器之间同步数据库,构建考虑冗余的LDAP服务器。此外,OpenLDAP还支持通过两种形式,即叠加和后端DB,扩展LDAP服务器的功能。
调优
在OpenLDAP中,可以根据LDAP服务器的用途选择后端数据库。通过设置与搜索方式匹配的索引,可以加快LDAP服务器的运行速度。
OpenLDAP的服务器基本功能
在这里,我们将介绍OpenLDAP服务器slapd的基本功能。
简单身份验证和SASL身份验证
OpenLDAP支持以下3种方法作为每个LDAP客户端连接到服务器时的身份验证方式:
匿名身份验证
这是一种连接到LDAP服务器后不进行认证的连接方式,仅用于访问公开信息。
简单身份验证
这是一种在连接到LDAP服务器后,使用LDAP服务器目录中定义的特定DN和密码进行身份验证的方法。
SASL身份验证
这是LDAP Version 3中定义的身份验证方法,在OpenLDAP附带的实用工具命令中,此方法是默认的。SASL(简单认证和安全层)在RFC2222中定义。连接到LDAP服务器后,将进行基于外部数据而不是LDAP服务器目录中定义的数据的身份验证。OpenLDAP还支持使用运行LDAP服务器的Linux系统的用户进行身份验证等功能。
LDAP模式
与使用数据库时定义表一样,要在LDAP服务器注册数据,需要预先定义数据的类型。这就是模式。LDAP服务器的模式可以通过自定义,但通常使用已经在RFC等中标准化了的模式。OpenLDAP附带了许多模式。但是,默认情况下,OpenLDAP并不加载大多数模式,因此可能需要根据需要进行设置。
LDAP模式 | 描述 |
---|---|
collective.schema | 定义在RFC3671中定义的集合属性的模式 |
corba.schema | 用于CORBA(公共对象请求代理体系结构)的模式 |
core.schema | OpenLDAP核心模式(必需) |
cosine.schema | COSINE和Internet X.500模式(必需) |
duaconf.schema | 用于管理DUA(目录用户代理)的模式 |
dyngroup.schema | 用于Netscape定义的动态组的模式 |
inetorgperson.schema | 定义表示与组织相关的人员的inetOrgPerson对象类的模式 |
java.schema | 用于处理在RFC2713中定义的Java对象的模式 |
misc.schema | 定义正在发展中的对象类的模式 |
nis.schema | 用于处理UNIX账户等的模式,例如posixAccount和posixGroup在此文件中定义 |
openldap.schema | OpenLDAP项目的模式,用于信息提供 |
pmi.schema | 用于管理X.509 PMI(权限管理基础结构)的模式 |
ppolicy.schema | 用于密码策略的模式 |
在OpenLDAP中,注册模式到LDAP服务器时,需要使用LDIF格式的模式数据。
OpenLDAP服务器管理
LDAP服务器配置
LDAP服务器(slapd)将配置管理为专用DIT(目录信息树),以cn=config作为根DN。该DIT包含LDAP服务器的配置信息,这些信息分别存储在各种条目中。例如,模式信息存储在以cn=schema,cn=config作为顶级的条目中。可以通过添加或更改这些条目的属性来更改配置。在cn=config下面,有许多用于配置的条目。这些配置在LDAP服务器上实际上是作为目录层次结构和文件进行管理的。可以验证存储的数据文件如下所示。
# find /usr/local/etc/openldap/slapd.d/cn=config ⏎
/usr/local/etc/openldap/slapd.d/cn=config
/usr/local/etc/openldap/slapd.d/cn=config/cn=schema.ldif
/usr/local/etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif
/usr/local/etc/openldap/slapd.d/cn=config/olcDatabase={1}mdb.ldif
/usr/local/etc/openldap/slapd.d/cn=config/cn=schema
/usr/local/etc/openldap/slapd.d/cn=config/cn=schema/cn={2}nis.ldif
/usr/local/etc/openldap/slapd.d/cn=config/cn=schema/cn={1}cosine.ldif
/usr/local/etc/openldap/slapd.d/cn=config/cn=schema/cn={3}inetorgperson.ldif
/usr/local/etc/openldap/slapd.d/cn=config/cn=schema/cn={0}core.ldif
/usr/local/etc/openldap/slapd.d/cn=config/olcDatabase={-1}frontend.ldif
不能直接修改这些配置文件。可以使用ldapsearch命令显示配置条目的属性。可以使用LDIF格式的文件,并使用ldapadd、ldapmodify等命令来添加或修改配置。例如,如果要更改LDAP服务器以在LDAP Version 2协议下通信,可以创建以下类似的LDIF文件(bind-v2.ldif)。
用于LDAP服务器配置的LDIF示例(bind-v2.ldif)
dn: cn=config
changetype: modify
add: olcAllows
olcAllows: bind_v2
可以使用ldapmodify命令更改配置,如下所示。
# ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f bind_v2.ldif ⏎
modifying entry "cn=config"
在CentOS7或RedHat Enterprise Linux 7中,使用UNIX域套接字配置为root用户可以更改LDAP服务器的配置。在使用UNIX域套接字时,需要查看执行命令的用户的权限,以确定是否可以更改配置。在此示例中,已使用root用户执行,可以在不输入密码的情况下进行配置更改。
LDAP数据备份和还原
OpenLDAP的LDAP服务器附带了用于备份和还原LDAP数据的LDAP实用工具。因此,即使发生故障,也可以恢复LDAP服务器并安全使用。
slapcat
slapcat命令用于以LDIF格式导出LDAP服务器的数据。可以使用以下示例指定文件来获取LDAP服务器数据的备份。
# slapcat -l /tmp/openldap-data.ldif ⏎
slapadd
使用slapcat获取的LDAP数据可以使用slapadd命令进行还原。
# slapadd -l /tmp/openldap-data.ldif ⏎
> _#################### 100.00% eta none elapsed none fast!
Closing DB...
slapindex
在恢复LDAP数据后,需要使用slapindex命令重新生成索引。
# slapindex ⏎
调优
一旦使用OpenLDAP构建LDAP服务器,就需要进行优化。优化有两种方法:设置索引和调整数据库。通过正确优化LDAP服务器,可以加快其速度。
数据库优化
在OpenLDAP中,可以根据LDAP服务器的用途选择几种数据库格式。
bdb
使用Berkeley DB创建的数据库。LDAP服务器的数据注册处理速度较慢,但是搜索速度快。
hdb
使用Berkeley DB创建的数据库。将数据以层次结构进行管理。搜索性能稍逊色,但数据注册处理优于bdb。
mdb
这是最新的OpenLDAP采用的专有数据库格式。优于搜索和注册处理,但尚无大规模部署经验。
遗憾的是,mdb在采用它的版本(如CentOS7、RedHat Enterprise Linux 7等)中尚不可用。使用bdb或hdb时,可以通过调整Berkeley DB的缓存大小等进行优化,从而进一步加快LDAP服务器的速度。
索引
注册到LDAP服务器的LDAP数据将根据使用方式进行索引化。可以通过更改LDAP服务器(slapd)的设置来确定为哪些属性设置索引。通过为经常搜索的属性设置索引,可以优化LDAP服务器(slapd)。
OpenLDAP的安全性
在LDAP服务器上,管理个人信息并不少见。因此,安全性需要得到充分考虑。OpenLDAP可以提供强大的安全性,以满足企业级应用的需要。
使用专用用户启动
如果使用root用户运行LDAP服务器(slapd),则可能会遭受攻击从而获取系统的root权限。因此,可以配置LDAP服务器(slapd)以使用专用用户运行。
# /usr/local/sbin/slapd -u ldap -g ldap
SSL/TLS支持
OpenLDAP支持SSL/TLS连接。要将LDAP服务器(slapd)配置为支持SSL/TLS,可以使用下面示例的LDIF文件注册LDAP服务器的服务器证书、服务器密钥、CA证书等。
示例LDAP服务器中注册服务器证书、服务器密钥、CA证书的LDIF文件
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /usr/local/etc/openldap/server.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /usr/local/etc/openldap/server.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /usr/local/etc/openldap/server.key
LDAP服务器(slapd)支持在常规的ldap端口(TCP 389)上连接后,通过STARTTLS切换到TLS模式,以及在LDAP over TLS(TCP 636)上一开始就使用TLS的两种方法。
RESTRICT LISTEN地址
可以根据IP地址来限定特定IP地址的连接方式,例如:
# /usr/local/libexec/slapd -h "ldap:/// ldapi:/// ldaps:///" ⏎
此示例中,LDAP服务器将接受UNIX域套接字(ldapi)、ldap端口(ldap)和ldaps端口(ldaps)的连接。可以根据IP地址来限制仅特定IP地址的连接,例如:
# /usr/local/libexec/slapd -h "ldap://192.168.2.10/ ldapi:/// ldaps://192.168.2.10/" ⏎
IP访问控制
slapd支持使用TCP Wrapper进行对访问的控制。例如,在CentOS7和RedHat Enterprise Linux 7中使用的包中,此功能已启用。使用TCP Wrapper,可以根据连接的源IP地址控制连接的是否性。
/etc/hosts.allow
slapd: 192.168.2.0/24
对LDAP数据的访问控制
LDAP服务器(slapd)默认定义了一个称为root DN的管理DN。使用此DN,可以对LDAP服务器上的所有数据进行修改或添加。与在Linux上的root用户类似。然而,使用此DN进行所有操作是危险的。因此,Designet建议根据用途创建用于访问的DN。
另外,可以根据需要对可以访问LDAP数据的用户进行细粒度的控制。例如,可以将包含用户密码的userPassword属性设置为仅允许管理员读取。 接下来,是创建名为cn=Admin,dc=designet,dc=jp的只读用户的LDIF示例。在此LDIF中,配置为仅允许该用户和DN的所有者查看userPassword属性。
用于创建只读用户的LDAP服务器的LDIF示例
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to attrs=userPassword
by anonymous auth
by dn="cn=Admin,dc=designet,dc=jp" read
by * none
olcAccess: to *
by self =rwcsx
by dn="cn=Admin,dc=designet,dc=jp" =rcsx
by * read