コンピュータセキュリティやシステム管理、そしてデジタルフォレンジック(デジタル鑑識)の世界では、ファイルの「完全性」を確認することが非常に重要です。ファイルが改ざんされていないか、意図しない変更が加えられていないかを確かめることは、システムの信頼性を保ち、インシデント調査を正確に進める上で不可欠な要素となります。
このようなニーズに応える強力なツールが hashdeep
です。このツールは、ファイルやディレクトリ内の多数のファイルに対して、複数のハッシュアルゴリズム(MD5, SHA-1, SHA-256, Tiger, Whirlpoolなど)を用いてハッシュ値を計算し、比較・監査することができます。特に、ディレクトリ構造を再帰的に処理できる点が大きな特徴です。
このブログ記事では、hashdeep
の基本的な概念から、インストール方法、具体的な使い方、そしてデジタルフォレンジックなどの実践的な活用例まで、詳しく解説していきます。さあ、hashdeep
の世界を探検しましょう!🚀
🤔 hashdeep とは何か? なぜ重要なのか?
hashdeep
は、ファイルの内容に基づいて一意の「指紋」とも言えるハッシュ値を計算するコマンドラインツールです。ハッシュ関数(例: MD5, SHA-256)をファイルデータに適用することで、固定長のハッシュ値が生成されます。もし2つのファイルのハッシュ値が同じであれば、その内容も同一であると高い確率で言えます(ただし、ハッシュ衝突の可能性も理論上は存在します)。
hashdeep
は、もともと md5deep
という名前のパッケージの一部として開発されました。md5deep
はMD5ハッシュに特化していましたが、より多くのハッシュアルゴリズムを扱えるように機能拡張され、hashdeep
として多機能化しました。現在では、MD5, SHA-1, SHA-256, Tiger, Whirlpool といった複数のアルゴリズムを同時に扱えるのが大きな利点です。
主な用途
- ファイル整合性チェック: ファイルが時間経過や転送中に破損・改ざんされていないかを確認します。
- デジタルフォレンジック: 証拠保全されたファイルの完全性を検証したり、既知の不正ファイル(マルウェアなど)や正常ファイル(OS標準ファイルなど)のリストと比較して、調査対象のファイルを分類したりします。
- バックアップとリストア: バックアップファイルの完全性を確認し、データ復旧時に一貫性を保証します。
- 重複ファイルの検出: システム内の同一ファイルを特定し、ストレージの最適化などに役立てます(ただし、ファイル名やパスが異なっていてもハッシュが同じなら同一内容とみなします)。
⚠️ 注意点: MD5 や SHA-1 は、現在では暗号学的な安全性が低い(衝突が見つけられやすい)とされています。セキュリティが重要な場面では、SHA-256 などのより強力なアルゴリズムの使用が推奨されます。hashdeep
はこれらのアルゴリズムに対応しています。
💻 hashdeep のインストール
hashdeep
は多くの Linux ディストリビューションの公式パッケージリポジトリに含まれているため、インストールは簡単です。また、Windows や macOS 用にも利用可能です。
Linux でのインストール
お使いのディストリビューションに合わせて、以下のコマンドを実行してください。
Debian / Ubuntu / Mint など:
sudo apt update
sudo apt install hashdeep
Fedora / CentOS / RHEL / Rocky Linux / AlmaLinux など:
sudo yum install hashdeep
# または
sudo dnf install hashdeep
Arch Linux / Manjaro など:
sudo pacman -S hashdeep
OpenSUSE:
sudo zypper install hashdeep
Gentoo Linux:
sudo emerge -a sys-apps/hashdeep
Alpine Linux:
sudo apk add hashdeep
Windows でのインストール
公式サイトや関連プロジェクト (例: GitHub Releases) からコンパイル済みのバイナリ (.exe
ファイル) をダウンロードできます。ダウンロードしたファイルを、パスの通ったディレクトリ(例: C:\Windows\System32
や、自分で作成したツール用フォルダなど)に配置します。
または、Chocolatey や Scoop といったパッケージマネージャーを使っている場合は、それらを通じてインストールできる可能性もあります。
macOS でのインストール
Homebrew を使用している場合、以下のコマンドでインストールできます。
brew install hashdeep
MacPorts を使用している場合は、以下のようになるでしょう。
sudo port install hashdeep
インストール後、ターミナル(またはコマンドプロンプト)で以下のコマンドを実行して、バージョン情報が表示されれば成功です。
hashdeep -V
🚀 hashdeep の基本的な使い方
hashdeep
の基本的な操作は、ハッシュ値の計算、ファイルへの保存、そして既知のハッシュリストとの比較です。
1. ファイルのハッシュ値を計算する
特定のファイルのハッシュ値を計算するには、-c
オプションでアルゴリズムを指定し、ファイル名を引数として渡します。デフォルトでは MD5 と SHA-256 が計算されます。
# デフォルト (MD5 と SHA-256) で計算
hashdeep my_document.txt
# SHA-256 のみ計算
hashdeep -c sha256 my_important_file.zip
# MD5 と SHA-1 を計算
hashdeep -c md5,sha1 image.jpg another_image.png
# 複数のファイルを指定
hashdeep file1.txt file2.dat
出力は以下のような形式になります(デフォルトの場合):
%%%% HASHDEEP-1.0
%%%% size,md5,sha256,filename
1234,d41d8cd98f00b204e9800998ecf8427e,e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,/path/to/my_document.txt
最初の2行はヘッダー情報で、3行目以降が各ファイルのサイズ、指定されたアルゴリズムのハッシュ値、ファイル名の順で表示されます。
2. ディレクトリ内のファイルを再帰的にハッシュ計算する
特定のディレクトリとそのサブディレクトリ内のすべてのファイルのハッシュ値を計算するには、-r
(recursive) オプションを使用します。
# /home/user/documents ディレクトリ以下を再帰的に処理 (デフォルトアルゴリズム)
hashdeep -r /home/user/documents
# /var/log ディレクトリ以下を SHA-256 で再帰的に処理
hashdeep -c sha256 -r /var/log
3. 計算結果をファイルに保存する
計算したハッシュ値を後で比較するためにファイルに保存するには、リダイレクト(>
)を使用します。
# カレントディレクトリ以下を再帰的にハッシュ計算し、hashes.txt に保存
hashdeep -r . > hashes.txt
# /data ディレクトリ以下を SHA-256 で計算し、data_sha256.txt に保存
hashdeep -c sha256 -r /data > data_sha256.txt
この hashes.txt
のようなファイルは「既知のハッシュリスト」として、後の監査や比較に使用できます。
4. ファイルの整合性を検証する (監査モード)
hashdeep
の最も強力な機能の一つが「監査モード (audit mode)」です。これは、事前に作成した「既知のハッシュリスト」ファイルと、現在のファイルシステムの状態を比較し、変更、追加、削除されたファイルを検出する機能です。-a
オプションで監査モードを有効にし、-k
オプションで既知のハッシュリストファイルを指定します。
# カレントディレクトリ以下を hashes.txt と比較して監査する
hashdeep -r -a -k hashes.txt .
# /data ディレクトリを data_sha256.txt と比較監査 (詳細表示)
hashdeep -r -a -k data_sha256.txt -v /data
-a
: 監査モードを有効にします。-k <file>
: 比較対象となる既知のハッシュリストファイルを指定します。複数回指定することも可能です。-r
: 再帰的にディレクトリを処理します。-v
: 詳細表示モード (Verbose)。複数回指定すると (-vv
,-vvv
)、さらに詳細な情報が出力されます。-v
: 各カテゴリ(一致、変更、新規、不明、削除)のファイル数を表示します。-vv
: 不一致(変更、新規、不明、削除)の詳細を表示します。-vvv
: 調査対象の全ファイルと既知リストの全ファイルの結果を表示します。
監査結果は、”Audit passed” (監査成功) または “Audit failed” (監査失敗) として表示されます。失敗した場合、-vv
オプションなどをつけることで、どのファイルが変更されたか、どのファイルが新たに追加されたか、どのファイルが見つからなかったかなどの詳細を確認できます。
5. 既知のハッシュリストと一致するファイルを探す (マッチングモード)
特定のファイル群が、既知のハッシュリストに含まれているかどうかを確認したい場合があります。例えば、システム内に既知のマルウェアが存在しないか、あるいは特定のツール群が正しくインストールされているかを確認するような場合です。これにはマッチングモード (-m
または -M
) を使用します。
# カレントディレクトリ以下で、known_good_files.txt に含まれるハッシュと一致するファイルを表示
hashdeep -r -m -k known_good_files.txt .
# /download ディレクトリ以下で、malware_hashes.txt に含まれるハッシュと一致するファイルとそのハッシュ値を表示
hashdeep -r -M -k malware_hashes.txt /download
-m
: 既知のハッシュリストに一致するファイル名のみを表示します。-M
: 既知のハッシュリストに一致するファイル名とそのハッシュ値を表示します。-k <file>
: 既知のハッシュリストファイルを指定します。-w
:-m
または-M
と併用し、一致した場合に、既知リスト側のどのファイルと一致したかを表示します。
6. 既知のハッシュリストと一致しないファイルを探す (ネガティブマッチングモード)
逆に、既知のリストに含まれて「いない」ファイルを探したい場合もあります。例えば、システム内に未知のファイル(潜在的な不正ファイルや設定外のファイル)がないかを確認するような場合です。これにはネガティブマッチングモード (-x
または -X
) を使用します。
# /etc ディレクトリ以下で、standard_config_hashes.txt に含まれないファイルを表示
hashdeep -r -x -k standard_config_hashes.txt /etc
# /usr/bin ディレクトリ以下で、approved_tools.txt に含まれないファイルとそのハッシュ値を表示
hashdeep -r -X -k approved_tools.txt /usr/bin
-x
: 既知のハッシュリストに一致しないファイル名のみを表示します。-X
: 既知のハッシュリストに一致しないファイル名とそのハッシュ値を表示します。-k <file>
: 既知のハッシュリストファイルを指定します。
⚙️ hashdeep の便利なオプションと機能
hashdeep
には、基本的な使い方以外にも多くの便利なオプションがあります。
オプション | 説明 | 例 |
---|---|---|
-r |
再帰モード。サブディレクトリを辿って処理します。 | hashdeep -r /path/to/dir |
-c <alg1>[,<alg2>...] |
使用するハッシュアルゴリズムを指定します (例: md5, sha1, sha256, tiger, whirlpool)。デフォルトは md5,sha256 です。 | hashdeep -c sha256,tiger file.dat |
-k <file> |
比較・監査用の既知のハッシュリストファイルを読み込みます。複数指定可能です。 | hashdeep -a -k known1.txt -k known2.txt . |
-a |
監査モード。-k で指定したリストと現在のファイルを比較します。 |
hashdeep -r -a -k baseline.txt / |
-m / -M |
ポジティブマッチングモード。-k リストに一致するファイルを表示 (-m : ファイル名のみ, -M : ハッシュも)。 |
hashdeep -r -m -k goodware.txt /opt |
-x / -X |
ネガティブマッチングモード。-k リストに一致しないファイルを表示 (-x : ファイル名のみ, -X : ハッシュも)。 |
hashdeep -r -x -k approved.txt /tmp |
-w |
-m や -M と併用し、どの既知ファイルと一致したかを表示します。 |
hashdeep -r -m -w -k known.txt . |
-l |
ファイルパスを相対パスで表示します。 | hashdeep -r -l . |
-b |
ファイルパスを含まず、ファイル名のみ (basename) を表示します。-l とは併用できません。 |
hashdeep -r -b /etc |
-s |
サイレントモード。エラーメッセージを抑制します。 | hashdeep -r -s /very/large/dir > /dev/null |
-e |
処理中のファイルごとに進行状況インジケータと推定残り時間を表示します。大きなファイルの処理時に便利です。(Windows の 4GB 超ファイルなど、一部環境では推定不可) | hashdeep -r -e /huge_data |
-p <size> |
ピースワイズハッシュモード。ファイルを指定したサイズ (例: 10M, 2G) のブロックに分割してハッシュ計算します。非常に大きなファイル用。 | hashdeep -p 1G large_disk_image.dd |
-i <size> / -I <size> |
サイズ閾値モード。指定したサイズより小さい (-i ) または大きい (-I ) ファイルのみを処理します。 |
hashdeep -r -i 10M /var/log |
-o <types> |
エキスパートモード。処理するファイルタイプを指定します (f: 通常ファイル, b: ブロックデバイス, c: キャラクターデバイス, p: 名前付きパイプ, l: シンボリックリンク, s: ソケットなど)。 | hashdeep -r -o f /dev (通常のファイルのみ) |
-d |
出力を DFXML (Digital Forensics XML) 形式にします。他のフォレンジックツールとの連携に役立ちます。 | hashdeep -r -d /evidence > evidence.dfxml |
-j <num> |
使用するスレッド数を指定します(デフォルトは通常4)。マルチコアCPUで処理を高速化できます。-j0 でマルチスレッドを無効にします。 |
hashdeep -r -j 8 /mnt/data |
-v |
冗長 (Verbose) モード。詳細な情報を出力します。複数回 (-vv , -vvv ) 指定するとさらに詳細になります。特に監査モードで有用です。 |
hashdeep -r -a -k known.txt -vv . |
💡 活用事例:デジタルフォレンジックとセキュリティ
hashdeep
は、その強力な機能から、特にデジタルフォレンジックやセキュリティインシデント対応の分野で広く活用されています。
1. 証拠保全データの完全性検証
デジタルフォレンジックの初期段階では、調査対象となるストレージデバイス(HDD, SSD, USBメモリなど)の完全なコピー(イメージ)を作成します。このプロセスを「イメージング」と呼びます。作成したイメージが元のデバイスと完全に同一であることを証明するために、ハッシュ値が用いられます。
- 元のデバイス全体のハッシュ値を計算します(例: dd, dcfldd, FTK Imager などのツールを使用)。
- デバイスのイメージを作成します。
- 作成されたイメージファイルのハッシュ値を、元デバイスと同じアルゴリズムで計算します。
- 両者のハッシュ値が一致すれば、イメージが正確に作成されたこと(完全性)が保証されます。
hashdeep
は、イメージファイル内の個々のファイルのハッシュ値を計算し、ベースラインと比較するためにも使用できます。例えば、証拠取得時に対象システム全体のファイルハッシュリストを作成しておき、後の分析段階で再度ハッシュ計算して比較することで、分析中に意図しない変更が加わっていないかを確認できます。
# 証拠イメージマウントポイント /mnt/evidence の初期ハッシュリスト作成
sudo hashdeep -r -c sha256 /mnt/evidence > initial_evidence_hashes.txt
# ... 分析作業後 ...
# 再度ハッシュを計算し、初期状態と比較監査
sudo hashdeep -r -a -k initial_evidence_hashes.txt -vv /mnt/evidence
2. 既知ファイルの識別 (Hashing / Hash Analysis)
フォレンジック調査では、大量のファイルの中から重要な証拠や不正なファイルを見つけ出す必要があります。ハッシュ値を利用することで、このプロセスを効率化できます。
- 既知の不正ファイルの特定 (マルウェアスキャン):
既知のマルウェアのハッシュ値リスト (ブラックリスト) を用意し、
hashdeep
のマッチングモード (-m
) を使って調査対象システム内に同じハッシュ値を持つファイルがないか検索します。NSRL (National Software Reference Library) や VirusTotal などの情報を基にしたハッシュセットが利用されることがあります。hashdeep -r -m -k known_malware_hashes.txt /path/to/suspect/system
- 既知の正常ファイルの除外 (Known Good Files):
OSの標準ファイルや一般的なアプリケーションファイルなど、調査対象外として明確に分かっているファイルのハッシュ値リスト (ホワイトリスト) を用意します。
hashdeep
のネガティブマッチングモード (-x
) を使って、これらの既知の正常ファイル「以外」のファイル(=調査対象となる可能性のあるファイル)を抽出します。これにより、調査対象を絞り込むことができます。NSRL のハッシュセットなどが利用できます。hashdeep -r -x -k known_good_files_nsrl.txt /path/to/suspect/system > potentially_interesting_files.txt
3. ファイル改ざん検知 (Integrity Monitoring)
システムの重要なファイル(設定ファイル、実行ファイル、ライブラリなど)が不正に改ざんされていないかを定期的にチェックすることは、セキュリティ維持において重要です。
- システムの正常な状態(ベースライン)で、監視対象としたいディレクトリやファイルのハッシュリストを作成し、安全な場所に保管します。
sudo hashdeep -r -c sha256 /etc /usr/bin /usr/sbin /lib /usr/lib > /root/system_baseline_hashes.txt
- 定期的に(例: cron ジョブなどで)再度ハッシュを計算し、ベースラインと比較監査します。
sudo hashdeep -r -a -k /root/system_baseline_hashes.txt -vv /etc /usr/bin /usr/sbin /lib /usr/lib
監査結果が “Audit failed” となった場合、どのファイルが変更、追加、削除されたかを確認し、不正アクセスの兆候やマルウェア感染の可能性を調査します。これは、Tripwire や AIDE といった専用のホスト型侵入検知システム (HIDS) と同様の機能を提供するものですが、hashdeep
はより手軽に導入・実行できます。
🛡️ セキュリティにおける応用:
ファイル整合性監視は、ランサムウェア攻撃の検知や、Webサーバーへの不正なファイルアップロード(Webシェル設置など)の早期発見にも役立ちます。
✨ まとめ
hashdeep
は、ファイルやディレクトリのハッシュ値を効率的に計算、比較、監査するための非常に強力で多機能なコマンドラインツールです。複数のハッシュアルゴリズムに対応し、再帰的な処理やマッチング、監査モードといった豊富な機能を備えています。
その主な用途は以下の通りです。
- ファイルが改ざんされていないかを確認するファイル整合性チェック。
- デジタル証拠の完全性を保証し、既知のファイルを効率的に識別・分類するデジタルフォレンジック。
- システムの重要なファイルへの変更を検知するセキュリティ監視。
- バックアップデータの正確性を確認するデータ管理。
基本的な使い方から、監査モードやマッチングモード、その他の便利なオプションを組み合わせることで、様々なシナリオに対応できます。特に、セキュリティ専門家やシステム管理者、フォレンジック調査員にとって、hashdeep
は欠かせないツールの一つと言えるでしょう。
このツールを使いこなすことで、デジタルデータの信頼性を確保し、より安全で効率的なコンピューティング環境を維持するための一助となるはずです。ぜひ、あなたの環境で hashdeep
を試してみてください!💪
コメント