http://www.ibm.com/developerworks/cn/education/linux/l-lpic3302/section2.html
编译并安装 OpenLDAP
本节讨论 Senior Level Linux Professional(LPIC-3)考试 301 的 302.1 主题的内容。这个主题的权值为 3。
在本节中,学习如何:
从源代码编译和配置 OpenLDAP
理解 OpenLDAP 后端数据库
管理 OpenLDAP 守护进程
排除安装期间的错误
OpenLDAP 是一个实现 LDAP 服务器和相关工具的开放源码应用程序。因为它是开放源码的,所以可以免费下载它的源代码。OpenLDAP 项目并不直接发布二进制代码,但是大多数主流的发行版都打包了二进制代码。在本教程中,学习如何从源代码和软件包安装 OpenLDAP。
从源代码编译
第一步是从项目站点下载 OpenLDAP 的最新版本(见 参考资料 中的下载链接)。这个项目通常有两个当前版本:一个是稳定版本,另一个是测试版本。本教程使用稳定版 2.3.30 和 2.3.38。如果按照本教程进行操作,一些目录名可能会随版本而变化。
为了从下载的文件中提取源代码,输入 tar -xzf openldap-stable-20070831.tgz。这会将下载的文件解压到一个目录中。用 cd openldap-2.3.38 命令进入这个新目录(根据需要替换您的 OpenLDAP 版本号)。
现在的位置在源代码目录中。现在必须配置系统的构建环境,然后构建这个软件。OpenLDAP 使用脚本 configure 执行这些操作。输入 ./configure --help 就可以看到可用的所有选项。一些选项定义安装文件的位置(比如 --prefix):其他选项定义希望安装的 OpenLDAP 特性。清单 1 列出特性及其默认设置。

清单 1. 与 OpenLDAP 特性相关的配置选项

SLAPD (Standalone LDAP Daemon) Options:
--enable-slapd enable building slapd [yes]
--enable-aci enable per-object ACIs (experimental) [no]
--enable-cleartext enable cleartext passwords [yes]
--enable-crypt enable crypt(3) passwords [no]
--enable-lmpasswd enable LAN Manager passwords [no]
--enable-spasswd enable (Cyrus) SASL password verification [no]
--enable-modules enable dynamic module support [no]
--enable-rewrite enable DN rewriting in back-ldap and rwm overlay [auto]
--enable-rlookups enable reverse lookups of client hostnames [no]
--enable-slapi enable SLAPI support (experimental) [no]
--enable-slp enable SLPv2 support [no]
--enable-wrappers enable tcp wrapper support [no]

SLAPD Backend Options:
--enable-backends enable all available backends no|yes|mod
--enable-bdb enable Berkeley DB backend no|yes|mod [yes]
--enable-dnssrv enable dnssrv backend no|yes|mod [no]
--enable-hdb enable Hierarchical DB backend no|yes|mod [yes]
--enable-ldap enable ldap backend no|yes|mod [no]
--enable-ldbm enable ldbm backend no|yes|mod [no]
--enable-ldbm-api use LDBM API auto|berkeley|bcompat|mdbm|gdbm [auto]
--enable-ldbm-type use LDBM type auto|btree|hash [auto]
--enable-meta enable metadirectory backend no|yes|mod [no]
--enable-monitor enable monitor backend no|yes|mod [yes]
--enable-null enable null backend no|yes|mod [no]
--enable-passwd enable passwd backend no|yes|mod [no]
--enable-perl enable perl backend no|yes|mod [no]
--enable-relay enable relay backend no|yes|mod [yes]
--enable-shell enable shell backend no|yes|mod [no]
--enable-sql enable sql backend no|yes|mod [no]

SLAPD Overlay Options:
--enable-overlays enable all available overlays no|yes|mod
--enable-accesslog In-Directory Access Logging overlay no|yes|mod [no]
--enable-auditlog Audit Logging overlay no|yes|mod [no]
--enable-denyop Deny Operation overlay no|yes|mod [no]
--enable-dyngroup Dynamic Group overlay no|yes|mod [no]
--enable-dynlist Dynamic List overlay no|yes|mod [no]
--enable-lastmod Last Modification overlay no|yes|mod [no]
--enable-ppolicy Password Policy overlay no|yes|mod [no]
--enable-proxycache Proxy Cache overlay no|yes|mod [no]
--enable-refint Referential Integrity overlay no|yes|mod [no]
--enable-retcode Return Code testing overlay no|yes|mod [no]
--enable-rwm Rewrite/Remap overlay no|yes|mod [no]
--enable-syncprov Syncrepl Provider overlay no|yes|mod [yes]
--enable-translucent Translucent Proxy overlay no|yes|mod [no]
--enable-unique Attribute Uniqueness overlay no|yes|mod [no]
--enable-valsort Value Sorting overlay no|yes|mod [no]

SLURPD (Replication Daemon) Options:
--enable-slurpd enable building slurpd [auto]

Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--with-subdir=DIR change default subdirectory used for installs
--with-cyrus-sasl with Cyrus SASL support [auto]
--with-fetch with fetch(3) URL support [auto]
--with-threads with threads [auto]
--with-tls with TLS/SSL support [auto]
--with-yielding-select with implicitly yielding select [auto]
--with-odbc with specific ODBC support iodbc|unixodbc|auto [auto]

--with-gnu-ld assume the C compiler uses GNU ld [default=no]
--with-pic try to use only PIC/non-PIC objects [default=use
both]
--with-tags[=TAGS]
include additional configurations [automatic]


在清单 1 中,可以看到许多特性在默认情况下是禁用的,比如元目录和模块。另外,许多选项被标为 “auto”,如果系统上有适当的库,这些选项就会打开。最好不要依赖这种自动行为,而是明确建立所需特性的列表并启用它们。如果缺少任何库,就会在编译时收到错误消息,而不是在以后才发现。
一些配置选项可以传递 no、yes 或 mod。no 禁用这个选项,yes 将选项静态链接到最终的二进制代码,mod 将选项构建为单独的共享库。共享库在运行时装载到服务器中(参见下面的 “服务器参数(全局)”)。在默认情况下,模块是静态链接的;所以它们是二进制代码不可分割的组成部分。如果希望使用动态模块,那么还需要 --enable-modules 选项。动态模块的好处是可以在不修改二进制代码的情况下测试各种选项,而且可以单独打包模块。
清单 2 给出一个基于 Fedora 7 中的配置的配置行,它启用了许多有帮助的特性。所选的大多数选项将启用后面教程中需要的特性,比如 --enable-slurpd 和 --enable-multimaster(用于复制)和 --enable-meta(用于元目录)。其他选项启用各种后端,比如 ldab、bdb、null 和 monitor。

清单 2. 一个构建配置示例

./configure --enable-plugins --enable-modules --enable-slapd --enable-slurpd \
--enable-multimaster --enable-bdb --enable-hdb --enable-ldap --enable-ldbm \
--enable-ldbm-api=berkeley --enable-meta --enable-monitor --enable-null \
--enable-shell --enable-sql=mod --disable-perl \
--with-kerberos=k5only --enable-overlays=mod --prefix=/tmp/openldap

清单 2 启用了插件和多个后端,包括基于 Structured Query Language(SQL)的后端和 Berkeley Database 文件。后端是 OpenLDAP 存储和获取数据的方式,下面的 “后端和数据库” 和以后的教程会详细讨论后端。
清单 2 还构建单独的守护进程 slapd 和复制守护进程 slurpd。为了进行测试,还启用了覆盖,覆盖允许更容易地定制后端数据库。因为这是一个用于测试的设置,安装前缀被改为 /tmp/openldap,所以生成的二进制代码放在 /tmp/openldap/libexec 中。
当执行 configure 脚本时,它会检查所需的库,然后生成构建环境。如果 configure 成功完成,那么用 make depend; make 编译 OpenLDAP。
编译代码之后,可以用 make install 命令安装 OpenLDAP。这会把所有二进制代码、手册页和库复制到 /tmp/openldap 中的相应位置。
从包安装
您可能会觉得从源代码编译太麻烦。从源代码编译很耗费时间,而且如果缺少适当的开发库,那么会更棘手。如果您的 C 语言开发经验不足,那么可能无法理解构建错误消息的意思。幸运的是,大多数发行版打包了 OpenLDAP 的二进制代码,并预先进行了配置。这些二进制代码通常包含所需的所有特性。
基于 RPM 的发行版
Fedora 和 CentOS 使用 yum 工具安装来自存储库的 RedHat 软件包(RPM)。为了查明可用的包,应该使用 yum list 命令,还可以传递一个正则表达式来过滤返回的包列表。清单 3 搜索包含 openldap 这个单词的所有包。

清单 3. 查明可以通过 yum 获得哪些包

# yum list \*openldap\*
Loading "installonlyn" plugin
Setting up repositories
Reading repository metadata in from local files
Installed Packages
openldap.i386 2.3.30-2.fc6 installed
openldap-clients.i386 2.3.30-2.fc6 installed
openldap-devel.i386 2.3.30-2.fc6 installed
openldap-servers.i386 2.3.30-2.fc6 installed
openldap-servers-sql.i386 2.3.30-2.fc6 installed
Available Packages
compat-openldap.i386 2.3.30_2.229-2.fc6 updates


在 OpenLDAP 这样的大型应用程序中,客户机和服务器工具常常分成两个单独的包。另外,还可能找到一些兼容库(为了确保链接老版本软件的应用程序仍然可以正常工作)。安装包的方法是使用 yum install 和包的名称,比如 yum install openldap-clients openldap-servers;这会下载并安装客户机和服务器包以及所需的所有依赖关系。
对于 Red Hat Enterprise Linux,搜索 openldap 的包的命令是 up2date --showall | grep openldap。安装包的方法是将包名称作为参数传递给 up2date,比如 up2date openldap-clients openldap-servers。
使用 chkconfig ldap on 确保在系统引导时启动 OpenLDAP 服务器。
基于 Debian 的发行版
基于 Debian 的发行版(比如 Ubuntu)使用 Advanced Packaging(APT)工具安装包。首先,使用 apt-cache search openldap 命令搜索 OpenLDAP 包,见清单 4。

清单 4. 列出 Ubuntu Linux 中可用的 OpenLDAP 包

notroot@ubuntu:~$ apt-cache search openldap
libldap2 - OpenLDAP libraries
libldap2-dev - OpenLDAP development libraries
python-ldap - A LDAP interface module for Python. [dummy package]
python-ldap-doc - Documentation for the Python LDAP interface module
python2.4-ldap - A LDAP interface module for Python 2.4
ldap-utils - OpenLDAP utilities
libldap-2.2-7 - OpenLDAP libraries
slapd - OpenLDAP server (slapd)


清单 4 显示几个可用的包。slapd 包提供服务器,并在安装时解析所有依赖软件。运行 sudo apt-get install slapd 安装服务器。还可能需要 ldap-utils 包,这个包包含命令行客户机。
回页首
配置软件
安装 OpenLDAP 之后,必须配置它。为了进行测试,只需要指定几个设置;但是对于真实环境(和 LPIC 考试),必须充分了解各个选项。
有两个配置文件控制 OpenLDAP 的行为;这两个文件在默认情况下都放在 /etc/openldap/ 中。第一个文件是 ldap.conf,它控制 LDAP 客户机的全局行为。所有 LDAP 服务器的配置文件称为 slapd.conf。slapd.conf 还包含复制守护进程 slurpd 的配置。本文主要关注 slapd.conf,尤其是与 slapd 守护进程相关的部分。
slapd.conf 的格式很简单:一个关键字,后面是一个或多个参数,它们要符合以下条件:
关键字必须从 0 列开始 — 即,前面没有空格。
如果参数中有空格,那么这个参数必须加上双引号("")。
如果一行以空格开头,它就是前一行的延续。
关键字不是大小写敏感的,但是根据所用的关键字不同,参数可能是大小写敏感的。
与大多数 UNIX® 工具一样,hash 符号(#)表示注释。hash 符号后面的所有内容都被忽略。
slapd.conf 分成两部分:全局选项和后端数据库选项。尽管对于次序没有限制,但是必须注意放置指令的位置,因为一些指令会改变处理后续指令的上下文。例如,如果还没有遇到 backend 或 database 关键字,那么选项就是全局的。遇到 database 指令之后,所有后续选项都应用于这个数据库。这种情况一直持续到另一个 database 指令,此后的指令应用于新的数据库。
本系列后面的教程会讨论一些全局选项,比如用于访问控制和复制的选项。下面讨论常用的配置指令。
服务器参数(全局)
有几个参数限制 slapd 进程可以执行的操作,从而避免过度消耗资源。conn_max_pending 接受一个整数,这个数字表示任何时候未处理的匿名请求的最大数量。 本系列后面的教程会讨论对 LDAP 服务器的绑定;简单地说,在向服务器发出请求时,可以作为一个用户登录(经过身份验证的会话),也可以不使用任何凭证(匿名会话)。超过 conn_max_pending 限制的匿名请求会被服务器丢弃。conn_max_pending_auth 与 conn_max_pending 相似,但是它控制经过身份验证的会话。
idletimeout 参数(以秒为单位)告诉 slapd 空闲的客户机经过多长时间之后应该断开连接。如果这个数字是 0,那么不会断开连接。
sizelimit 参数限制一个查询可以返回的搜索结果数量,timelimit 限制服务器花费的搜索时间。这两个参数可以接受一个整数、关键字 unlimited 或更复杂的硬限制和软限制。这允许设置一个默认的(软)超时或结果集大小;但是,如果一个客户机请求大量行或更长的超时,可以允许它达到硬限制。例如,sizelimit sizesoft=400 size.hard=1000 指定在默认情况下返回 400 行。客户机可以请求将这个限制提高到最多 1,000 行。这个格式可以应用于用户组,这让一些用户或应用程序可以执行大搜索,而其他用户只能执行小搜索。
当客户机对树执行搜索时,常常指定一个开始搜索的节点(称为搜索基 或基)— 所有结果的区分名(DN)中都包含搜索基。这可以加快搜索速度(因为需要搜索的节点更少),而且使客户机的实现比较简单(因为只搜索树的一部分是一个简单且有效的过滤)。如果客户机没有指定搜索基,那么使用 defaultsearchbase 的值。设置这个参数可以避免配置错误的客户机造成问题。根据 LDAP 树的布局不同,可能希望使用用户的容器或树的根。(前一个教程 讨论了树和区分名。)
有三个命令控制服务器提供的各个特性,比如遗留支持和客户机的安全需求。这些命令是 allow、disallow 和 require。每个命令接受一系列关键字,分别启用、禁用或要求特性。表 3 列出这些关键字。

表 3. allow、disallow 和 require 使用的关键字
命令 关键字 说明 默认
allow bind_v2 如果设置了,就允许连接遗留的 LDAPv2 客户机。OpenLDAP 文档反复指出 OpenLDAP 实际上不支持 LDAPv2,所以某些请求可能导致出乎意料的行为。 Disallowed
allow bind_anon_cred 允许客户机在使用密码但是不使用 DN 的情况下执行绑定。如果允许这个选项,那么客户机就可以进行匿名绑定。 Disallowed
allow bind_anon_dn 允许客户机在使用 DN 但是不使用密码的情况下执行绑定,这常常是因为客户机的配置是错误的。如果允许这个选项,那么客户机就可以进行匿名绑定。 Disallowed
allow, disallow update_anon 允许匿名绑定,如果客户机在连接 LDAP 服务器时缺少 DN 或密码,就会发生匿名绑定。 Allowed
disallow bind_simple 允许简单的身份验证(未加密的用户名和密码)。否则,只能使用更严格的方法,比如 Simple Authentication and Security Layer(SASL)。 Allowed
require bind 要求客户机先用 bind 操作绑定到目录,然后才能执行其他操作。 Not required
require LDAPv3 决定是否需要 LDAPv3。注意,这与 allow bind_v2 相互冲突。 Not required
require authc 需要身份验证,这与匿名绑定相反。 Not required
require SASL 要求使用 SASL 方法连接服务器。 Not required
require strong 要求使用更严格的身份验证方法。这可以是 SASL 或通过受保护方法的简单身份验证。 Not required
require none 这个选项清除所有需求,通常在 slapd.conf 的数据库部分中使用这个命令放宽对某个数据库的需求。如果希望修改某个数据库的需求(而不是清除所有需求),那么在添加新需求之前必须使用 none,即使在全局部分中已经要求了这些需求。 Not applicable
即使表 3 中的一些命令允许某些登录类型,连接仍然会受到访问控制。例如,可能向匿名绑定授予对树的一部分的只读访问权。应该根据应用程序的性质和客户机的功能,决定如何允许或不允许各种身份验证方法。
如果希望维持比较高的可用性,那么应该启用 gentlehup。启用这个命令之后,当 slapd 收到 SIGHUP 信号时会停止监听网络,但是不会丢弃任何已经打开的连接。然后可以启动 slapd 的新实例,常常是使用一个更新的连接。
为了进行更详细的日志记录,可以调整 loglevel 的值。这个命令接受一个整数、多个整数或一系列关键字,这些数字和关键字为特定的功能启用日志记录。在 slapd.conf 的手册页中可以找到关键字和值的完整列表。例如,连接跟踪的值为 8,关键字是 conns,同步的值是 4096,关键字是 sync。logging 5004、logging 8 4096 或 logging conns sync 的作用都是同时为这两个特性启用日志记录。
如果从源代码编译 OpenLDAP,那么可以启用一些模块。也可以通过包管理器下载模块,比如 openldap-server-sql 包中包含 SQL 后端模块。modulepath 和 moduleload 选项用来将动态模块装载到 slapd 中。modulepath 指定包含共享库的目录(或目录列表),每个 moduleload 指定一个要装载的模块。不需要指定模块的版本号或扩展名,因为 slapd 会搜索共享库。例如,对于 back_sql-2.3.so.0.2.18 库,使用 moduleload back_sql。也可以在 moduleload 选项中指定库的完整路径(不带版本号和扩展名),比如moduleload /usr/share/openldap/back_sql。
一些脚本需要在某个文件中存储的进程 id。pidfile 告诉 slapd 将它的进程 id 写到哪里。
模式参数
一些命令可以在树中添加模式条目,这可以通过包含模式文件,也可以通过在 slapd.conf 中定义对象。正如 前面的教程 指出的,模式提供 LDAP 树可以使用的属性和对象类。
在服务器中添加新的模式文件的方法是使用 include 命令,在后面指定模式文件的完整路径(通常在 /etc/openldap/schema 中)。如果一个模式引用另一个模式(比如从 organizationalPerson 派生的 inetOrgPerson),就需要按正确的次序(基对象在前)包含所有必需的文件。OpenLDAP 会在包含每个模式时进行解析,所以包含的次序很重要。
可以通过 slapd.conf 直接添加模式条目,attributetype 和 objectclass 命令分别用来添加属性和对象。这么做的效果相当于把信息放在模式文件中并用 include 命令包含模式文件。还可以用 objectidentifier 定义对象标识符(OID)。
后端和数据库
后端和数据库是两个不同的概念,但是它们密切相关。数据库代表树的一部分,比如 dc=ertw,dc=com(本系列以 dc=ertw,dc=com 树作为主要示例)。后端表示 slapd 获取数据的方法。
在许多情况下,后端是硬盘上的一个文件 (采用某种格式;更多信息见下文);也可以是从另一个来源获取数据的方法,来源包括 SQL 数据库、DNS,甚至是通过脚本。每个数据库由一个后端处理,多个数据库可以使用相同的后端类型。
正如前面提到的,slapd.conf 首先包含全局指令。后端模式从 backend 指令的第一个实例开始。这个后端模式中的所有指令都应用于配置的特定后端。全局设置的所有选项也应用于后端,除非在后端级别覆盖了它们。同样,用 database 关键字配置数据库。一个数据库与一个后端类型相关联,继承所有全局或后端级别的配置。也可以在数据库级覆盖任何选项。
OpenLDAP 将后端分为三种类型:
存储数据的后端:
bdb — 使用 Berkeley 数据库引擎(比如现在属于 Oracle 的 Sleepycat)
hdb — 对 back-ldb 的一种改进,添加了一些索引改进
代理数据的后端:
ldap — 代理另一个 LDAP 服务器
meta — 对于树的不同部分,代理几个 LDAP 服务器
sql — 从一个 SQL 数据库返回数据
生成数据的后端:
dnssrv — 根据 DNS SRV 记录中的数据返回 LDAP 数据
monitor — 从 LDAP 服务器返回统计数据
null — 测试模式;不返回任何数据
passwd — 从密码文件返回数据
perl — 返回从 Perl 脚本生成的数据
shell — 返回从 shell 脚本生成的数据
每个后端都有相关的配置选项,可以在相关的手册页中找到这些选项(比如针对 bdb 后端的 slapd-bdb)。
数据库代表树及其数据。dc=ertw,dc=com 树是一个数据库示例。如果这个 DN 下面的所有数据属于同一个数据库,就以相似的方式存储。可能出现另一种情况:ou=people,dc=ertw,dc=com 存储在一个数据库中,dc=ertw,dc=com 中的其他数据存储在另一个数据库中。另外,一个 LDAP 服务器可以处理多个树,比如 dc=ertw,dc=com 和 dc=lpi,dc=org。每个数据库根据自己的后端以自己的方式处理请求。
通过指定 database 和数据库类型,启动数据库配置模式。常用的数据库形式是 Berkeley 数据库,所以 database bdb 创建一个 BDB 数据库。需要的下一个命令是 suffix,它指定数据库代表的树的根。
rootdn 和 rootpw 允许为数据库指定一个具有所有特权的用户(根用户)。这个用户甚至不受访问控制的影响。rootdn 应该在指定的后缀中,可以有也可以没有密码。如果指定了 rootpw,就使用它作为密码。否则,就要查看树中 rootdn 的记录并根据 userPassword属性执行身份验证。如果没有指定根用户,那么所有用户都受到访问控制。
如果指定 lastmod on,那么 OpenLDAP 会保存几个隐藏的属性(称为操作性属性(operational attribute)),比如创建记录的用户的名称和修改记录的时间。复制过程需要其中一些属性,所以最好启用 lastmod(这是默认设置)。除非专门请求,客户机上不显示这些操作性属性。
可以通过 restrict 命令进一步限制可以对数据库执行的操作。这个命令接受几个与 LDAP 操作对应的参数,比如add、bind、compare、 delete、rename 和 search。如果要禁止用户删除树中的节点,就使用 restrict delete。如果树包含用户,但是由于某种原因不希望允许他们绑定到这个树,那么使用 restrict bind。 另外,read 和 write 分别禁止对树的任何读和写,这样就不必明确指定所有相关操作。还可以使用 readonly 命令让数据库成为只读。
同一个树的不同部分可以由不同的数据库处理。如果配置得正确,OpenLDAP 会将所有部分组合在一起。包含其他数据库的数据库称为上级数据库(superior database);被包含的数据库称为从属数据库(subordinate database)。首先,定义从属数据库并在同一行上添加 subordinate 命令。然后定义上级数据库。通过采用这样的配置,OpenLDAP 就可以把多个数据库当作一个数据库,其中一部分数据是本地存储的,一些数据来自其他来源(一种特殊情况是所有数据都放在一个远程 LDAP 服务器上,这个服务器使用一个元目录)。注意,如果在从属数据库之前定义上级数据库,就会收到错误,错误消息指出这会重新定义树的结构。清单 5 将dc=ertw,dc=com 树划分成一个上级数据库和一个从属数据库。

清单 5. 从属数据库和上级数据库的配置

# Subordinate
database bdb
suffix "ou=people,dc=ertw, dc=com"
rootdn "cn=Sean Walberg,ou=people,dc=ertw,dc=com"
rootpw mysecret
directory /var/db/openldap/ertw-com-people
subordinate

# Superior
database bdb
suffix "dc=ertw, dc=com"
rootdn "cn=Sean Walberg,dc=ertw,dc=com"
rootpw mysecret
directory /var/db/openldap/ertw-com


还要注意,这里配置了两个 rootdn。如果要定义密码,rootdn 就必须在数据库的范围内。在构建这个树时,必须使用第二个根帐户定义 dc=ertw,dc=com 条目,使用第一个根帐户定义人员组织单元(OU)和它下面的所有对象。添加了用户之后,就可以作为另一个用户进行身份验证,获得对整个树的访问权。
如果使用 bdb 后端,那么还需要使用 directory 命令指定存储数据库文件的位置。每个数据库实例需要一个单独的目录。
设置新数据库是非常简单的,只需要使用几个命令。当需要调整后端时,会出现比较复杂的情况,这是本系列中下一个教程的主题。
覆盖
覆盖(overlay)是数据库的扩展。如果希望在数据库中添加一个特性,常常可以采用覆盖的形式,而不必修改数据库代码。例如,如果希望在日志中记录所有写操作,可以将 auditlog 覆盖附加到相关的数据库。
覆盖的操作方式像一个堆栈。在配置数据库之后,指定一个或多个数据库。然后,用 overlay 命令和覆盖名定义每个覆盖。每个覆盖有自己的配置参数。
如果配置了多个覆盖,那么它们按照与定义次序相反的次序运行。运行了所有覆盖之后,才会访问数据库。当数据库返回数据之后,以相同次序再次运行覆盖,然后 slapd 将数据返回到客户机。
在每一步中,一个覆盖可以执行一个操作(比如日志记录),它可以修改请求或响应,也可以停止处理。

Logo

更多推荐