我正在尝试将基于 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
如果你还没有下定决心,请跳过阅读:-)
使 vmail 成为 sendmail 独有的(无需对目标进行 DNS 查找)
LOCAL_CONFIG CPvmail
使用 FEATURE(ldap_routing) 选择 mailHost 而不是 mailRoutingAddress
使用FEATURE(mailertable)选择传送方式(mailer)
邮寄表
vmail dovecot:dummy
不要将 dovecot 作为本地邮件程序 - FEATURE(local_procmail,…)
在 dovecot 邮件程序定义中使用 xSMTP 规则而不是 xL(本地)规则
答案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 并测试。