2.10. 保护 Postfix 服务
Postfix 是邮件传输代理(MTA),其使用简单邮件传输协议(SMTP)在其他 MTA 之间发送电子邮件,并将电子邮件发送给客户端或传输代理。虽然 MTA 可以加密彼此之间的流量,但默认情况下可能不会这样做。您还可以通过将设置改为更安全的值来降低各种攻击的风险。
2.10.1. 减少 Postfix 网络相关的安全风险
要降低攻击者通过网络侵入系统的风险,请尽可能执行许多以下的任务。
不要在网络文件系统(NFS)共享卷上共享
/var/spool/postfix/
邮件假脱机目录。NFSv2 和 NFSv3 不维护对用户和组 ID 的控制。因此,如果两个或多个用户具有相同的 UID,他们可以接收和读取彼此的邮件,这是一个安全风险。注意此规则不适用于使用 Kerberos 的 NFSv4,因为
SECRPC_GSS
内核模块不使用基于 UID 的身份验证。但是,为了降低安全风险,您不应该将邮件假脱机目录放在 NFS 共享卷上。-
为了减少 Postfix 服务器漏洞的可能性,邮件用户必须使用电子邮件程序访问 Postfix 服务器。不允许邮件服务器上的 shell 帐户,并将
/etc/passwd
文件中的所有用户 shell 设为/sbin/nologin
(root
用户可能例外)。 -
为了防止 Postfix 免受网络攻击,默认设置为仅侦听本地回环地址。您可以通过查看
/etc/postfix/main.cf
文件中的inet_interfaces = localhost
行来验证这一点。这样可确保 Postfix 仅接受来自本地系统,而不是来自网络的邮件(如cron
作业报告)。这是默认设置,保护 Postfix 免受网络攻击。要删除 localhost 限制并允许 Postfix 侦听所有接口,请将/etc/postfix/main.cf
中的inet_interfaces
参数设为all
。
2.10.2. 用于限制 DoS 攻击的 Postfix 配置选项
攻击者可以用流量淹没服务器,或发送触发崩溃的信息,从而导致拒绝服务(DoS)攻击。您可以通过在 /etc/postfix/main.cf
文件中设置限制来配置系统,以降低此类攻击的风险。您可以更改现有指令的值,或者您可以使用 <directive> = <value> 格式添加具有自定义值的新指令。
使用以下指令列表来限制 DoS 攻击:
- smtpd_client_connection_rate_limit
-
这个指令限制了任何客户端每个时间单位内向这个服务进行连接尝试的最大数。默认值为
0
,这意味着客户端每个时间单位内可以尝试的 Postfix 所能接受的连接数。默认情况下,指令排除可信网络中的客户端。 - anvil_rate_time_unit
-
这个指令是计算速率限制的时间单位。默认值为
60
秒。 - smtpd_client_event_limit_exceptions
- 这个指令排除了连接和速率限制命令中的客户端。默认情况下,指令排除可信网络中的客户端。
- smtpd_client_message_rate_limit
- 此指令定义了每个时间单位客户端发送到请求的最大消息数(不论 Postfix 是否实际接收了这些消息)。
- default_process_limit
-
此指令定义了提供给定服务的默认 Postfix 子进程的最大数。对于
master.cf
文件中的特定服务,您可以忽略此规则。默认情况下,该值为100
。 - queue_minfree
-
此指令定义在队列文件系统中接收邮件所需的最小空闲空间量。该指令目前由 Postfix SMTP 服务器使用,以决定是否接受任何邮件。默认情况下,空闲空间量小于
message_size_limit
的 1.5 倍时,Postfix SMTP 服务器会拒绝MAIL FROM
命令。要指定较高的最小空闲空间限制,请将queue_minfree
值指定为至少message_size_limit
的 1.5 倍。默认情况下,queue_minfree
值为0
。 - header_size_limit
-
此指令定义用于存储消息头的最大内存量(以字节为单位)。如果消息头较大,它会丢弃超出的消息头。默认情况下,值为
102400
字节。 - message_size_limit
-
此指令定义消息的最大大小(以字节为单位),包括信封信息。默认情况下,值为
10240000
字节。
2.10.3. 将 Postfix 配置为使用 SASL
Postfix 支持基于简单身份验证和安全层(SASL)的 SMTP 身份验证(AUTH)。SMTP AUTH 是简单邮件传输协议的扩展。目前,Postfix SMTP 服务器通过以下方式支持 SASL 实现:
- Dovecot SASL
- Postfix SMTP 服务器可以使用 UNIX-域套接字或 TCP 套接字与 Dovecot SASL 实现进行通信。如果 Postfix 和 Dovecot 应用程序运行在单独的计算机上,则使用此方法。
- Cyrus SASL
- 启用后,SMTP 客户端必须使用服务器和客户端都支持和接受的身份验证方法与 SMTP 服务器进行身份验证。
先决条件
-
dovecot
软件包已安装在系统上
流程
设置 Dovecot:
在
/etc/dovecot/conf.d/10-master.conf
文件中包括以下行:service auth { unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } }
前面的示例对 Postfix 和 Dovecot 之间的通信使用 UNIX-域套接字。该示例还假定默认的 Postfix SMTP 服务器设置,其包括位于
/var/spool/postfix/
目录中的邮件队列,以及在postfix
用户和组下运行的应用程序。可选:建立 Dovecot 以通过 TCP 侦听 Postfix 验证请求:
service auth { inet_listener { port = port-number } }
通过编辑
/etc/dovecot/conf.d/10-auth.conf
文件中的auth_mechanisms
参数来指定电子邮件客户端用来使用 Dovecot 进行身份验证的方法:auth_mechanisms = plain login
auth_mechanisms
参数支持不同的纯文本和非纯文本身份验证方法。
通过修改
/etc/postfix/main.cf
文件来建立 Postfix:在 Postfix SMTP 服务器上启用 SMTP 身份验证:
smtpd_sasl_auth_enable = yes
为 SMTP 身份验证启用 Dovecot SASL 实现:
smtpd_sasl_type = dovecot
提供相对于 Postfix 队列目录的身份验证路径。请注意,使用相对路径可确保无论 Postfix 服务器是否以
chroot
运行,配置都可以正常工作:smtpd_sasl_path = private/auth
此步骤使用 UNIX-域套接字在 Postfix 和 Dovecot 之间进行通信。
如果您使用 TCP 套接字进行通信,要将 Postfix 配置为在不同机器上查找 Dovecot,请使用类似如下的配置值:
smtpd_sasl_path = inet: ip-address : port-number
在上例中,将 ip-address 替换为 Dovecot 机器的 IP 地址,将 port-number 替换为 Dovecot 的
/etc/dovecot/conf.d/10-master.conf
文件中指定的端口号。指定 Postfix SMTP 服务器为客户端提供的 SASL 机制。请注意,您可以为加密和未加密的会话指定不同的机制。
smtpd_sasl_security_options = noanonymous, noplaintext smtpd_sasl_tls_security_options = noanonymous
以上指令指定在未加密的会话期间,不允许匿名身份验证,且不会允许传输未加密的用户名或密码的机制。对于使用 TLS 的加密会话,只允许非匿名身份验证机制。