LDAP 安全应用,第一部分
假设您有一个互联网邮件访问协议 (IMAP) 服务器和一群用户,但您不想给每个用户在服务器上一个 shell 帐户。您宁愿使用某种中央用户身份验证服务,该服务也可用于其他任务。当您进行此操作时,您还需要一个在线地址簿,用于您组织的电子邮件和群件应用程序。并且假设,除了所有这些之外,您还需要为您的用户提供使用 X.509 证书的加密工具,然后为您整个组织管理数字证书。
您会相信一项服务可以解决所有四种情况吗?轻型目录访问协议 (LDAP) 可以完成所有这些以及更多。而且您知道吗,开源社区有幸拥有一个免费、稳定且功能齐全的 LDAP 服务器和客户端软件包,该软件包已经是大多数 Linux 发行版的一部分:OpenLDAP。
唯一的缺点是 LDAP 是一个复杂的野兽。为了理解它,您将不得不在您的 UNIX 技巧包中添加更多的首字母缩略词和一些重型抽象概念。但是,有了未来几个月的 Paranoid Penguin 专栏和一点决心,您将拥有强大的 LDAP 驴子同时拉动几把大型犁,使您的网络更安全且更易于使用。以我的经验,“更安全”和“对最终用户更简单”很少并驾齐驱,所以我很高兴最终在本专栏中介绍 OpenLDAP。
简而言之,LDAP 提供目录服务,这是一个关于构成组织的人员、组和其他实体的基本信息的集中数据库。由于每个组织的结构及其对基本信息的精确定义可能不同,因此目录服务必须具有高度的灵活性和可定制性。因此,这本质上是一项复杂的工作。
X.500 目录服务协议就是一个例子。它旨在为大型复杂组织提供大规模目录服务。因此,X.500 本身是一个庞大而复杂的协议,以至于创建了它的轻量级版本:轻型目录访问协议。RFC 1777 中描述的 LDAP 本质上是 X.500 协议的子集,并且它的实现比 X.500 本身更广泛。
X.500 和 LDAP 是开放协议,如 TCP/IP;两者都不是独立的产品。协议必须在某种软件中实现,例如内核模块、服务器守护程序或客户端程序。与 TCP/IP 一样,并非所有 LDAP 实现都相同,甚至完全可互操作(无需修改)。我们在此处介绍的特定 LDAP 实现是 OpenLDAP,但您应该意识到其他软件产品提供了替代实现。其中包括 Netscape Directory Server、Sun ONE Directory Server,甚至在有限程度上包括 Windows 2000 Server 中的 Microsoft Active Directory。
幸运的是,LDAP 被设计为可扩展的。在一个平台上创建与其他 LDAP 实现兼容的 LDAP 数据库通常只是调整数据库的记录格式或模式的问题,我们将在下个月讨论这个问题。因此,在 Linux 系统上运行 OpenLDAP 服务器,为在 Mac 上运行 Netscape Communicator 的用户提供地址簿功能是没问题的。
OpenLDAP 作为一个有用且重要的工具,包含在大多数主要的 Linux 发行版中。通常,它分布在多个软件包中:一个软件包中的服务器守护程序,另一个软件包中的客户端程序,还有一个软件包中的开发库。本文是关于构建 LDAP 服务器的,因此您自然会想要安装您的发行版的 OpenLDAP 服务器软件包,以及 OpenLDAP 运行时库(如果它们未包含在服务器软件包中)。
如果您的服务器上没有本地用户帐户,并且您希望所有 LDAP 事务都在网络上发生,您可能会想放弃在服务器上安装 OpenLDAP 客户端命令。但是,这些客户端命令对于测试和故障排除很有用,因此我强烈建议您安装它们。
Red Hat 中包含 OpenLDAP 的特定软件包是 openldap(OpenLDAP 库、配置文件和文档);openldap-clients(OpenLDAP 客户端软件/命令);openldap-servers(OpenLDAP 服务器程序);和 openldap-devel(开发人员的头文件和库)。尽管这些软件包有许多相当普通的依赖项,包括 glibc,但有两个是您可能尚未安装的必需软件包:cyrus-sasl 和 cyrus-sasl-md5,它们有助于与 OpenLDAP 协商身份验证事务。
在 SuSE 中,OpenLDAP 在以下 RPM 中提供:openldap2-client(在 SuSE 7.3 和 8.0 版本的 n1 部分中);openldap2(包括 OpenLDAP 库和服务器守护程序,位于 n2 部分);和 openldap2-devel(位于 SuSE 7.3 的 n2 部分和 SuSE 8.0 的 n4 部分)。与 Red Hat 一样,请务必安装 cyrus-sasl 软件包,该软件包位于 SuSE 的 sec1 目录中。
在 7.3 和 8.0 发行版中,SuSE 都提供了 OpenLDAP 1.2 和 2.0 版本的软件包。除非您有运行 OpenLDAP 1.2 的特殊原因,否则请务必安装前面段落中列出的较新的 2.0 软件包。此指南不适用于 Red Hat 或 Debian,它们都在其当前发行版中标准化为 OpenLDAP 2.0。
对于 Debian 3.0 (Woody),等效的 deb 软件包为:libldap2(OpenLDAP 库,在 Debian 的 libs 目录中);slapd(OpenLDAP 服务器软件包,在 net 目录中);和 ldap-utils(OpenLDAP 客户端命令,也在 net 目录中)。您还需要 Debian libs 目录中的 libsasl7。
如果您的首选发行版没有 OpenLDAP 的二进制软件包,或者如果您的发行版的 OpenLDAP 软件包中缺少最新版本的 OpenLDAP 的特定功能,或者您需要在二进制级别自定义 OpenLDAP,您可以始终从官方 OpenLDAP 网站 www.openldap.org 下载源代码自行编译。
OpenLDAP 中的主要服务器守护程序称为 slapd,配置此程序是安装 OpenLDAP 后使其工作的首要步骤。它的配置主要由文件 /etc/openldap/slapd.conf 决定。“OpenLDAP 2.0 管理员指南”位于 www.openldap.org/doc/admin20/guide.html,其中有一个出色的快速入门程序,用于启动和运行 slapd:它在第 2 节中,从步骤 8 开始。该文档还使用树/层次结构图更深入地解释了目录服务和 LDAP 概念,比本文更深入。
让我们逐步完成此过程,以确保您有一个良好的开端。首先要做的是编辑 slapd.conf,清单 1 中显示了一个示例。正如您所见,slapd.conf 是一个典型的 Linux 配置文件:每行由一个参数名称后跟一个值组成。
清单 1. /etc/openldap/slapd.conf 的自定义部分
清单 1 中显示的第一个参数 database 指定要使用的数据库后端类型。通常,这里的最佳选择是 ldbm,它使用快速 dbm 数据库格式,但 shell(用于自定义 shell 脚本后端)和 passwd(使用 /etc/passwd 作为后端)也是有效的选择。可能有多个数据库定义,每个定义都有自己的一组适用参数;清单 1 中的所有行都包含单个数据库定义。
清单 1 中的下一个参数是 suffix,它确定哪些查询与此数据库定义匹配。此处,指定的后缀是 wiremonkeys.org,以 LDAP 语言表示为一系列域组件 (dc) 语句,这些语句从左到右解析。换句话说,如果 LDAP 客户端向我们的示例服务器查询有关专有名称 (dn) cn=bubba,dc=wiremonkeys,dc=org 的信息,我们的服务器会将该查询与此数据库定义匹配,因为 dn 以 dc=wiremonkeys,dc=org 结尾。有关专有名称的更多信息,请参阅边栏“X.500 命名速成课程”。
清单 1 中的下两个条目与 LDAP 数据库管理有关;rootdn 和 rootpw 分别指定用户名和密码,远程或本地命令必须提供这些用户名和密码才能对 LDAP 数据库执行管理操作。有趣的是,此条目仅用于此目的。它不会显示在常规 LDAP 数据库查询中。
这解决了如何验证填充身份验证 (LDAP) 数据库所需操作的悖论。稍后,在您使用真实实体记录填充 LDAP 数据库后,使用 slapd.conf 访问控制列表 (acl) 将其中一个记录指定为管理帐户,并删除 rootdn 和 rootpw 条目。我将在以后的专栏中介绍该步骤;目前,rootdn 和 rootpw 就足够了。
以明文形式存储 rootpw 的值是一个非常非常糟糕的主意。相反,您应该使用 slappasswd 命令生成密码哈希,如清单 2 所示。
正如您所见,slappasswd 会提示您输入密码,并使用您使用 -h 选项指定的算法对该密码进行哈希处理。请务必将此值括在花括号中 - 有关有效选择的列表,请参阅 slappasswd(8C) 手册页。您可以将 slappasswd 的输出直接复制并粘贴到 slapd.conf 中,这正是我创建清单 1 中的 rootpw 值所做的事情。
回到清单 1,此目录定义中的下一个参数是 directory。显然,这指定了应在本地文件系统的哪个目录中创建 LDAP 目录。由于 /var 是日志和数据库等增长文件通常存放的位置,因此清单 1 显示的值为 /var/lib/ldap。此目录必须已存在,并确保它归 OpenLDAP 的用户和组所有,通常是 ldap 和 ldap。其权限应设置为 0700 (-rwx------)。
从技术上讲,这足以开始:您可以尝试使用您的 ldap 启动脚本(很可能是 /etc/init.d/ldap,尽管这可能因发行版而异)启动 slapd。我鼓励您开始使用 ldapadd 命令向您的 LDAP 数据库添加练习条目 - 我之前提到的快速入门程序显示了如何操作。
但是,在您开始通过网络管理和查询您的 LDAP 数据库之前,您需要配置并启用 TLS 加密。这很重要,因为 OpenLDAP 使用的简单身份验证方法通过未加密的网络发送身份验证凭据。但我现在没有空间了,所以我们将在下个月介绍这一点。如果您迫不及待想等到那时,Vincent Danen 在他的在线文章“使用 OpenLDAP 进行身份验证”中解释了如何操作,网址为 www.mandrakesecure.net/en/docs/ldap-auth.php,尽管它有点以 Mandrake 为中心。我还将讨论一些确定 LDAP 数据库结构的注意事项,并展示如何构建一个数据库。在那之前,祝你好运!

Mick Bauer,CISSP,是Linux Journal的安全编辑,也是明尼苏达州明尼阿波利斯市 Upstream Solutions LLC 的 IS 安全顾问。Mick 将他大量的空闲时间用于追逐小孩(严格来说是他自己的小孩)和演奏音乐,有时是同时进行。Mick 是使用 Linux 构建安全服务器(O'Reilly & Associates,2002 年)的作者。