Postfix

如何安全地阻止 postfix 對 sqlite 數據庫的組權限挑剔?

  • March 24, 2022

背景

我使用 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”:

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_directory, shlib_directory,daemon_directorymeta_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 環境以支持載入數據。您可能會使用硬連結,但感覺就像是 hack。

引用自:https://serverfault.com/questions/1096470