问题

问题

背景

我使用 sqlite 设置了一个示例 postfix 服务器来存储别名和邮箱详细信息(以便它们可以实时更新并且有一个真实的数据库来源。)

为了安全起见,我让 postfix 的各个部分尽可能地运行 chroot,因此数据库(mail.sqlite)位于 /var/lib/postfix/(一切正常。)

所需的功能

我编写了一个 Web 前端,让用户添加新的电子邮件地址。Web 前端以 www-data 的形式运行。

我将 www-data 添加到 postfix 组,以便chmod g+rw /var/lib/postfix/mail.sqlite /var/lib/postfix/Web 前端能够更新数据库。

电子邮件不断进出。Web 前端可以创建远程更新删除别名。我重新启动 Postfix 并检查日志:

postfix/postfix-script[26524]: warning: group or other writable: /var/lib/postfix/.
postfix/postfix-script[26525]: warning: group or other writable: /var/lib/postfix/./mail.sqlite

如果我chmod g-w /var/lib/postfix/mail.sqlite这样做会让 Postfix 很高兴,但却删除了我的 Web 前端添加新别名的能力。

我可以使用 cron 脚本将 /var/lib/postfix/mail.sqlite 替换为权威的 /var/www/admin/app/mail.sqlite,但是这有点像竞争条件,或者至少不太雅致。

(我想知道为什么在配置时 postfix 将数据库称为“/var/lib/postfix/./mail.sqlite” dbpath = /var/lib/postfix/mail.sqlite?)

问题

如何让我的 cgi web 前端在不运行它的情况下授予它对 postfix 数据库的写权限作为后缀同时保持 Postfix 正常运行?(我认为在添加 SELinux 策略之前我必须解决这个问题。)

编辑:

我有 main.cf

virtual_mailbox_maps = sqlite:/etc/postfix/sqlite_mailbox.cf
virtual_alias_maps = sqlite:/etc/postfix/sqlite_alias.cf
virtual_mailbox_domains = sqlite:/etc/postfix/sqlite_domains.cf

并尝试过代理映射:

virtual_mailbox_maps = proxy:sqlite:/etc/postfix/sqlite_mailbox.cf
virtual_alias_maps = proxy:sqlite:/etc/postfix/sqlite_alias.cf
virtual_mailbox_domains = proxy:sqlite:/etc/postfix/sqlite_domains.cf

两者在电子邮件处理方面似乎同样有效,但重新启动 postfix 后,两者仍然会记录:

postfix/postfix-script[957]: warning: group or other writable: /var/lib/postfix/.             
postfix/postfix-script[958]: warning: group or other writable: /var/lib/postfix/./mail.sqlite

答案1

此错误的根源在于此时的脚本“postfix-script”:

find $queue_directory/. $queue_directory/pid \
    -prune \( -perm -020 -o -perm -002 \) \
    -exec $WARN group or other writable: {} \;
..
find $todo \( -perm -020 -o -perm -002 \) \
    -exec $WARN group or other writable: {} \;
..
find $data_directory/. \( -perm -020 -o -perm -002 \) \
    -exec $WARN group or other writable: {} \;
..

$todo实际上是config_directoryshlib_directorydaemon_directory作为meta_directory列表。

您可以运行postconf命令来找出这些变量是什么。

$ postconf queue_directory config_directory daemon_directory meta_directory shlib_directory data_directory
queue_directory = /var/spool/postfix
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
meta_directory = /etc/postfix
shlib_directory = /usr/lib64/postfix
data_directory = /var/lib/postfix

这似乎表明,如果你保留实际的 sqlite 数据库外部在这些目录中,postfix-script 将不会意识到检查它们。

因此,您可以创建由 Web 服务器和邮件服务器共享的新内容,/srv/maildb/比如根据您的偏好设置所有权,然后以此方式解决它。

哦,我想指出的是,您可能需要改变您的 chroot 环境以支持加载数据。您可能会使用硬链接,但这感觉像是黑客攻击。

相关内容