GNU/Linux >> Linux の 問題 >  >> Linux

/tmp と /run の違いは何ですか?

ディレクトリ /tmp/usr/tmp (後で /var/tmp ) は、すべての人のゴミ捨て場でした。これらのディレクトリ内のファイルに対する唯一の保護メカニズムは、ファイルの削除または名前変更を所有者に制限するスティッキー ビットです。 marcelm がコメントで指摘したように、原則として、サービスで使用される名前 (nginx.pid など) のファイルを誰かが作成することを妨げるものは何もありません。 または sshd.pid )。 (ただし、実際には、起動スクリプトはそのような偽のファイルを最初に削除できます。)

/run ロック、ソケット、pid ファイルなどの長期サービスの非永続的なランタイム データ用に確立されました。公開されていないため、/tmp の混乱からサービス ランタイム データを保護します。 そしてそこをきれいにする仕事。確かに:私が実行している 2 つのディストリビューション (しゃれた意図はありません) には、/run に対する権限 755 があります。 、 /tmp の間 そして /var/tmp (そして /dev/shm さらに言えば) パーミッション 1777 を持っています。


/tmp 一時ファイルとディレクトリを作成する場所です。名前空間の所有者は誰もいないため、「よく知られている名前」(つまり、別のプロセスに名前を伝えなくても認識できる名前)の保存には使用できません。誰でもそこでファイルを作成できます。そのため、通常、入力または出力としてファイル (つまり、パイプなどではない) を必要とするユーティリティがある場合に使用します。この場合、名前を渡す限り、(ランダムに生成された) 名前が機能します。

歴史的に、いくつかのもの (X など) はこの原則に違反し、よく知られている名前 (.X11-unix など) を付けました。 ) /tmp で .もちろんこれにはバグがあり、最初に目的の名前でファイルを作成するために競争するだけで、必要なサービスを DoS することができます。そのようなものは /run に属します (または同等の /var/run Freedesktop.org の修正主義に加入していない場合)。もちろん、グローバル名前空間でよく知られている名前を使用せず、代わりにパス名を渡すように修正することをお勧めします。


/run と /tmp の両方を使用する理由はありません

私はあなたが正しいと思います。 /tmp /run ができたので、基本的に非推奨です .あなたのプログラムがそうする立場にある場合 (これには、インストール済み である必要があります) 特権操作として)、最近では /run のサブディレクトリを使用します .これはセキュリティ上の理由によるものです。

例えば。 CUPS 印刷デーモンはルートとして実行されませんが、通常は 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 を読み間違えました .協力に依存しているように見えます:)。サービス拒否が起こりうる最悪の事態であるように、コードは監査されていると思います。


    Linux
    1. Linuxは複数の連続したパスセパレーター(/ home //// username /// file)をどのように処理しますか?

    2. Bash =〜正規表現とHttps://regex101.com/?

    3. / sbin/nologinと/bin/ falseの違いは何ですか?

    1. ‘$の違い。 Foo」と「$./foo」??

    2. /bin と /usr/bin の違い

    3. Linux の /etc/init.d と /etc/rcX.d ディレクトリの間の接続は何ですか?

    1. Linux:/dev/console 、 /dev/tty 、 /dev/tty0 の違い

    2. デフォルトの /tmp を /home/user/tmp に変更する方法

    3. /etc/hosts と /etc/resolv.conf の違い