Linux

updatedb 無法為自定義數據庫文件創建臨時文件

  • July 15, 2021

我正在嘗試mlocate為我的主目錄創建一個自定義數據庫。執行時updatedb它抱怨無法打開臨時文件。

55;~/>uname -a
Linux yoga 4.12.14-lp151.28.59-default #1 SMP Wed Aug 5 10:58:34 UTC 2020 (337e42e) x86_64 x86_64 x86_64 GNU/Linux
56;~/>updatedb --version
updatedb (mlocate) 0.26
...
57;~/>updatedb -l 0 -o ~/.home-mlocate.db -U ~/
updatedb: can not open a temporary file for `/home/<user>/.home-mlocate.db'

以 root身份updatedb添加sudo或以 root 身份執行不會改變結果。簡單地執行sudo updatedb沒有任何參數成功。

更一般的除非數據庫是預設的updatedb不能創建臨時文件的:

yoga:~ # /usr/bin/whoami
root
yoga:~ # /usr/bin/updatedb ; echo $?
0
yoga:~ # /usr/bin/updatedb -o /var/lib/mlocate/mlocate.db ; echo $?
0
yoga:~ # /usr/bin/updatedb -o /var/lib/mlocate/custom-mlocate.db ; echo $?
/usr/bin/updatedb: can not open a temporary file for `/var/lib/mlocate/custom-mlocate.db'
1
yoga:~ # /usr/bin/strace /usr/bin/updatedb -o /var/lib/mlocate/custom-mlocate.db 2>&1 1>\dev\null | grep "openat.*custom-mlocate.db"
openat(AT_FDCWD, "/var/lib/mlocate/custom-mlocate.db", O_RDWR) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/var/lib/mlocate/custom-mlocate.db.6JiH9O", O_RDWR|O_CREAT|O_EXCL, 0600) = -1 EACCES (Permission denied)
yoga:~ #  

我的作業系統是 openSUSE Leap 15.1,我的/home目錄位於 ext4 文件系統上。

問題是什麼以及如何解決?

正如@fra-san 所建議的,問題是由安全策略引起的。解決方案是

  1. 確保您執行並audit2allow 安裝了審核守護程序。對於 opensuse 審計守護程序在包audit中,並且audit2allowpolicycoreutils. 如果不存在則安裝並以 root 身份啟動守護程序
systemctl start auditd
  1. 執行有問題的程序,例如updatedb -o ~/custom-mlocate.db -U ~/ 作為普通使用者。其餘的應該以root身份登錄(壞)或在每一行前面加上sudo(好)執行。
  2. 檢查最後幾行/var/log/audit/audit.log
tail -n 20 /var/log/audit/audit.log | grep -i denied

type=AVC您對以違規命令的名稱開頭的行 以及出現的位置感興趣。有兩種可能:

  • 該行包含avc: denied. 您的系統使用 SELinux。
  • 該行包含apparmor="DENIED". 這意味著您的系統使用 AppArmor 來確保安全。

如果是 AppArmor,請查閱 AppArmor 手冊。例如 https://doc.opensuse.org/documentation/leap/security/html/book.security/part-apparmor.html 對於 OpenSuse。

對於 SELinux:

  1. 將您在步驟 3 中標識的行複製到單獨的文件中。例如
tail -n 20 /var/log/audit/audit.log | grep -i "denied.*updatedb" > /var/log/audit/audit-partial-tmp.log

檢查是否正常

cat /var/log/audit/audit-partial-tmp.log

audit2allow -w -i /var/log/audit/audit-partial-tmp.log
  1. 創建 SELinux 模組
audit2allow -i /var/log/audit/audit-partial-tmp.log -M custom-selinux-module
  1. 啟動新政策
semodule -i custom-selinux-module.pp
  1. 以普通使用者執行程序,檢查是否正常。例如
updatedb -o ~/custom-mlocate.db -U ~/
  1. 清理
rm /var/log/audit/audit-partial-tmp.log custom-selinux-module.pp 

引用自:https://unix.stackexchange.com/questions/607166