背景
我使用 sqlite 设置了一个示例 postfix 服务器来存储别名和邮箱详细信息,(这样它们就可以实时更新,并拥有一个单一的事实来源作为数据库。)
为了安全起见,我在可能的情况下运行 chroot 的 postfix 部分,因此数据库(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/www/admin/app/mail.sqlite 替换 /var/lib/postfix/mail.sqlite,但这闻起来像竞争条件,或者至少是不雅的。
(我想知道为什么配置为时,postfix 将数据库称为“/var/lib/postfix/./mail.sqlite” dbpath = /var/lib/postfix/mail.sqlite
?)
问题
如何让我的 cgi Web 前端写入访问 postfix 的数据库,而不将其作为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
并尝试过proxymap:
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-script[957]: warning: group or other writable: /var/lib/postfix/.
postfix/postfix-script[958]: warning: group or other writable: /var/lib/postfix/./mail.sqlite
这个错误的来源是此时的脚本“postfix-script”:
$todo
实际上是config_directory
,shlib_directory
,daemon_directory
和meta_directory
作为一个列表。您可以运行该
postconf
命令来确定这些变量是什么。这似乎表明,如果您将实际的 sqlite 数据库保留在这些目录之外,postfix-script 将不知道检查它们。
因此,您可以创建由 Web 服务器和邮件服务器共享的新内容,例如 -
/srv/maildb/
根据您的偏好设置所有权并像这样绕过它。哦,我要指出您可能想要更改您的 chroot 环境以支持加载数据。您可能会使用硬链接,但感觉就像是 hack。