/ runと/ tmpの両方を持つ理由はありません
あなたは正しいと思います。 /tmp
は、本質的に廃止されました/run
。あなたのプログラムがそうする立場にある場合(特権操作としてインストールする必要がある場合)、今日ではのサブディレクトリを使用します/run
。これはセキュリティ上の理由によるものです。
たとえば、CUPS印刷デーモンはrootとして実行されませんが、通常はOSパッケージからインストールされます。パッケージがインストールされ/usr/lib/tmpfiles.d/cups.conf
、systemd-tmpfiles
アクセス可能なディレクトリが作成されます。ディレクトリはの下/run
にあるため、誰/tmp
もが書き込み可能なのとは異なり、権限のないユーザーがその名前を悪意を持って要求することはできません。
/run
直接使用できない「非特権プログラム」
本当の違いは、自分のユーザーIDの下で、任意の非特権ユーザーがプログラムを実行している場合です。ただし/tmp
、他の非特権ユーザーがアクセスできるため、通常は使用しません。を使用することをお勧めします$XDG_RUNTIME_DIR
。通常、これは/run/user/$(id -u)
- として実装されるため、たまたまサブディレクトリに/run
もなります。ただし、場所は保証されません。プログラムは常に環境変数を使用する必要があります。
/tmp
システム上の異なる特権のないユーザー間のアドホックな連携にのみ役立ちます。このようなアドホックシステムは、悪意のあるユーザーがすべての人に協力したり、物事を台無しにしたりすることに対して脆弱です。1つの例はtalk
、Unixソケットを使用して、デーモンのバージョンを実行することを決定する非特権ユーザーです。
Lennart Poetteringのオリジナル情報
以下のPoetteringのチェックリストは、/tmp
「小さなファイル」には役立つが/run
、「通信プリミティブ」にのみ使用すべきであると主張していることに注意してください。この区別も当てはまらないと思います。の投稿者/run
はudev
であり/run/udev
、内部データベースが含まれていると確信しています。あなたが持ってたら/run
、ディレクトリを、私は誰が主張区別に従い、作成したいとは思わない別のディレクトリを、乱雑します/tmp
。そのため、実際には/run
最近使用しています。
通信を目的とした世界書き込み可能な共有名前空間[/ tmpなど]の使用には、常に問題があります。通信を確立するには安定した名前が必要ですが、安定した名前はDoS攻撃の扉を開きます。これは、初期ブート中に特定のサービスの保護されたアプリごとのディレクトリを確立することで部分的に修正できます(X11の場合と同様)が、これはすべてのパッケージのインストール後に再起動が行われた場合にのみ正しく機能するため、問題を部分的に修正するだけです。
...
別のFedora機能(Fedora 17用)は、さまざまなサービスの/ tmp名前空間を分離することにより、多くのシステムサービスの/ tmpのセマンティクスを変更して、安全性を高めました。
...
/ tmpは必ずしも共有名前空間ではないため、通常、通信プリミティブの場所としては不適切です。
...
[/ run]はtmpfsであることが保証されているため、ブート時に自動的にフラッシュされます。それ以上の自動クリーンアップは行われません。
...
Linuxアプリケーション開発者が使用する適切なディレクトリを選択することをお勧めする方法の大まかなガイドを次に示します。
- ソケット(または他の通信プリミティブ)を配置する場所が必要で、コードは特権的に実行されます。/runの下のサブディレクトリを使用します。(または、互換性を高めるために/ var / runの下に。)
- ソケット(または他の通信プリミティブ)を配置する場所が必要で、コードは特権なしで実行されます。$ XDG_RUNTIME_DIRの下のサブディレクトリを使用します。
- 大きなダウンロードとダウンロードを進行中にし、非特権で実行する場所が必要です:$ XDG_DOWNLOAD_DIRを使用します。
- 永続的で非特権で実行するキャッシュファイルを置く場所が必要です:$ XDG_CACHE_HOMEを使用します。
- 上記のいずれも当てはまらず、永続性を必要としない小さなファイルを配置する必要があります。/tmpでフォールバックを使用して$ TMPDIRを使用します。そして、mkstemp()とmkdtemp()を使用します。
- それ以外の場合は、/ var / tmpのフォールバックで$ TMPDIRを使用します。mkstemp()/ mkdtemp()も使用します。
上記のこれらの規則は、私たちだけが提案していることに注意してください。これらのルールは、このトピックについて私たちが知っているすべてを考慮に入れ、現在および将来のディストリビューションに関する問題を回避できる限り回避します。これらのルールに従うようにプロジェクトを更新することを検討してください。新しいコードを作成する場合は、それらを念頭に置いてください。
強調したいことの1つは、/ tmpと/ var / tmpが実際にユースケースに適しているとは限らないことです。これらのディレクトリの有効な使用方法はありますが、実際には別のディレクトリが実際にはより良い場所である場合があります。したがって、他のオプションを検討してください。ただし、/ tmpまたは/ var / tmpを使用する場合は、少なくともmkstemp()/ mkdtemp()を使用してください。
/tmp
上で説明したように、Xウィンドウシステムで使用されるレガシーソケットを使用します。 誤解しましたtmpfiles.d/x11.conf
。それは協力に依存しているように見えます:)。サービス拒否は起こりうる最悪の事態であるように、コードが監査されていると思います。