使用 sendmail 和 dovecot lda 向虚拟用户发送邮件

使用 sendmail 和 dovecot lda 向虚拟用户发送邮件

我正在尝试将基于 Linux 系统用户的帖子系统迁移到虚拟用户。

我有

  • sendmail 与 procmail 传递
  • 鸽舍
  • 具有不同 uid 的系统用户
  • roundcube 网络界面

Sendmail 负责将所有邮件发送到用户邮箱,dovecot 负责与用户的 pop3 和 imap 交互,一切都运行良好

现在我们开始在全球范围内实施活动目录,并且我想拒绝来自 ldap 虚拟用户之前的 linux 系统电子邮件用户。

我启用了 sendmail ldap_routing

define(`confLDAP_DEFAULT_SPEC', `-h "10.1.0.1" -b "ou=portal,dc=univ,dc=priv" -d "cn=portal admin,ou=portal,dc=univ,dc=priv" -MLDAP_AUTH_SIMPLE -P/etc/mail/ldap_pass')dnl

LDAPROUTE_DOMAIN_FILE(`/etc/mail/ldap_route_domains')dnl

FEATURE(`ldap_routing', `null', `ldap -1 -T -v sAMAccountName -k (&(|(objectclass=user)(objectclass=group))(|(mail=%0)(proxyAddresses=smtp:%0)))',`passthru')dnl

通过 perl 脚本为 ldap 用户创建了简单的别名文件。文件最初看起来像这样

sAMAccountName1:    vmail
sAMAccountName2:    vmail
....
sAMAccountNameN:    vmail

使用此启用 dovecot-lda如何

不幸的是,sendmail 将真实系统用户名(在我的情况下为“vmail”)作为 -d 参数传递,而不是使用此配置的虚拟用户的 sAMAccountName。

之后我修改了我的别名文件,如下所示(受此启发话题

sAMAccountName1:    "|/usr/libexec/dovecot/dovecot-lda -d sAMAccountName1"
sAMAccountName2:    "|/usr/libexec/dovecot/dovecot-lda -d sAMAccountName1"
....
sAMAccountNameN:    "|/usr/libexec/dovecot/dovecot-lda -d sAMAccountName1"

此解决方案失败,因为我无法解决系统权限问题。以下是日志消息

致命:setgid(来自 userdb 查找的 5000(vmail))失败,euid=8(mail)、gid=12(mail)、egid=12(mail):操作不允许(此二进制文件可能应该将进程组设置为 5000(vmail)而不是 12(mail)来调用)

sendmail.cf 中定义的 dovecot 递送代理,其 U=vmail:vmail

Mdovecot,      P=/usr/libexec/dovecot/dovecot-lda,
           F=l59DFMPhnu,
           S=EnvFromL/HdrFromL, R=EnvToL/HdrToL,
           M=51200000,
           U=vmail:vmail,
           T=DNS/RFC822/X-Unix,
           A=/usr/libexec/dovecot/dovecot-lda -d $u

dovecot-lda 具有相同的所有者和组

-rwxr-x--- 1 vmail vmail 28512 апр.   5  2013 /usr/libexec/dovecot/dovecot-lda

如果我使用系统用户邮件而不是 vmail,一切都会开始正常工作。但这种配置对我来说似乎不太安全,我想使用 uid > 100 的用户 vmail 而不是用户邮件。

因此邮件传递失败。任何帮助解决此问题的方法我都非常感谢。

答案1

  1. 如果你还没有下定决心,请跳过阅读:-)

  2. 使 vmail 成为 sendmail 独有的(无需对目标进行 DNS 查找)

    LOCAL_CONFIG
    CPvmail
    
  3. 使用 FEATURE(ldap_routing) 选择 mailHost 而不是 mailRoutingAddress

  4. 使用FEATURE(mailertable)选择传送方式(mailer)

    邮寄表

    vmail  dovecot:dummy
    
  5. 不要将 dovecot 作为本地邮件程序 - FEATURE(local_procmail,…)

  6. 在 dovecot 邮件程序定义中使用 xSMTP 规则而不是 xL(本地)规则

    http://wiki2.dovecot.org/LDA/Sendmail

答案2

我尝试自己设置,但只找到了一些片段,没有完整的菜谱。下面是我设置的方法。

我正在运行 FreeBSD 10.3-RELEASE、sendmail 8.15.2 和 dovecot 2.2.29。

您需要一个用户来存储虚拟用户文件:

# passwd
vmail:*:2025:2025:Dovecot Virtual Mail:/var/empty:/usr/sbin/nologin

# group
vmail:*:2025:

dovecot 很简单,所以我们先来做一下。假设 dovecot 配置有效,您至少已经有一个 userdb 设置。为虚拟用户添加一个新的:

# Virtual users
userdb {
        driver = static
        args = uid=vmail gid=vmail home=/var/vmail/%u
}

如果你还没有,请为静态凭证添加 passdb 设置:

passdb {
        args = scheme=plain-md5 username_format=%u /usr/local/etc/dovecot/imap-passwd
        driver = passwd-file
}

创建/var/vmail:

mkdir /var/vmail
chown vmail:vmail /var/vmail

除非您想为每个新虚拟用户手动创建目录,否则请添加:

# Virtual users config
lda_mailbox_autocreate = yes

到 dovecot.conf(不打开 lda_mailbox_autocreate 且目录不存在的症状是 EX_TEMPFAIL 错误和消息卡在本地 sendmail 队列中)。

使用“doveadm pw -s PLAIN-MD5”并为新的虚拟用户添加一行:

vfred:{PLAIN-MD5}912ec803b2ce49e4a541068d495ab570

重新启动 dovecot 以获取新配置:

service dovecot restart

现在开始 sendmail。如果你没有 mailertable,你需要添加一个:

FEATURE(`mailertable')dnl

到 sendmail.mc 并:

vmail dovecot:dummy

到 mailertable。这告诉 sendmail 使用 dovecot 本地投递代理来处理 *@vmail。

在你的 sendmail.mc 的末尾你可能会看到类似这样的内容:

MAILER(local)dnl
MAILER(smtp)dnl

附加如下内容:

dnl
dnl Dovecot virtual user delivery agent
dnl
LOCAL_CONFIG
Mdovecot,
    P=/usr/local/libexec/dovecot/dovecot-lda,
    F=l59DFMPhnu,
    S=EnvFromL/HdrFromL,
    R=EnvToL/HdrToL,
    M=51200000,
    U=vmail:vmail,
    T=DNS/RFC822/X-Unix,
    A=/usr/local/libexec/dovecot/dovecot-lda -d $u

生成新的 sendmail.cf 并重新启动 sendmail:

service sendmail stop ; sleep 1 ; service sendmail start

(在 FreeBSD 下,“service sendmail restart” 有点搞笑)

最后将您的虚拟用户添加到别名文件中:

vfred: vfred@vmail

运行 newaliases 并测试。

相关内容