跳转到内容

LPI Linux 认证/配置邮件列表

来自 Wikibooks,开放书籍,为开放世界

详细目标

[编辑 | 编辑源代码]

权重:1

描述: 安装和维护邮件列表。通过查看日志监控和解决问题。

  • 关键知识领域
    • 安装、配置和操作邮件列表
    • Mailman 配置文件、术语和工具
    • Majordomo 配置文件、术语和工具
    • Ezmlm 配置文件、术语和工具
  • 以下是使用文件、术语和工具的部分列表
    • 不适用

配置邮件列表

[编辑 | 编辑源代码]

Majordomo 是一个邮件列表管理程序。它的目标是处理发往特定电子邮件地址的所有传入邮件,并将其重新分配到电子邮件地址列表。Majordomo 还负责添加和删除电子邮件地址及其列表。

由于 Majordomo 负责管理电子邮件列表,因此它严重依赖于 MTA,如 Sendmail、Smail、Qmail 或 Postfix。

别名文件(通常为 /etc/aliases)用于创建电子邮件地址的别名。例如,安装 Majordomo 后,别名文件中的条目通常如下所示

majordomo-owner: jarchie

此条目表示所有发往 [email protected] 的邮件实际上将发送给 [email protected]。请注意,没有必要在 jarchie 后面添加 @host.com,因为两个用户都在同一主机上。如果需要将消息重定向到不同主机上的不同用户,则必须添加 @host.com 部分。

别名文件中的另一种条目允许将电子邮件重定向到文件中列出的多个地址

testlist: :include:/usr/local/majordomo-1.94.5/lists/testlist

此条目表示发送到 [email protected] 的任何消息将被重定向到文件 /usr/local/majordomo-1.94.5/lists/testlist 中列出的所有地址。testlist 文件可能如下所示

[email protected]
[email protected]
[email protected]

Majordomo 能够通过利用此功能来添加或删除列表中的地址。处理订阅请求时,用户的电子邮件地址将附加到 testlist 文件;处理退订请求时,用户的电子邮件地址将从 testlist 文件中删除。也可以通过使用文本编辑器(如 vi)手动添加或删除地址,只需编辑文件即可。

由于 Majordomo 需要能够处理通过电子邮件发送给它的命令,因此 Sendmail 必须能够执行 Majordomo 程序并将消息传递给它。这是通过在别名文件中添加另一种类型的条目来实现的

majordomo:  "|/usr/local/majordomo-1.94.5/wrapper majordomo"

程序 /usr/local/majordomo-1.94.5/wrapper 是一个包装器(根据配置,为 SUID 和 SGID majordomo 或守护程序),它运行 Majordomo 程序。别名条目第二部分周围的引号用于告诉 Sendmail 此条目的这部分是一个语句;如果 wrapper 和 majordomo 之间没有空格,则引号将是不必要的。| 被称为“管道”;它用于告诉 Sendmail 通过标准输入将电子邮件发送给包装器。(由于包装器在这里所做的只是调用 majordomo,因此电子邮件实际上被发送给 Majordomo。)包装器接受一个参数 - 它要执行的程序的参数。(第一个参数之后的任何参数都将传递给包装器正在执行的程序。)出于安全原因,包装器仅执行位于 Majordomo 目录 /usr/local/majordomo-1.94.5/ 中的程序。此限制可以防止程序员使用包装器运行不应具有 Majordomo 权限的程序。(例如,wrapper /bin/vi 将允许任何用户编辑任何 Majordomo 配置文件。)当消息发送到 [email protected] 时,Sendmail 启动包装器,包装器反过来启动 majordomo,然后 Sendmail 通过标准输入将消息发送到 majordomo 脚本。Majordomo 然后从消息中提取命令并相应地做出响应。

当然,Majordomo 是本文档围绕的代码,它由一系列 Perl 脚本组成,其唯一目的是管理邮件列表。

Majordomo 必须在特定的 UID 和 GID 下运行,这样当运行任何脚本时,它们将在 Majordomo 的 UID 下运行。因此,有必要确定 Majordomo 应该在哪个 UID 和 GID 下运行。此外,Majordomo 必须是 Sendmail 受信用户

检查 /etc/passwd 和 /etc/group 文件以查找未使用的 UID 和 GID。在本例中,选择了 16 的 UID 和 16 的 GID。您必须决定 Majordomo 脚本将驻留的位置。如果您使用的是阴影密码文件,请添加类似于

majordomo:x:16:16:Majordomo List Manager:/usr/local/majordomo-1.94.5:

的行到您的 /etc/passwd,并在 /etc/shadow 中添加相应的条目。

majordomo:*:10883:0:88888:7:::

使用这些文件中的其他条目作为关于要添加内容的确切信息的指南。这些只是我系统的值。如果您没有使用阴影密码,则只需要在 /etc/passwd 文件中添加一个条目。

要创建 Majordomo 组,请添加类似于

majordomo:x:16:jarchie

的行到您的 /etc/group 文件中。将您的用户名附加到行的末尾将允许您访问组可写的 Majordomo 文件。

Makefile 包含安装 Majordomo 所需的所有信息;通常有必要编辑 Makefile 中引用系统特定设置的行,这样 Majordomo 才能在您的系统上干净地安装。大多数默认设置都是正确的;但是,以下设置几乎总是需要根据系统进行更改。

PERL = /bin/perl
CC = cc
W_HOME = /usr/test/majordomo-$(VERSION)
MAN = $(W_HOME)/man
W_USER = 123
W_GROUP = 45

应更改为更适合您的系统的设置。例如,在我的设置中,这些值被更改为

PERL = /usr/bin/perl
CC = gcc
W_HOME = /usr/local/majordomo-1.94.5
MAN = /usr/man
W_USER = 16
W_GROUP = 16

此外,必须创建 majordomo.cf 文件。创建此文件的一种简单方法是将提供的 sample.cf 文件复制到 majordomo.cf 并对其进行编辑。

同样,大多数设置在默认情况下都是正确的,但以下行可能需要根据您的系统从

$whereami = "example.com";
$whoami = "Majordomo\@$whereami";
$whoami_owner = "Majordomo-Owner\@$whereami";
$homedir = "/usr/test/majordomo";
$digest_work_dir = "/usr/local/mail/digest";
$sendmail_command = "/usr/lib/sendmail";

更改为更合适的设置,例如

$whereami = "kes.emeraldis.com";
$whoami = "majordomo\@$whereami";
$whoami_owner = "majordomo-owner\@$whereami";
$homedir = "/usr/local/majordomo-1.94.5";
$digest_work_dir = "/usr/local/majordomo-1.94.5/digest";
$sendmail_command = "/usr/sbin/sendmail";

$whoami 和 $whoami_owner 不需要更改 Majordomo 才能正常工作;但是,我更改了它们,因为我喜欢避免输入大写字母。$digest_work_dir 是一个临时目录,摘要文件应该放在其中;此目录应分配到您想要存储摘要的位置。如果您不打算使用摘要列表,请不要担心此选项。$whereami、$homedir 和 $sendmail_command 应更改为适合您系统的相应值。与 Makefile 不同,这些选项可以在安装 Majordomo 后始终通过编辑 Majordomo 安装目录中的 majordomo.cf 来更改。(配置文件在安装期间只是被复制。)

下一步是编译 Majordomo 包装器。包装器是唯一需要编译的 Majordomo 组件,因为其他所有内容都是 Perl 脚本的集合,因此不会被编译。

$ make wrapper

要安装 Majordomo 文件,请执行以下命令

# make install
# make install-wrapper

第一个命令可以作为 Majordomo 用户执行(假设 majordomo 可以创建或访问 $home_dir),但第二个命令需要作为 root 执行,这样安装脚本才能将 Majordomo 包装器设置为 SUID root。(由于 majordomo 是没有登录 shell 或密码创建的,如果您想以 majordomo 身份执行第一个命令,则需要以 root 身份 su majordomo 才能成为 majordomo。)

必须为 Majordomo 创建 Sendmail 别名,以便发送给 Majordomo 的命令可以由 majordomo 处理,并且必须为 Majordomo 所有者创建别名,以便人们可以通过标准的 owner-majordomo 地址给您发送电子邮件。将以下条目添加到您的别名文件中

majordomo:       "|/usr/local/majordomo-1.94.5/wrapper majordomo"
owner-majordomo: jarchie
majordomo-owner: jarchie

然后测试您的配置,作为普通用户(而不是 majordomo 或 root),运行

$ /usr/local/majordomo-1.94.5/wrapper config-test

此程序可以检测 Majordomo 安装中的大多数问题。

要创建列表,请在 Majordomo 列表目录中创建一个与列表名称相同的文件。例如,要创建一个名为 test 的列表,请作为 Majordomo 创建一个 test 文件

[root@kes /]# su majordomo
[majordomo@kes /]$ touch /usr/local/majordomo-1.94.5/lists/test

并添加相关的别名

test:        :include:/usr/local/majordomo-1.94.5/lists/test
owner-test:    jarchie
test-request:  "|/usr/local/majordomo-1.94.5/wrapper request-answer test"
test-approval: jarchie

现在通过向 Majordomo 发送 lists 命令来测试列表的操作

[jarchie@kes jarchie]$ echo lists | mail majordomo

Majordomo 只需要一秒钟就可以回复一条包含当前设置的所有列表的消息。接下来,尝试发送 help 命令。

[jarchie@kes jarchie]$ echo help | mail majordomo

Majordomo 应该回复包含 Majordomo 接受的所有命令的列表。保存消息以供将来参考可能是个好主意。

要查看别名是否正常工作,请尝试订阅和退订该列表

[jarchie@kes jarchie]$ echo subscribe test | mail majordomo

您将收到包含如何确认订阅的说明以及确认您的命令已成功执行的信件的电子邮件。在发回确认信息后,Majordomo 应该发送两封信 - 一封信说明您的订阅请求已成功,另一封信欢迎您加入 test 列表。列表所有者也将收到一条消息,说明您已订阅该列表。

要退订列表,请发送 unsubscribe 命令

[jarchie@kes jarchie]$ echo unsubscribe test | mail majordomo

您应该收到一封信,说明您的命令已成功执行。

对于某些列表,可能希望 Majordomo 在消息到达列表之前处理消息。例如,Majordomo 有 resend 脚本可以根据内容(例如禁忌词语)自动过滤消息,以防止人们向列表发送 Majordomo 命令,以及其他功能。要使用这些选项,有必要使用一组更好的别名,例如

test:        "|/usr/local/majordomo-1.94.5/wrapper resend -l test test-list"
test-list:   :include:/usr/local/majordomo-1.94.5/lists/test
owner-test:  jarchie
test-owner:  jarchie
test-request:  "|/usr/local/majordomo-1.94.5/wrapper majordomo -l test"

最后一个条目允许用户简单地向 [email protected] 发送包含 subscribe 的邮件,而不是向 [email protected] 发送包含 subscribe test 的邮件。另外,请注意,如果 sendmail 使用 smrsh,上述别名应该引用安全路径中的包装器副本 - 通常是 /etc/smrsh/wrapper。

Majordomo 权限设置错误导致 Majordomo 工作不正常的情况很常见。幸运的是,Sendmail 和 Majordomo 通常会给出指示问题的合理错误消息。例如,lists 目录必须由 sendmail 设置的 uid 用户(通常是 mail 或 daemon)可执行。如果 sendmail 无法执行 lists,则必须放宽权限。

[root@kes root]# chmod +x /usr/local/majordomo-1.94.5/lists

另一个常见问题是由 lists 目录可由组写入造成的。要解决此问题,可以清除组可写入位,或使用 sendmail 选项 IncludeFileInGroupWritableDirPath。

Majordomo 旨在运行在隔离系统上;脚本中存在几个众所周知的安全漏洞,允许任何能够执行包装器的本地用户以 majordomo 用户身份执行代码。如果 Majordomo 必须运行在为用户提供 shell 访问权限的系统上,那么建议加强对包装器的权限。可以通过清除世界可执行位并将包装器 chgrp 给需要运行 Majordomo 脚本的用户来完成。例如,如果 Sendmail 和 MajorCool 都被用于执行包装器,使用以下命令

[root@kes root]# cp /usr/local/majordomo-1.94.5/wrapper /etc/smrsh/wrapper
[root@kes root]# chmod 4750 /usr/local/majordomo-1.94.5/wrapper
[root@kes root]# chown root:nobody /usr/local/majordomo-1.94.5/wrapper
[root@kes root]# chmod 4750 /etc/smrsh/wrapper
[root@kes root]# chown root:mail /etc/smrsh/wrapper

来保护系统。这将允许 sendmail(在 mail 下运行)执行 /etc/smrsh/wrapper,同时允许 web 服务器的 MajorCool(在 nobody 下运行)执行 /usr/local/majordomo-1.94.5/wrapper。但是,此解决方案将允许任何具有 mail 或 nobody 的 UID 或 GID 的用户也访问 majordomo 帐户。为了保护 nobody 帐户,重要的是不允许普通用户使用服务器端包含或 CGI 脚本,除非这些服务不在 nobody 下运行。

关键术语、文件和实用程序:Majordomo MTA


华夏公益教科书