多疑的企鹅 - 使用 LDAP 和 IMAP 的安全邮件,第一部分

作者:Mick Bauer

在 2003 年 9 月刊中,我结束了一个关于构建 OpenLDAP 服务器的系列文章。在本专栏和下一专栏中,我将深入讨论 LDAP 最引人注目的应用之一:为 IMAP 用户提供身份验证和地址簿信息。但这并不是更多关于 LDAP 的文章。重点是 IMAP 本身 (Cyrus) 以及它如何利用 LDAP 及其自身的安全功能来提供安全的远程邮件服务。换句话说,假设您已经拥有(或知道如何获得)一个正在运行并填充了用户帐户的 LDAP 服务器。

传递代理与传输代理

首先,简单介绍一下 IMAP 在电子邮件食物链中的作用。IMAP,互联网消息访问协议(在 RFC 3501 中指定),是一种用于邮件传递代理(MDA)的协议。邮件传输代理(MTA),例如 Postfix 和 Sendmail,在网络之间移动邮件,而 MDA 将邮件从 MTA 移动到目标邮箱。用我的书《使用 Linux 构建安全服务器》中的一个比喻来说,如果 MTA 像在邮局之间移动邮件的邮车,那么 MDA 就好比将邮件从当地邮局送到您家的邮递员。

基于 IMAP 的 MDA 系统包含两个部分:一个 IMAP 服务器,它托管用户邮箱并从某个 MTA 接收邮件;以及一组运行 IMAP 客户端软件的用户。三个最流行的开源 IMAP 服务器是华盛顿大学 IMAP (UW IMAP)、卡内基梅隆大学的 Cyrus IMAP 和 Inter7 Internet Technologies 的 Courier IMAP。流行的 IMAP 客户端应用程序包括 Netscape/Mozilla Communicator、Ximian Evolution、Microsoft Outlook Express、KMail、mutt、pine 和 Apple Mac OS X Mail。IMAP 客户端超出了我们这里的讨论范围,但它们相对容易配置和使用。此外,大多数 IMAP 客户端可以与大多数 IMAP 服务器互操作,因此也没有太多需要解释的。

选择哪个 IMAP 服务器?

在构建 IMAP 系统时,电子邮件管理员必须做的首要选择是使用哪个服务器。UW IMAP、Courier IMAP 和 Cyrus IMAP 之间的主要区别是什么?由于后两者经常添加新功能,我将避免详细说明答案。我可以肯定的是:

  1. 在这三者中,UW IMAP 的灵活性最差,因为它仅支持本地用户帐户邮件文件传递;每个本地用户的收件箱都存储为单个平面文件,/var/mail/myusername。这有两个缺点:每个邮件用户还必须是系统用户,并且在任何给定时间只有一个进程可以写入任何给定用户的收件箱,这可能会导致文件锁定问题。

  2. Courier IMAP,实际上是 Courier 邮件服务器的一部分,旨在支持 qmail 的 maildir 系统。在 maildir 系统中,用户拥有自己的邮件目录,这些目录将邮件存储为单独的文件,这从性能角度和避免文件锁定问题的角度来看都更好。Courier 还可以将邮件存储在数据库中(参见第 3 点);最新版本的 Courier IMAP 还支持 LDAP 身份验证。

  3. Cyrus IMAP 的设置可能比 UW IMAP 或 Courier IMAP 更复杂,这主要是由于它所依赖的 Cyrus SASL 身份验证库。但是,Cyrus IMAP 使用自己的用户和邮件数据库,这两个数据库都完全独立于底层操作系统,这允许您在不添加系统用户帐户的情况下添加邮件用户。此外,使用数据库而不是平面文件来存储邮件具有明显的性能优势。

就个人而言,我使用 Cyrus IMAP 最多,因此本文讨论的是 MDA。请参阅 UW IMAP、Courier IMAP 和 Cyrus IMAP 各自主页上的功能列表(请参阅“资源”部分),以确定哪一个最适合您的环境。如果您的选择与我不同,我希望本文其余部分中的某些概念仍然对您有所帮助。

获取和安装 Cyrus IMAP

如您所知,我是二进制软件包的忠实拥护者,因为好的软件包管理器提供了版本控制和补丁管理功能。在我看来,主要发行版的软件包管理器都非常好。因此,我建议您尽可能从发行版的更新服务或安装介质安装 Cyrus IMAP。您还需要 Cyrus SASL,Cyrus IMAP 需要的身份验证后端。SMTP AUTH 也使用它,因此您可能已经安装了它。

因此,在 SuSE 8.2 中,您需要的 RPM 是 cyrus-imapd 和 cyrus-sasl2。在 Debian 3.0 中,您需要 deb 软件包 cyrus-common、cyrus-imapd、libsasl2 和 sasl2-bin。SuSE 和 Debian 用户都应该意识到,您各自发行版的早期版本可能具有基于旧版本(pre-v2.0)Cyrus SASL 的 Cyrus SASL 软件包。但是,我即将描述的针对 LDAP 验证 Cyrus IMAP 的方法依赖于 SASL v2.0 或更高版本。如果您的发行版版本具有 pre-2.0 SASL 软件包,您可能需要获取并编译 Cyrus SASL 源代码(可在 ftp.andrew.cmu.edu/pub/cyrus-mail 获取)。

对于 Red Hat 9.0,您需要比最新版本的 SuSE 或 Debian 做更多的工作,因为自 Red Hat 7.1 以来,Red Hat 没有提供 Cyrus IMAP 软件包。您应该安装 RPM cyrus-sasl、cyrus-sasl-plain 和 cyrus-sasl-md5,它们是标准 Red Hat 9.0 发行版的一部分。但是,您需要从 home.teleport.ch/simix(由瑞士的 Simon Matter 慷慨维护和提供)以 SRPM 的形式获取 Cyrus IMAP 本身。

如果您以前从未处理过源 RPM (SRPM) 文件,请不要担心:从 SRPM 构建二进制 RPM 的命令非常简单:rpm --rebuild [--target 您的架构] srpm.name.src.rpm,其中 srpm.name.src.rpm 是您的 SRPM 文件的名称,您的架构 是您机器的架构(例如 i386、i586、i686)。例如,当我在我的 Pentium III 服务器上运行此命令时,我使用了rpm --rebuild --target i686 cyrus-imapd-2.1.12-7.src.rpm。虽然 --target 设置是可选的,但如果您要拥有大型 IMAP 用户数据库,据报告,针对您的 CPU 类型优化 Cyrus IMAP 会比默认的 i386 构建产生明显的性能提升。

rpm 然后会自动编译几个新的二进制 RPM,这些 RPM 针对您的本地系统架构进行了自定义。这些 RPM 将写入 /usr/src/redhat/RPMS/(精确的子目录是您在--target或默认 i386/ 之后指定的任何内容)。这些 RPM 是 cyrus-imapd、cyrus-imapd-utils、cyrus-imapd-devel 和 perl-Cyrus。使用rpm -Uvh 文件名命令安装它们。

配置 SASL

本文的剩余部分有两个目标:利用我们现有的 LDAP 服务器来验证 IMAP 用户,并将我们的 Cyrus IMAP 服务器配置为仅接受来自最终用户的 SSL 加密连接。在过去的文章中,我赞扬了集中身份验证的优点,因此希望现在使用 LDAP 进行此步骤的价值已成定局。我可能在之前的专栏中解释过明文电子邮件检索有多危险。在正常的 POP3 和 IMAP 事务中,您的用户名、密码和所有后续电子邮件数据都在网络上以未加密的方式传输。因此,它们容易受到窃听攻击,特别是当您通过无线网络或来自最大的不受信任网络——互联网检索电子邮件时。

回到 SASL。由于 Cyrus IMAP 和 Cyrus SASL 都来自卡内基梅隆大学,并且由于 Cyrus 团队可以理解地不愿重新发明轮子,因此 Cyrus IMAP 依赖于 Cyrus SASL 的身份验证功能。这可能看起来令人困惑:这难道不是我们使用 LDAP 的功能吗?是的,SASL 确实是冗余的,因为 SASL 旨在使用自己的用户数据库来验证用户。

除了使用自己的数据库外,SASL 还可以用于与 PAM 或 LDAP 等其他身份验证源进行身份验证事务。最简单的方法是配置 saslauthd,SASL 身份验证守护程序,其行为主要由文件 /etc/saslauthd.conf 控制。列表 1 显示了一个示例 saslauthd.conf 文件。

列表 1. 示例 /etc/saslauthd.conf

ldap_servers: ldap:///
ldap_search_base: dc=wiremonkeys,dc=org
ldap_bind_dn: cn=servers,dc=wiremonkeys,dc=org
ldap_bind_pw: password_goes_here

ldap_servers 指定 LDAP 服务器 URI 的空格分隔列表。在列表 1 中,我指定了与本地 LDAP 进程的明文 LDAP 连接。我可以指定加密的 ldaps 协议而不是 ldap,远程完全限定域名或 IP 地址而不是 localhost,或者两者都指定,例如 ldaps://ldap.wiremonkeys.org。

ldap_search_base 是您的用户专有名称 (DN) 的基本(共享)部分。ldap_bind_dn 和 ldap_bind_pw 是您希望 saslauthd 用于连接到您的 LDAP 服务器的 DN 和密码。我建议为此目的创建一个特殊的 LDAP 记录。在列表 1 中,servers 是一个特殊 LDAP 帐户的名称,该帐户的 objectClass 为 simpleSecurity Object,这意味着除了其 DN 和 objectClass 之外,它只有一个属性 userPassword。

如果没有其他原因,在 LDAP 中拥有专用服务器帐户意味着您可以在 LDAP 日志中区分后端进程和服务器与最终用户发起的查询进行的 LDAP 查找。如果 IMAP 使用您的个人 LDAP 帐户,例如,这将更加困难。为了更精细的审计,您甚至可以为执行 LDAP 查询的每个服务使用不同的 LDAP 帐户,例如 cyrus 和 postfix。

这些是我在自己的 /etc/saslauthd.conf 文件中使用的选项,但它们并不是您可以使用的唯一选项。Cyrus SASL 随附一个文件 LDAP_SASLAUTHD,其中记录了这些和其他 saslauthd.conf 选项。它位于源代码发行版的 saslauthd 目录中,但如果您从二进制软件包安装 SASL,则此文件将放置在您的发行版放置软件包文档的任何位置,可能是 /usr/share/doc 的某个子目录。

除了编辑 /etc/saslauthd.conf 之外,您还需要确保 saslauthd 以 -a ldap 选项启动。在 Red Hat 上,这可以通过编辑文件 /etc/sysconfig/saslauthd 来完成,以便将参数 MECH 设置为 ldap。在 SuSE 上,您编辑相同的文件,但参数名为 SASLAUTHD_AUTHMECH。使用 sysconfig 的其他发行版可能具有不同的参数名称,和/或您可能需要自定义 /etc/saslauthd。同样,所需的最终结果是在启动时将选项 -a ldap 传递给 saslauthd。

配置并重新启动 saslauthd 后,您就可以配置 IMAP 服务了。碰巧的是,这部分很容易。

配置 Cyrus IMAP

Cyrus IMAP 的大多数行为都由一个名为 /etc/imapd.conf 的文件控制,这是可预测的。列表 2 显示了一个示例 imapd.conf 文件。

列表 2. 示例 /etc/imapd.conf 文件

configdirectory: /var/lib/imap
partition-default: /var/spool/imap
admins: cyrus wongfh
sievedir: /var/lib/imap/sieve
sendmail: /usr/sbin/sendmail
hashimapspool: true
sasl_pwcheck_method: saslauthd
sasl_mech_list: PLAIN
tls_cert_file: /var/lib/imap/slapd3.pem
tls_key_file: /var/lib/imap/slapd3key.pem
tls_cipher_list: HIGH:MEDIUM:+SSLv2

如您所见,imapd.conf 中的许多选项只是定义了 Cyrus IMAP 需要的各种事物的路径。我不会详细介绍这些内容(有关完整文档,请参阅 imapd.conf(5) 手册页),但让我们至少讨论一下列表 2 中的非默认设置。

admins: 指定可以使用 cyradm 工具管理 IMAP 系统的 Cyrus IMAP 用户。(我们将在以后的专栏中介绍 cyradm。)通过将 sasl_pwcheck_method: 设置为 saslauthd,并通过已经配置 saslauthd 以使用 LDAP,我们将 Cyrus IMAP 配置为使用 LDAP 进行所有身份验证。因此,即使例如,用户 cyrus 可能存在于本地 Linux 系统上(在 /etc/passwd 中),cyrus 也需要具有 LDAP 条目。当您运行 cyradmin 并提示输入 cyrus 的密码时,请提供在数据库中为 Cyrus 定义的密码,而不是 cyrus 的 Linux 密码(如果 Linux 帐户确实有密码)。换句话说,您在 admins: 之后指定的任何帐户名称都必须存在于 sasl_pwcheck_method 指定的任何用户数据库中。

当您安装 Cyrus IMAP 时,无论是从二进制软件包还是从源代码安装,都应该创建一个新用户 (cyrus) 并赋予其大多数 Cyrus IMAP 文件的所有权。与任何其他优秀的守护进程一样,Cyrus IMAP 大多数时候都以特殊的非特权用户而不是 root 用户身份运行。

我在列表 2 中必须自定义的其他三个设置是 tls_cert_file:、tls_key_file: 和 tls_cipher_list:。这些设置类似于 OpenLDAP 的 slapd.conf 参数 TLSCertificateFile、TLSCertificateKeyFile 和 TLSCipherSuite。我提到这一点是因为此处指定的证书/密钥文件与我在本系统上用于 OpenLDAP 的文件相同。我这样做是因为在我的示例场景中,我在运行 OpenLDAP 的同一服务器上运行 Cyrus IMAP;没有理由为每个服务使用不同的服务器证书和密钥。但是,我确实将这两个文件从 /etc/openldap 复制到 /var/lib/imap 以简化所有权/权限管理。

如果我的 LDAP 服务在单独的主机上运行,我将为我的 LDAP 服务器创建一个新的 TLS 证书/密钥对,使用与我在 2003 年 8 月专栏中描述的完全相同的过程

openssl req -new -x509 -nodes -out slapdcert.pem \
-keyout slapdkey.pem -days 365

无论如何,请记住使您的证书和密钥文件都归 cyrus 所有,并且您的密钥文件只能由其所有者读取。

如果您从源代码安装 Cyrus IMAP,它会使用默认的 SSL 密钥,如果 IMAP 客户端尝试使用 TLS 而不是 SSL 加密连接,则会失败。除了可靠性问题之外,为任何事物使用默认(占位符)证书或密钥绝不是一个好主意。要么利用您已经创建的服务器证书/密钥(如果适用),要么创建一对新的证书/密钥对。您的 IMAP 服务器将更加可靠和安全。

就是这样;现在可以重新启动 Cyrus IMAP (/etc/init.d/cyrus-imapd restart) 并使用 cyradm 添加用户。我们必须将这部分以及让您的本地 MTA 将邮件传递到 IMAP 的内容留到下次讨论。

资源

Courier IMAP 主页:www.inter7.com/courierimap.html

Cyrus IMAP 主页(源代码、文档等):asg.web.cmu.edu/cyrus/imapd

Exchange 替代方案 HOWTO,使用 Cyrus Imap 和 LDAP 的优秀参考资料:www.arrayservices.com/projects/Exchange-HOWTO/html/book1.html

UW IMAP 主页:www.washington.edu/imap

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

加载 Disqus 评论