はじめに
- 初投稿です
- エンジニア歴5年目のインフラエンジニアです
- C言語を使うのもコードを公開するのも初めてなので不備があるかもしれませんが、皆さんに使ってもらいたいと思い、記事を書きました
自作しようと思い立った背景
- 現場でplaybookを実行した際に想定外のファイル更新が入り、障害が発生しました
- 何かの処理を実行する際に想定外の更新が入っても気付きにくいな~と感じたので勉強も兼ねて作成しました!
簡単な概要
- コマンド名は
fmです - やっていることは各ファイルのハッシュ値を取得してファイルに書き込み、実行前後で差分を確認するイメージです
- コードはGitHubに公開しています
『fm』の特徴
🚀 高速・軽量
- C言語実装(わずか511行)で大規模ディレクトリも高速スキャン
- メモリ効率を考慮した設計
🔍 厳密な差分検出
- MD5ハッシュでファイル内容の変化を正確に検出
- タイムスタンプやサイズだけでなく、内容の変更を確実にキャッチ
🎯 柔軟な対象指定
- 複数ディレクトリの同時監視
- 除外パターンで不要なファイル・ディレクトリをスキップ
- システムディレクトリ(
/proc/,/sys/,/tmp/など)は自動除外
🌈 見やすい出力
- 色付き表示で変更箇所が一目瞭然
- 新規ファイル(緑)、変更ファイル(黄)、削除ファイル(赤)
インストールや使い方
インストール
- OpenSSLライブラリが必要です
# Ubuntu/Debian
sudo apt-get install libssl-dev
# CentOS/RHEL/Fedora
sudo dnf install openssl-devel
ビルド
git clone https://github.com/BitFigther/fm-linux.git
cd fm-linux
make
基本的な使い方
1. ベースライン作成(作業前のベースになるファイル情報)
fm -B /etc,/usr
2. 変更チェック
fm -C /etc,/usr
3. ベースラインリセット
fm -R
実際の作業ログ
$ which fm
/usr/local/bin/fm
#baseline作成(/etc配下のファイルのハッシュ値を取得し/tmp/fm_baseline.datに書き込む)
$ fm -B /etc/
Creating baseline for: /etc/
Processing...
Create baseline file : /tmp/fm_baseline.dat
Baseline saved: 397 files
#ユーザー作成
$ useradd qiita
#/tmp/fm_baseline.datの情報と今の/etc配下のファイルの差分を出力する
#本当は色付きで出力されます...
$ fm -C /etc/
Checking for changes in: /etc/
Baseline loaded: 397 files (Created: 2025-09-14 03:50:04)
Processing...
Change detected: /etc/passwd
Modified time: 20250913_234950 -> 20250914_035015
Size: 873 -> 914
MD5 hash: caa76778a7920290fce2d21146d5c4b8 -> b109b7e5dff68e9570175eda00bcfd7c
Change detected: /etc/subuid-
Modified time: 20250707_012914 -> 20250913_234951
Size: 20 -> 43
MD5 hash: e2c4d03b04defffe45a629fb4b0ff319 -> 46686e2bda28f3af1aa4aa1e63fa1311
Change detected: /etc/gshadow
Modified time: 20250913_234950 -> 20250914_035015
Size: 380 -> 390
MD5 hash: 8b70a2e03e38da122a91d6a387acd4a2 -> ac6741bacf284f5abf15d417e6ef8572
Change detected: /etc/shadow
Modified time: 20250913_234950 -> 20250914_035015
Size: 616 -> 644
MD5 hash: de9b3b713ce51d878b2918ea1ec0491d -> f04da60f9110baa070937af0b6b273f9
Change detected: /etc/subgid
Modified time: 20250913_234951 -> 20250914_035015
Size: 43 -> 62
MD5 hash: 46686e2bda28f3af1aa4aa1e63fa1311 -> 78ec260474bd6e5d556349577f4617a9
Change detected: /etc/shadow-
Modified time: 20250707_012921 -> 20250913_234950
Size: 584 -> 616
MD5 hash: 4f01e07f0b2deadd58ee9c9a3d48dca6 -> de9b3b713ce51d878b2918ea1ec0491d
Change detected: /etc/subuid
Modified time: 20250913_234951 -> 20250914_035015
Size: 43 -> 62
MD5 hash: 46686e2bda28f3af1aa4aa1e63fa1311 -> 78ec260474bd6e5d556349577f4617a9
Change detected: /etc/subgid-
Modified time: 20250707_012914 -> 20250913_234951
Size: 20 -> 43
MD5 hash: e2c4d03b04defffe45a629fb4b0ff319 -> 46686e2bda28f3af1aa4aa1e63fa1311
Change detected: /etc/group
Modified time: 20250913_234950 -> 20250914_035015
Size: 484 -> 498
MD5 hash: 220cabdeb143092f03e7e1c85bff63ba -> c763b88649bb8c9daede89ef168f1917
Change detected: /etc/group-
Modified time: 20250707_013158 -> 20250913_234950
Size: 466 -> 484
MD5 hash: fb26b9ac2ec9541c9c83beed643a404e -> 220cabdeb143092f03e7e1c85bff63ba
Change detected: /etc/passwd-
Modified time: 20250707_012914 -> 20250913_234950
Size: 824 -> 873
MD5 hash: fd89457ff2884c9d47bd8ef6750cf268 -> caa76778a7920290fce2d21146d5c4b8
Change detected: /etc/gshadow-
Modified time: 20250707_013158 -> 20250913_234950
Size: 366 -> 380
MD5 hash: 1ac7fbbfaf4d554e6227fa3b7bdbab3d -> 8b70a2e03e38da122a91d6a387acd4a2
=== Result ===
Changes detected: 12 file(s) changed
#/tmp/fm_baseline.datを削除する
$ fm -R
Baseline file deleted: /tmp/fm_baseline.dat
活用シーンまとめ
✅ システム管理
- パッケージインストール前後の変更確認
- セキュリティパッチ適用の影響範囲調査
✅ 勉強
- 設定変更の影響範囲把握
- 例えばユーザー作成をするとどこのファイルが更新される確認など
おわりに
- まだまだ改良点はあると思いますが、えいやーの精神でリリースしました
- コメント頂ければ可能な限り取り込みますので是非使ってみてください!!
リポジトリ: https://github.com/BitFigther/fm-linux
ライセンス: MIT License