多疑的企鹅 - 使用 LDAP 和 IMAP 的安全邮件,第二部分
在本系列关于将 LDAP 与 Cyrus IMAP 邮件传递服务器结合使用的第一部分(LJ,2003 年 11 月)中,我们已经完成了 Cyrus IMAP 和 Cyrus SASL 的安装和设置。在本文中,我们将向 Cyrus IMAP 添加一些用户,并配置 Postfix 以将邮件传递到 Cyrus IMAP 服务器。
在我们重新深入研究 Cyrus IMAP 的配置和管理之前,请注意文档。Cyrus IMAP 附带 HTML 格式的管理员手册。在 SuSE 发行版中,该手册位于 /usr/share/doc/packages/cyrus-imapd/doc 中,而在 Simon Matter 的 Red Hat SRPM 发行版中(请参阅本文的第一部分),它位于 /usr/share/doc/cyrus-imapd-2.1.12 中。被误导性地标记为“安装”的链接实际上不仅指向 Cyrus 安装说明,还指向配置和管理说明。除了此文档之外,Cyrus IMAP 还包含多个手册页,最值得注意的是 imapd.conf(5)、imapd(8) 和 cyradm(1)。
除了 Cyrus IMAP 包含的文档外,我推荐 Dianna 和 Kevin Mullet 撰写的 Managing IMAP 一书(O'Reilly & Associates,2000 年)。据我所知,这是唯一一本专门介绍 IMAP 的书。尽管它对 Cyrus IMAP 的覆盖范围没有扩展到 LDAP,但这是一本写得很好的书,清楚地解释了 IMAP 概念和 Cyrus IMAP 管理;它还详细介绍了 UW-IMAP。
Cyrus IMAP 附带一个 Perl 脚本 cyradmn,它提供了创建和管理用户邮箱的最便捷方式。在使用 cyradm 之前,您应该了解几件事。首先,您应该从您也读取电子邮件的任何帐户运行 cyradm。换句话说,您永远不应将 IMAP 管理帐户用作电子邮件帐户。由于不寻常的写入访问权限,使用此类帐户读取或发送电子邮件可能会对您的服务器产生奇怪的负面影响。正如我们上次了解到的,Cyrus 管理帐户根据 /etc/imapd.conf 中的变量 admins 命名。
其次,cyradm 使用与 Cyrus IMAP 其余部分相同的身份验证方法。在我之前的专栏中,我们通过将 /etc/imapd.conf 的变量 sasl_pwcheck_method 设置为 saslauthd,并通过编辑 /etc/sysconfig/saslauthd 以使用 LDAP 或,在 SuSE 的情况下,使用 PAM 来确定这一点。PAM 本身可以配置为在 /etc/pam.d/imap 和 /etc/openldap/ldap.conf 文件中使用 LDAP 进行 IMAP 事务。简而言之,cyradm 使用 LDAP 识别和验证管理用户,前提是您已在 Cyrus IMAP 中正确配置了 LDAP 支持,如上次所述。
最后,为了进行身份验证,cyradm 会针对您的用户名和密码执行 LDAP 身份验证查找,使用 LDAP 属性 UID 作为搜索条件。因此,对于您要允许运行 cyradm 的每个用户帐户,LDAP 记录都需要包含 UID 和 userPassword 的定义。UID 是必需属性,userPassword 是 posixAccount 对象类中允许的属性,因此所有 IMAP 用户帐户都需要与 posixAccount 关联。
最后一点还有另一个重要的影响:在您的 OpenLDAP 服务器的 /etc/openldap/slapd.conf 文件中,您需要具有访问控制列表 (ACL) 语句,为您的 IMAP 服务器(或其 saslauthd 进程)用于绑定到 LDAP 服务器(即执行身份验证)的任何 LDAP 用户授予对 userPassword 属性的身份验证访问权限。LDAP ACL 语句在 slapd.conf(5) 手册页和我的文章“使用 LDAP 身份验证,第三部分”(LJ,2003 年 9 月)中进行了描述。
cyradm 通常作为管理 shell 而不是命令本身运行。当您调用 cyradm 时,提供您的用户名以及您要管理的 host,它会提示您输入密码。身份验证成功后,它会启动一个交互式会话,其中包含其自己的命令和帮助屏幕。cyradm 也可以以非交互方式运行;有关使用 cyradm 进行脚本编写的信息,请参阅 cyradm(1) 手册页。
cyradm 最简单的调用是
bash-$> cyradm --user username hostname
如果您在运行 Cyrus IMAP 的同一主机上运行 cyradm,则可以使用主机名 localhost。但是,如果您要管理的服务器是远程主机,请指定其主机名或 IP 地址。默认情况下,cyradm 尝试通过 TCP 端口 143 连接到它。由于 Cyrus IMAP 使用此端口进行明文通信,因此请使用 --port 选项指定 TCP 端口 993 以进行 TLS 加密通信,如下所示--port 993。就我个人而言,在这种情况下,我发现最简单的方法是使用 SSH 连接到我的远程 IMAP 服务器,然后使用我的 SSH 会话在远程主机上本地运行 cyradm。
假设我想在我的 IMAP 服务器上本地运行 cyradm,并且我的管理员帐户名为 mick_admin。该命令将如下所示
bash-$ cyradm -u mick_admin localhost IMAP Password: ********** localhost>
请注意成功登录后的 localhost> 提示符:我现在已登录到 cyradm shell 会话。要查看可用命令的完整列表,我所需要做的就是键入?或help。总共有 20 个命令,每个命令都可以缩写,有时可以以两种不同的方式缩写。帮助屏幕列出了每个命令的所有版本。
要创建邮箱,我可以使用命令createmailbox。或者,我可以使用缩写create甚至一个简单的cm,像这样
localhost> cm user.bwooster localhost>
这是命令行效率的典范,但请注意,与我们的新邮箱对应的用户名实际上不是 user.bwooster——它只是 bwooster。user. 前缀必须用于您在 Cyrus IMAP 中创建的所有邮箱。因此,要为用户 bubba 创建邮箱,我将使用命令cm user.bubba。然后,要为该邮箱创建子目录,我将使用cm user.bubba.sent, cm user.bubba.drafts等等。
user. 前缀仅对 Cyrus 及其管理员可见。实际上,当我们的用户 Bubba 使用 Evolution 或其他 IMAP 客户端连接到服务器时,他看到的只是一个名为 Inbox 的文件夹,而不是 user.bubba,即使它的真实名称是 user.bubba。同样,子邮箱显示为 sent、drafts 等,缩进在 Inbox 下。
关于电子邮件帐户创建命令,另一件值得注意的事情是,Cyrus 在成功完成后没有任何反馈。如果您像我一样,您会觉得这令人不安;您会定期想使用listmailbox命令,lm简而言之,看看你有什么
localhost> lm user.bwooster (\HasNoChildren)
信不信由你,这就是我们需要对 Cyrus IMAP 做的一切,以允许用户 bwooster 接收和阅读他的电子邮件,假设有一个 UID 为 bwooster 的 LDAP 记录。在 Cyrus IMAP 中,创建新的用户邮箱具有创建该用户的 IMAP 帐户的效果。但在我继续讨论配置 Postfix MTA 以将电子邮件传递到 Cyrus IMAP 的主题之前,先简要介绍一下 Cyrus IMAP ACL。
Cyrus IMAP 系统中的每个邮箱都可以关联一个或多个 ACL,其中每个 ACL 定义给定用户可以在引用的邮箱或文件夹上执行哪些操作。默认情况下,新邮箱只有一个 ACL,即授予邮箱所有者对邮箱的完全管理权限。
有趣的是,默认情况下,管理员仅对新邮箱具有查找和管理权限。您可以使用listmailbox命令查找邮箱的名称,并且可以在其上设置 ACL。但是,如果您需要删除邮箱,则首先必须为邮箱创建一个 ACL,该 ACL 授予您的管理帐户管理权限。这是一个功能,而不是错误;它有助于防止意外删除内容。
继续我们的示例,以下是使用我们的管理帐户 mick_admin 删除我们刚刚创建的邮箱的命令
$ cyradm -u mick_admin localhost IMAP Password: ***** localhost> setaclmailbox user.bwooster mick_admin all localhost> deletemailbox user.bwooster
此处发出的第二个命令尤其值得注意;它以 cyradm 命令开头setaclmailbox,可以缩写为sam或setacl。接下来是相关的邮箱(user.bwooster),然后是我们希望授予(或拒绝)访问权限的帐户名称,在本例中为 mick_admin。最后,指示权限代码组或特殊字符串。在本例中,我们有特殊字符串all,它是所有权限的缩写。要删除 user.bwooster 邮箱,只需指定 c,用于创建或删除邮箱或子邮箱就足够了。其他可能的 ACL 权限在表 1 中列出。
表 1. cyradm ACL 权限代码(改编自 cyradm(1) 手册页)
权限 | 描述 |
---|---|
l | 查找(对 LIST/LSUB/UNSEEN 可见) |
r | 读取(SELECT、CHECK、FETCH、PARTIAL、SEARCH、COPY 源) |
s | 已读(STORE \SEEN) |
w | 写入除 \SEEN 和 \DELETED 之外的标志 |
i | 插入(APPEND、COPY 目标) |
p | 投递(发送邮件到邮箱) |
c | 创建和删除邮箱(CREATE 新子邮箱、RENAME 或 DELETE 邮箱) |
d | 删除(STORE \DELETED、EXPUNGE) |
a | 管理(SETACL) |
none | 特殊字符串,表示没有权限 |
read | 特殊字符串,表示 lrs |
post | 特殊字符串,表示 lrsp |
append | 特殊字符串,表示 lrsip |
write | 特殊字符串,表示 lrswipcd |
all | 特殊字符串,表示 lrswipcda |
cyradm(1) 手册页详细介绍了 ACL,Cyrus IMAP 的 HTML 文档中也对其进行了说明。我强烈建议您养成至少查看(如果不是始终自定义)您使用 cyradm 创建的每个邮箱的 ACL 的习惯。在某些站点上,用户可能不需要保留默认权限 c。例如,如果所有用户子邮箱(user.whomever.sent、user.whomever.saved 等)都是您为他们创建的,您可能希望他们不具备创建新邮箱或意外删除邮箱的能力。
在第一部分中,我描述了邮件传递代理 (MDA) 的作用是将邮件传递到邮箱。作为 MDA,Cyrus IMAP 可以传递邮件,但它首先必须从消息传输代理 (MTA) 接收该邮件。最流行的 MTA 是 Sendmail,但更简单、更安全的选择是 Wietse Venema 出色的 Postfix (www.postfix.org)。由于 Postfix 是我首选的 MTA,并且因为它现在在大多数主要的 Linux 发行版中都可用作默认 MTA 或选项,因此我在此处详细解释它。
您的 IMAP 服务器是否需要驻留在您组织的 SMTP 中继上?它可以,但不是必须的。从安全性和性能的角度来看,将您的 SMTP 中继专用于该目的可能更有意义。然后,您可以让您的 IMAP 服务器运行自己的 Postfix 实例,该实例从专用 SMTP 中继而不是直接从其他网络的 MTA 接收邮件。在任何一种情况下,我们都假设 IMAP 接收邮件的 MTA 与 Cyrus IMAP 在同一主机上运行。
需要编辑三个文件才能配置 Postfix 以将邮件传输到 Cyrus。第一个文件是 /etc/postfix/main.cf,我们需要在其中添加或取消注释此行
mailbox_transport = cyrus
我们需要编辑的第二个文件是 /etc/postfix/master.cf,我们需要在其中添加或取消注释这两行
cyrus unix - n n - - pipe user=cyrus argv=/usr/libexec/cyrus/deliver -r ${sender} ${user}
实际上,第二行在您的系统上可能有所不同;多年来,Cyrus 的 deliver 程序的语法已更改。如果您从 Linux 发行版的当前 CD 或下载站点安装了 Cyrus IMAP 和 Postfix,则包含的 /etc/postfix/master.cf 文件应该可以正常工作,无需调整。但是,如果您从源代码安装了 Cyrus IMAP 或 Postfix 中的任何一个,您可能需要进行一些调整和 Google 搜索才能使第二行完全正确。第二行的关键部分之一是 argv=/usr/libexec/cyrus/deliver 中的路径,该路径必须指向您本地系统的 Cyrus deliver 命令。
要编辑的第三个也是最后一个 Postfix 文件是 /etc/aliases;您可以将您的文件保存在 /etc/postfix/aliases 中。除非您使用 LDAP 进行别名查找——这是一个对于本文来说过于复杂的过程,但我会在侧边栏中对此进行描述——否则您需要在 aliases 中为每个 Cyrus 邮箱至少有一个条目,以及您需要的任何指向这些邮箱的别名。对于我们的示例用户 Bubba,/etc/aliases 需要以下行
bubba: bubba
很简单,对吧?我们省略了 user. 前缀;Cyrus 邮箱按用户名引用。如果您的 Cyrus (LDAP) 用户名与本地系统用户名相对应,则您不需要这些用户的 aliases 条目。但 Cyrus 的吸引力部分在于它不要求用户拥有 shell 帐户。
如果 Bubba 是我们组织的营销分析师,我们还可以添加以下行
marketing_weasel: bubba
编辑 aliases 文件后,不要忘记使用 postalias 命令生成新的别名数据库
bash-$> postalias hash:/etc/aliases
Postfix 和 LDAP
在本文中,我描述了如何使用 LDAP 来验证 Cyrus IMAP 用户,但我对 Postfix 的介绍仅限于将 Postfix 邮件传递指向 Cyrus。实际上,Postfix 也具有 LDAP 功能:它可以使用 LDAP 将电子邮件别名解析为邮箱名称。
也就是说,您可以将 Postfix 配置为同时检查其本地 /etc/postfix/aliases 数据库以查找电子邮件别名到邮箱名称的映射,以及查询本地 LDAP 服务或远程 LDAP 服务。这可以节省大量的管理时间;您可以全部在 LDAP 中完成,而无需维护单独的别名和用户数据库。
但是,Red Hat 7.3(以及可能更高版本)上的 Postfix 没有编译 LDAP 支持。要确定您选择的发行版版本是否在其 Postfix 包中编译了 LDAP 支持,请使用命令postconf -m。如果 LDAP 未列在受支持的 Postfix 模块中,则需要卸载 Postfix 包并从源代码自行构建。
有关更多信息和 Postfix 源代码,请参阅 www.postfix.org。请务必阅读 Postfix 源代码中 ./READMES/LDAP_README 中的说明,其中解释了如何编译 Postfix 的 LDAP 功能——默认的 Postfix Makefile 不会自动执行此操作。另请务必阅读文件 /etc/postfix/samples/sample-ldap.cf,其中包含您需要在 /etc/postfix/main.cf 中添加和配置以使 LDAP 别名查找正常工作的参数。后一步非常重要,可能需要进行一些调整才能使其正常工作。
如果您放弃所有这些,而是选择单独维护 Postfix 的 aliases 文件(老式方法),那么请不要担心;在 Postfix 中使用或不使用 LDAP 对 Postfix 与您的 LDAP 身份验证的 Cyrus IMAP 软件交互的能力没有任何影响。
要成为 Cyrus IMAP 管理员,这并不是您需要了解的全部内容,但希望它足以让您开始构建支持 LDAP 的 Cyrus IMAP 服务器。通过我们在这两篇文章中涵盖或涉及的主题,您现在可以继续学习高级主题,包括如何让用户更改其 LDAP 密码;如何让用户将 LDAP 服务器用作地址簿;如何安全地设置共享 IMAP 文件夹;以及如何设置安全的 Web 邮件界面,例如用于 Cyrus IMAP 的 SquirrelMail。
资源
Cyrus IMAP 主页(源代码、文档等):asg.web.cmu.edu/cyrus/imapd。
Mullet, Dianna 和 Kevin Mullet。《Managing IMAP》。Sebastopol, California:O'Reilly & Associates,2000 年。
“使用 LDAP 和 IMAP 的安全邮件,第一部分”:/article/6998
Mick Bauer,CISSP,是 Linux Journal 的安全编辑,也是明尼苏达州明尼阿波利斯的 IS 安全顾问。他是《Building Secure Servers With Linux》(O'Reilly & Associates,2002 年)的作者。