The-McGrail-Foundation/MIMEDefang
GitHub: The-McGrail-Foundation/MIMEDefang
MIMEDefang 是一个基于 Perl 的灵活电子邮件过滤程序,通过 Sendmail Milter 或 Postfix 在 SMTP 层拦截、检查和修改邮件内容及附件。
Stars: 31 | Forks: 8
# MIMEDefang
[](https://github.com/The-McGrail-Foundation/MIMEDefang/actions/workflows/main.yml) [](https://github.com/The-McGrail-Foundation/MIMEDefang/blob/master/LICENSE) [](https://GitHub.com/The-McGrail-Foundation/MIMEDefang/releases/)
1. 简介
MIMEDefang 是一个电子邮件过滤程序,可与 Sendmail 8.12
及更高版本或 Postfix 配合使用。MIMEDefang 会过滤所有通过 SMTP 发送的电子邮件。
MIMEDefang 将多部分 MIME 邮件拆分为各个组件,并
可能删除或修改其中的不同部分。然后,它会
将这些部分重新组装成一封电子邮件并发送出去。
MIMEDefang (主要)使用 Perl 编写,过滤操作也是
通过 Perl 表达的。这使得 MIMEDefang 高度灵活且
高度可配置。举个简单的例子,你可以删除所有的 *.exe 和 *.com
文件,将所有 Word 文档转换为 HTML,并允许其他附件
通过。
MIMEDefang 使用 Sendmail 的“milter”功能来“监听”
SMTP 连接。它对每封邮件执行一次扫描,而不是
对每个收件人扫描一次(就像简单的基于 procmail 的系统那样)。因此,它
比基于 procmail 的系统更节省 CPU 资源。此外,
因为 MIMEDefang 可以介入 SMTP 连接,所以你可以
拒收(退回)邮件(这是基于 procmail 的系统
无法做到的。)
2. 警告
在使用 MIMEDefang 之前,你需要注意一些注意事项。
MIMEDefang 可能会修改电子邮件。这打破了邮件传输代理
不修改邮件正文的“君子
协定”。这可能会导致一些问题,例如,对于加密或签名的邮件。
删除附件可能会导致信息丢失。收件人必须
意识到这种可能性,并且必须愿意向发件人解释
为什么他们不能邮寄特定类型的文件。你必须让你的
电子邮件用户愿意致力于安全,否则他们
会对 MIMEDefang 怨声载道。
3. 前置条件
MIMEDefang 有以下软件要求:
1. 类 UNIX 操作系统(MIMEDefang 是在 Linux 上开发和测试的)
2. Perl 5.8.0 或更高版本
3. 必需的 Perl 模块:
Digest::SHA
FindBin
MailTools 1.1401 或更高版本
MIME::tools 5.413 或更高版本
MIME::Base64 3.03 或更高版本
MIME::WordDecoder
这些模块可以从 http://www.cpan.org 获取
4. 可选的 Perl 模块:
Crypt::OpenSSL::Random - 生成真正的随机 ipheader 文件所需
HTML::Parser (CPAN) - append_html_boilerplate 函数所需
IO::Socket::SSL - md_check_against_smtp_server SSL 检查所需
JSON 和 LWP::UserAgent - 支持 rspamd 所需
Mail::SpamAssassin (https://www.spamassassin.org/) - 垃圾邮件检测器
Test::Class、Test::Most 和 tzdata 文件 - 运行回归测试所需
5. Sendmail 8.12.x、8.13.x 或 Postfix。请获取最新版本。
4. 安装
Mickey Hill 提供了一份非常出色的 MIMEDefang-HOWTO,位于
http://www.mickeyhill.com/mimedefang-howto/。它更加详细地
解释了本 README 中的所有内容。无论如何,我们继续:
1. Sendmail
**你必须使用 Sendmail 8.12.x 或更高版本**
从
http://www.sendmail.org 获取最新的 Sendmail 8.12.x 或更高版本的源代码发行版。将其解压。如果你正在构建 8.12.x,
请将以下几行添加到 devtools/Site/site.config.m4 中:
```
dnl Milter
APPENDDEF(`conf_sendmail_ENVDEF', `-DMILTER')
```
这将启用邮件过滤功能。(对于 8.13.x 及更高版本,
Milter 是默认启用的。)
按照 Sendmail 文档中的说明继续构建
Sendmail。安装并配置 Sendmail。
你*必须*运行一个 client-queue runner,因为 MIMEDefang 现在
使用 deferred 模式来传递内部生成的邮件。我们建议
在 Sendmail 启动时运行以下命令:
```
sendmail -Ac -q5m
```
## 编译并安装 Sendmail:
接下来,你需要让 Sendmail 的头文件和库文件在编译和链接
MIMEDefang 时可见。最可靠的方法是
在 Sendmail 的主目录中运行以下命令:
```
mkdir -p /usr/local/include/sendmail
cp -R include/* /usr/local/include/sendmail
cp -R sendmail/*.h /usr/local/include/sendmail
mkdir -p /usr/local/lib
cp obj.Linux.2.2.14-5.0.i686/*/*.a /usr/local/lib
```
注意:在最后一条“cp”命令中,请将“obj.Linux.2.2.14-5.0.i686”替换为
Sendmail 构建脚本创建的相应“obj.*”目录。
2. 获取并安装必要的 Perl 模块。这些通常按以下方式构建和
安装:
perl Makefile.PL
make install
如果你正在使用任何可选的 Perl 模块,请在开始
构建 MIMEDefang 之前安装它们。
3. (可选)获取并安装“wv”库。将 wvHtml
程序安装到你喜欢的 bin 目录(/usr/bin 或 /usr/local/bin)中。
4. 配置、构建并安装 MIMEDefang 软件:
./configure
make
make install
注意:与大多数 autoconf 脚本不同,这个
版本的 ./configure 默认的 --sysconfdir 是“/etc”。你可以按以下方式将其
更改为 /usr/local/etc:
```
./configure --sysconfdir=/usr/local/etc
```
此外,实际的配置文件会放在 --sysconfdir 下的
“mail”子目录中。你可以像这样将它们放在其他位置(例如
/usr/local/etc/mimedefang):
```
./configure --sysconfdir=/usr/local/etc --with-confsubdir=mimedefang
```
如果你希望将它们直接放在 /usr/local/etc 中,你应该输入:
```
./configure --sysconfdir=/usr/local/etc --with-confsubdir=
```
默认情况下,MIMEDefang 会在 /var/spool/MIMEDefang 目录中
处理传入的邮件。你可以通过输入以下命令来更改它:
```
./configure --with-spooldir=DIRNAME
```
默认情况下,MIMEDefang 会将邮件隔离在
/var/spool/MD-Quarantine 目录中。你可以通过输入以下命令来更改它:
```
./configure --with-quarantinedir=DIR2
```
你应该以模式 700 创建 spool 和 quarantine 目录,
并将其所有者设为运行 MIMEDefang 的用户。
有用的 ./configure 选项摘要:
--with-sendmail=PATH 指定 Sendmail 二进制文件的位置
--with-user=LOGIN 使用 LOGIN 作为 MIMEDefang 用户
--with-milterinc=PATH 指定 milter 头文件的备用位置
--with-milterlib=PATH 指定 milter 库文件的备用位置
--with-ipheader 安装 /etc/mail/mimedefang-ip-key
--with-confsubdir=DIR 指定配置子目录
(mail)
--with-spooldir=DIR 指定 spool 目录的位置
(/var/spool/MIMEDefang)
--with-quarantinedir=DIR
指定 quarantine 目录的位置
(/var/spool/MD-Quarantine)
--enable-poll 在 multiplexor 中使用 poll(2) 而不是 select(2)
--disable-check-perl-modules
禁用编译时对 Perl 模块的检查
--disable-embedded-perl 禁用嵌入式 Perl 解释器
--enable-debugging 向 syslog 添加调试消息
--disable-anti-virus 不搜索任何防病毒程序
--disable-antivir 不包含对 H+BEDV antivir 的支持
--disable-vexira 不包含对 Central Command Vexira 的支持
--disable-uvscan 不包含对 NAI uvscan 的支持
--disable-sweep 不包含对 Sophos sweep 的支持
--disable-trend 不包含对 Trend Filescanner/Interscan 的支持
--disable-AvpLinux 不包含对 AVP AvpLinux 的支持
--disable-clamav 不包含对 clamav 的支持
--disable-csav 不包含对 Command Anti-Virus 的支持
--disable-fsav 不包含对 F-Secure Anti-Virus 的支持
--disable-fprot 不包含对 F-prot Anti-Virus 的支持
--disable-fpscan 不包含对 F-prot Anti-Virus v6 的支持
--disable-sophie 不包含对 Sophie 的支持
--disable-nvcc 不包含对 Nvcc 的支持
5. 将以下行添加到你的 Sendmail“m4”配置文件中。(你确实
在使用 m4 配置方法,对吧?)
INPUT_MAIL_FILTER(`mimedefang', `S=unix:/var/spool/MIMEDefang/mimedefang.sock, F=T, T=S:360s;R:360s;E:15m')
(如果你将 spool 目录保留在其他位置,请使用其位置代替
/var/spool/MIMEDefang/mimedefang.sock)
“T=...”等式增加了 milter 的默认超时时间,因为默认值
实在是太小了。
6. 确保 mimedefang 在 Sendmail 启动时也随之启动。在启动时
运行 sendmail 的任何 shell 脚本中,添加以下几行:
rm -f /var/spool/MIMEDefang/mimedefang.sock
/usr/local/bin/mimedefang -p /var/spool/MIMEDefang/mimedefang.sock &
放在实际启动 Sendmail 的那行之前。当你关闭 Sendmail 时,
记得终止 mimedefang 进程。redhat 目录中有一个用于
Red Hat Linux 的 /etc/rc.d/init.d 脚本示例。examples 目录中有一个
通用的 init 脚本示例,它应该能在大多数 UNIX 系统上运行。
## DOCKER
在 Docker Hub 上有可用的 Docker 镜像,地址为 https://hub.docker.com/u/mimedefang
其中的 MIMEDefang 配置了 postfix(8) 或 sendmail(8) MTA。
## 配置
要配置你的过滤器,你需要编辑文件
`/etc/mail/mimedefang-filter`。这是一个 Perl 源文件,因此你必须
了解 Perl。请阅读 man 手册页 mimedefang(8)、
mimedefang.pl(8) 和 mimedefang-filter(5)。examples 目录中有一些示例
过滤器。
## MULTIPLEXOR
在繁忙的邮件服务器上,为每封传入的电子邮件启动一个新的 Perl 进程
代价太高。MIMEDefang 包含一个 multiplexor,它可以
管理一个长期存活的 Perl 进程池,并将它们重复用于
连续的电子邮件。详情请阅读 mimedefang-multiplexor(8) man 手册页。
examples/init-script 中展示了一个示例的启动/停止脚本;
该脚本是通用的,应该能在大多数 UNIX 版本上运行。
标签:MIME处理, Perl, Postfix, Sendmail, 请求拦截, 邮件过滤