在Ubuntu Mail Server上设置Amavis和ClamAV
这是Ubuntu邮件服务器从头开始教程系列的第10部分。 在本文中,我将向您展示如何使用 阿马维斯 和 ClamAV 扫描电子邮件中的病毒。
阿马维斯 (邮件病毒扫描程序)是邮件传输代理(MTA)之间的高性能接口,例如 后缀 和内容过滤器。 内容过滤器是一个程序,它扫描电子邮件的标题和正文,通常根据发现的内容采取一些措施。 最常见的例子是 ClamAV病毒扫描程序 和 垃圾邮件刺客。
Amavis使用标准的SMTP协议,也可以使用Sendmail milter界面。 通常用于
- 与ClamAV(Clam AntiVirus)集成进行病毒扫描
- 通过与SpamAssassin集成进行垃圾邮件检查
- DKIM签名和验证。 (实际上,我更喜欢使用OpenDKIM进行DKIM签名和验证。)
先决条件
从头开始教程系列,您应该至少已经完成了Ubuntu邮件服务器的第1部分(Postfix SMTP服务器)和第2部分(Dovecot IMAP服务器)。 请注意,如果您使用iRedMail或Modoboa来设置邮件服务器,则已经安装和配置了Amavis和ClamAV,因此您无需遵循本教程。
警告:Amavis和ClamAV需要大量RAM。 在安装Amavis和ClamAV之前,请确保服务器上至少有1.3 GB的可用RAM。 整个邮件服务器堆栈(Postfix,Dovecot,Amavis,ClamAV,SpamAssassin,OpenDKIM,MySQL / MariaDB,PostfixAdmin和Roundcube Webmail)至少需要 3 GB RAM运行平稳。 如果您的RAM用完了,您将遇到麻烦,例如邮件服务器脱机或无响应。
步骤1:在Ubuntu上安装Amavis
Amvis可从默认的Ubuntu存储库中获得,因此请运行以下命令进行安装。
sudo apt install amavisd-new -y
安装后,它将自动启动。 您可以通过以下方式查看其状态:
systemctl status amavis
输出:
● amavis.service - LSB: Starts amavisd-new mailfilter Loaded: loaded (/etc/init.d/amavis; generated) Active: active (running) since Fri 2020-08-07 15:43:40 HKT; 1min 1s ago Docs: man:systemd-sysv-generator(8) Tasks: 3 (limit: 9451) Memory: 75.4M CGroup: /system.slice/amavis.service ├─1794260 /usr/sbin/amavisd-new (master) ├─1794263 /usr/sbin/amavisd-new (virgin child) └─1794264 /usr/sbin/amavisd-new (virgin child)
如果它没有运行,则可以使用以下命令启动它:
sudo systemctl start amavis
在启动时启用自动启动。
sudo systemctl enable amavis
默认情况下,它在127.0.0.1:10024上侦听,可以看到:
sudo netstat -lnpt | grep amavis
它作为 amavis
用户。 要检查版本号,请运行
amavisd-new -V
样本输出:
amavisd-new-2.11.0 (20160426)
要查看Amavis的日志,可以运行
sudo journalctl -eu amavis
病毒通常作为电子邮件的附件传播。 为Amavis安装以下软件包,以提取和扫描电子邮件中的存档文件,例如 .7z
, .cab
, .doc
, .exe
, .iso
, .jar
和 .rar
文件。
sudo apt install arj bzip2 cabextract cpio rpm2cpio file gzip lhasa nomarch pax rar unrar p7zip-full unzip zip lrzip lzip liblz4-tool lzop unrar-free
如果您使用Ubuntu 18.04,请同时安装 ripole
包。
sudo apt install ripole
请注意,如果您的服务器没有使用完全限定的域名(FQDN)作为主机名,则Amavis可能无法启动。 而且操作系统主机名可能会更改,因此建议直接在Amavis配置文件中设置一个有效的主机名。
sudo nano /etc/amavis/conf.d/05-node_id
找到以下行。
#$myhostname = "mail.example.com";
删除注释字符(#)并进行更改 mail.example.com
到您的真实主机名。
$myhostname = "mail.linuxbabe.com";
保存并关闭文件。 重新启动Amavis,以使更改生效。
sudo systemctl restart amavis
步骤2:将Postfix SMTP服务器与Amavis集成
Amavisd-new用作SMTP代理。 电子邮件通过SMTP反馈给它,经过处理,然后通过新的SMTP连接反馈给MTA。
编辑Postfix主配置文件。
sudo nano /etc/postfix/main.cf
在文件末尾添加以下行。 这告诉Postfix通过将所有传入的电子邮件发送给Amavis来打开内容筛选,Amavis侦听127.0.0.1:10024。
content_filter = smtp-amavis:[127.0.0.1]:10024
另外,添加以下行。
smtpd_proxy_options = speed_adjust
这将延迟Postfix与内容过滤器的连接,直到接收到整个电子邮件为止,这可以防止内容过滤器浪费时间和资源用于速度较慢的SMTP客户端。
保存并关闭文件。 然后编辑 master.cf
文件。
sudo nano /etc/postfix/master.cf
在文件末尾添加以下行。 这指示Postfix使用称为的特殊SMTP客户端组件。 smtp-amavis
将电子邮件传递给Amavis。 请在每个字符前至少留一个空格字符(制表符或空格键) -o
。 在后缀配置中,前一个空格字符表示该行是前一行的延续。
smtp-amavis unix - - n - 2 smtp -o syslog_name=postfix/amavis -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes -o disable_dns_lookups=yes -o max_use=20 -o smtp_tls_security_level=none
然后在文件末尾添加以下行。 这告诉Postfix运行一个额外的smtpd守护程序,该守护程序在127.0.0.1:10025上侦听以接收来自Amavis的电子邮件。
127.0.0.1:10025 inet n - n - - smtpd -o syslog_name=postfix/10025 -o content_filter= -o mynetworks_style=host -o mynetworks=127.0.0.0/8 -o local_recipient_maps= -o relay_recipient_maps= -o strict_rfc821_envelopes=yes -o smtp_tls_security_level=none -o smtpd_tls_security_level=none -o smtpd_restriction_classes= -o smtpd_delay_reject=no -o smtpd_client_restrictions=permit_mynetworks,reject -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o smtpd_end_of_data_restrictions= -o smtpd_error_sleep_time=0 -o smtpd_soft_error_limit=1001 -o smtpd_hard_error_limit=1000 -o smtpd_client_connection_count_limit=0 -o smtpd_client_connection_rate_limit=0 -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_address_mappings
保存并关闭文件。 重新启动Postfix,以使更改生效。
sudo systemctl restart postfix
步骤3:将Amavis与ClamAV集成
现在Postfix可以将传入的电子邮件传递给Amavis,我们需要安装ClamAV病毒扫描程序并将其与Amavis集成,以便ClamAV可以扫描传入的电子邮件。
在Ubuntu上安装ClamAV。
sudo apt install clamav clamav-daemon
ClamAV将安装两个系统服务:
clamav-daemon.service
:Clam AntiVirus用户空间守护程序clamav-freshclam.service
:ClamAV病毒数据库更新程序
首先,检查状态 clamav-freshclam.service
。
systemctl status clamav-freshclam
如您所见,它处于活动状态(正在运行),并在我的邮件服务器上使用了217.6M RAM。 然后检查日志/日志。
sudo journalctl -eu clamav-freshclam
输出:
提示:如果上述命令没有立即退出,请按Q键使其退出。
我们可以看到 freshclam
下载了3个病毒数据库。 CVD代表ClamAV病毒数据库。
- 日报
- main.cvd
- 字节码
然而, clamd
未收到通知,因为freshclam无法通过连接到clamd /var/run/clamav/clamd.ctl
。 检查状态 clamav-daemon.service
。
systemctl status clamav-daemon
输出:
如您所见,由于未满足条件,它无法启动。 在里面 /lib/systemd/system/clamav-daemon.service
文件,有两个条件:
ConditionPathExistsGlob=/var/lib/clamav/main.{c[vl]d,inc} ConditionPathExistsGlob=/var/lib/clamav/daily.{c[vl]d,inc}
的 clamav-daemon.service
无法启动,因为main.cvd和daily.cvd在启动时尚未下载。 因此,我们只需要重新启动该服务即可。
sudo systemctl restart clamav-daemon
现在它应该正在运行。 顺便说一句,它在我的邮件服务器上使用了731.4M RAM。 如果您的邮件服务器没有足够的RAM,则该服务将失败。
systemctl status clamav-daemon.service
的 clamav-freshclam.service
将每小时检查一次ClamAV病毒数据库更新。
现在,我们需要在Amavis中打开病毒检查功能。
sudo nano /etc/amavis/conf.d/15-content_filter_mode
取消注释以下行以启用病毒检查。
#@bypass_virus_checks_maps = ( # %bypass_virus_checks, @bypass_virus_checks_acl, $bypass_virus_checks_re);
保存并关闭文件。 在其中有很多防病毒扫描程序 /etc/amavis/conf.d/15-av_scanners
文件。 ClamAV是默认设置。 Amavis将通过以下方式致电ClamAV /var/run/clamav/clamd.ctl
Unix套接字。 我们需要添加用户 clamav
到 amavis
组。
sudo adduser clamav amavis
然后重新启动Amavis和ClamAV守护程序,以使更改生效。
sudo systemctl restart amavis clamav-daemon
检查日志。
sudo journalctl -eu amavis
您可以看到Amavis现在正在使用ClamAV扫描病毒。
Aug 08 17:26:19 mail.linuxbabe.com amavis[1233432]: Using primary internal av scanner code for ClamAV-clamd Aug 08 17:26:19 mail.linuxbabe.com amavis[1233432]: Found secondary av scanner ClamAV-clamscan at /usr/bin/clamscan
现在,如果您将电子邮件从其他邮件服务器(例如Gmail)发送到您自己的邮件服务器并检查电子邮件标题,则可以在下面找到一行,表明该电子邮件已被Amavis扫描。
X-Virus-Scanned: Debian amavisd-new at linuxbabe.com
您还应该检查邮件日志(/var/log/mail.log
)以查找是否有任何错误。
步骤4:使用专用端口进行电子邮件提交
ClamAV现在可以同时扫描传入和传出的电子邮件。 Amavis在端口10024上侦听传入和传出的电子邮件消息。 但是,最好使用其他端口(例如10026)从经过身份验证的用户提交电子邮件。 编辑Amavis配置文件。
sudo nano /etc/amavis/conf.d/50-user
自定义设置应在 use strict;
和 1;
线。 默认情况下,Amavis仅侦听端口10024。添加以下行以使其也侦听端口10026。
$inet_socket_port = [10024,10026];
然后添加以下行,为端口10026设置“ ORIGINATING”策略。
$interface_policy{'10026'} = 'ORIGINATING';
接下来,添加以下几行,这些行定义了“ ORIGINATING”策略。
$policy_bank{'ORIGINATING'} = { # mail supposedly originating from our users originating => 1, # declare that mail was submitted by our smtp client allow_disclaimers => 1, # enables disclaimer insertion if available # notify administrator of locally originating malware virus_admin_maps => ["[email protected]$mydomain"], spam_admin_maps => ["[email protected]$mydomain"], warnbadhsender => 1, # force MTA conversion to 7-bit (e.g. before DKIM signing) smtpd_discard_ehlo_keywords => ['8BITMIME'], bypass_banned_checks_maps => [1], # allow sending any file names and types terminate_dsn_on_notify_success => 0, # don't remove NOTIFY=SUCCESS option };
保存并关闭文件。 重新启动Amavis。
sudo systemctl restart amavis
检查其状态以查看重新启动是否成功。
systemctl status amavis
接下来,编辑Postfix主配置文件。
sudo nano /etc/postfix/master.cf
将以下行添加到 submission
服务,因此来自经过身份验证的SMTP客户端的电子邮件将被传递到侦听端口10026的Amavis。此行将覆盖(-o) content_filter
在参数 /etc/postfix/main.cf
文件。
-o content_filter=smtp-amavis:[127.0.0.1]:10026
像这样:
如果启用了 smtps
Microsoft Outlook用户的服务,那么您还需要将此行添加到 smtps
服务。
保存并关闭文件。 重新启动Postfix,以使更改生效。
sudo systemctl restart postfix
检查其状态以查看重新启动是否成功。
systemctl status postfix
Amavis中的垃圾邮件过滤
注意:如果您已遵循SpamAssassin教程,则无需在Amavis中启用垃圾邮件检查功能。 如果启用它,SpamAssassin将对每封电子邮件进行两次检查。
要在Amavis中启用垃圾邮件检查,请安装SpamAssassin和相关软件包。
sudo apt install spamassassin libnet-dns-perl libmail-spf-perl pyzor razor
编辑一个Amavis配置文件。
sudo nano /etc/amavis/conf.d/15-content_filter_mode
取消注释以下行以启用垃圾邮件检查。
#@bypass_spam_checks_maps = ( # %bypass_spam_checks, @bypass_spam_checks_acl, $bypass_spam_checks_re);
保存并关闭文件。 然后重新启动Amavis。
sudo systemctl restart amavis
DKIM在Amavis
在Linux上可以执行DKIM签名和验证的两个常见软件是OpenDKIM和Amavis。 我更喜欢使用OpenDKIM,因为它与OpenDMARC更好地协同工作。 因此,我将不解释如何DKIM在Amavis中对您的电子邮件进行签名。
默认情况下,Amavis可以验证传入电子邮件的DKIM签名。 如果您的邮件服务器上运行了OpenDKIM,则可以在Amavis中禁用DKIM验证。
sudo nano /etc/amavis/conf.d/21-ubuntu_defaults
找到以下行并进行更改 1
至 0
,因此Amavis不会验证DKIM签名。
$enable_dkim_verification = 1;
保存并关闭文件。 然后重新启动Amavis。
sudo systemctl restart amavis
收到传入的电子邮件时,Postfix将通过sendmail milter界面调用OpenDKIM以验证DKIM签名,然后将电子邮件传递给Amavis进行病毒检查。 发送外发电子邮件时,Postfix将调用OpenDKIM对电子邮件进行签名,然后将其传递给Amavis进行病毒检查。
改善Amavis的性能
默认情况下,Amavis运行2个进程。 如果您在邮件日志中看到以下几行(/var/log/mail.log
),这意味着Amavis无法足够快地处理电子邮件。
postfix/qmgr[1619188]: warning: mail for [127.0.0.1]:10024 is using up 4001 of 4008 active queue entries postfix/qmgr[1619188]: warning: you may need to reduce smtp-amavis connect and helo timeouts postfix/qmgr[1619188]: warning: so that Postfix quickly skips unavailable hosts postfix/qmgr[1619188]: warning: you may need to increase the main.cf minimal_backoff_time and maximal_backoff_time postfix/qmgr[1619188]: warning: so that Postfix wastes less time on undeliverable mail mail postfix/qmgr[1619188]: warning: you may need to increase the master.cf smtp-amavis process limit mail postfix/qmgr[1619188]: warning: please avoid flushing the whole queue when you have mail postfix/qmgr[1619188]: warning: lots of deferred mail, that is bad for performance
为了提高性能,请编辑Amavis配置文件。
sudo nano /etc/amavis/conf.d/50-user
在文件之间添加以下行 use strict;
和 1;
线。 这将使Amavis运行4个流程。 如果您有10个CPU核心,则可以将4更改为10。请注意,运行10个以上的Amavis进程对性能几乎没有影响。
$max_servers = 4;
保存并关闭文件。 然后编辑Postifx主配置文件。
sudo nano /etc/postfix/master.cf
找出 smtp-amavis
服务定义,并将流程限制从2更改为4。
smtp-amavis unix - - n - 4 smtp -o syslog_name=postfix/amavis -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes -o disable_dns_lookups=yes -o max_use=20 -o smtp_tls_security_level=none
保存并关闭文件。 然后重新启动Amavis和Postfix,以使更改生效。
sudo systemctl restart amavis postfix
现在运行以下命令。 您应该看到现在有4个Amavis进程。
sudo amavisd-nanny
按 Ctrl+C
停止被害的保姆。
跳过病毒检查您的时事通讯
如果您使用邮件服务器发送新闻稿,并且启用了Amavis和ClamAV,则在将新闻稿发送给订户时,大量的CPU和RAM资源将用于病毒检查。 它可能使您的邮件服务器无响应。 您可以使用以下方法跳过对时事通讯的病毒检查。
编辑Postfix主配置文件。
sudo nano /etc/postfix/master.cf
在此文件的开头添加以下行。 这将启用 smtpd
在本地主机的端口2525上,它可以接受从同一服务器启动的客户端连接。 如果还有另一个进程正在监听端口2525,则可以将127.0.0.1:2525更改为其他名称,例如127.0.0.1:2552。 请注意 content_filter
参数设置为 none
,这意味着ClamAV不会扫描电子邮件。
127.0.0.1:2525 inet n - - - 1 smtpd -o syslog_name=postfix/2525 -o content_filter=
然后在此文件的末尾添加以下行。 将12.34.56.78替换为邮件服务器的公用IP地址。 这将创建另一个侦听端口10587的Postfix提交守护程序。这用于来自另一台服务器的客户端连接。
12.34.56.78:10587 inet n - y - - smtpd -o syslog_name=postfix/10587 -o smtpd_tls_security_level=encrypt -o smtpd_tls_wrappermode=no -o smtpd_sasl_auth_enable=yes -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth -o content_filter=
保存并关闭文件。 然后重新启动后缀。
sudo systemctl restart postfix
如果您的新闻通讯应用程序在邮件服务器上运行,请指定 127.0.0.1:2525
作为SMTP主机,无需SMTP身份验证。 如果您的新闻通讯应用程序在其他服务器上运行,请指定 12.34.56.78:10587
作为SMTP主机,并带有SMTP身份验证。
包起来
我希望本教程可以帮助您在Ubuntu邮件服务器上设置Amavis和ClamAV。 与往常一样,如果您发现这篇文章很有用,请订阅我们的免费新闻通讯以获取更多提示和技巧。 保重🙂