Dovecot

一個程序可能無法連結文件,但我可以為同一個使用者使用 sudo?

  • January 28, 2021

我在 Debian 10(無 SELinux)上使用 Dovecot 2.3.4.1 和 EncFS(encfs 版本 1.9.5)加密郵箱

基本設置是:

EncFS 安裝有

encfs --public /var/encrypted-mail /var/decrypted-mail -o nonempty --verbose

郵箱設置:

/var/decrypted-mail/domain.com/foo@domain.com/[cur,new...]

drwx------ 8 mail mail 4096 Dec 29 2019 /var/decrypted-mail(這些權限是遞歸的)

所有 dovecot 程序都以mail使用者身份執行:

mail 5194 0.0 0.0 6308 4312 ? S 14:52 0:00 dovecot/imap

儘管一切似乎都配置正確,但我無法創建新文件夾或重命名現有文件夾。

我在以下內容中收到此錯誤/var/log/dovecot.log

Jan 24 14:59:04 imap(foo@domain.com)<6010><Us21sxWS5OZaC6Ex>: Error: Couldn't create mailbox list lock /var/decrypted-mail/domain.com/foo@domain.com/mailboxes.lock: file_create_locked(/var/decrypted-mail/domain.com/foo@domain.com/mailboxes.lock) failed: link(/var/decrypted-mail/domain.com/foo@domain.com/mailboxes.lockba53af3795974a32, /var/decrypted-mail/domain.com/foo@domain.com/mailboxes.lock) failed: Operation not permitted

該錯誤消息的原始碼位於此處:https ://github.com/dovecot/core/blob/4d09884528e592a0fa5d38bf479b3ddab1a4a0ef/src/lib/file-create-locked.c#L109-L123

如果我沒看錯,它就不能使用“正常鎖定”機制並嘗試將臨時文件符號連結到mailboxes.lock. 這表明它可以創建臨時文件mailboxes.lockba53af3795974a32並且無法對其進行符號連結。

當我在 shell 中執行這個命令時: sudo -u mail bash -c 'touch mailboxes.lockba53af3795974a32 && ln -s mailboxes.lockba53af3795974a32 mailboxes.lock'

它工作正常,我沒有錯誤。

鴿舍的行為怎麼可能與普通貝殼如此不同?

我唯一的解釋是時間問題(之前訪問過臨時文件,但是為什麼這沒有出現在 bash 複製中?)。

我也嘗試過chmod -R g+rwx /var/decrypted-mail,以確保所有這些 gid 都不是問題,但這只是尋找修復的絕望嘗試。

encfs事實證明,在某些情況下,這是已知的限制。

如果啟用External IV Chaining硬連結則禁用。

外部 IV 連結

1.1.3 中的新功能。此選項與 Per-File Initialization Vectors 和 Filename Initialization Vector Chaining 密切相關。基本上,它將初始化向量鏈從文件名擴展到每個文件的初始化向量。

啟用此選項後,每個文件的初始化向量使用從文件名初始化向量連結程式碼派生的初始化向量進行編碼。這意味著文件中的數據與文件名相關聯。如果加密文件在 encfs 之外被重命名,則它在 encfs 中將不再可解碼。請注意,除非啟用 Block MAC 標頭,否則將不會檢測到解碼錯誤,並會導致讀取隨機數據。

有一個與此相關的成本。啟用外部 IV 連結後,文件系統中將不允許硬連結,因為無法正確解碼指向相同數據的兩個不同文件名。

此外,重命名文件需要修改文件頭。因此,僅當使用者對文件具有寫入權限時才允許重命名。

由於這些限制,此選項在標準模式下預設禁用(在偏執模式下預設啟用)。

來源:encfs(1) 手冊頁。

事實證明,我誤讀了link. 它清楚地表明它預設創建一個新的 *硬連結。我用我發布的程式碼片段創建了一個軟連結:

sudo -u mail bash -c 'touch mailboxes.lockba53af3795974a32 && ln -s mailboxes.lockba53af3795974a32 mailboxes.lock'

如果我跑了:

sudo -u mail bash -c 'touch mailboxes.lockba53af3795974a32 && ln mailboxes.lockba53af3795974a32 mailboxes.lock'

相反,我會得到與程式碼完全相同的錯誤消息dovecot

ln: failed to create hard link 'mailboxes.lock' => 'mailboxes.lockba53af3795974a32': Operation not permitted


額外知識

在此過程中我發現了一個巧妙的技巧,您可以fuse使用-f -d.

實現喜歡encfscryfs允許您將這些選項解析為fuse

encfs enc dec -- -f -d

Fuse 將在前台執行,然後向您顯示掛載文件系統中發生的一切。:)

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