更新されたデータベースは、カスタムデータベースファイルの一時ファイルを生成できません。

更新されたデータベースは、カスタムデータベースファイルの一時ファイルを生成できません。

私のホームディレクトリ用のカスタムデータベースを作成しようとしています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'

フロントロードまたはルートとして実行しても結果は変わりupdatedbません。sudoパラメータなしで単純に実行すると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ファイルシステムにあります。

問題は何であり、どのように解決しますか?

答え1

@fra-sanが提案したように、問題はセキュリティポリシーによって引き起こされます。解決策は

  1. 監査デーモンが実行中でインストールされてaudit2allow いることを確認してください。 opensuseの場合、監査デーモンはパッケージ内にauditありaudit2allowますpolicycoreutils。存在しない場合は、インストールしてrootとしてデーモンを起動します。
systemctl start auditd
  1. updatedb -o ~/custom-mlocate.db -U ~/ たとえば、一般ユーザーとしてそのプログラムを実行します。残りはsudorootとしてログインするか(悪い)、各行の接頭辞を付けて実行する必要があります(良い)。

  2. 最後の数行を確認してください/var/log/audit/audit.log

    tail -n 20 /var/log/audit/audit.log | grep -i denied
    

    あなたが興味を持っているのは、 type=AVC問題のあるコマンドの名前で始まる行です。 2つの可能性があります。

  • この行には、avc: deniedシステムが SELinux を使用します。
  • この行にはが含まれていますapparmor="DENIED"。これは、システムがセキュリティのためにAppArmorを使用することを意味します。

AppArmorの場合は、AppArmorのマニュアルを参照してください。例えば https://doc.opensuse.org/documentation/leap/security/html/book.security/part-apparmor.html オープン水洗用。

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
    
  2. SELinuxモジュールの作成
    audit2allow -i /var/log/audit/audit-partial-tmp.log -M custom-selinux-module
    
  3. 新しいポリシーを有効にする
    semodule -i custom-selinux-module.pp
    
  4. 通常のユーザーとしてプログラムを実行して正常であることを確認してください。例えば
    updatedb -o ~/custom-mlocate.db -U ~/
    
  5. 掃除する
    rm /var/log/audit/audit-partial-tmp.log custom-selinux-module.pp 
    

答え2

データベースファイルへの書き込みアクセス権があるがファイルが作成されたディレクトリにない場合は、ディレクトリへの書き込みアクセス権を持つ別の場所にデータベースを書き込み、最終ファイルの場所にコピーしてこの問題を解決できます。例えば

updatedb -o /myhomedir/mydb.db
cp /myhomedir/mydb.db /somespeciallocation/mydb.db

関連情報