3. Majordomo

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

3.1. 安装准备

Great Circle Associates 下载最新版本的 Majordomo 的 gzip 压缩源代码发行包并解压。
[jarchie@kes jarchie]$ tar zxvf majordomo-1.94.5.tar.gz
这将创建一个子目录,其中包含安装 Majordomo 所需的所有文件;这个目录不能与 Majordomo 的安装目录相同。

Majordomo 必须在特定的 UID 和 GID 下运行,这样当任何脚本运行时,它们将以 Majordomo 的 UID 运行。因此,有必要决定 Majordomo 应该在哪个 UID 和 GID 下运行。此外,Majordomo 必须是 Sendmail 的可信用户(参见 第 2.2.3 节)。

检查/etc/passwd/etc/group文件,以查找未被使用的 UID 和 GID。在本例中,选择了 UID 16 和 GID 16。您必须决定 Majordomo 脚本的存放位置;在本 HOWTO 中,目录/usr/local/majordomo-1.94.5/被选中。如果您正在使用 shadow 密码文件,请添加类似以下的条目到
majordomo:x:16:16:Majordomo List Manager:/usr/local/majordomo-1.94.5:
到您的/etc/passwd并添加适当的条目到/etc/shadow.
majordomo:*:10883:0:88888:7:::
文件中,使用这些文件中的其他条目作为指南,了解应该添加什么。这些仅适用于我的系统。如果您不使用 shadow 密码,则只需在/etc/passwd文件中添加条目即可。

要创建 Majordomo 组,请添加类似于以下的行到
majordomo:x:16:jarchie
到您的/etc/group文件。在行尾附加您的用户名将使您能够访问组可写的 Majordomo 文件。

3.2. 编辑安装文件

TheMakefile包含安装 Majordomo 所需的所有信息;通常需要编辑Makefile中引用系统特定设置的行,以便 Majordomo 能够在您的系统上干净地安装。大多数默认设置都是正确的;但是,以下设置几乎总是需要根据每个系统进行更改。
[jarchie@kes majordomo-1.94.5]$ vi Makefile
设置
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并编辑它。
[jarchie@kes majordomo-1.94.5]$ cp sample.cf majordomo.cf
[jarchie@kes majordomo-1.94.5]$ vi 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.cf(位于 Majordomo 的安装目录中)来更改。(配置文件只是在设置期间被复制。)

3.3. 安装 Majordomo

下一步是编译 Majordomo 包装器。包装器是唯一需要编译的 Majordomo 组件,因为其他所有内容都是 Perl 脚本的集合,因此不需要编译。
[jarchie@kes majordomo-1.94.5]$ make wrapper
要安装 Majordomo 文件,请执行以下命令
[root@kes majordomo-1.94.5]# make install
[root@kes majordomo-1.94.5]# make install-wrapper
第一个命令可以以 Majordomo 用户身份完成(假设majordomo可以创建或有权访问$home_dir),但第二个命令需要以root身份完成,以便安装脚本可以 SUID root Majordomo 包装器。(因为,majordomo在创建时没有登录 shell 或密码,如果您想以majordomo身份执行第一个命令,您需要以 root 身份 su majordomo 以成为majordomo.)

3.4. 创建 Majordomo 别名

必须为 Majordomo 创建 Sendmail 别名,以便发送给 Majordomo 的命令可以由 majordomo 处理,并且必须为 Majordomo 所有者创建一个别名,以便人们可以通过标准的owner-majordomo地址通过电子邮件与您联系。将以下条目添加到您的别名文件(参见 第 2.1 节)。
majordomo:       "|/usr/local/majordomo-1.94.5/wrapper majordomo"
owner-majordomo: jarchie
majordomo-owner: jarchie

3.5. 测试配置

以普通用户身份(不是majordomo root身份),运行
[jarchie@kes jarchie]$ /usr/local/majordomo-1.94.5/wrapper config-test
此程序可以检测 Majordomo 安装中的大多数问题。

3.6. 创建列表

要创建列表,请在 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

3.7. 配置的进一步测试

现在通过向 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
您应该收到一封信件,说明您的命令已成功。

3.8. 创建更好的别名

对于某些列表,可能希望在消息到达列表之前让 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"
最后一个条目允许某人简单地发送消息到test-request@kes.emeraldis.com文本为subscribe而不是发送邮件到majordomo@kes.emeraldis.com文本为subscribe test。另外,请注意,如果 sendmail 正在使用 smrsh,则上述别名应引用安全路径中包装器的副本——通常是/etc/smrsh/wrapper.

3.9. 调试

Majordomo 的权限设置不正确是很常见的,这会导致 Majordomo 无法正常工作。幸运的是,Sendmail 和 Majordomo 通常会给出不错的错误消息,指示问题所在。例如,lists目录必须可由用户 sendmail setuid 执行,通常是maildaemon。如果 sendmail 无法执行lists,则必须放宽权限。
[root@kes root]# chmod +x /usr/local/majordomo-1.94.5/lists
另一个常见问题是由lists目录组可写引起的。要解决此问题,可以清除组可写位,或者使用 sendmail 选项IncludeFileInGroupWritableDirPath(有关更多详细信息,请参见 第 2.2.5 节第 2.4.1 节)。

3.10. Majordomo 安全问题

Majordomo 旨在在隔离系统上运行;脚本中有几个众所周知的安全漏洞,允许任何能够执行 wrapper 的本地用户以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。但是,此解决方案将允许任何具有mailnobody的 UID 或 GID 的人也获得对majordomo帐户的访问权限。为了保护nobody帐户,重要的是不要允许普通用户使用服务器端包含或 cgi 脚本,除非这些服务不在nobody.