- テンポラリディレクトリっていうのは、プログラムが処理中に一時的なデータを置いておくための専用フォルダで、LinuxやMacなら/tmp、Windowsなら%TEMP%がそれにあたるよ。
- ディスクへの書き込みを避けてRAMで処理したい一時データの中継点として機能しており、ファイル変換・解凍・セッションデータの一時保存などで縁の下の力持ち的な役割を担っている。
- テンポラリディレクトリの扱いを間違えると、本番サーバーのディスクが溢れてサービス停止につながったり、機密データが意図せず平文で残ったりする事故が起きる。
【深掘り】これだけ知ってればOK!
テンポラリディレクトリはPOSIX標準でその存在が定義されており、LinuxおよびmacOSでは/tmp(または/var/tmp)がデフォルトの一時ファイル置き場となる。Windowsでは環境変数TEMPまたはTMPが指すパス(通常C:\Users\ユーザー名\AppData\Local\Temp)がそれに相当する。Pythonではtempfileモジュール、JavaではFiles.createTempFile()、Node.jsではosモジュールのtmpdir()関数がOSのテンポラリディレクトリを取得するAPIとして提供されており、ハードコードせずにOSに問い合わせる方式が移植性の点で推奨される。
テンポラリディレクトリに関するセキュリティリスクとして最も重要なのは「シンボリックリンク攻撃(Symlink Attack)」だ。/tmpは通常すべてのユーザーが書き込み可能なスティッキービットディレクトリであるため、攻撃者が事前に予測可能なファイル名のシンボリックリンクを設置し、特権プロセスがそのファイルに書き込む際に任意のファイルを上書きさせることができる。これを防ぐためにはtempfileモジュールのmkdtemp()やmkstemp()のように、ランダムなサフィックスを持つユニークな一時ファイルを生成するAPIを必ず使用し、ファイル名を予測可能にしないことが鉄則だ。
マイクロサービス・コンテナ時代においてテンポラリディレクトリの管理は従来以上に重要性を増している。複数コンテナが同一ノードで稼働する環境ではホストの/tmpをバインドマウントで共有する設計が情報漏洩のリスクになりうる。各コンテナが独立したtmpfsをマウントし、コンテナ終了時に自動でクリアされる設計が現在のセキュリティベストプラクティスとされている。
よくある誤解
テンポラリディレクトリのファイルはOS再起動で必ず消えるという誤解
/var/tmpはシステム再起動をまたいで保持されるように設計されており、/tmpも設定によっては自動削除されないケースがある。「一時ファイルだから放置してよい」という判断は誤りで、長期稼働するサーバーでは定期的な手動またはsystemd-tmpfilesによるクリーンアップ設計が必要だ。
全ての一時ファイルは/tmpに置けば安全なのか?
/tmpはシステム上の全ユーザーが読み取れる可能性があるディレクトリだ。パスワードや個人情報などの機密データを/tmpに平文で書き出すのは重大なセキュリティリスクとなる。機密を含む一時ファイルはプロセスのメモリ内またはパーミッションが厳格に制御されたディレクトリに限定すべきではないだろうか。
会話での使われ方

デプロイスクリプトが失敗したのは/tmpの空き容量がゼロになってたからです。tmpディレクトリのクリーンアップをCronに入れておくべきでした。
インフラエンジニアが本番障害のポストモーテムでテンポラリディレクトリ溢れを原因として報告している場面。




Pythonのtempfile.mkstemp()を使えば、ファイル名がランダムになるからシンボリックリンク攻撃を防げる。ハードコードのファイル名は絶対使わないこと。
セキュリティエンジニアがコードレビューで一時ファイル生成の実装方法を指摘している場面。




コンテナのビルドプロセスで生成される一時ファイルがイメージレイヤーに残っていて、イメージサイズが2GB超えてる。マルチステージビルドかtmpfsマウントで対応しましょう。
SREがCI/CDパイプラインのDockerイメージ最適化をDevチームに提案している場面。
【まとめ】3つのポイント
- テンポラリディレクトリはOSが提供する一時ファイルの標準置き場:Linux/macOSの/tmp、Windowsの%TEMP%がその実体で、プログラムから取得する際はハードコードせずOS APIを通じて動的に参照するのが移植性・安全性の観点から必須だ。
- シンボリックリンク攻撃への対策としてランダムファイル名を使う:mkstemp()/mkdtemp()などのAPIはランダムサフィックスを付与したユニークな一時ファイルを生成するため、攻撃者によるファイル名予測を防ぐ。全ての一時ファイル生成はこれらAPIを経由すること。
- コンテナ環境ではtmpfsマウントで一時領域を独立させる:overlayfsに一時ファイルが残るとイメージ肥大化・情報漏洩のリスクが生じる。–tmpfs /tmpオプションでメモリ上に一時領域を確保し、コンテナ終了と同時に自動消去される設計が現在のベストプラクティスだ。
よくある質問
-
QPythonで安全に一時ファイルを作成する方法を教えてください。
-
A
tempfileモジュールのmkstemp()またはNamedTemporaryFile()を使用してください。これらはランダムなファイル名を生成し、プロセス終了時または明示的なclose()でファイルを削除するオプションも持っています。with文と組み合わせるのが最も安全な使い方です。
-
Q/tmpと/var/tmpの違いは何ですか?
-
A
/tmpは再起動時にクリアされることが多く短期的な一時ファイル向けです。/var/tmpは再起動後も保持されることが多く、より長期間保存が必要な一時ファイルに使います。ただし両者の挙動はディストリビューションとsystemd設定によって異なります。
-
Qテンポラリディレクトリが溢れたときの対処法は何ですか?
-
A
まずdu -sh /tmp/*で容量を消費しているファイルを特定します。古いファイルをfind /tmp -atime +7 -deleteで削除し、再発防止のためにsystemd-tmpfiles.confまたはcronで定期クリーンアップジョブを設定します。
-
Qテンポラリディレクトリとキャッシュディレクトリの違いは何ですか?
-
A
テンポラリディレクトリはプロセス実行中のみ必要な一時データを格納し、処理完了後は不要になります。キャッシュディレクトリ(/var/cache等)は繰り返し使う計算済みデータを保存し、パフォーマンス向上のために意図的に残しておく点が異なります。
この用語と一緒に知っておきたい用語
| 用語 | この記事との関連 |
|---|---|
| コンテナ | コンテナは関連分野でよく登場する重要キーワードです。アプリの動作に必要なプログラム・設定・ライブラリを一箱にまとめて、どこでも同じように動かせる軽量な仮想化技術だ。 |
| データ | 本記事のテーマと実務上セットで使われることが多い用語です。コンピュータが処理する数値や文字、画像といった事実や資料そのもの、それがデータだ |
| モジュール | 本記事のテーマと実務上セットで使われることが多い用語です。プログラムやシステムを機能・役割ごとに分割した独立した構成単位のこと。関数・クラス・ファイル・パッケージ・ライブラリなど粒度はさまざまだが「一つのまとまった機能を担う独立した部品」という概念は共通だ |
| マウント | 次のステップとしてマウントを学ぶと知識が広がります。マウントの主要な特徴と用途を理解することで、関連する技術・制度・概念を正確に把握できるようになる |
| シンボリックリンク | シンボリックリンクは関連分野でよく登場する重要キーワードです。シンボリックリンクの主要な特徴と用途を理解することで、関連する技術・制度・概念を正確に把握できるようになる |
【出典】参考URL
https://www.freedesktop.org/software/systemd/man/tmpfiles.d.html:systemd-tmpfilesの公式設定リファレンス
https://docs.python.org/3/library/tempfile.html:Python tempfileモジュール公式ドキュメント


コメント