Postfix-Cyrus-Web-cyradm-HOWTO

Luc de Louw

           
        

修订历史
修订 1.2.62004-03-30修订者: ldl
添加了细微的补充和更正到 amavisd-new,修正了 freshclam 的 cronjob-time
修订 1.2.52004-03-28修订者: ldl
添加了防病毒和垃圾邮件方法(amavisd-new、spamassassin、clamav),更新了 cyrus-imapd 部分的更新说明,添加了限制 imapd 管理员访问的说明。
修订 1.2.42003-11-30修订者: ldl
来自英文校对的输入,用户输入的细微更正和增强,更新了 HOWTO 中提到的软件
修订 1.2.32003-03-24修订者: ldl
来自用户输入的一些细微更正和增强,更新了 HOWTO 中提到的软件
修订 1.2.22003-02-14修订者: ldl
修复了大量的语法和错别字。 对 pam_mysql Makefile 进行了一些更正
修订 1.2.12003-02-12修订者: ldl
非官方测试版本:添加了大量的修复和更新。 添加了 OpenSSL 和更多 pam 相关的内容。
修订 1.2.02002-10-16修订者: ldl
添加了大量用户请求,更新了 HOWTO 中提到的软件
修订 1.1.72002-10-15修订者: ldl
添加了 Michael Muenz 关于 SMTP AUTH 的提示,更正了 ca-cert 相关的错误,改进了 SGML 代码(更多元数据),更新了文档中提到的软件。
修订 1.1.62002-06-14修订者: ldl
将 sasl_mech_list: PLAIN 添加到 imapd.conf,添加了 web-cyradm 邮件列表,为 web-cyradm 添加了更多内容
修订 1.1.52002-06-11修订者: ldl
添加了新的 SQL 查询来初始化 web-cyradm,以在 MySQL 数据库中具有完整的数据完整性,mysql-mydestination.cf 据报告运行正常。
修订 1.1.42002-05-15修订者: ldl
添加了 /etc/services 中需要的内容的描述。 另一个 pam_mysql 编译的修复,更新了软件版本。
修订 1.1.32002-05-08修订者: ldl
为 web-cyradm 添加了更多描述,修复了 saslauthdb-socket 的错误路径,修复了 com_err.h 的错误位置,保护了 TLS/SSL 私钥。
修订 1.1.22002-04-29修订者: ldl
为 Redhat 用户添加了如何安装 init 脚本的描述。
修订 1.1.12002-04-29修订者: ldl
修复了配置 cyrus-IMAP 中的错误(禁用了未使用的 kerberos 身份验证)
修订 1.1.02002-04-28修订者: ldl
初步支持从源代码构建 cyrus,放弃了 Cyrus 的二进制安装,因为配置已随 Release 2.1.x 更改
修订 1.0.22002-04-25修订者: ldl
添加了 sieve 和正确的发件人处理的基本描述,对数据库相关内容进行了细微修复,为“mydestination”添加了 mysql-lookup,修复了构建具有 mysql 支持的 postfix 的错误。
修订 1.0.12002-04-07修订者: ldl
为编译 pam_mysql 添加了一个重要的修复
修订 1.0.02002-04-07修订者: ldl
初始版本

本文档指导您完成 Postfix 邮件传输代理 (MTA) 和 Cyrus IMAP 服务器的安装。 目标是构建一个功能齐全的高性能邮件系统,并使用 Web-cyradm(一个 Web 界面)进行用户管理。 虚拟用户、别名等数据存储在 mysql 数据库中。


目录
1. 简介
1.1. 贡献者和联系方式
1.2. 我为什么写这份文档
1.3. 版权信息
1.4. 免责声明
1.5. 新版本
1.6. 鸣谢
1.7. 反馈
1.8. 翻译
2. 技术
2.1. Postfix MTA
2.2. Cyrus IMAP
2.3. Cyrus SASL
2.4. OpenSSL
2.5. MySQL 数据库
2.6. pam_mysql
2.7. Web-cyradm Web 界面
3. 获取和安装软件
3.1. 获取和安装 MySQL
3.2. 获取和安装 Berkeley DB
3.3. 获取和安装 OpenSSL
3.4. 获取和安装 Cyrus SASL 和 IMAP
3.5. 获取和安装 Postfix
3.6. 获取和安装 PAM
3.7. 获取和安装 pam_mysql
3.8. 获取和安装 Web-cyradm
4. 配置 MySQL
4.1. 保护 MySQL 安全
4.2. 设置 rinetd
5. 配置 PAM
6. 配置 Postfix
6.1. master.cf
6.2. main.cf
6.3. 对抗垃圾邮件
7. 配置 Cyrus IMAP
7.1. 创建配置文件
7.2. 创建目录
7.3. 更改文件系统属性
8. 配置 Web-cyradm
8.1. Cyrus 设置
8.2. 数据库设置
8.3. 默认配额
8.4. 加密密码
8.5. 用户名
9. 测试设置
9.1. (重新)启动守护进程
9.2. 测试 Web-cyradm
9.3. 测试 postfix
9.4. 测试 IMAP 功能
10. 对抗病毒和垃圾邮件
10.1. 病毒简介
10.2. 垃圾邮件简介
10.3. 对抗病毒的策略
10.4. 对抗垃圾邮件的策略
11. 对抗病毒和垃圾邮件所需的软件
11.1. 获取和安装 ClamAV
11.2. Razor
11.3. 获取和安装 spamassassin
11.4. 获取和安装 amavisd-new
11.5. 设置 postfix
12. 更多信息
12.1. 新闻组
12.2. 邮件列表
12.3. HOWTO
12.4. 电子书
12.5. 本地资源
12.6. 网站
13. 问题和答案

1. 简介

cyrus 部分仅对 Cyrus-IMAP 2.1.x 和 Cyrus-SASL 2.1.x 有效。 如果您计划使用 Cyrus-IMAP 2.0.x,请查阅本 HOWTO 的已弃用版本 1.0.x。

我强烈建议您升级到 Cyrus 版本 2.1.x。 如果您这样做,您将能够更好地从用户社区获得有价值的支持


1.1. 贡献者和联系方式

首先,我要感谢所有发送问题和建议的人,这些问题和建议使本文档的进一步开发成为可能。 这向我表明,分享知识是正确的方法。 我鼓励您向我发送更多建议,只需给我写一封电子邮件


1.2. 我为什么写这份文档

关于如何设置不同的邮件系统,有不同的方法。 大多数可用的文档都与 Sendmail、procmail、WU-IMAPd 及其同类相关。 这些软件包非常好,但不幸的是,它们的用户管理非常不灵活。

长期以来,我一直在测试替代的 MTA,如 qmail、postfix 和 exim,以及 IMAP/POP 服务器,如 Cyrus、vpopmail、Courier IMAP 等。

最终,从我的角度来看,Postfix/Cyrus 的组合似乎是最灵活且性能最佳的解决方案。

所有这些软件组合都有一个共同点:几乎没有文档描述这些软件包如何相互协作。 为了安装这些软件,需要花费大量精力来获取使所有软件运行所需的所有信息。


1.3. 版权信息

本文档受 Luc de Louw 于 2002 年、2003 年、2004 年版权所有 (c),并根据下述 Linux 文档项目 (LDP) 许可条款分发。

除非另有说明,Linux HOWTO 文档均由其各自的作者拥有版权。 Linux HOWTO 文档可以完整或部分地以任何物理或电子媒介复制和分发,只要所有副本都保留此版权声明即可。 允许并鼓励商业再分发; 但是,作者希望收到任何此类分发的通知。

所有翻译、衍生作品或包含任何 Linux HOWTO 文档的聚合作品都必须受此版权声明的约束。 也就是说,您不得从 HOWTO 生成衍生作品,并对其分发施加额外限制。 在某些条件下可以授予对这些规则的例外; 请通过以下地址联系 Linux HOWTO 协调员。

简而言之,我们希望通过尽可能多的渠道促进信息的传播。 但是,我们确实希望保留 HOWTO 文档的版权,并希望收到任何重新分发 HOWTO 的计划的通知。

如果您有任何问题,请联系


1.4. 免责声明

对于本文档的内容不承担任何责任。 使用本文档中的概念、示例和其他内容,风险自负。 由于这是本文档的新版本,因此可能存在错误和不准确之处,这些错误和不准确之处当然可能会对您的系统造成损害。 请谨慎操作,尽管这种情况极不可能发生,但作者不对其承担任何责任。

除非另有特别说明,否则所有版权均由其各自的所有者持有。 在本文档中使用某个术语不应被视为影响任何商标或服务标记的有效性。

对特定产品或品牌的命名不应被视为认可。

强烈建议您在进行重大安装之前备份系统,并定期进行备份。


1.5. 新版本

本文档的新版本在 freshmeat 上发布

本文档的最新版本可以从 http://www.delouw.ch/linux 获取


1.6. 鸣谢


1.7. 反馈

非常欢迎对本文档提出反馈。 没有您的投稿和意见,本文档将不复存在。 请将您的补充、评论和批评发送到以下电子邮件地址.

请理解,我不想再在本文档中添加与 Cyrus-IMAP 2.0.x 相关的内容。


1.8. 翻译

目前没有可用的翻译版本。 计划进行德语翻译,我会在有时间后编写。

始终欢迎翻译成其他语言。 如果您翻译本文档,请翻译 SGML 源代码。 如果您开始翻译,请告诉我,以便我可以在此处设置链接。


2. 技术

2.1. Postfix MTA

 

Postfix 致力于实现快速、易于管理和安全,同时又足够与 sendmail 兼容,以免让现有用户感到不安。 因此,外部具有类似 sendmail 的风格,但内部完全不同。

 
--www.postfix.org 

图 1. Postfix - 全貌

看起来是不是很 впечатляюще? - 它看起来比实际情况复杂得多。 Postfix 确实易于配置和处理。

与 sendmail 不同,postfix 不是一个单一的程序,而是由许多小程序组成,每个小程序都有专门的功能。 在这一点上,我不想详细介绍每个程序的作用。 如果您有兴趣了解 Postfix 的工作原理,请参阅 http://www.postfix.org/docs.html 上的文档

在本文档中,您将找到使系统与完整电子邮件设置的其他组件结合运行所需的信息。


2.2. Cyrus IMAP

Cyrus IMAP 由卡内基梅隆大学开发和维护。

与 WU-IMAPd 软件包不同,Cyrus 使用自己的方法来存储用户的邮件。 每条消息都存储在自己的文件中。 使用单独文件的优点是提高了可靠性,因为如果文件系统出现错误,只会丢失一条消息。 元数据(例如消息的状态(已读等))存储在数据库中。 此外,消息还被索引以提高 Cyrus 的性能,尤其是在有大量用户和/或大量大型电子邮件的情况下。 没有其他服务器像 Cyrus IMAP 服务器那样快速。

另一个非常重要的功能是,您不需要为每个帐户设置本地 Un*x 用户。 所有用户都由 IMAP 服务器进行身份验证。 当您有大量用户时,这是一个非常好的解决方案。

用户管理通过特殊的 IMAP 命令完成。 这允许您使用命令行界面或使用可用的 Web 界面之一。 这种方法比 Web 界面更安全,可以访问/etc/passwd.

从 Cyrus 2.1 开始,SASL-lib 版本 2 用于身份验证。 对于本 HOWTO 中描述的设置,实施了三层身份验证。 Cyrus 使用 saslauthdaemon 进行身份验证,saslauthdaemon 将请求转发到 pam_mysql,pam_mysql 最终在 MySQL 表中查找用户信息。

由于 CMU 更改了 Cyrus 的许可策略,因此更多用户将使用此软件。


2.3. Cyrus SASL

SASL 的意思是“简单身份验证和安全层”。 它由 IETF(互联网工程任务组)标准化。 网络服务器(在本例中为 Cyrus-IMAP)使用 SASL 来处理来自客户端的身份验证请求。

Cyrus SASL 是一个广泛的软件,有时不容易理解。 即使我只掌握编写本 HOWTO 所需的最少知识。


2.4. OpenSSL

OpenSSL 是 SASL 加密数据流所需的库。 几乎所有需要加密的开源软件都使用它。 大多数或所有 Un*x 发行版都预装了 OpenSSL。 确保还安装了相应的 devel 软件包。 如果您愿意,可以自行编译 OpenSSL。 如果您需要修复安全漏洞,这将是必需的。


2.5. MySQL 数据库

MySQL 是一个非常快速、强大且非常易于使用的数据库。

由于 Cyrus 可以使用 pam 验证其用户身份,因此您可以使用 pam_mysql 作为 MySQL 中存储的用户数据库的连接器。 这允许您为用户创建一个友好的 Web 界面,用于更改密码、定义和删除别名等。


2.6. pam_mysql

pam 的意思是“可插拔身份验证模块”,最初是由 Sun 的一些人提出的。 与此同时,已经开发了许多模块。 其中之一是 MySQL 的接口

使用 pam_mysql,您可以将用户密码存储在 MySQL 数据库中。 此外,Postfix 能够从 MySQL 表中查找别名。 最终,您将拥有一个供邮局管理员完成所有管理任务的基础。

您将能够将一些任务委派给高级用户。 例如,创建帐户、更改密码和创建新别名等任务可以委派给特定域的管理员。 最终,作为系统管理员,您将有时间做一些更有成效的任务,或者为 Linux 文档项目编写 HOWTO。


2.7. Web-cyradm Web 界面

图 2. Web-cyradm 域管理

Web-cyradm 是一个 Web 界面,允许您执行维护邮件系统所需的管理任务。 此屏幕截图显示了 Web-cyradm 的域管理部分。

Web-cyradm 是用 PHP 编写的,PHP 是最复杂的 html 预处理器语言。 如果您没有安装 php 的 Web 服务器,我想将您推荐到我的 Apache-Compile-HOWTO。 本文档描述了如何设置带有 PHP 和其他模块的 Apache。

Web-cyradm 正在全球各地的人们积极开发中。 功能列表随着每个版本的发布而增长。 如果您想为 web-cyradm 做出贡献,或者您有一个好主意,请随时通过 http://www.web-cyradm.org 上的邮件列表联系。

以下是部分功能列表

  • 管理多个虚拟域

  • 设置配额

  • 自动创建用户名,可以使用定义的前缀或域名

  • 将任务(例如创建新用户)委派给“域管理员”

  • 将用户帐户映射到电子邮件地址

  • 将帐户转发到单个别名

  • 单个别名的休假功能

  • 支持 SMTP 传输表

  • 支持 MySQL 和 PostgreSQL

  • i18n(国际化)支持(包括不同的字符集)

  • 已翻译成 18 种语言并且还在增加

Web-cyradm 支持其用户的不同角色。 如果您计划将其用作高级用户的前端,请注意安全可能是一个问题。 基于角色的内容需要安全审查。


3. 获取和安装软件

大多数软件都包含在您的 Linux 发行版中。 例如,据我所知,SuSE 从 7.1 开始就发布了 Cyrus。 从 SuSE 8.1 开始,cyrus-imap 2.1 和 sasl2 已包含在内,并且可以正常工作。 仍然建议您自行编译 Cyrus。 SuSE 不发布启用 MySQL 的 Postfix。

TipDebian 稳定版和测试版中已弃用的软件包
 

Debian 用户可能想要安装 Debian 提供的软件包。 不幸的是,Debian 稳定版 (Woody) 和测试版 (sarge) 正在使用本 HOWTO 中使用的软件的已弃用版本。 我测试了 Debian 不稳定版 (sid) 中的相应软件包,它们可以正常工作。 请注意,Debian 的维护人员非常保守。 软件包“postfix-mysql”、“libsasl2”和“cyrus21-imapd”是稳定的,即使它们仅在“不稳定”树中可用。


3.1. 获取和安装 MySQL

3.1.1. 下载

原始站点:https://mysqlserver.cn/downloads/


3.1.2. 构建和安装

cd /usr/local
tar -xvzf mysql-4.0.18.tar.gz
cd mysql-4.0.18

./configure \
--prefix=/usr/local/mysql \
--enable-assembler \
--with-innodb \
--without-debug

make
make install

/usr/local/mysql/bin/mysql_install_db
echo /usr/local/mysql/lib/mysql >> /etc/ld.so.conf
ldconfig

ln -s /usr/local/mysql/include/mysql /usr/include/mysql
ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql

为了提高安全性,请在您的系统上添加一个 mysql 用户,例如 “mysql”,然后

chown -R mysql /usr/local/mysql/var

如果您想在启动时自动启动 MySQL,请复制/usr/local/mysql/share/mysql/mysql.server/etc/init.d/对于 SuSE,对于 Redhat 则是/etc/rc.d/init.d而不是/etc/init.d/。 此外,您需要添加符号链接到/etc/init.d/rc3.d对于 SuSE 和/etc/rc.d/rc3.d对于 Redhat。

以下示例适用于 SuSE Linux,应易于为 Redhat 和其他 Linux 发行版以及商业 Unix 系统进行更改。

cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/
ln -s /etc/init.d/mysql.server /etc/init.d/rc3.d/S20mysql
ln -s /etc/init.d/mysql.server /etc/init.d/rc3.d/k08mysql

3.2. 获取和安装 Berkeley DB

Berkeley DB 是构建 Cyrus-SASL 和 Cyrus-IMAP 的必要条件。 某些系统附带了最新版本,但未安装头文件。 请查看您的发行商 CD/DVD,看看是否可以从软件包安装头文件。 通常,此软件包称为 bdb-devel。

GNU/Debian Linux 附带的版本已过时,您需要编译最新的版本。 如果您已经在 Debian Box 上安装了 Berkeley DB,请卸载它以防止冲突。

同样非常重要的是,Cyrus-SASL 和 Cyrus-IMAP 是使用相同版本的 Berkeley DB 编译的,否则您可能会遇到问题。

TipBerkeley DB 版本
 

我只测试了 bdb 的 4.0.x 版本。 如果您成功使用了更新的版本,请告诉我。


3.2.1. 下载 Berkeley DB

原始站点: http://www.sleepycat.com/update/snapshot/db-4.0.14.tar.gz


3.2.2. 构建和安装 Berkeley DB

cd dist

./configure --prefix=/usr/local/bdb

make
make install

echo /usr/local/bdb/lib >> /etc/ld.so.conf
ldconfig


3.3. 获取和安装 OpenSSL

3.3.1. 下载 OpenSSL

原始站点 http://www.openssl.org


3.3.2. 构建和安装

cd /usr/local
tar -xvzf openssl-0.9.7d.tar.gz

cd openssl-0.9.7d

./config shared

make
make test
make install

echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
ldconfig

Tip选择您的 CPU 以提高速度
 

默认情况下,Makefile 为 i486 CPU 生成代码。 您可以通过编辑Makefile在运行 config 后进行更改shared。 搜索-m486并将其替换为,例如-march=athlon


3.4. 获取和安装 Cyrus SASL 和 IMAP

从源代码构建 Cyrus SASL 和 IMAP 并非易事。 有一些先决条件需要满足,并且需要考虑许多困难的身份验证相关内容。


3.4.2. 创建 cyrus 用户

在大多数系统上,默认情况下没有 cyrus 用户和 mailgroup。 检查是否有可用的 UID,通常守护进程使用小于 100 的 UID 运行。例如,我使用的是 UID 96,这是 SuSE 默认值中的值/etc/passwd.

groupadd mail
useradd -u 96 -d /usr/cyrus -g mail cyrus
passwd cyrus

3.4.3. 构建和安装 Cyrus SASL

tar -xvzf cyrus-sasl-2.1.18.tar.gz
cd cyrus-sasl-2.1.18

./configure \
--enable-anon \
--enable-plain \
--enable-login \
--disable-krb4 \
--disable-otp \
--disable-cram \
--disable-digest \
--with-saslauthd=/var/run/saslauthd \
--with-pam=/lib/security \
--with-dblib=berkeley \
--with-bdb-libdir=/usr/local/bdb/lib \
--with-bdb-incdir=/usr/local/bdb/include \
--with-openssl=/usr/local/ssl \
--with-plugindir=/usr/local/lib/sasl2


make
make install

mkdir -p /var/run/saslauthd

cd saslauthd
make testsaslauthd
cp testsaslauthd /usr/local/bin

echo /usr/local/lib/sasl2 >> /etc/ld.so.conf
ldconfig

SASL 库安装在/usr/local/lib/sasl2但有些程序希望 SASL 在/usr/lib/sasl2中。 因此,创建一个符号链接是个好主意:ln -s /usr/local/lib/sasl2 /usr/lib/sasl2


3.4.4. 构建 Cyrus-IMAP

tar -xvzf cyrus-imapd-2.2.3.tar.gz
cd cyrus-imapd-2.2.3

export CPPFLAGS="-I/usr/include/et" 

./configure \
--with-sasl=/usr/local/lib \
--with-perl \
--with-auth=unix \
--with-dbdir=/usr/local/bdb \
--with-bdb-libdir=/usr/local/bdb/lib \
--with-bdb-incdir=/usr/local/bdb/include \
--with-openssl=/usr/local/ssl \
--without-ucdsnmp \

make depend
make
make install

3.4.5. 自动启动脚本

如果您希望在启动后自动启动 Cyrus IMAP 守护进程,则需要启动脚本。 将以下脚本放置在/etc/init.d/中。 对于 Redhat,它是/etc/rc.d/init.d而不是/etc/init.d/.

#!/bin/bash
#
# Cyrus startup script

case "$1" in
    start)
        # Starting SASL saslauthdaemon
        /usr/local/sbin/saslauthd -c -a pam&

        # Starting Cyrus IMAP Server
        /usr/cyrus/bin/master &
        ;;

    stop)

        # Stopping SASL saslauthdaemon
        killall saslauthd

        # Stopping Cyrus IMAP Server
        killall /usr/cyrus/bin/master

        ;;

    *)
        echo "Usage: $0 {start|stop}"
        exit 1
        ;;

esac

如果我有时间,我将提供一个更复杂的脚本,但是这个脚本可以工作。

现在在运行级别目录 (SuSE) 中创建符号链接

ln -s /etc/init.d/cyrus /etc/init.d/rc3.d/S20
ln -s /etc/init.d/cyrus /etc/init.d/rc3.d/K10

对于 Redhat

ln -s /etc/rc.d/init.d/cyrus /etc/rc.d/rc3.d/S20cyrus
ln -s /etc/rc.d/init.d/cyrus /etc/rc.d/rc3.d/K10cyrus

3.4.6. 更新 Cyrus IMAPd

本节介绍如何将 IMAPd 从版本 2.1.x 更新到 2.2.x

Caution更新至关重要,可能意味着完全数据丢失
 

请先在测试/预生产服务器上测试此过程。 还要仔细查看install-upgrade.html该文件随 cyrus-imapd 发行版一起提供。 请注意,您应该为生产服务器计划停机时间,以便有时间解决问题。 另请注意,对于此处提供的更新过程,我无法承担任何责任

Cyrus 更改了用于内部存储邮箱列表标志等的 dbd 数据库的格式。

发行版附带了一个转换脚本。 最重要的数据库是/var/imap/mailboxes.db。 如果没有该数据库,cyrus-imapd 将无法运行。 这需要备份。 让我们对数据库进行转储和备份。

/etc/init.d/cyrus stop # be sure no cyrus process is running

lsof /var/imap/mailboxes.db # be sure NO process is accessing the mailbox file

su - cyrus
/usr/cyrus/bin/ctl_mboxlist -d > /tmp/mailbox.db.dump
cp /var/imap/mailboxes.db /var/imap/mailboxes.db.old

转换/var/imap/mailboxes.db
/usr/cyrus/bin/cvt_cyrusdb /var/imap/mailboxes.db berkeley /var/imap/mailboxes.db.new skiplist
mv /var/imap/mailboxes.db.new /var/imap/mailboxes.db

转换所有“seen”数据库

find /var/imap/user -name \*.seen -exec /usr/cyrus/bin/cvt_cyrusdb \{\} flat \{\}.new skiplist \; -exec mv \{\}.new \{\} \;

转换 sieve 脚本

/usr/local/cyrus-imapd-2.2.3/tools/masssievec /usr/cyrus/bin/sievec

3.5. 获取和安装 Postfix

3.5.1. 下载

原始站点:http://www.postfix.org/ftp-sites.html


3.5.2. 为 postfix 创建用户 ID (UID) 和组 ID (GID)

在构建和安装 postfix 之前,请确保创建“postfix”和“postdrop”用户和组(如果系统上不存在)。 首先检查组。 您可以使用 grep postfix /etc/groupgrep maildrop /etc/group 进行检查

如果不存在此类组和用户,只需创建它们即可。 搜索可用的数字 UID 和 GID。 在以下示例中,我将为 Postfix 使用 UID 和 GID 33333,为 maildrop UID 和 GID 使用 33335。 这些 ID 与其他文档相对应。

groupadd -g 33333 postfix
groupadd -g 33335 postdrop

useradd -u 33333 -g 33333 -d /dev/null -s /bin/false postfix

3.5.3. 构建和安装

以下部分说明了如果您按照上述说明从源代码安装了 MySQL,则必须执行的操作。 如果您从二进制软件包(例如 rpm 或 deb)安装了 MySQL,则必须将 include 和 library 标志更改为 -I/usr/include/mysql 和 -L/usr/lib/mysql。

Caution需要卸载旧的 MTA
 

重要的是,您必须从基于 RPM 的系统中卸载任何 sendmail 版本。 我建议您删除 sendmail,然后安装 Postfix。 至少 SuSE RPM 需要 MTA。 安装 Postfix-RPM 后,只需按照 HOWTO 通过 RPM 安装安装 Postfix 即可。

tar -xvzf postfix-2.0.19.tar.gz

cd postfix-2.0.19

make makefiles 'CCARGS=-DHAS_MYSQL \
-I/usr/local/mysql/include/mysql -DUSE_SASL_AUTH \
-I/usr/local/include/sasl -I/usr/local/bdb/include' \
'AUXLIBS=-L/usr/local/mysql/lib/mysql \
-lmysqlclient -lz -lm -L/usr/local/lib -lsasl2 -L/usr/local/bdb/lib'
make
make install

make install 期间,会询问几个问题。 只需按 Enter 即可满足您的需求。 对于 Redhat 用户,输入以下内容可能很有用/usr/local/share/man

现在您需要创建一些符号链接,以便在系统启动时自动启动 Postfix。 该示例适用于 SuSE Linux,请查阅您的供应商手册以了解其他发行版。

ln -s /usr/sbin/postfix /etc/init.d/rc3.d/S14postfix
ln -s /usr/sbin/postfix /etc/init.d/rc3.d/K07postfix

3.6. 获取和安装 PAM

PAM 默认安装在几乎所有 Linux 发行版上。 我不描述如何自行编译 PAM,因为它可能会破坏您的系统。 相反,我将描述如何安装软件包。

基于 RPM 的发行版的用户可以发出以下命令

rpm -i pam-devel.rpm

Debian 用户可以使用以下命令安装 devel 软件包

apt-get install libpam0g-dev

3.7. 获取和安装 pam_mysql


3.7.2. 安装

tar -xvzf pam_mysql-0.5.tar.gz

cd pam_mysql

如果您自己编译了 mysql,请检查Makefile并输入 mysql 库的正确路径,并添加编译器标志CFLAGS -I/path/to/mysql/include.

ifndef FULL_LINUX_PAM_SOURCE_TREE
export DYNAMIC=-DPAM_DYNAMIC
export CC=gcc
export CFLAGS=-O2 -Dlinux -DLINUX_PAM \
       -ansi -D_POSIX_SOURCE -Wall -Wwrite-strings \
       -Wpointer-arith -Wcast-qual -Wcast-align -Wtraditional \
       -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline \
       -Wshadow -pedantic -fPIC -I/usr/local/mysql/include
export MKDIR=mkdir -p
export LD_D=gcc -shared -Xlinker -x -L/usr/local/mysql/lib/mysql -lz
endif

自定义该文件后,您可以继续进行 pam_mysql 编译。

make

cp pam_mysql.so /lib/security

[[ ! -d /var/lib/mysql ]] && mkdir /var/lib/mysql
ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock

3.8. 获取和安装 Web-cyradm

3.8.1. 下载

原始站点:http://www.web-cyradm.org


3.8.2. 安装

cd /usr/local/apache/htdocs

tar -xvzf web-cyradm-0.5.4.tar.gz

touch /var/log/web-cyradm.log
chown nobody /var/log/web-cyradm.log

解压缩 web-cyradm 后,将其移动到 Web 服务器文档根目录中的某个位置。

就这样。 现在您需要配置所有这些软件。

Web-cyradm 0.5.4 被认为是稳定的,并于 2003-12-05 发布

由于 web-cyradm 使用 PEAR 作为其数据库抽象层,因此您还需要 PEAR 的最新副本。 这包含在最新的 PHP 版本中。 我强烈建议将 PHP 更新到 4.3.4,因为许多重要的错误已得到修复。

一个常见的错误是忘记触摸日志文件并将所有者更改为 Apache UID。 这通常是“nobody”或“wwwrun”。


3.8.3. 创建数据库和表

现在我们需要为 Postfix 和 Web-cyradm 创建数据库和表,并将用户添加到数据库中。

Web-cyradm 附带了几个 MySQL 脚本insertuser_mysql.sqlcreate_mysql.sql。 第一个脚本将数据库用户插入到数据库“mysql”并创建数据库“mail”。 第二个脚本创建所需的表,并使用初始管理员用户和 cyrus 用户填充数据库。

其他脚本用于从旧版本进行增量升级。

本示例中数据库用户“mail”的密码为“secret”。 请插入您喜欢的任何用户和密码。

初始超级用户的用户名为“admin”,密码为“test”。

Caution更改默认密码!
 

如果恶意用户想要获得对系统的未授权访问,他们首先尝试的总是供应商提供的默认用户名和密码。**务必**在应用脚本之前更改它们。

自定义用户名和密码后,应用脚本

/usr/local/mysql/bin/mysql -u root -p < \
/usr/local/apache/htdocs/web-cyradm/scripts/insertuser_mysql.sql

/usr/local/mysql/bin/mysql mail -u mail -p < \
/usr/local/apache/htdocs/web-cyradm/scripts/create_mysql.sql

3.8.4. 从 0.5.3 版本升级到 0.5.4 版本

在 0.5.4 版本中,数据库有少量增强。您可以通过执行发行版附带的 MySQL 脚本来升级数据库。

mysql mail -u mail -p < \ 
scripts/upgrade-0.5.3-to-0.5.4_mysql.sql

自 0.5.3 版本起,web-cyradm 完全支持 DES 加密密码。您可以使用 php 脚本migrate.php将用户密码从纯文本转换为 Unix 兼容的 crypt(DES)格式。

Caution从纯文本到 crypt 的迁移无法撤销
 

在对迁移脚本执行任何操作之前,请务必备份您最近的数据库。


4. 配置 MySQL

4.1. 保护 MySQL 安全

因为您正在使用 MySQL 来验证用户身份,所以您需要限制对 3306 端口的网络访问。

最简单的方法是将 MySQL 仅绑定到环回接口 127.0.0.1。这可以确保没有人可以通过网络连接到您的 MySQL 守护进程。

编辑/etc/init.d/mysql.server并按如下方式更改第 107 行

原始行

$bindir/safe_mysqld --datadir=$datadir --pid-file=$pid_file&

已更改的行

$bindir/safe_mysqld --datadir=$datadir --pid-file=$pid_file \
--bind-address=127.0.0.1&

通过执行命令 /etc/init.d/mysql.server start 重新启动您的 MySQL 守护进程

为了确保配置更改成功,请执行 netstat -an|grep LISTEN。输出应类似于以下内容

bond:~ # netstat -an|grep LISTEN
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN

4.2. 设置 rinetd

仅当您在邮件服务器以外的主机上运行 MySQL 服务器时,此步骤才是必要的。这允许您从另一个主机安全地连接,因为只允许从预定义的 IP 地址进行访问。

该示例来自服务 MySQL 数据库的主机的角度。假设您的邮件服务器的 IP 为 192.168.0.100,而 MySQL 主机的 IP 为 192.168.0.200

编辑/etc/rinetd.conf并添加

192.168.0.200 3306 127.0.0.1 3306
allow 192.168.0.100

这意味着:MySQL 主机正在 192.168.0.200 的 3306 端口上监听。如果 192.168.0.100 尝试连接,它将被转发到 127.0.0.1:3306。所有其他主机都将被拒绝。


5. 配置 PAM

现在我们需要确保 PAM 知道如何验证 Cyrus 用户身份

您必须创建文件/etc/pam.d/imap包含以下条目

auth sufficient pam_mysql.so user=mail passwd=secret host=localhost db=mail table=accountuser usercolumn=username passwdcolumn=password crypt=1 logtable=log logmsgcolumn=msg logusercolumn=user loghostcolumn=host logpidcolumn=pid logtimecolumn=time

auth sufficient pam_unix_auth.so

account required pam_mysql.so user=mail passwd=secret host=localhost db=mail table=accountuser usercolumn=username passwdcolumn=password crypt=1 logtable=log logmsgcolumn=msg logusercolumn=user loghostcolumn=host logpidcolumn=pid logtimecolumn=time

account  sufficient       pam_unix_acct.so

包含以下内容的行pam_unix_auth.sopam_unix_acct.so仅当您从 WU-IMAP 迁移到 Cyrus 时才需要。这允许您使用旧的 unix 密码和新的基于 mysql 的密码进行身份验证。

要使用 cyrus 和 smtp 身份验证提供的其他服务,您需要复制该文件,以便它们与服务 ID 匹配

cp /etc/pam.d/imap /etc/pam.d/pop
cp /etc/pam.d/imap /etc/pam.d/sieve
cp /etc/pam.d/imap /etc/pam.d/smtp

6. 配置 Postfix

Postfix 需要两个主要的配置文件main.cfmaster.cf. 两者都需要您注意。


6.1. master.cf

您只需要更改一行

flags=R user=cyrus argv=/cyrus/bin/deliver -e -m ${extension} ${user}

flags= user=cyrus argv=/usr/cyrus/bin/deliver -r ${sender} -m ${extension} ${user}

此更改会影响什么?

查看 cyrus 手册页 man deliver 可以澄清这个问题

Postfix 默认设置使用了错误的 cyrus deliver 路径,这是第一个更改。参数 “-r” 插入了正确的返回路径。如果没有它,sieve 拒绝/退回的邮件将发送到您域名下的 cyrus 用户。


6.2. main.cf

在这里您需要更改更多内容,例如主机名、中继、别名查找等。

首先更改主机名

myhostname = foo.bar.org

mydestination

您必须在此处放置所有本地域名(对应于 sendmail 的/etc/mail/sendmail.cw). 如果您有多个域名,请用逗号分隔它们。

mydestination = foo.bar.org, example.com, furchbar-grausam.ch, 
 whatever.domain.tld, mysql:/etc/postfix/mysql-mydestination.cf

Relayhost

您可以在此处定义将传出邮件传递到哪里。如果您不提供任何主机,邮件将直接传递到目标 smtp 主机。通常您的中继主机是您的互联网服务提供商的 smtp 服务器。

relayhost = relay01.foobar.net relay02.foobar.net relay03.foobar.net

Mailtransport

您可以在此处定义应如何处理接受本地传递的邮件。在您的情况下,邮件应由 cyrus 传递程序传递。

mailbox_transport = cyrus

在文件末尾,您需要添加

virtual_alias_maps = hash:/etc/postfix/virtual, mysql:/etc/postfix/mysql-virtual.cf

如果您不想覆盖 /etc/postfix/virtual,请跳过哈希条目

传出的地址应该从 test0002 at domain 重写为 user.name at virtualhost.com。如果您想使用 webmail 界面,这一点很重要。

sender_canonical_maps = mysql:/etc/postfix/mysql-canonical.cf 

现在您需要创建文件/etc/postfix/mysql-virtual.cf:

#
# mysql config file for alias lookups on postfix
# comments are ok.
#

# the user name and password to log into the mysql server
hosts = localhost
user = mail
password = secret

# the database name on the servers
dbname = mail

# the table name
table = virtual

#
select_field = dest
where_field = alias
additional_conditions = and status = '1'

文件/etc/postfix/mysql-canonical.cf:

# mysql config file for canonical lookups on postfix
# comments are ok.
#

# the user name and password to log into the mysql server
hosts = localhost
user = mail
password = secret

# the database name on the servers
dbname = mail

# the table name
table = virtual
#
select_field = alias
where_field = username
# Return the first match only
additional_conditions = and status = '1' limit 1

最后是文件/etc/postfix/mysql-mydestination.cf:

# mysql config file for local domain (like sendmail's sendmail.cw) lookups on postfix
# comments are ok.
#

# the user name and password to log into the mysql server
hosts = localhost
user = mail
password = secret

# the database name on the servers
dbname = mail

# the table name
table = domain
#
select_field = domain_name
where_field = domain_name

使用 SASL 和 PAM 进行 SMTP 身份验证

将以下内容放入您的/etc/postfix/main.cf

smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = 
broken_sasl_auth_clients = yes

您还需要创建文件/usr/local/lib/sasl2/smtpd.conf包含以下内容

pwcheck_method: saslauthd

下一步是告诉 postfix 如何找到 saslauthd 套接字

mv /var/run/sasl2 /var/run/sasl2-old
ln -s /var/run/saslauthd /var/run/sasl2


6.3. 对抗垃圾邮件

本节介绍如何使用 postfix 实现基本的垃圾邮件防护设置。它不使用任何外部软件,如 spamassassin 等。

Postfix 具有一些内置过滤器,允许您阻止明显的垃圾邮件尝试。特别是以下这些:

  • smtpd_helo_required = yes

    main.cf中的此开关意味着连接到您的邮件服务器的 SMTP 客户端在连接时必须提供 “helo”。

  • smtpd_recipient_restrictions

    main.cf中的此选项允许您定义处理接受邮件的不同规则。以下示例简单地拒绝所有无效的发件人和收件人数据。此外,它还定义了如何从在线黑名单中查找已知的垃圾邮件发送者。

    smtpd_recipient_restrictions =
                reject_invalid_hostname,
                reject_non_fqdn_hostname,
                reject_non_fqdn_sender,
                reject_non_fqdn_recipient,
                reject_unknown_sender_domain,
                reject_unknown_recipient_domain,
                reject_unauth_pipelining,
                permit_mynetworks,
                reject_unauth_destination,
                reject_rbl_client zombie.dnsbl.sorbs.net,
                reject_rbl_client relays.ordb.org,
                reject_rbl_client opm.blitzed.org,
                reject_rbl_client list.dsbl.org,
                reject_rbl_client sbl.spamhaus.org,
                permit

  • mime_header_checks=pcre:/etc/postfix/body_checks

    MIME 标头检查允许您拒绝包含恶意 MIME 内容的邮件,即危险的附件,例如 Windows 可执行文件。创建文件/etc/postfix/body_checks. 以下示例拒绝所有包含潜在危险附件的邮件。根据我的经验,使用此示例将过滤掉通过电子邮件传递的大部分病毒。无论如何,应始终安装病毒扫描程序。

    	/^((Content-(Disposition: attachment;|Type:).*|\ +)| *)(file)?name\ *=\ *"?.*\.(lnk|asd|hlp|ocx|reg|bat|c[ho]m|cmd|exe|dll|vxd|pif|scr|hta|jse?|sh[mbs]|vb[esx]|ws[fh]|wmf)"?\ *$/      REJECT  attachment type not allowed
    	

7. 配置 Cyrus IMAP

7.1. 创建配置文件

您必须创建/etc/imapd.conf/etc/cyrus.conf


7.1.1. /etc/services

如果您想使用 sieve(一种邮件过滤语言),则必须更改/etc/services中的一个条目。对于 SuSE 8.0,请特别注意 sieve 的端口,他们定义了错误的端口。添加或更改以下行

pop3		110/tcp
imap		143/tcp
imaps           993/tcp
pop3s           995/tcp 
sieve           2000/tcp

7.1.2. /etc/imapd.conf

确保 “servername” 包含您的 FQHN(完全限定主机名)

参数 “unixhierarchysep: yes” 仅当您希望拥有像 “hans.mueller.somedomain.tld” 这样的用户名时才使用,有关更多信息,请参见 第 8 节

postmaster: postmaster
configdirectory: /var/imap
partition-default: /var/spool/imap
# admins: cyrus # no admins!
allowanonymouslogin: no
allowplaintext: yes
sasl_mech_list: PLAIN
servername: servername
autocreatequota: 10000
reject8bit: no
quotawarn: 90
timeout: 30
poptimeout: 10
dracinterval: 0
drachost: localhost
sasl_pwcheck_method: saslauthd
sievedir: /usr/sieve
sendmail: /usr/sbin/sendmail
sieve_maxscriptsize: 32
sieve_maxscripts: 5
#unixhierarchysep: yes

7.1.3. /etc/imapd-local.conf

确保 “servername” 包含您的 FQHN(完全限定主机名)

参数 “unixhierarchysep: yes” 仅当您希望拥有像 “hans.mueller.somedomain.tld” 这样的用户名时才使用,有关更多信息,请参见 第 8 节

第二个文件确保只有管理员用户可以通过 localhost 连接。您自己决定您的站点是否需要此额外的安全功能。

postmaster: postmaster
configdirectory: /var/imap
partition-default: /var/spool/imap
admins: cyrus 
allowanonymouslogin: no
allowplaintext: yes
sasl_mech_list: PLAIN
servername: servername
autocreatequota: 10000
reject8bit: no
quotawarn: 90
timeout: 30
poptimeout: 10
dracinterval: 0
drachost: localhost
sasl_pwcheck_method: saslauthd
sievedir: /usr/sieve
sendmail: /usr/sbin/sendmail
sieve_maxscriptsize: 32
sieve_maxscripts: 5
#unixhierarchysep: yes

7.1.4. 创建 TLS/SSL 证书

如果您想启用 Cyrus 的 TLS/SSL 功能,您必须首先创建证书。这需要安装 OpenSSL

openssl req -new -nodes -out req.pem -keyout key.pem  
openssl rsa -in key.pem -out new.key.pem
openssl x509 -in req.pem -out ca-cert -req \
-signkey new.key.pem -days 999 

mkdir /var/imap

cp new.key.pem /var/imap/server.pem
rm new.key.pem
cat ca-cert >> /var/imap/server.pem

chown cyrus:mail /var/imap/server.pem
chmod 600 /var/imap/server.pem # Your key should be protected

echo tls_ca_file: /var/imap/server.pem >> /etc/imapd.conf
echo tls_cert_file: /var/imap/server.pem >> /etc/imapd.conf
echo tls_key_file: /var/imap/server.pem >> /etc/imapd.conf

7.1.5. /etc/cyrus.conf

您需要创建的另一个文件是/etc/cyrus.conf它是 Cyrus 主进程的配置文件。它定义了进程 “master” 启动的启动过程、服务和事件。

# standard standalone server implementation

START {
  # do not delete this entry!
  recover       cmd="ctl_cyrusdb -r"

  # this is only necessary if using idled for IMAP IDLE
#  idled                cmd="idled"
}

# UNIX sockets start with a slash and are put into /var/imap/socket
SERVICES {
  # add or remove based on preferences
  imap          cmd="imapd" listen="192.168.0.1:imap" prefork=0
  imaplocal     cmd="imapd -C /etc/imapd-local.conf" listen="127.0.0.1:imap" prefork=0
  imaps         cmd="imapd -s" listen="192.168.0.1:imaps" prefork=0
  imapslocal    cmd="imapd -C /etc/imapd-local.conf" listen="127.0.0.1:imaps" prefork=0
  pop3          cmd="pop3d" listen="pop3" prefork=0
  pop3s         cmd="pop3d -s" listen="pop3s" prefork=0
  sieve         cmd="timsieved" listen="192.168.0.1:sieve" prefork=0
  sievelocal    cmd="timsieved -C /etc/imapd-local.conf listen="127.0.0.1:sieve" prefork=0

  # at least one LMTP is required for delivery
#  lmtp         cmd="lmtpd" listen="lmtp" prefork=0
  lmtpunix      cmd="lmtpd" listen="/var/imap/socket/lmtp" prefork=0

  # this is only necessary if using notifications
#  notify       cmd="notifyd" listen="/var/imap/socket/notify" proto="udp" prefork=1
}

EVENTS {
  # this is required
  checkpoint    cmd="ctl_cyrusdb -c" period=30

  # this is only necessary if using duplicate delivery suppression
  delprune      cmd="ctl_deliver -E 3" period=1440

  # this is only necessary if caching TLS sessions
  tlsprune      cmd="tls_prune" period=1440
}

Tip请检查您的系统 IP 地址
 

在上面的示例中,IP 192.168.0.1 将被替换为您的系统外部 IP 地址。


7.2. 创建目录

必须创建不同的目录。此外,您应该更改文件系统的某些属性


7.2.1. /var/imap

cd /var
mkdir imap
chown cyrus:mail imap
chmod 750 imap

7.2.2. /var/spool/imap

cd /var/spool
mkdir imap
chown cyrus:mail imap
chmod 750 imap

7.2.3. /usr/sieve

cd /usr
mkdir sieve
chown cyrus:mail sieve
chmod 750 sieve

7.2.4. 其余目录

其余目录可以使用工具 mkimap 创建

su - cyrus
/usr/local/cyrus-imapd-2.1.12/tools/mkimap

7.3. 更改文件系统属性

当使用 ext2 文件系统时,您必须设置一个属性,该属性定义所有更改都立即提交到磁盘。对于当今的日志文件系统,没有必要这样做。如果您仍然运行 ext2 文件系统,我强烈建议切换到 ext3 文件系统。Ext2 和 ext3 完全彼此兼容。

要检查用于/var的文件系统类型,请执行命令 mount 或查看您的/etc/fstab。请注意,/var也可能是根文件系统或其他文件系统的一部分。

cd /var/imap

chattr +S user quota user/* quota/*
chattr +S /var/spool/imap /var/spool/imap/*

8. 配置 Web-cyradm

首先复制发行版的配置文件,并创建日志文件。日志文件必须由运行 web 服务器的用户拥有。这通常是用户 “nobody” 或 “wwwrun”。

cd /usr/local/apache/htdocs/web-cyradm/config

cp conf.php.dist conf.php

touch /var/log/web-cyradm-login.log
chown nobody /var/log/web-cyradm-login.log

8.1. Cyrus 设置

#The Cyrus login stuff
$CYRUS = array(
        'HOST'  => 'localhost',
        'PORT'  => 143,
        'ADMIN' => 'cyrus',
        'PASS'  => 'secret'
);

这应该是自我解释的。请注意,目前不支持 SSL 连接,这对于希望在与运行 cyrus-imapd 的服务器不同的服务器上使用 web-cyradm 的用户尤其重要。


8.2. 数据库设置

自 0.5.2 版本以来,web-cyradm 使用 PEAR 作为数据库抽象层。这增加了更多的灵活性。目前支持 MySQL 和 PostgreSQL。请注意,PostgreSQL 需要一个补丁,因为 Postfix 本身不支持 PostgreSQL。我强烈建议您使用 MySQL。我知道 MySQL 在事务等方面有一些限制,但在分发的 Postfix 代码中支持它。

这些条目应该是自我解释的

$DB = array(
        'TYPE'  => 'mysql',
        'USER'  => 'mail',
        'PASS'  => 'secret',
        'PROTO' => 'unix',      // set to "tcp" for TCP/IP
        'HOST'  => 'localhost',
        'NAME'  => 'mail'
);

8.3. 默认配额

要使用的默认配额在变量中设置DEFAULT_QUOTA=20000并在创建新域时使用


8.4. 加密密码

Web-cyradm 支持存储加密密码。我强烈建议使用加密。目前支持三种方法:Unix 兼容(crypt)、md5 和 MySQL。Unix 兼容加密允许您从现有的/etc/shadow导入加密密码。这是首选选项。

不幸的是,MySQL 使用专有的加密方法,该方法仅在使用 MySQL 时可用。我目前正在考虑放弃对 MySQL crypt 的支持,因为它仅适用于 MySQL,并且使迁移到另一个数据库成为不可能。一旦有一种方法可以在 PHP 上重新设计 MySQL crypt,就会有一个解决方案(需要编程方面的帮助,法律限制?)

检查变量$CRYPT在文件config.inc.php中。值 “plain” 表示不加密,“crypt” 表示 Shadow 兼容加密,mysql 表示 MySQL 加密。

Caution请仔细选择加密方法
 

由于支持的加密方法都是单向加密,因此**没有办法**从一种方法迁移到另一种方法。另请注意,这是一个全局变量,它用于所有密码,包括管理员用户的密码。我**强烈**建议使用 Unix Shadow 兼容加密,因为它使您独立于任何软件供应商。


8.5. 用户名

变量 “DOMAIN_AS_PREFIX” 中定义了两种支持的用户名方案。默认设置是具有定义的前缀 ($DOMAIN_AS_PREFIX=0),即域名 “expample.com” 的前缀为 “test”。使用此方案,第一个用户获得用户名 test0001,第二个用户获得 test0002,依此类推。

另一种方案是拥有像 “hans.mueller.example.com” 这样的用户名。如果是这种情况,请设置 $DOMAIN_AS_PREFIX=1

目前您不能混合使用这两种方案,请仔细评估哪种方案最适合您的需求

如果您选择 $DOMAIN_AS_PREFIX=1,请确保取消注释选项unixhierarchysep: yes第 7.1.2 节 中所述


9. 测试设置


9.1. (重新)启动守护进程

现在所有软件都已安装和配置。现在让我们进行一些测试。首先,您必须(重新)启动所有受影响的守护进程

  • postfix start

  • /etc/init.d/cyrus start

  • /etc/init.d/mysql.server start

  • /usr/local/apache/bin/apachectl startssl

希望所有守护进程都已启动,没有任何错误提示。请注意,这假设 saslauthd 在 cyrus 启动脚本中启动。

现在您可以通过执行 netstat -an|grep LISTEN 来验证守护进程是否正常运行

输出应类似于以下内容

bond:~ # netstat -an|grep LISTEN
tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:995             0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:2000            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN

端口分配如下

  • 993 imap-ssl

  • 995 pop3-ssl

  • 3306 mysql

  • 110 pop3

  • 143 imap

  • 2000 sieve

  • 80 http

  • 25 smtp

  • 443 https


9.2. 测试 Web-cyradm

现在您应该能够连接到 http://localhost/web-cyradm/。使用之前定义的凭据登录。

定义域名和一些帐户。确保域名属于您的服务器。如果不是,您必须通过在/etc/hosts中输入域名来伪造它。该域名也必须在/etc/postfix/main.cf(mydestination = domain)

中定义为本地域名。请确保在添加新域时提供唯一的域名前缀。例如,域名 test.org 的前缀为 test。如果您不提供这样的前缀,您将收到错误消息。


9.3. 测试 postfix

现在我们将编写一封邮件

telnet localhost 25
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail ESMTP Postfix

helo localhost
250 mail
mail from: testing at example.com
250 Ok
rcpt to: tester at localhost
250 Ok

data
354 End data with <CR><LF>.<CR><LF>
some text
.
250 Ok: queued as B58E141D33

quit

如果您看到这样的消息,那么一切似乎都正常工作。请务必指定您之前在 web-cyradm 数据库中定义的收件人地址

如果您收到如下错误

rcpt to: tester at localhost
451 <tester  at localhost>: Temporary lookup failure

那么可能是 MySQL 没有运行,DB 权限未正确设置,或者您配置错误/etc/postfix/main.cf

如果出现任何错误,我建议检查/var/log/mail。通常您会找到一些关于哪里出错的提示。


9.4. 测试 IMAP 功能

许多用户喜欢使用命令行界面 (CLI) “cyradm” 测试 cyrus-IMAPd,但他们失败了。要成功使用 cyradm,您需要将 cyrus 用户添加到/etc/sasldb2因为 “cyradm” 始终针对 SASL 和 IMAP 进行身份验证。

要将 Cyrus 用户添加到 sasldb,请使用命令

saslpasswd2 -c cyrus
Password: (enter your passwd)
Again (for verification): (enter your password)

要使用 “cyradm” CLI,请注意该工具不识别标准 CLI 选项(如 -u 等)。请遵循手册页 “cyradm 1” 中描述的语法,如以下示例所示

bond:~ # cyradm --user cyrus --server localhost --auth plain
Password: # This is the SASL2 password
IMAP Password: # This is the IMAP password that you need to enter in the mysql-table �accountusers�
localhost>

使用 Cyrus 命令 help,您将看到所有可能的命令及其缩写。

要进行此类测试,您只需要一个邮件客户端,如 kmail 或 netscape(是的,当然,M$ 产品也可以工作),但在本示例中,我使用 kmail。

图 3. 创建新帐户

如果您启用了 TLS/SSL,您可能还希望测试以下内容

图 4. 测试 TLS/SSL 功能

如果登录失败,并且您确定您输入了正确的密码,请注意 MySQL 是否正在运行。


10. 对抗病毒和垃圾邮件

本章是可选的,介绍了如何对抗病毒和垃圾邮件。


10.1. 病毒简介

我认为我不需要解释病毒有多危险。不幸的是,在最近来自 SCO.A(又名 MyDoom)的攻击中,即使是或多或少经验丰富的用户也会被病毒欺骗。当今大多数病毒和蠕虫通过互联网传播,其中大多数是通过电子邮件传播。不用说,如果可能,应该由 SMTP 系统捕获病毒。

Caution不是替代品
 

过滤病毒的邮件系统**绝不是**本地安装的防病毒软件的替代品。电子邮件只是病毒渗透计算机的一种方式。


10.2. 垃圾邮件简介

另一种无害但不受欢迎和令人不安的电子邮件是垃圾邮件。垃圾邮件最初是一种令人厌恶的罐头肉。它是 UCE(未经请求的商业电子邮件)和 UBE(未经请求的批量电子邮件)的同义词。

研究表明,全球高达 60% 的电子邮件流量是垃圾邮件。在我的 SMTP 服务器上安装反垃圾邮件过滤器之前,我每天收到大约 150 封垃圾邮件。原因之一是本文档。在很久以前,我注意到我的真实电子邮件地址没有受到保护。电子邮件收集器正在全球范围内扫描网站以查找地址,并尝试传递其商业广告,通常是非法的。


10.3. 对抗病毒的策略

对抗病毒的策略非常直接:过滤通过电子邮件传递的病毒并安装本地防病毒软件。

几乎所有防病毒软件供应商都为 Linux 和 Unix 系统提供了最新版本,因为大多数 SMTP 服务器都在 Unix 上运行。在本文档中,我将解释如何实现 clamav,这是一个非常活跃的开源防病毒项目。


10.4. 对抗垃圾邮件的策略

对抗垃圾邮件比对抗病毒困难得多。为什么?这是因为每个病毒都有唯一的签名。垃圾邮件可以包含任意内容。一些垃圾邮件是英文的,另一些是韩文的,另一些是 “您想得到的任何语言”。

防止垃圾邮件的最佳方法是将您的电子邮件地址视为您最珍贵的秘密。**永远不要**将您的地址放在 web 表单中或将其放在您的网站上。我知道,这与互联网的理念背道而驰。信息必须是自由的。如果您实施以下配置,您可以继续发布您的电子邮件地址。

在垃圾邮件的早期,过滤 “viagra” 等关键字就足够了。当今的垃圾邮件技术要复杂得多。这是用户和垃圾邮件发送者之间的战争。对抗复杂垃圾邮件的解决方案是更复杂的反垃圾邮件软件。当今的反垃圾邮件软件不仅检查电子邮件的关键字。它们还检查特定的邮件标头数据等。还有一种称为 贝叶斯 过滤器的技术,该过滤器可以从特定输入、分布式校验和网络等中学习。


11. 对抗病毒和垃圾邮件所需的软件

本章介绍如何安装和处理对抗病毒和垃圾邮件的软件


11.1. 获取并安装 ClamAV


11.1.2. 构建和安装

# Adding a group for the clamav user
groupadd clamav

# Adding the clamav user to your system
useradd -g clamav -c "clamav user" clamav

cd /usr/local

tar -xvzf clamav-0.68.tar.gz
cd clamav-0.68

./configure

make && make install

11.1.3. 测试和配置

要测试 clamav 的功能,您可以运行 clamscan 以从 clamav 发行版中包含的测试模式中获取一些结果,运行 clamscan -r -i /usr/local/clamav-0.68

输出应如下所示

/usr/local/clamav-0.68/test/test1: ClamAV-Test-Signature FOUND
/usr/local/clamav-0.68/test/test1.bz2: ClamAV-Test-Signature FOUND
/usr/local/clamav-0.68/test/test2.zip: ClamAV-Test-Signature FOUND
/usr/local/clamav-0.68/test/test2.badext: ClamAV-Test-Signature FOUND
/usr/local/clamav-0.68/contrib/clamdwatch/clamdwatch.tar.gz: Eicar-Test-Signature FOUND

----------- SCAN SUMMARY -----------
Known viruses: 20482
Scanned directories: 47
Scanned files: 406
Infected files: 5
Data scanned: 5.48 MB
I/O buffer size: 131072 bytes
Time: 2.706 sec (0 m 2 s)

下一步是设置病毒数据库的自动更新。这是一个重要的步骤,因为病毒传播的速度很快,并且会进一步加快。

创建所需的日志文件

touch /var/log/clam-update.log
chmod 600 /var/log/clam-update.log
chown clamav /var/log/clam-update.log

我建议使用每小时的 cronjob 更新签名。要编辑 crontab,请执行 crontab -e 并添加以下行,并将 “x” 替换为 1 到 59 之间的随机值。这是一种基于时间的负载均衡,以确保更多人可以获取更新。

#x * * * *       /usr/local/bin/freshclam --quiet -l /var/log/clam-update.log

要测试更新过程是否正常工作,请执行命令 /usr/local/bin/freshclam -l /var/log/clam-update.log 并查看输出。

输出应类似于以下内容

ClamAV update process started at Tue Mar 23 19:58:11 2004
Reading CVD header (main.cvd): OK
Downloading main.cvd [*]
main.cvd updated (version: 21, sigs: 20094, f-level: 1, builder: tkojm)
Reading CVD header (daily.cvd): OK
Downloading daily.cvd [*]
daily.cvd updated (version: 210, sigs: 596, f-level: 1, builder: acab)
Database updated (20690 signatures) from database.clamav.net (64.74.124.90).

11.2. Razor

Razor 是 spamassassin 的先决条件之一。


11.2.1. 下载

原始站点:http://prdownloads.sourceforge.net/razor/razor-agents-sdk-2.03.tar.gz?download

原始站点:http://prdownloads.sourceforge.net/razor/razor-agents-2.40.tar.gz?download
cd /usr/local

tar -xvzf razor-agents-sdk-2.03.tar.gz
cd razor-agents-sdk-2.03

perl Makefile.PL
make && make install

cd /usr/local
tar -xvzf razor-agents-2.40.tar.gz
cd razor-agents-2.40/

perl Makefile.PL
make && make install


11.2.2. 注册和设置

为了使用 razor2,您需要注册自己为用户

选择唯一的用户名和密码并执行 razor-admin -register -user=some_user -pass=somepass


11.3. 获取并安装 spamassassin

Spamassassin 是当今领先的开源项目,用于对抗垃圾邮件。描述 spamassassin 的工作原理对于本文档来说太多了。有关更多信息,请查阅 http://eu.spamassassin.org/doc.html


11.3.2. 先决条件

Spamassassin 依赖于许多先决条件。最简单的方法是使用 CPAN 存储库。执行命令 perl -MCPAN -e shell 并根据需要回答所有问题。


11.3.3. 构建和安装

cd /usr/local

tar -xvzf Mail-SpamAssassin-2.63.tar.gz

cd Mail-SpamAssassin-2.63

perl Makefile.PL

# You get prompted to run Razor tests which you should answer with "y"
Run Razor v2 tests (these may fail due to network problems)? (y/n) [n] y 

make && make install

11.4. 获取并安装 amavisd-new

Amavisd-new 是将上述所有软件粘合在一起以连接到 postfix 的软件


11.4.2. 先决条件

Amavisd-new 需要许多先决条件。

运行 perl -MCPAN -e shell 并执行

install ExtUtils::MakeMaker
install HTML::Parser
install DB_File
install Digest::SHA1
install Archive::Tar
install Archive::Zip
install Compress::Zlib
install Convert::TNEF
install Convert::UUlib
install MIME::Base64
install MIME::Parser
install Mail::Internet
install Mail::SPF::Query
install Net::Server
install Net::SMTP
install Net::DNS
install Digest::MD5
install IO::Stringy
install Time::HiRes
install Unix::Syslog

最后,运行 ./amavisd 并查看忽略的先决条件。

编辑/etc/amavisd.conf并更改变量$daemon_user为 “amavis” 和$daemon_group为 “amavis”。另一个要更改的变量是$mydomain 以匹配您的域名。

另请考虑更改病毒和垃圾邮件的默认设置,以避免收到有关每封拦截邮件的通知

$final_virus_destiny      = D_DISCARD;  # (defaults to D_BOUNCE)
$final_spam_destiny       = D_DISCARD;  # (defaults to D_REJECT)

在垃圾邮件过滤的开始阶段,我建议将 kill 值设置为更高的值,直到您调整过滤器为止。更改变量$sa_kill_level_deflt为 8 甚至更高。


11.4.3. 构建和安装

cd /usr/local

tar -xvzf amavisd-new-20030616-p8.tar.gz

cd amavisd-new-20030616
cp amavisd /usr/local/sbin
cp amavisd.conf /etc
chown root /etc/amavisd.conf
chmod 644  /etc/amavisd.conf

现在是时候为 amavisd-new 定义组和用户了

groupadd amavis
useradd -g amavis -c "Amavisd-new user" amavis

接下来,您必须为隔离邮件定义一个目录

mkdir /var/virusmails
chown amavis:amavis /var/virusmails
chmod 750 /var/virusmails
mkdir /var/amavis
chown amavis:amavis /var/amavis
chmod 750 /var/amavis

amavisd-new 发行版中的原始 init 脚本仅适用于 Redhat。其他发行版需要安装我快速而简陋的 init 脚本

#!/bin/bash
#
# Amavisd-new startup script

case "$1" in
    start)
        # Starting amavisd
        /usr/local/sbin/amavisd
        ;;

    stop)

	# follows later

        ;;

    *)
        echo "Usage: $0 {start|stop}"
        exit 1
        ;;

esac

11.5. 设置 postfix

需要配置 Postfix 以将每封邮件发送到 amavis-new 以进行清理。

您需要将以下行添加到/etc/postfix/main.cf

content_filter = smtp-amavis:127.0.0.1:10024

/etc/postfix/master.cf也需要进行一些调整,以将 amavisd-new 的结果返回到邮件系统。

请将以下行添加到您的配置中

smtp-amavis unix - - y - 2 smtp -o smtp_data_done_timeout=1200

127.0.0.1:10025 inet n  -       n       -       -  smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_client_restrictions=
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o mynetworks=127.0.0.0/8
    -o strict_rfc821_envelopes=yes
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000

12. 更多信息

您可以在这里找到互联网上可用的其他一些资源。


12.1. 新闻组

一些最有趣的新闻组是

您也可以查看您所在国家/地区的新闻组,例如 ch.comp.os.linux

大多数新闻组都有自己的 FAQ,旨在回答您的大部分问题,正如其名称 “常见问题解答” 所表明的那样。最新版本应定期发布到相关新闻组。如果您在新闻组中找不到它,您可以直接访问 FAQ 主存档 FTP 站点。WWW 版本可以在 FAQ 主存档 WWW 站点 上浏览。


12.2. 邮件列表


12.2.1.

发送邮件至内容(非主题)为
subscribe postfix-users

在向列表写入之前,请查看存档: http://www.deja.com/group/mailing.postfix.users


12.2.2.

发送邮件至内容(非主题)为
subscribe info-cyrus

在向列表写入之前,请查看存档: http://asg.web.cmu.edu/archive/index.php?mailbox=archive.info-cyrus


12.2.3.

可以通过 web 界面完成订阅 http://www.web-cyradm.org/mailman/listinfo/web-cyradm

在向列表写入之前,请查看存档中是否有类似的事件:http://www.web-cyradm.org/pipermail/web-cyradm/


12.3. HOWTO

这些旨在作为获取背景信息以及向您展示如何解决特定问题的主要起点。一些相关的 HOWTO 是Cyrus-IMAPApache-Compile-HOWTO. 这些的主要站点是 LDP 存档


12.4. 电子书

在 TLDP.org 之外还有一些其他的 HOWTO 和免费提供的文档

IBM 最近发布了一本新的 RedbookBladeCenter、Linux 和开源:按需电子商务的蓝图.尤其是第 6 章在寻找电子邮件解决方案时很有趣。


12.5. 本地资源

通常,发行版会将一些文档安装到您的系统中。作为标准,它们位于/usr/share/doc/packages

Cyrus 的 SuSE rpm 包含大量此类文档。

Postfix 在源目录中包含一些 html 文件/usr/local/postfix-2.0.16/html

PAM 也附带大量文档,位于/usr/share/doc/packages/pam

pam_mysql 模块有一个 README,大小惊人,为 1670 字节。


12.6. 网站

有大量的 информационные 网站可用。由于它们的性质,它们变化很快,因此如果这些链接很快过时,请不要感到惊讶。

一个好的起点当然是 Linux 文档项目主页,它是文档、项目页面等的中心信息站。

要获得有关 Postfix 的更深入信息,那么 www.postfix.org 将是起点。

如果您有任何其他可能有趣的线索,请告诉我。


13. 问题与解答

在这里我回答了从用户那里收到的问题。如果您找不到答案,请随时与我联系

1. FAQ
13.1.1. web-cyradm 是否仅支持像 “test0001” 这样的用户?我想要一个更具描述性的用户名
13.1.2. 邮件正在退回。Postfix/pipe 抱怨 “Mailbox does not exist”。哪里出错了?
13.1.3. web-cyradm 抱怨 “Fatal error: Call to undefined function: bindtextdomain() in /www/web-cyradm-0.5.3/index.php on line 46”,哪里出错了?
13.1.4. 我从 Web-cyradm 收到如下错误 “Fatal error: Call to undefined function: query() in /usr/local/httpd/htdocs/web-cyradm/auth.inc.php on line 17”
13.1.5. 为什么是 MySQL 而不是 LDAP?
13.1.6. 为什么是 Postfix 而不是 Qmail?
13.1.7. 我收到错误:“Temporary lookup failure”
13.1.8. 此 HOWTO 适用于哪些平台?

1. FAQ

13.1.1. web-cyradm 是否仅支持像 “test0001” 这样的用户?我想要一个更具描述性的用户名

如果您配置了 web-cyradm,它也支持像 “user.name.example.com” 这样的用户名。您需要更改 config.inc.php 并将 DOMAIN_AS_PREFIX 的值更改为 1。然后您需要将 “unixhierarchysep: yes” 添加到您的/etc/imapd.conf

13.1.2. 邮件正在退回。Postfix/pipe 抱怨 “Mailbox does not exist”。哪里出错了?

检查 web-cyradm (config.inc.php) 上的 cyrus 登录名是否正确。用户名和密码必须存在于 MySQL 的 accountuser 表中。如果 cyrus 登录信息不正确,Web-cyradm 不会抱怨。

13.1.3. web-cyradm 抱怨 “Fatal error: Call to undefined function: bindtextdomain() in /www/web-cyradm-0.5.3/index.php on line 46”,哪里出错了?

Web-cyradm 需要启用 gettext 的 PHP。请使用 configure 选项 --with-gettext 编译 PHP。

gettext 是 NLS(本机语言支持)所必需的,这意味着贡献者可以轻松地将 web-cyradm 翻译成他们的语言。在文件/usr/local/apache/htdocs/web-cyradm/locale/templates/web-cyradm.pot中填写您的语言,然后将文件发送给我,您的语言将在下一个 CVS 快照中得到支持

13.1.4. 我从 Web-cyradm 收到一个错误,如下所示:“Fatal error: Call to undefined function: query() in /usr/local/httpd/htdocs/web-cyradm/auth.inc.php on line 17”

Web-cyradm 依赖 PEAR 进行数据库抽象。PEAR 包含在最新的 PHP 版本中。通常 PEAR 是一个单独的软件包,请查看您的发行版的软件包库。我强烈建议更新到最新版本的 PHP,因为很多错误已被修复。

另一个原因可能是 MySQL 的身份验证错误。请确保用户 “mail” 拥有足够的权限来访问数据库和表。

13.1.5. 为什么是 MySQL 而不是 LDAP?

问得好。LDAP 是基于角色的,对于此类应用来说,它确实是一个更好的解决方案。不幸的是,LDAP 非常难以设置。您必须制定合适的模式等等。MySQL 是最直接的方法,它非常易于处理且用途广泛。有一个可用于 LDAP 的 PAM 模块,请随意使用它。

13.1.6. 为什么是 Postfix 而不是 Qmail?

很多人希望看到使用 Qmail 的设置。原因是,Mysql 支持是一个 hack,而不是包含在主源代码树中。这可能会导致糟糕的情况。想想如果在 qmail 中发现一个安全漏洞,而补丁在修正后的版本中不起作用。Postfix 原生支持 MySQL。另一个(个人)原因是,我发现 Postfix 更令人喜欢(我不知道为什么)。

13.1.7. 我收到一个错误:“Temporary lookup failure”

Postfix 无法查找别名表。最常见的故障是 MySQL 没有运行,或者存在身份验证错误。检查/var/log/mail/usr/local/mysql/var/<hostname>.err以跟踪错误。

13.1.8. 本 HOWTO 适用于哪些平台?

它主要用于 Linux。到目前为止,我只在 Linux/IA32 上测试过它。很可能它也适用于其他架构。据报告 FreeBSD 运行良好。AIX 至少在 PHP 上存在问题。如果您在其他平台上成功运行它,请报告,以便我可以更新本节。