主题302:安装和开发

在你开始前

了解这些教程可以教给您什么以及如何从中获得最大收益。

关于本系列

Linux Professional Institute (LPI)在三个级别上对Linux系统管理员进行认证: 初级 (也称为“认证级别1”), 高级 (也称为“认证级别2”)和高级 (也称为“认证级别3”) )。 要获得认证1级,您必须通过考试101和102。要达到认证2级,您必须通过考试201和202。要达到认证3级,您必须具有有效的高级认证并通过考试301(“核心”)。 您还可以通过其他高级专业考试。

developerWorks提供了教程,以帮助您准备五个初级,高级和高级认证考试。 每个考试涵盖几个主题,并且每个主题在developerWorks上都有一个相应的自学教程。 表1列出了LPI 301考试的六个主题和相应的developerWorks教程。

表1. LPI 301考试:教程和主题
LPI 301考试主题 developerWorks教程 教程总结
主题301 LPI 301考试准备:
概念,体系结构和设计
了解有关LDAP概念和体系结构,如何设计和实现LDAP目录以及架构的信息。
主题302 LPI 301考试准备:
安装与开发
(本教程)了解如何安装,配置和使用OpenLDAP软件。 请参阅详细目标
主题303 LPI 301考试准备:
组态
快来了。
主题304 LPI 301考试准备:
用法
快来了。
主题305 LPI 301考试准备:
整合与迁移
快来了。
主题306 LPI 301考试准备:
容量规划
快来了。

要通过301考试(并达到3级认证),您应该:

  • 具有多年在各种目的的各种计算机上安装和维护Linux的经验。
  • 具有与多种技术和操作系统的集成经验
  • 具有企业级Linux专业人员的专业经验或接受过培训(包括作为另一角色的一部分具有经验)
  • 熟悉Linux管理的高级和企业级别,包括安装,管理,安全性,故障排除和维护。
  • 能够使用开源工具来衡量容量规划并解决资源问题
  • 具有使用LDAP与UNIX®服务和Microsoft®Windows®服务(包括Samba,可插拔身份验证模块(PAM),电子邮件和Active Directory)集成的专业经验。
  • 能够使用Samba和LDAP进行规划,架构,设计,构建和实施完整的环境,以及衡量服务的容量规划和安全性
  • 能够使用Bash或Perl创建脚本,或者至少了解一种系统编程语言(例如C)

Linux Professional Institute不特别认可任何第三方考试准备材料或技术。

关于本教程

欢迎使用“安装和开发”,这是为您准备LPI 301考试而设计的六个教程中的第二个。在本教程中,您将学习LDAP服务器的安装和配置,以及如何使用Perl访问新的LDAP服务器。

本教程根据该主题的LPI目标进行组织。 粗略地说,对于权重较高的目标,应在考试中遇到更多问题。

目标

表2显示了本教程的详细目标。

表2.安装和开发:本教程涵盖的考试目标
LPI考试目标 客观体重 客观总结
302.1
编译和安装OpenLDAP
3 从源代码和程序包编译并安装OpenLDAP
302.2
使用Perl / C ++为LDAP开发
1个 编写基本的Perl脚本以与LDAP目录进行交互

先决条件

为了从本教程中获得最大收益,您应该具有Linux的高级知识以及可以在其上实践所涵盖命令的Linux系统。

如果您的基本Linux技能有点生锈,那么您可能需要先阅读LPIC-1和LPIC-2考试教程

程序的不同版本可能会不同地格式化输出,因此您的结果可能看起来与本教程中的清单和图不完全相同。

系统要求

要按照这些教程中的示例进行操作,您将需要具有OpenLDAP软件包并支持PAM的Linux工作站。 大多数现代发行版都满足这些要求。

编译和安装OpenLDAP

本部分介绍了高级Linux专业人员(LPIC-3)考试301的主题302.1的材料。此主题的权重为3。

在本节中,学习如何:

  • 从源代码编译和配置OpenLDAP
  • 了解OpenLDAP后端数据库
  • 管理OpenLDAP守护程序
  • 解决安装过程中的错误

OpenLDAP是实现LDAP服务器和相关工具的开源应用程序。 因为它是开源的,所以您可以免费下载源代码。 OpenLDAP项目不会直接分发二进制文件,但是大多数主要发行版都将其自身打包。 在本教程中,您将学习如何从源代码和软件包中安装OpenLDAP。

从源编译

首先要做的是从项目站点下载最新版本的OpenLDAP( 有关下载链接,请参阅参考资料部分)。 该项目通常有两个可用的活动版本:一个是稳定版本,另一个是测试版本。 本教程使用的是稳定版本2.3.30和2.3.38。 如果您遵循的话,某些目录名称可能会有所不同,具体取决于您使用的版本。

要从下载的tarball中提取源代码,请输入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中,您可以看到默认情况下禁用了许多功能,例如元目录和模块。 此外,许多选项都标记为“自动”,如果系统上存在正确的库,则这些功能会打开。 最好不要列出此自动功能,而要列出所需功能并启用它们。 如果缺少任何库,则会在编译时而不是在一段时间后得到此效果的错误。

可以通过noyesmod传递某些配置选项。 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启用了插件和多个后端,包括基于结构化查询语言(SQL)的后端和Berkeley数据库文件。 后端是OpenLDAP的存储和检索数据的方式,在“ 后端和数据库 ”和后面的教程中将进行更详细的研究。

清单2还构建了独立的守护程序slapd和复制守护程序slurpd 。 还启用了可轻松定制后端数据的覆盖图,以进行测试。 因为这是一个测试设置,所以安装前缀已更改为/tmp/openldap ,因此生成的二进制文件最终位于/tmp/openldap/libexec

当您执行configure脚本时,它将检查必要的库,然后生成构建环境。 如果configure成功完成,请使用makedepend编译OpenLDAP make depend; make make depend; make

代码编译后,可以使用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 --showall | grep openldap 。 要安装软件包,请提供软件包名称作为up2date参数,例如up2date openldap-clients openldap-servers

要确保OpenLDAP服务器在启动时启动,请在上使用chkconfig ldap on

基于Debian的发行版

基于Debian的发行版(例如Ubuntu)使用Advanced Packaging( APT )工具来安装软件包。 首先,要搜索OpenLDAP软件包,请使用apt-cache search 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 3考试),您必须熟悉各种选择。

两个配置文件控制OpenLDAP的行为。 两者默认都在/ etc / openldap /中。 第一个是ldap.conf,它控制LDAP客户端的全局行为。 所有LDAP服务器的配置文件称为slapd.conf。 尽管名称如此,slapd.conf也具有复制守护程序slurpd的配置。 本文的重点是slapd.conf,特别是有关slapd守护程序的内容。

slapd.conf的格式很简单:一个关键字后跟一个或多个参数,但要满足以下条件:

  • 关键字必须从第0列开始-也就是说,其前面不能有空格。
  • 如果参数中有空格,则参数必须用双引号(“”)引起来。
  • 如果一行以空格开头,则将其视为前一行的延续。
  • 关键字不区分大小写,但参数可以区分大小写,具体取决于所使用的关键字。

与大多数UNIX®工具一样,井号(#)表示注释。 哈希之后的所有内容都将被忽略。

slapd.conf分为两部分:全局选项和后端数据库选项。 尽管没有强制执行此顺序,但是您必须注意放置指令的位置,因为某些指令会更改处理后续指令的上下文。 例如,如果未遇到backenddatabase关键字,则将选项视为全局选项。 读取database指令后,所有其他选项都将应用于该数据库。 这一直持续到读取另一个database指令为止,此时下一个命令将应用于新数据库。

301系列的后续教程将介绍一些全局选项,例如那些涉及访问控制和复制的选项。 常用配置指令的描述如下。

服务器参数(全局)

有几个参数限制了slapd进程可以完成的工作,这可以防止资源匮乏。 conn_max_pending接受一个整数,该整数指示在任何给定时间可以挂起多少个匿名请求。 您将在此301系列的后续教程中学习有关绑定到LDAP服务器的信息。 简而言之,您可以通过以用户身份登录(经过身份验证的会话)或不使用任何凭据(匿名会话)来向服务器发出请求。 服务器会丢弃超出conn_max_pending限制的请求。 同样, conn_max_pending_authconn_max_pending相同,但指的是经过身份验证的会话。

idletimeout参数(以秒为单位指定)告诉slapd空闲客户端可以保持多长时间,然后再断开它们。 如果该数字为0,则不会断开连接。

sizelimit参数限制单个查询可以返回的搜索结果的数量,而timelimit限制服务器花费搜索时间的时间。 这两个参数可以采用整数(关键字unlimited )或更复杂的硬限制和软限制。 这将允许您设置默认(软)超时或结果集大小。 但是,如果客户端请求更多的行数或更长的超时时间,则可以满足硬限制。 例如, sizelimit sizesoft=400 size.hard=1000指定默认情况下,返回400行。 客户可以要求将该限制增加到1000。 此格式可以应用于用户组,以便某些人或应用程序可以执行大型搜索,而其他人或应用程序只能执行小型搜索

客户端在树上执行搜索时,通常会指定从其开始搜索的节点(称为search base或base )-所有结果的专有名称(DN)中都包含搜索基础。 这样可以进行更快的搜索(因为需要搜索的节点更少)和更容易的客户端实现(因为仅搜索树的一部分是一个简单但有效的过滤器)。 如果客户端未指定基数,则使用defaultsearchbase的值。 设置此参数是一个很好的参数,可以避免配置错误的客户端带来意外情况。 根据LDAP树的布局,您可能希望使用用户容器或树的根。 (在上一教程中介绍了树和专有名称。)

三个命令控制着服务器支持的各种功能,例如客户端的旧支持和安全要求。 这些命令allowdisallowrequire 。 每个命令采用一系列启用,禁用或需要功能的空白关键字。 关键字显示在表3中。

表3.与allowdisallowrequire一起使用的关键字
命令 关键词 描述 默认
allow bind_v2 如果设置,则允许旧版LDAPv2客户端连接。 OpenLDAP文档反复指出,OpenLDAP并不真正支持LDAPv2,因此某些请求可能会导致意外行为。 不允许的
allow bind_anon_cred 允许客户端绑定密码但不绑定DN。 如果允许此选项,则允许客户端作为匿名绑定。 不允许的
allow bind_anon_dn 允许客户端绑定DN但不绑定密码,通常是因为客户端配置错误。 如果允许此选项,则允许客户端作为匿名绑定。 不允许的
allow, disallow update_anon 允许匿名绑定,当客户端不使用DN或密码连接到LDAP服务器时,就会发生匿名绑定。 允许的
disallow bind_simple 与简单的身份验证和安全层(SASL)等更强的方法相比,允许简单的身份验证(未加密的用户名和密码)。 允许的
require bind 要求客户端在执行任何其他操作之前,先使用bind操作将其绑定到目录。 不需要
require LDAPv3 确定是否需要LDAPv3。 请注意,这可能与allow bind_v2冲突。 不需要
require authc 需要身份验证,而不是匿名绑定。 不需要
require SASL 要求使用SASL方法连接到服务器 不需要
require strong 要求使用强大的身份验证方法。 这可以是SASL或通过受保护方法的简单身份验证。 不需要
require none 通常,如果您通过在slapd.conf的数据库部分中使用此命令来放宽某个数据库的要求,则此选项将清除所有要求。 如果您希望更改数据库的需求(而不是仅仅清除列表),则即使在全局部分中已将其添加,也必须在添加新需求之前none使用它们。 不适用

尽管表3中的某些命令可能允许某些类型的登录,但是连接仍受访问控制。 例如,可以授予匿名绑定对树的一部分的只读访问权限。 应用程序的性质和客户端的功能决定了如何允许或禁止各种身份验证方法。

如果您希望保持更高的可用性,请启用gentlehup 。 启用此命令后,当slapd收到SIGHUP信号时,它将停止侦听网络,但不会断开任何打开的连接。 然后通常可以使用更新的配置来启动新的slapd实例。

要获取更多详细的日志记录,请调整loglevel的值。 该命令接受一个整数,多个整数或一系列关键字,这些关键字启用对特定功能的日志记录。 有关关键字和值的完整列表,请参考slapd.conf联机帮助页。 例如,连接跟踪的值为8,关键字为conns ,同步的值为4096,关键字sync 。 要启用这两项的logging 5004logging 8 4096 logging 5004logging 8 4096logging conns sync将达到相同的结果。

如果从源代码编译OpenLDAP,则可能已启用了某些模块。 另外,您可能已经从软件包管理器中下载了额外的模块,例如openldap-server-sql软件包,其中包括SQL后端模块。 modulepathmoduleload选项用于将动态模块加载到slapdmodulepath指定包含共享库的目录(或目录列表),而moduleload每个实例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中找到)。 如果一个模式引用另一个模式(例如inetOrgPerson继承自organizationalPerson ),则需要以正确的顺序包括所有必需的文件,首先包含基础对象。 OpenLDAP在解析每个架构文件时会对其进行分析,因此包含顺序很重要。

您可以直接通过slapd.conf使用attributetypeobjectclassattributetypeobjectclass命令直接添加新的架构项目。 这与将信息放入模式文件并将其包含在include命令中相同。 同样,您可以使用objectidentifier定义对象标识符(OID)。

后端和数据库

后端和数据库是两个独立但密切相关的概念。 数据库代表树的一部分,例如dc=ertw,dc=com 。 后端描述了slapd检索数据的方法。 ( dc=ertw,dc=com树是本系列的主要示例。)

在许多情况下,后端是磁盘上的文件(某种格式;稍后会对此进行更多介绍); 或者它可以是一种从另一个来源,SQL数据库,DNS甚至通过脚本获取数据的方法。 每个数据库由一个后端处理,并且多个数据库可以使用相同的后端类型。

如前所述,slapd.conf以全局指令开头。 然后,后端模式从backend指令的第一个实例开始。 此后备模式下的所有指令均适用于正在配置的特定后端。 全局设置的所有选项都适用于后端,除非它们在后端级别被覆盖。 同样,您可以使用database关键字配置数据库。 数据库绑定到后端类型,该后端类型继承任何全局或后端级别的配置。 您也可以在数据库级别覆盖任何选项。

OpenLDAP将后端分为三种类型:

  1. 那些存储数据的:
    • bdb-使用Berkeley数据库引擎(例如,现在由Oracle拥有的Sleepycat)
    • hdb-对back-ldb的改进,增加了一些索引编制改进
  2. 那些代理数据的:
    • ldap-代理另一个LDAP服务器
    • meta-为树的不同部分代理多个LDAP服务器
    • sql-从SQL数据库返回数据
  3. 那些产生数据的:
    • 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=comdc=lpi,dc=org 。 每个数据库都有通过自己的后端处理请求的方式。

指定database然后指定database类型以启动数据库配置模式。 常用的形式是Berkeley数据库,因此database bdb创建一个BDB数据库。 您需要的下一个命令是suffix ,它指定数据库正在服务的树的根。

rootdnrootpw允许您为数据库指定一个具有所有特权的用户( root用户 )。 该用户甚至不受访问控制。 rootdn应该在指定的后缀内,并且可以或可以不具有密码。 如果指定了rootpw ,则使用它。 否则,行为是在树中查找rootdn的记录,并根据userPassword属性进行身份验证。 如果未指定root用户,则所有用户都受配置的访问控制的约束。

如果在上指定lastmod on ,则OpenLDAP会保留几个隐藏的属性(称为操作属性 ),例如创建记录的人的姓名以及记录的修改时间。 这些属性中的某些属性是复制正常工作所必需的,因此,使lastmod启用状态是很明智的(这是默认设置)。 除非特别要求,否则不会将这些操作属性显示给客户端。

您可以通过restrict命令进一步限制可以对数据库执行的操作。 该命令采用与LDAP操作相对应的参数,例如addbindcomparedeleterenamesearch 。 要阻止用户删除树中的节点,请使用restrict delete 。 如果树包含用户,但是由于某些原因您不希望他们能够绑定到树,请使用restrict bind 。 此外,可使用readwrite分别阻止对树的任何读取和写入,而不必拼出所有相关操作。 或者,您可以使用命令readonly将数据库设置为只读。

同一棵树的不同部分可以由不同的数据库处理。 如果配置正确,OpenLDAP会将所有部件粘合在一起。 包含另一个的数据库称为上级数据库 ; 包含的数据库是下属数据库 。 首先,定义下级数据库,并在其下一行添加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命令指定数据库文件的存储位置。 每个数据库实例需要一个单独的目录。

设置新数据库非常简单,因为只需要担心几个命令。 当您尝试调整后端时,这会带来很多复杂性,这是此301系列下一个教程的主题。

叠加层

覆盖是数据库的扩展。 如果要向数据库添加功能,通常可以将其作为覆盖添加,而不是分叉数据库代码。 例如,如果要将所有写入记录到文件中,则可以将auditlog日志覆盖图附加到相关数据库。

叠加层是堆栈。 配置数据库后,您可以指定一个或多个数据库。 然后,使用overlay命令定义每个叠加overlay ,后跟overlay的名称。 每个覆盖都有自己的配置参数。

如果您配置了多个叠加层,则它们以与定义它们相反的顺序运行。 只有在所有叠加层都运行完之后,才能访问数据库。 数据库返回数据后,将以相同顺序再次运行叠加层,然后slapd将数据返回给客户端。

在每个步骤中,叠加层都可以执行诸如记录之类的操作,可以修改请求或响应,也可以停止处理。

使用Perl / C ++为LDAP开发

本节介绍了高级Linux专业人员(LPIC-3)考试301的主题302.2的材料。此主题的权重为1。

在本节中,学习如何:

  • 使用Perl的Net::LDAP模块
  • 编写Perl脚本以绑定,搜索和修改目录
  • 用C / C ++开发

尽管OpenLDAP包含命令行客户端,但在自己的脚本中使用LDAP信息通常会有所帮助。 Perl是一种流行的脚本语言。 Perl有一个称为Net::LDAP的模块,该模块用于连接和使用LDAP服务器。

入门

Net::LDAP不随Perl一起提供,但您的发行版可能会将其作为软件包包括在内。 有关搜索和安装软件包的更多信息,请参见“ 从软件包安装 ”。

如果您的发行版没有Net::LDAP软件包,则可以从综合Perl归档网络(CPAN)下载它。 以root用户perl -MCPAN -e "install Net::LDAP"运行perl -MCPAN -e "install Net::LDAP" ,该程序将下载并安装Net::LDAP及其所有依赖项。

使用Net :: LDAP

使用Net::LDAP非常简单:

  1. 创建一个新的Net::LDAP对象。
  2. 绑定到所需的服务器。
  3. 执行您的LDAP操作。
创建一个新对象

以典型的Perl方式,您必须通过new方法创建Net::LDAP模块的实例。 所有其他操作将在此实例上。 new至少需要您要连接的服务器的名称。 例如:

my $ldap = Net::LDAP->new('localhost') or die "$@";

在这里,使用new方法创建了一个新的Net::LDAP对象,并将其传递给字符串localhost 。 结果分配给$ldap变量。 如果功能失败,程序将退出并显示一条描述该问题的错误消息。 $@是一个Perl内部变量,其中包含上一次操作的状态。

您可以继续使用新的Net::LDAP对象执行LDAP操作。 每个函数返回一个Net::LDAP::Message对象,该对象包含操作状态,任何错误消息以及从服务器返回的任何数据。

绑定到树

您应该做的第一个操作是登录或绑定到树。 清单6显示了绑定操作和相关的错误检查。

清单6.绑定到树的Perl代码
my $message = $ldap->bind( "cn=Sean Walberg,ou=people,dc=ertw,dc=com", password=>"test" ); if ($message->code() != 0) { die $message->error(); }

清单6首先调用先前创建的对象的bind方法。 该函数的第一个参数是您要绑定的DN。 如果未指定DN,则将进行匿名绑定。 其他参数的格式为key=>value ; 您最常使用的密码是。

每个Net::LDAP方法都返回一个Net::LDAP::Message对象,该对象具有函数的结果。 通过code方法检索错误代码。 代码0表示成功,因此如果结果不为0,清单6中的代码将退出并显示错误消息。请注意,错误是从$message->error而不是$@检索的,例如前面的例子。 这是因为该错误不是Perl错误。 它在Net::LDAP内部。

绑定成功后,您可以根据服务器的访问控制来执行所需的任何操作。 要注销,请调用unbind方法。

搜索树

通过search方法进行search 。 与bind方法一样,您必须传递一些参数并检查查询结果。 但是,返回的对象现在包含您的数据,因此必须对其进行解析。 通过search操作,结果是一个Net::LDAP::Search对象,该对象继承了Net::LDAP::Message所有方法(例如codeerror ),并添加了一些方法来帮助您解析数据。 清单7显示了对树的搜索。

清单7.搜索与树search
$message = $ldap->search(base => "dc=ertw,dc=com", filter=> "(objectClass=*)"); if ($message->code() != 0) { print $message->error(); } else { foreach my $entry ($message->entries()) { print $entry->dn() . ": "; print join ", ", $entry->get_value("objectClass"); print "\n"; } }

清单7首先调用search方法,并传递两个参数:base和filter。 基地告诉服务器在树中开始搜索。 补充选项scope告诉服务器搜索多远:

  • base —仅基础对象
  • 一个 -仅基础对象的子代(而不是基础对象本身)
  • sub —基础对象及其所有对象(默认)

过滤器是一个字符串,描述您感兴趣的对象。您可以搜索属性并执行复杂的AND / OR查询。 objectClass=*返回任何对象。

检查搜索结果,如果出现问题,则打印错误。 因为脚本仍然可以从错误中恢复,所以它只显示错误并继续,而不是退出。

entries函数返回Net::LDAP::Entry对象的数组,每个对象都有一个结果。 首先打印条目的DN,然后打印所有对象类。 如果您希望获得整个记录的文本版本,则dump方法将以文本格式打印整个条目。

添加新条目

您可以通过add方法将条目添加到树中。 您必须向函数传递要添加的条目的DN,以及属性。 这些属性是key =>的数组key => 值对。 对于相同属性的多个实例,该值也可以是一个数组。 清单8显示了一个添加到树中的条目。

清单8.使用Net::LDAP添加一个条目
$message = $ldap->add( "cn=Fred Flintstone,ou=people,dc=ertw,dc=com", attr => [ cn => "Fred Flintstone", sn => "Flintstone", objectclass => [ "organizationalPerson", "inetOrgPerson" ], ] ); if ($message->code() != 0) { print $message->error(); }

add的第一个参数是DN或Net::LDAP::Entry对象。 如果传递了DN,则必须通过attr方法传递一个arrayref。 即使key => 值格式用于hashref中, Net::LDAP期望使用arrayref,所以要小心!

有关Net::LDAP更多信息

Net::LDAP提供了所有LDAP功能的接口,例如comparedeletemoddn 。 它们的用法都与前面的示例类似,并且在Net::LDAP联机帮助页中进行了全面记录。

所示的所有示例均在阻塞模式下运行,这意味着从服务器收到响应后,该函数将返回。 You can also operate in asynchronous mode, which involves giving a callback function that is called as packets are received.

By using Net::LDAP , you can use the data stored in your LDAP tree from within your scripts. Perl is already used in a wide variety of software, so the opportunities for integration are unlimited.

Developing in C/C++

Using the C libraries is more involved than the Perl libraries. The ldap(3) manpage contains a detailed description of how to use the library, and has pointers to the other manpages describing each function. To use the LDAP C libraries, your code must first include the ldap.h include file, such as with #include <ldap.h> 。 Your object files must then be linked with libldap using the -lldap option to the linker.

摘要

In this tutorial, you learned about installing and configuring the OpenLDAP stand-alone server. When configuring slapd , use the slapd.conf file. You must take care to keep your global options at the top of the file and then progress to backend and database configurations, because slapd is dependent on the order of the directives. When in doubt, consult the slapd.conf manpage.

Perl code can make use of an LDAP server through the Net::LDAP module. First you create an object, and then you call methods of the object that correspond with the LDAP operation you want. Generally, you first bind and then perform your queries. It's important to check the results of your functions through the code and error functions.


翻译自: https://www.ibm.com/developerworks/linux/tutorials/l-lpic3302/index.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值