ディレクトリ完全ガイド:ファイルシステムとディレクトリサービスの仕組み・運用・セキュリティ
ディレクトリとは(概念の整理)
ITにおける「ディレクトリ」は文脈によって二つの主要な意味を持ちます。一つはファイルシステム上のディレクトリ(一般的に「フォルダ」とも呼ばれる)で、ファイルや他のディレクトリを階層的に整理するための構造体です。もう一つはネットワーク/認証分野のディレクトリサービス(LDAPやActive Directoryなど)で、ユーザー、グループ、ポリシー、リソース情報を階層化して格納・検索・認証に利用します。本稿では両者を分けて仕組み、運用、性能、セキュリティ観点から深掘りします。
ファイルシステムにおけるディレクトリの構造と基本概念
ファイルシステムのディレクトリは、ファイル名とファイルを特定する参照(UNIX系ならinode番号、Windows/NTFSならファイルレコードなど)とのマッピングを保持するエントリの集合です。典型的な要素は次の通りです。
- ルート(/ やドライブルート)から始まるツリー状の階層構造。
- 相対パスと絶対パス。絶対パスはルートからの経路、相対パスはカレントディレクトリからの経路。
- 特殊エントリ「.」(カレントディレクトリ)と「..」(親ディレクトリ)。
- ファイル名の長さ制限(多くのファイルシステムで1ファイル名あたり255バイト程度)やパス長制限(POSIX系では実装依存だが、一般的に4096バイトを想定)。
主要なシステムコールとユーティリティ
UNIX系ではmkdir(), rmdir(), unlink(), rename(), opendir()/readdir()/closedir() などのAPIでディレクトリ操作を行います。ユーザー空間のコマンドとしては mkdir, rmdir, ls, find, tree, rm -r などが使われます。WindowsではCreateDirectoryやRemoveDirectory、FindFirstFile/FindNextFile等のAPIが対応します。ファイル操作の際はパス名の正規化(canonicalization)を正しく行うことが重要です。
パーミッションと特別なビットの意味
POSIX系のパーミッション表現(rwx)はファイルとディレクトリで意味が異なります。ディレクトリに対する「読み取り(r)」はエントリを一覧表示する権限、「書き込み(w)」は新規作成や削除などエントリの追加・削除、「実行(x)」はディレクトリを通過(traverse)してその中のファイルにアクセスできるかを示します。加えてsticky bit(1777)が設定されたディレクトリ(例:/tmp)は、ディレクトリに対して書き込み権があっても所有者とrootだけが自身のファイルを削除できるようになります。setgid ビットをディレクトリに設定すると、新規作成ファイルのグループがディレクトリのグループを継承するなどの効果があります。
リンク(ハードリンクとシンボリックリンク)の扱い
ハードリンクは同一ファイルシステム内でinode(または同等の識別子)への追加参照を作成します。ハードリンクはディレクトリには通常作成できない制限がある(ループを避けるため)一方、シンボリックリンク(シンボリック参照)はパス名を保存する特殊ファイルで、ファイルシステムをまたいだ参照やディレクトリへの参照も可能です。削除時の振る舞いはリンク種別で異なり、ハードリンクが残る限り元データは残存します。
実装と性能:大規模ディレクトリの扱い
単純な線形リストでディレクトリエントリを管理すると大量ファイルの検索や作成時に線形時間を要するため、近年のファイルシステムはディレクトリをハッシュ構造やB-treeで管理します。例としてext3/ext4のHTree、XFSのB+tree、ReiserFSのツリー構造などがあります。これにより数百万エントリがあるディレクトリでも操作が現実的な時間で行えます。
Linuxカーネルはdentryキャッシュ(dcache)を使ってパス解決を高速化します。dentryはVFS(仮想ファイルシステム)レイヤでのキャッシュ機構で、短期的なアクセスが多いパスの解決コストを低減します。頻繁にアクセスされるディレクトリやファイルはdentry/ページキャッシュに残るため、I/O負荷とレイテンシにも影響します。
ファイルシステム固有の制約と設定
- ファイル名長:多くのFSで255バイト(例:ext4, NTFS)。
- パス長:POSIXでは実装依存だが、実務では4096バイトを見越す。Windowsは従来MAX_PATH=260文字の制限があったが、近年は長いパスのサポートがある(アプリやAPIの対応が必要)。
- マウントオプション:noexec, nodev, nosuidなどによりセキュリティと動作を制御可能。
Windowsのディレクトリ(NTFS等)の特徴
WindowsではドライブレターやUNCパス(\\server\\share)による命名、バックスラッシュ(\\)を区切りに用います。NTFSはMaster File Table(MFT)でファイル・ディレクトリを管理し、ジャーナリングや拡張属性、ACL(アクセス制御リスト)をサポートします。Windowsは既定で大文字小文字を区別しない(case-insensitive)挙動ですが、ファイルシステムレベルや設定によって大文字小文字を区別できる場合もあります。
ディレクトリサービス(LDAP / Active Directory)の基礎
ネットワークの文脈での「ディレクトリ」は、LDAP(Lightweight Directory Access Protocol)やMicrosoft Active Directory(AD)のようなディレクトリサービスを指します。これらは階層的なスキーマでエントリ(ユーザー、グループ、コンピュータ、ポリシーなど)を表現し、検索(フィルタ式)、認証、認可、レプリケーションを提供します。LDAPはRFC 4510以降で標準化され、ADはLDAP互換のAPIを提供するとともにKerberosベースの認証、Group Policyなどを統合しています。
セキュリティと脆弱性(ディレクトリトラバーサル等)
ディレクトリに関連する攻撃や誤設定は多岐にわたります。典型的な脆弱性は以下の通りです。
- ディレクトリトラバーサル(Path Traversal): 入力に"../"などを含めて任意のファイルにアクセスさせる攻撃。対策は入力の正規化、ホワイトリスト、アクセス権の最小化。
- ディレクトリ列挙(Directory Listing): Webサーバがインデックスファイルを返さずにディレクトリの内容を表示する設定は情報漏洩の原因になる。
- 不適切なパーミッション: world-writableなディレクトリや不正なACLはファイルの改ざんや削除を招く。
- 認証ディレクトリのレプリケーション/同期ミス: ADやLDAPでの不整合は認証停止や権限昇格につながる。
運用上のベストプラクティス
実運用における推奨事項は次の通りです。
- ディレクトリ構造は論理的でスケーラブルに設計する。巨大な単一ディレクトリは避け、ハッシュやサブディレクトリ分割を検討する。
- /tmpのような一時ディレクトリは適切にstickyビットを設定し、必要ならnoexecでマウントする。
- バックアップとスナップショットを定期的に取得する。ディレクトリ階層のロールバックについて設計しておく。
- アクセスログや監査ログを有効にして、ディレクトリ操作の異常を検知できるようにする。
- ネットワークディレクトリはレプリケーションやTLS保護、堅牢なパスワード/鍵管理を行う。
- Web公開ディレクトリではディレクトリ列挙を無効化し、入力の正規化とファイル名検証を徹底する。
まとめ
「ディレクトリ」は単なるファイルの入れ物以上の重要な役割を持ちます。ファイルシステム実装の違いにより性能や制限が変わり、パーミッションや特別ビットの意味を理解することは安全運用の前提です。さらに従来のファイル系ディレクトリだけでなく、LDAPやActive Directoryのようなネットワークディレクトリは組織の認証・認可基盤として不可欠です。適切な設計、権限管理、定期的な監査とバックアップにより、ディレクトリに関連するリスクを低減できます。
参考文献
The Open Group Base Specifications (POSIX)
Linux kernel - Filesystems documentation
Linux man-pages: pathconf(2) / path limits (man7)
Microsoft Docs: Maximum Path Length Limitation
RFC 4510: Lightweight Directory Access Protocol (LDAP): Technical Specification Road Map
投稿者プロフィール
最新の投稿
用語2025.12.21全音符を徹底解説:表記・歴史・演奏実務から制作・MIDIへの応用まで
用語2025.12.21二分音符(ミニム)のすべて:記譜・歴史・実用解説と演奏での扱い方
用語2025.12.21四分音符を徹底解説:記譜法・拍子・演奏法・歴史までわかるガイド
用語2025.12.21八分音符の完全ガイド — 理論・記譜・演奏テクニックと練習法

