Majordomo 当然是本文档围绕的代码核心;它由一系列 Perl 脚本组成,唯一目的是管理邮件列表。
从 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 组,请添加类似于以下的行到
到您的
/etc/group文件。在行尾附加您的用户名将使您能够访问组可写的 Majordomo 文件。
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 的安装目录中)来更改。(配置文件只是在设置期间被复制。)
下一步是编译 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.)
必须为 Majordomo 创建 Sendmail 别名,以便发送给 Majordomo 的命令可以由 majordomo 处理,并且必须为 Majordomo 所有者创建一个别名,以便人们可以通过标准的owner-majordomo地址通过电子邮件与您联系。将以下条目添加到您的别名文件(参见 第 2.1 节)。
majordomo: "|/usr/local/majordomo-1.94.5/wrapper majordomo"
owner-majordomo: jarchie
majordomo-owner: jarchie |
以普通用户身份(不是以majordomo 或以root身份),运行
[jarchie@kes jarchie]$ /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" |
最后一个条目允许某人简单地发送消息到
test-request@kes.emeraldis.com文本为
subscribe而不是发送邮件到
majordomo@kes.emeraldis.com文本为
subscribe test。另外,请注意,如果 sendmail 正在使用 smrsh,则上述别名应引用安全路径中包装器的副本——通常是
/etc/smrsh/wrapper.
Majordomo 的权限设置不正确是很常见的,这会导致 Majordomo 无法正常工作。幸运的是,Sendmail 和 Majordomo 通常会给出不错的错误消息,指示问题所在。例如,lists目录必须可由用户 sendmail setuid 执行,通常是mail或daemon。如果 sendmail 无法执行lists,则必须放宽权限。
[root@kes root]# chmod +x /usr/local/majordomo-1.94.5/lists |
另一个常见问题是由
lists目录组可写引起的。要解决此问题,可以清除组可写位,或者使用 sendmail 选项
IncludeFileInGroupWritableDirPath(有关更多详细信息,请参见
第 2.2.5 节 和
第 2.4.1 节)。
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。但是,此解决方案将允许任何具有
mail或
nobody的 UID 或 GID 的人也获得对
majordomo帐户的访问权限。为了保护
nobody帐户,重要的是不要允许普通用户使用服务器端包含或 cgi 脚本,除非这些服务不在
nobody.