Linux におけるファイル整合性検証:md5sum を用いた実践的手法

Linux 環境では、ファイルの内容が意図せず変更・破損していないかを確認する作業は、システム運用やデータ管理の基本的なセキュリティ対策です。MD5 ハッシュは、ファイルのバイナリ内容から固定長(128 ビット)のダイジェスト値を生成するアルゴリズムであり、たとえ1バイトでも変化すれば出力が完全に異なります。`md5sum` コマンドは、このハッシュ計算と検証を一貫して行える標準ツールで、本稿ではインストール方法からスクリプト連携まで、実務に即した使い方を体系的に解説します。

なぜファイルの整合性を検証するのか?

MD5 検証は、「ファイルの中身が確実に変わっていない」という信頼性を数値で保証する手段です。具体的な活用例として以下のようなケースがあります:
  • ダウンロード後の検証:オープンソースパッケージを公式サイトから取得した直後に、配布元が提示するハッシュ値と照合し、通信途上での欠落や改ざんを排除
  • バックアップの信頼性確認:アーカイブ処理後のファイルと元ファイルの MD5 を比較し、圧縮・転送によるデータ損失を検出
  • 構成ファイルの監視:`/etc/hosts` や `/etc/crontab` のような重要設定ファイルについて、定期的にハッシュを再計算し、不審な変更を早期発見
  • 重複ファイルの高速判別:数千個のログや画像ファイルから、中身が同一のものをグループ化する際に、全ファイルを逐次比較するより効率的
補足として、MD5 はファイルのメタデータ(所有者、パーミッション、タイムスタンプなど)には一切影響されません。つまり、`chmod 600 config.yml` を実行しても、内容が変わらなければハッシュ値は不変です。

md5sum の準備と基本操作

ほとんどの Linux ディストリビューション(Ubuntu、CentOS、AlmaLinux、Debian など)では、`coreutils` パッケージに含まれるため、デフォルトで利用可能です。万が一未導入の場合、以下のコマンドで追加できます:
# Debian / Ubuntu
sudo apt update && sudo apt install -y coreutils

# RHEL / Rocky Linux / AlmaLinux
sudo dnf install -y coreutils

単一ファイルのハッシュ生成

最もシンプルな使い方です。引数にファイルパスを指定すると、ハッシュ値とそのパスがスペース区切りで出力されます:
md5sum /etc/hosts
実行結果例:
9e107d9d372bb6826bd81d3542a419d6  /etc/hosts
左側の32文字はハッシュ値、右側は入力時に指定したパス形式(絶対パス/相対パス)がそのまま反映されます。

複数ファイルの一括ハッシュ生成

複数のファイルを同時に処理することで、内容の同一性を即座に判断できます。例えば、同一ファイルを異なる名前でコピーした場合:
cp /etc/hosts /tmp/hosts_orig
cp /etc/hosts /tmp/hosts_copy
md5sum /tmp/hosts_orig /tmp/hosts_copy
出力は以下のようになります:
9e107d9d372bb6826bd81d3542a419d6  /tmp/hosts_orig
9e107d9d372bb6826bd81d3542a419d6  /tmp/hosts_copy
両者のハッシュ値が一致すれば、内容が完全に等価であることを示します。

検証ワークフロー:ハッシュ記録の作成と再検証

単発のハッシュ生成にとどまらず、長期的な整合性監視を行うには、ハッシュ値をファイルに保存し、後続で自動検証する仕組みが不可欠です。これには `-c`(check)オプションが使われます。

ステップ1:ハッシュリストの作成

標準出力をリダイレクトすることで、複数ファイルのハッシュ情報をテキストファイルに保存できます。拡張子は `.checksums` など任意ですが、識別性を高めるために推奨します:
md5sum /tmp/hosts_orig /tmp/hosts_copy > /var/log/host-checksums.checksums
生成されたファイルの中身は、`md5sum` の通常出力と同一形式です:
9e107d9d372bb6826bd81d3542a419d6  /tmp/hosts_orig
9e107d9d372bb6826bd81d3542a419d6  /tmp/hosts_copy

ステップ2:記録に基づく検証実行

保存済みのチェックサムファイルを引数に与えると、`md5sum` は各エントリのパスを読み込み、そのファイルの現在のハッシュを再計算し、記録と比較します:
md5sum -c /var/log/host-checksums.checksums
正常時の出力:
/tmp/hosts_orig: OK
/tmp/hosts_copy: OK

ステップ3:改変検出の動作確認

片方のファイルを編集してハッシュが変わる状態を作り、検証を再実行します:
echo "# modified" >> /tmp/hosts_copy
md5sum -c /var/log/host-checksums.checksums
出力結果:
/tmp/hosts_orig: OK
/tmp/hosts_copy: FAILED
md5sum: WARNING: 1 of 2 computed checksums did NOT match
このように、不一致があるファイルのみ明示的に表示され、かつ全体の一致率も警告メッセージで通知されます。

スクリプト連携向け高度なオプション

CI/CD パイプラインや cron 定期タスクで `md5sum` を活用する際、不要な出力を抑制し、プログラム的に判定できるようにするためのオプションがあります。

`--quiet`:成功メッセージを非表示化

すべての検証結果を表示せず、失敗した項目のみを出力します。ログ解析やアラートトリガーに最適です:
md5sum --quiet -c /var/log/host-checksums.checksums
出力例(失敗時のみ):
/tmp/hosts_copy: FAILED
md5sum: WARNING: 1 of 2 computed checksums did NOT match

`--status`:出力を完全に抑制し、終了コードで判定

このオプションは、あらゆる標準出力・エラー出力を抑止し、シェルスクリプト内で `$?` を参照して分岐させるのに不可欠です:
  • 終了コード 0:すべてのファイルが一致
  • 終了コード 1:1つ以上のファイルが不一致(内容変更)
  • 終了コード 2:ファイルが存在しない、権限不足などI/Oエラー
実装例(Bash スクリプト):
#!/bin/bash
CHECKSUM_FILE="/var/log/host-checksums.checksums"

if md5sum --status -c "$CHECKSUM_FILE" > /dev/null 2>&1; then
    echo "[INFO] 全ファイルの整合性に問題なし"
    exit 0
else
    echo "[ALERT] 不正な変更が検出されました"
    exit 1
fi

実業務での応用事例

ケース1:外部リポジトリからのアーカイブ検証

ソフトウェアのソースコードをダウンロードする際、配布元が提供する `.sha256` または `.md5` ファイルを併用します:
wget https://example.com/app-v2.1.0.tar.gz
wget https://example.com/app-v2.1.0.tar.gz.md5
md5sum -c app-v2.1.0.tar.gz.md5
出力に `OK` が含まれれば、ダウンロード完了時点でファイルの正当性が担保されています。

ケース2:ログファイルの重複分析

日付付きログ群(`access-2024-04-01.log`, `access-2024-04-02.log`…)から、内容が同一のファイルを抽出するには:
md5sum access-*.log | sort -k1,1 | awk '{print $1, $2}'
同じハッシュ値を持つ行が連続して並ぶため、`uniq -w32` などと組み合わせても有効です。

ケース3:cron による構成ファイル監視

重要なシステムファイルを毎日監視し、変更時にメールで通知する例:
# 初期登録
md5sum /etc/hosts /etc/resolv.conf > /etc/integrity-baseline.md5

# crontab 登録(毎日午前3時)
0 3 * * * /usr/bin/md5sum --status -c /etc/integrity-baseline.md5 > /dev/null || /usr/bin/mail -s "【緊急】構成ファイル変更検出" admin@company.local < /dev/null

留意点と代替手法

  • MD5 はファイルの「内容」のみを評価し、サイズや属性は無視されます。
  • チェックサムファイル内に相対パスが記録されている場合、検証時は必ず同一ディレクトリで実行してください(パス解決エラー回避のため)。
  • 暗号論的に安全な用途(例:パスワードハッシュ)には使用しないでください。MD5 は既知の衝突攻撃に対し脆弱です。
  • 高い耐改竄性が求められる場合は、`sha256sum` や `sha512sum` を代わりに用いることを推奨します。コマンド構文は `md5sum` とほぼ同一です。

タグ: linux md5sum Hash integrity-check shell-scripting

10月20日 14:28 投稿