単一プロセスでアクセス可能な一時ファイル

単一プロセスでアクセス可能な一時ファイル

ファイルを作成したプロセス(およびその子孫)からのみアクセスできるファイルを作成し、プロセスが終了するとファイルが消えるようにし、理想的にはファイルをディスクに保持したくないとします。たとえば、/mylocation/myfile.txtファイルを現在のプロセスでのみ読み取ることができ、他のプロセスでは読み取ることができず、同じユーザーからも読み取れないようにしたいと思います。/mylocation下のどこかに同じ場所以外の魔法の場所を使用したいのですが、/prod/PIDすべてのファイル名に対して機能する必要があります。

背景は$FOO/mypassword同じユーザーアカウントで実行されますが、パスワードは他の複数のプロセスを持つ既存のライブラリを使用していることです。他のプロセスからライブラリにパスワードを安全に渡したいと思います。理想的な解決策は、他のユーザーアカウントを使用するか、ライブラリがファイルからパスワードを読み取らないようにすることですが、これらの側面を制御することはできません。

答え1

まあ、「ファイル」の意味とライブラリがファイルにアクセスする方法によって異なります。私が考えたいくつかのアプローチは次のとおりです(2つのアプローチ)。

  1. 一般的な意味で一時ファイルを使用してくださいmkstempmkstempリンクされていないファイルのファイル記述子を返します。その後、への$FOO/mypasswdシンボリックリンクを作成できます/proc/self/fd/returned_number。ファイルを開くときとリンク解除の間に小さなウィンドウがあり、同じユーザーで実行されている他のプログラムでは、ファイルを開き、ファイル記述子を保存して後でパスワードを読み取ることができます。一時ディレクトリがtmpfsにある場合は、ディスクに書き込まれないことを確認できます。
  2. seekパスワードファイルが不要な場合は、pipe/ を使用してpipe2ファイル記述子を作成し、シンボリックリンクを使用して上記の手順に進みます。パイプにパスワードを入力する場合を処理するには、子プロセスを分岐する必要があります。
  3. このためにFUSEを乱用する可能性があります。
  4. (または他のダイナミックリンカートリック)を使用してLD_PRELOAD//傍受し、通常の場所でパスワードを入力してライブラリを「修正」することができます。openreadclose

これらのうち何も本物他のプロセスから保護されます。たとえば、同じユーザーで実行される他のプロセスは、ptraceメモリから直接プロセスを読み込み、パスワードを読み取ることができます。

答え2

#!/bin/bash
exec 3<>file
rm file
exec program

正確に言えば、競争条件があります。そしてプログラムはファイル記述子を使用しなければなりません。ファイルパスを渡す必要がある場合を使用してください/proc/self/fd/3。ただし、理論的には、他のプロセスはこのprocパスを介してファイルにアクセスできます(削除された場合でも)。

関連情報