dd および dcfldd によるディスクイメージの取得
使用すべき状況
- 調査のために被疑ドライブのフォレンジックコピーを作成する必要がある場合
- インシデント対応において、分析前に揮発性ディスク証拠を保存する場合
- 法執行機関や法的手続きにおいて、検証済みのビット単位コピーが必要な場合
- ストレージデバイスに対して破壊的な分析を実行する前
- 物理ドライブ、USB デバイス、メモリカードからイメージを取得する場合
前提条件
- Linux ベースのフォレンジックワークステーション(SIFT、Kali、または任意の Linux ディストリビューション)
dd(すべての Linux システムにプリインストール)またはdcfldd(拡張フォレンジック版)- ハードウェアライトブロッカー、またはソフトウェア書き込み保護が設定されていること
- ソースよりも大きい容量の保存先ドライブ
- フォレンジックワークステーションでの root/sudo 権限
- SHA-256 または MD5 ハッシュユーティリティ(
sha256sum、md5sum)
ワークフロー
ステップ 1: ターゲットデバイスの特定と書き込み保護の有効化
# 接続されているすべてのブロックデバイスを一覧表示してターゲットを特定
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL
# デバイスの詳細を確認
fdisk -l /dev/sdb
# ソフトウェア書き込み保護を有効化(ハードウェアブロッカーがない場合)
blockdev --setro /dev/sdb
# 読み取り専用ステータスを確認
blockdev --getro /dev/sdb
# 出力: 1(読み取り専用が有効)
# または、永続的な書き込み保護のために udev ルールを使用
echo 'SUBSYSTEM=="block", ATTRS{serial}=="WD-WCAV5H861234", ATTR{ro}="1"' > /etc/udev/rules.d/99-writeblock.rules
udevadm control --reload-rules
ステップ 2: 保存先の準備とソースの文書化
# ケースディレクトリ構造を作成
mkdir -p /cases/case-2024-001/{images,hashes,logs,notes}
# ソースドライブ情報を文書化
hdparm -I /dev/sdb > /cases/case-2024-001/notes/source_drive_info.txt
# シリアル番号とモデルを記録
smartctl -i /dev/sdb >> /cases/case-2024-001/notes/source_drive_info.txt
# ソースデバイスの事前ハッシュを取る
sha256sum /dev/sdb | tee /cases/case-2024-001/hashes/source_hash_before.txt
ステップ 3: dd を使用したイメージ取得
# 進行状況表示とエラーハンドリング付きの基本的な dd 取得
dd if=/dev/sdb of=/cases/case-2024-001/images/evidence.dd \
bs=4096 \
conv=noerror,sync \
status=progress 2>&1 | tee /cases/case-2024-001/logs/dd_acquisition.log
# 容量節約のための圧縮イメージ
dd if=/dev/sdb bs=4096 conv=noerror,sync status=progress | \
gzip -c > /cases/case-2024-001/images/evidence.dd.gz
# 特定のカウントを使用した部分取得
dd if=/dev/sdb of=/cases/case-2024-001/images/first_1gb.dd \
bs=1M count=1024 status=progress
ステップ 4: dcfldd を使用した取得(推奨フォレンジック手法)
# dcfldd がインストールされていない場合はインストール
apt-get install dcfldd
# 内蔵ハッシュと分割出力を使用したイメージ取得
dcfldd if=/dev/sdb \
of=/cases/case-2024-001/images/evidence.dd \
hash=sha256,md5 \
hashwindow=1G \
hashlog=/cases/case-2024-001/hashes/acquisition_hashes.txt \
bs=4096 \
conv=noerror,sync \
errlog=/cases/case-2024-001/logs/dcfldd_errors.log
# 大規模イメージを管理可能なセグメントに分割
dcfldd if=/dev/sdb \
of=/cases/case-2024-001/images/evidence.dd \
hash=sha256 \
hashlog=/cases/case-2024-001/hashes/split_hashes.txt \
bs=4096 \
split=2G \
splitformat=aa
# 検証パス付き取得
dcfldd if=/dev/sdb \
of=/cases/case-2024-001/images/evidence.dd \
hash=sha256 \
hashlog=/cases/case-2024-001/hashes/verification.txt \
vf=/cases/case-2024-001/images/evidence.dd \
verifylog=/cases/case-2024-001/logs/verify.log
ステップ 5: イメージ整合性の検証
# 取得したイメージのハッシュを取る
sha256sum /cases/case-2024-001/images/evidence.dd | \
tee /cases/case-2024-001/hashes/image_hash.txt
# ソースハッシュとイメージハッシュを比較
diff <(sha256sum /dev/sdb | awk '{print $1}') \
<(sha256sum /cases/case-2024-001/images/evidence.dd | awk '{print $1}')
# 分割イメージを使用する場合、各セグメントを検証
sha256sum /cases/case-2024-001/images/evidence.dd.* | \
tee /cases/case-2024-001/hashes/split_image_hashes.txt
# ソースを再ハッシュして変更がないことを確認
sha256sum /dev/sdb | tee /cases/case-2024-001/hashes/source_hash_after.txt
diff /cases/case-2024-001/hashes/source_hash_before.txt \
/cases/case-2024-001/hashes/source_hash_after.txt
ステップ 6: 取得プロセスの文書化
# 取得レポートを生成
cat << 'EOF' > /cases/case-2024-001/notes/acquisition_report.txt
DISK IMAGE ACQUISITION REPORT
==============================
Case Number: 2024-001
Date/Time: $(date -u +"%Y-%m-%d %H:%M:%S UTC")
Examiner: [Name]
Source Device: /dev/sdb
Model: [from hdparm output]
Serial: [from hdparm output]
Size: [from fdisk output]
Acquisition Tool: dcfldd v1.9.1
Block Size: 4096
Write Blocker: [Hardware/Software model]
Image File: evidence.dd
Image Hash (SHA-256): [from hash file]
Source Hash (SHA-256): [from hash file]
Hash Match: YES/NO
Errors During Acquisition: [from error log]
EOF
# アーカイブ用にログを圧縮
tar -czf /cases/case-2024-001/acquisition_package.tar.gz \
/cases/case-2024-001/hashes/ \
/cases/case-2024-001/logs/ \
/cases/case-2024-001/notes/
主要概念
| 概念 | 説明 |
|---|---|
| ビット単位コピー | 未割り当て領域やスラックスペースを含むソースの正確な複製 |
| ライトブロッカー | 証拠メディアへの書き込みを防ぐハードウェアまたはソフトウェア機構 |
| ハッシュ検証 | ソースとイメージを比較して整合性を証明する暗号学的ハッシュ |
| ブロックサイズ (bs) | 速度に影響する転送チャンクサイズ、フォレンジックでは 4096 または 64K が一般的 |
| conv=noerror,sync | 読み取りエラーでも続行し、ゼロでパディングしてオフセットの位置を維持 |
| チェーンオブカストディ | 証拠が改ざんされていないことを証明する文書化された経路 |
| 分割イメージング | 大規模イメージを小さなファイルに分割して保存および転送 |
| Raw/dd 形式 | メタデータコンテナのオーバーヘッドがないビット単位のイメージ形式 |
ツールとシステム
| ツール | 目的 |
|---|---|
| dd | 標準 Unix ディスク複製ユーティリティ、raw イメージング用 |
| dcfldd | DoD コンピュータフォレンジック研究所による強化版 dd、ハッシュ機能付き |
| dc3dd | DoD サイバー犯罪センターによる別のフォレンジック dd バリアント |
| sha256sum | 整合性検証のための SHA-256 ハッシュ計算 |
| blockdev | ブロックデバイスの読み取り専用モードを設定する Linux コマンド |
| hdparm | ドライブ識別とパラメータレポート |
| smartctl | ドライブの健全性と識別のための S.M.A.R.T. データ取得 |
| lsblk | ブロックデバイスの列挙と識別 |
一般的なシナリオ
シナリオ 1: 被疑者のラップトップハードドライブの取得
Tableau T35u ハードウェアライトブロッカー経由でドライブを接続し、/dev/sdb として特定、SHA-256 ハッシュ付き dcfldd を使用、DVD アーカイブ用に 4GB セグメントに分割、ハッシュの一致を検証、ケースノートに文書化。
シナリオ 2: 侵害されたワークステーションからの USB フラッシュドライブのイメージング
blockdev --setro でソフトウェア書き込み保護を使用、MD5 と SHA-256 の二重ハッシュを含む dcfldd で取得、イメージは単一ファイルに十分小さい、検証後、暗号化されたケースドライブに保存。
シナリオ 3: ネットワーク経由のリモート取得
netcat または ssh 経由でパイプされた dd を使用してリモート取得: ssh root@remote "dd if=/dev/sda bs=4096" | dd of=remote_image.dd bs=4096、両端で独立してハッシュを計算し、転送の整合性を検証。
シナリオ 4: 障害発生ドライブからの取得
最初に ddrescue を使用して読み取り可能なセクタを復元、その後 dd を conv=noerror,sync で使用してギャップをゼロで埋め、エラーログにどのセクタが読み取り不能だったかを文書化。
出力形式
Acquisition Summary:
Source: /dev/sdb (500GB Western Digital WD5000AAKX)
Destination: /cases/case-2024-001/images/evidence.dd
Tool: dcfldd 1.9.1
Block Size: 4096 bytes
Duration: 2h 15m 32s
Bytes Copied: 500,107,862,016
Errors: 0 bad sectors
Source SHA-256: a3f2b8c9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1
Image SHA-256: a3f2b8c9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1
Verification: PASSED - Hashes match