使用 Alpine 保护您的电子邮件服务器

来自 Alpine Linux
此材料已过时...

这些指示适用于 Alpine 1.7.............. (讨论)

本文档将概述如何使用 Alpine Linux 设置垃圾邮件/病毒网关。我想首先说明,这并非设置此类系统的唯一方法。有很多方法可以实现此目标,但这只是我采用的方式。我不保证这对您有效!

我想提到的第一件事是,在无盘系统上设置 Postfix(将邮件队列保存在内存中)可能不是一个好方法。如果您遇到电源故障,您将丢失 Postfix 队列的内容。话虽如此,在我们的组织中,我们使用 UPS 设备为我们的服务器提供备用电源,因此我们的服务器因电源故障而关机的可能性极小(并且我们已准备好承担此风险)。

对于此特定设置,我们将使用以下内容

  • 邮件守护进程:Postfix
  • 病毒扫描器:Clamav
  • SMTP 过滤器:Clamsmtp
  • 灰名单服务器:Gross
  • 额外定义:SaneSecurity & MSRBL
  • relay_recipient_maps 中的 Exchange 2003 用户/组
  • Alpine Linux 1.7.19(某些软件包在此版本之前不可用)

设置邮件守护进程

我们要安装的第一件事是我们的邮件守护进程

apk add postfix

这将安装 Postfix,并在 /etc/postfix 中使用默认配置。让我们首先看一下 main.cf,这是(顾名思义)Postfix 的主要配置文件。我将向您展示我的配置文件,您可以使用它(我已经注释掉了一些我们稍后启用的选项)

mynetworks = lan-net/24, 127.0.0.0/8
transport_maps = hash:/etc/postfix/transport
relay_domains = $transport_maps
smtpd_helo_required = yes
disable_vrfy_command = yes
#relay_recipient_maps = hash:/etc/postfix/exchange_receipients
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,
    permit_mynetworks,
    reject_unauth_destination,
    #check_policy_service inet:127.0.0.1:5525,
    #
    # in case you want reject DNS blacklists rather than greylist them
    # with gross, uncomment the lines below
    #
    #  reject_rbl_client cbl.abuseat.org,
    #  reject_rbl_client sbl.spamhaus.org,
    #  reject_rbl_client pbl.spamhaus.org,
    #  reject_rbl_client bl.spamcop.net,
    #  reject_rbl_client list.dsbl.org,
    permit
smtpd_data_restrictions =
    reject_unauth_pipelining,
    permit
#content_filter = scan:[127.0.0.1]:10025
注意: 不要忘记将 lan-net 更改为您的 lan 子网。

这些是我用于设置 Postfix 邮件网关的最小设置。如果您正在寻找其他设置,请执行以下命令

postconf

这将显示您当前的默认配置。如果您想更改其中任何设置,您可以将它们添加到 main.cf 并重新加载 Postfix。查看我的 main.cf 文件,您将看到设置“transport_maps”。此设置指的是 Postfix 配置目录中的一个文件,该文件将保存 Postfix 的信息,以指示 Postfix 应将电子邮件转发到哪个服务器。它应该看起来像这样

domain-a.tld   smtp:[192.168.1.1]
domain-b.tld   smtp:[192.168.1.2]

每当电子邮件进入我们的邮件网关,并且其域名在我们的“transport_maps”文件中指定时,它将在处理后将此电子邮件转发到分配的 IP 地址。有关完整文档,请参阅 Postfix 文档。当您准备好编辑此文件时,请执行以下命令

postmap /etc/postfix/transport

这将创建此文件的哈希数据库,以便 Postfix 更容易/更快地读取。我们要查看的第二个设置是“relay_domains”。此设置将告诉 Postfix 它将为哪些域中继电子邮件。因为此设置很可能与我们在“transport_maps”中提及的域相同,所以我们可以直接链接到它。现在您的基本电子邮件网关已准备就绪,您可以启动它,但请记住,不会有病毒或垃圾邮件过滤。

rc-service postfix start

我们可以在启动时启动它

rc-update add postfix

设置病毒扫描器

为了能够从我们的电子邮件中过滤掉病毒,我们需要一个病毒扫描器。唯一可用的真正的开源解决方案是 Clamav。让我们安装它

apk add clamav

我们将使用 Clamav 的守护进程版本“clamd”。我们无需更改 Clamav 的任何内容,我们可以使用默认设置,并且病毒定义会自动使用 freshclam 更新。让我们启动它

rc-service clamd start

让我们在启动时启动它

rc-update add clamd

注意: 我在 Alpine 上使用 clamd 时遇到过内存问题。我仍在寻找有关此问题的解决方案。目前,我建议您每天使用 cron 重新启动 clamd。

更新: 请参阅 https://wwws.clamav.net/bugzilla/show_bug.cgi?id=1028 这应该在 clamav 0.93.1 中修复

设置 SMTP 过滤器

好的,现在我们已经安装并设置了邮件守护进程和病毒守护进程。现在我们需要让两个守护进程相互通信。最常用的工具是 amavisd-new,但它基于 Perl,我不喜欢它,因为 Perl 可能会占用大量资源,而且我不打算在我的 Alpine 安装上安装它。另一个更轻量级的基于 C 的解决方案是 Clamsmtp。它是一个 SMTP 过滤器,用于侦听传入连接,并使用 clamd 扫描电子邮件,然后将其转发回 MTA。它不像 amavisd-new 那样具有许多功能,但对我来说足够了。让我们安装它

apk add clamsmtp

这是我的 clamsmtp.conf 配置文件

OutAddress: 127.0.0.1:10026
Listen: 127.0.0.1:10025
ClamAddress: /var/run/clamav/clamd.sock
TempDirectory: /tmp
Action: drop
Quarantine: on
User: clamav
VirusAction: /etc/postfix/scripts/virus_action.sh

Clamsmtp 支持病毒操作脚本,每次 clamd 返回肯定检测结果时都会运行该脚本。我在此处包含了我的病毒操作脚本,但尚未经过充分测试,因此请您自行承担风险使用!确保您在 /etc/postfix/scripts/ 目录中设置了正确的权限,因为 clamsmtp 将以用户 clamav 身份运行。监控您的 /tmp 目录中的日志文件。

virus_action.sh

注意: 在我们的组织中,我们正在运行 Exchange 2003。Exchange 支持公用文件夹,这是一种存储我们使用 Clamsmtp 过滤的文件的良好方法。确保您对公用文件夹具有适当的权限和大小限制,以使其不会变得太大,并且其他人无法访问该文件夹,请记住它将包含病毒!

好的,让我们通过编辑我们的 master.cf 并在文件末尾添加以下行来为 clamsmtp 配置 Postfix

# AV scan filter (used by content_filter)
scan      unix  -       -       n       -       16      smtp
        -o smtp_send_xforward_command=yes
        -o smtp_enforce_tls=no
# For injecting mail back into postfix from the filter
127.0.0.1:10026 inet  n -       n       -       16      smtpd
        -o content_filter=
        -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
        -o smtpd_helo_restrictions=
        -o smtpd_client_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o mynetworks_style=host
        -o smtpd_authorized_xforward_hosts=127.0.0.0/8

让我们启动 Clamsmtp

rc-service clamstmp start

并将其添加到我们的系统启动项中

rc-update add clamsmtp

如果您确定您的所有设置都正确,我们可以取消注释 main.cf 中的“content_filter”行,这将为 Postfix 启用 Clamsmtp 并运行

postfix reload

设置灰名单服务器

我已经使用灰名单几个月了,虽然它有积极影响,但也有消极影响。积极影响之一是您几乎不会再收到垃圾邮件/病毒电子邮件到您的系统中,但它会给您的部分电子邮件流量带来延迟。如果您的组织足够大,您将开始注意到人们抱怨电子邮件延迟,这就是 Gross 将介入的地方。它仍然使用灰名单,但不会对所有主机都这样做,而只会对与指定的 DNSBL 数据库匹配的主机这样做。如果您想了解有关 gross 的更多信息,请访问他们的网站

https://code.google.com/p/gross/

让我们安装 gross

apk add gross

这是我的 grossd.conf 文件

protocol = postfix
statefile = /var/db/gross/state
check = dnsbl
check = rhsbl
dnsbl = zen.spamhaus.org
dnsbl = list.dsbl.org
dnsbl = bl.spamcop.net
dnsbl = combined.njabl.org
dnsbl = cbl.abuseat.org
dnsbl = dnsbl.sorbs.net
rhsbl = rhsbl.sorbs.net

让我们启动 grossd

rc-service grossd start

注意: gross 的 init 文件将自动在其配置文件中指定的目录中生成 grossd 状态文件。由于我们是从内存中运行 Alpine,因此状态文件不会保存到磁盘,因此我们需要使用 lbu_commit 将其添加到我们的备份中。最安全的方法是先停止 grossd,然后再将更改提交到我们的备份。

{{Cmd|lbu_include /var/db/gross/state}

rc-service grossd stop

lbu_commit

rc-service grossd start

让我们在启动时启动它

{{Cmd|rc-update add grossd}

现在我们需要使 Postfix 使用我们的灰名单服务,方法是取消注释 main.cf 中的“check_policy_service”行并运行

postfix reload

设置 SaneSecurity & MSRBL 额外定义

捕获垃圾邮件的另一种好方法是 Sanesecurity 和 MSRBL 定义。您可以在此处找到有关这些定义的更多信息

https://www.sanesecurity.co.uk/

要使用以下脚本,您需要安装以下软件包

apk add curl rsync

up_clam_ex.sh

将此脚本添加到此 /etc/postfix/scripts/ 目录

并将此脚本添加到 cron

echo "37 03 * * * /etc/postfix/scripts/up_clam_ex.sh &> /dev/nul" >> /etc/crontabs/root
注意: 请调整时间,以便不是每个人都在同一时间运行它。

并确保 cron 在启动时运行

rc-update add cron

Exchange 2003 & relay_recipient_maps

Postfix 将处理在“relay_domains”中指定的每个电子邮件地址的邮件。因为我们想阻止 Postfix 处理不存在的目的地的电子邮件,所以我们将 relay_recipient_maps 选项添加到我们的 main.cf 文件中。我已经添加了它,所以只需要取消注释即可。我在此处包含了一个 Visual Basic 脚本,它将提取 Exchange 2003 中用户和组的所有有效电子邮件地址,并将它们放在 IIS 服务器根目录下的文本文件中。我还包含了一个脚本,该脚本将下载此文件并将其处理为 Postfix 可以读取的数据库。将以下文件放在您的 Exchange 服务器上的某个位置,并使其每隔一段时间通过 Windows 任务运行一次

export_receipts.vbs

下载以下文件并将其移动到

exchange_receipients.sh

/etc/postfix/scripts/

并更改其设置并将其添加到 cron。我设置了一个时间,在我在 Exchange 服务器上运行 vbs 脚本后 10 分钟

echo "10,40 * * * * /etc/postfix/scripts/exchange_receipients.sh &> /dev/nul" >> /etc/crontabs/root