🐧 なぜ Linux フォレンジックが重要なのか

解析

サーバーの世界は Linux が支配しています。Web サーバー・データベース・クラウドインフラ・コンテナ基盤のほとんどが Linux で動いており、攻撃者にとっても最大の標的です。ランサムウェアグループが Linux サーバーを狙うケースは急増し、APT(高度持続的脅威)グループもサプライチェーン攻撃の踏み台として Linux ホストを悪用します。

一方で「Linux のフォレンジックは難しそう」という声も多く聞きます。Windows ほど GUI ツールが充実しておらず、アーティファクトの場所も教科書的に整理されていないからです。しかし実態は逆で、Linux は ログやファイルとして証跡が豊富に残ります。正しい場所を知っていれば、コマンドライン一本で大量の証拠を取得できるのです。

この記事では、Linux システムから取得すべきアーティファクトをカテゴリ別に網羅し、取得コマンドと解析ツール・活用方法をセットで解説します。インシデントレスポンスの初動対応から、オフラインイメージの詳細解析まで、実務で即使える内容を目指しています。

📌 この記事で学べること
・Linux フォレンジックの基本的な考え方(揮発性の順序)
・メモリ・プロセス・ネットワークなど揮発性アーティファクトの取得方法
・ログ・ファイルシステム・ユーザー活動など永続的アーティファクトの取得方法
・bash 履歴・Cron・systemd など攻撃者がよく残す痕跡の見つけ方
・代表的な解析ツール(Volatility・Autopsy・log2timeline・KAPE など)の使い方
・トリアージスクリプトによる一括収集の自動化

⚠️ 免責事項
本記事の内容は、自身が管理するシステムまたは正式な権限を付与されたシステムへの適用を前提としています。第三者の無許可システムへの適用は不正アクセス禁止法等の法律に違反します。常に合法・倫理的な範囲での活用をお願いします。


  1. 🧠 基本原則:揮発性の順序(Order of Volatility)
  2. 💾 カテゴリ①:メモリ(RAM)のアーティファクト
    1. メモリダンプの取得
    2. メモリアーティファクトの解析:Volatility 3
  3. ⚡ カテゴリ②:揮発性システム情報のアーティファクト
    1. システム基本情報
    2. プロセス情報
    3. ネットワーク情報
  4. 📁 カテゴリ③:ファイルシステムのアーティファクト
    1. 最近作成・変更されたファイルの検出
    2. マスターファイルテーブル相当:inode 情報の取得
    3. 削除ファイルの発見
  5. 📜 カテゴリ④:システムログのアーティファクト
    1. 主要ログファイルの場所と内容
    2. ログの取得コマンド
    3. Auditd(Linux Audit システム)のログ解析
  6. 👤 カテゴリ⑤:ユーザー活動のアーティファクト
    1. シェル履歴ファイル(最重要)
    2. ユーザーとグループ情報
    3. SSH 関連アーティファクト(非常に重要)
  7. 🔄 カテゴリ⑥:永続化(Persistence)メカニズムのアーティファクト
    1. Cron ジョブ
    2. systemd サービス・タイマー
    3. rc.local・init スクリプト・init.d
    4. PAM(Pluggable Authentication Module)の改ざん
    5. LD_PRELOAD と共有ライブラリのハイジャック
  8. 📦 カテゴリ⑦:インストール済みソフトウェアとパッケージ
  9. 🌐 カテゴリ⑧:Web・アプリケーション関連のアーティファクト
    1. Web シェルの検出
    2. Docker・コンテナ環境のアーティファクト
  10. 🔑 カテゴリ⑨:暗号化・証明書関連のアーティファクト
  11. 🗂️ カテゴリ⑩:ブラウザ・メール・その他アプリのアーティファクト
  12. 🧰 代表的な解析ツール完全ガイド
    1. ① Volatility 3 ― メモリフォレンジックの最高峰
    2. ② Autopsy ― GUI 統合フォレンジックプラットフォーム
    3. ③ log2timeline / plaso ― スーパータイムラインの生成
    4. ④ GRR Rapid Response ― リモートライブフォレンジック
    5. ⑤ Velociraptor ― 高速エンドポイント調査
    6. ⑥ The Sleuth Kit(TSK)― ファイルシステム解析の基礎
    7. ⑦ KAPE(Kroll Artifact Parser and Extractor)― トリアージの高速化
    8. ⑧ ClamAV ― オープンソースウイルス対策スキャン
  13. 🚀 トリアージスクリプト:一括収集の自動化
  14. 🔗 アーティファクトの活用方法:実際の調査フロー
    1. シナリオ:サーバーへの不正侵入調査
  15. 🎯 まとめ ― Linux フォレンジックのアーティファクトマップ

🧠 基本原則:揮発性の順序(Order of Volatility)

フォレンジック調査の鉄則は、「揮発性の高いもの(消えやすいもの)から先に取得する」 ことです。電源を落とすとメモリの内容は消滅し、時間が経てば接続情報やプロセス情報も変化します。

RFC 3227「デジタル証拠の収集とアーカイブに関するガイドライン」では、取得の優先順位を次のように定義しています。

優先度アーティファクト揮発性の理由
1(最高)CPU レジスタ・キャッシュ・RAM電源断で即時消滅
2ルーティングテーブル・ARP キャッシュ・プロセステーブルOS 再起動・時間経過で変化
3ネットワーク接続・開放ポート接続断・プロセス終了で消滅
4ログインセッション・オープンファイルログアウト・クローズで変化
5ディスク上のファイル・ログ比較的安定(上書き注意)
6(最低)アーカイブメディア・バックアップほぼ永続的

この順序に従い、以下ではアーティファクトを 「揮発性」→「準揮発性」→「永続性」 の順に解説していきます。


💾 カテゴリ①:メモリ(RAM)のアーティファクト

メモリには、実行中のプロセス・開いているファイル・暗号化キー・ネットワーク接続情報・マルウェアのコードなど、ディスク上では見えない情報が満載です。最優先で取得すべきアーティファクトです。

メモリダンプの取得

# 方法①:/proc/kcore を利用(カーネルメモリ全体)
# ※ルート権限が必要
dd if=/proc/kcore of=/tmp/memory.dump bs=1M

# 方法②:/dev/mem(物理メモリ直接取得)
# ※一部のカーネルでは制限あり
dd if=/dev/mem of=/tmp/mem.raw bs=1M

# 方法③:LiME(Linux Memory Extractor)を使う(推奨)
# LiME はカーネルモジュールとして動作し最も確実
# インストール(解析環境で事前コンパイル)
git clone https://github.com/504ensicsLabs/LiME.git
cd LiME/src
make

# ターゲットマシンで実行(TCP 経由でネットワーク転送)
insmod lime.ko "path=tcp:4444 format=lime"

# 受信側(調査端末)
nc -l 4444 > /evidence/memory.lime

# ターゲットマシンで実行(ファイルに直接保存)
insmod lime.ko "path=/mnt/usb/memory.lime format=lime"

メモリアーティファクトの解析:Volatility 3

# Volatility 3 のインストール
pip3 install volatility3

# プロセス一覧の表示
vol -f memory.lime linux.pslist

# プロセスツリー(親子関係含む)
vol -f memory.lime linux.pstree

# 隠蔽されたプロセスを検出(pslist と異なるプロセスを発見)
vol -f memory.lime linux.psaux

# ネットワーク接続情報
vol -f memory.lime linux.netstat

# 開いているファイルの一覧
vol -f memory.lime linux.lsof

# 環境変数の取得
vol -f memory.lime linux.envars

# マップされたファイル・共有ライブラリ
vol -f memory.lime linux.proc.maps

# カーネルモジュール一覧(ルートキット検出)
vol -f memory.lime linux.lsmod

# マルウェアが注入したコードの検出
vol -f memory.lime linux.malfind

# 特定プロセスのダンプ
vol -f memory.lime linux.dumpfiles --pid 1234

💡 調査のポイント
linux.malfind は、実行可能なメモリ領域に書き込まれているが、ディスク上に対応するファイルが存在しない(またはハッシュが一致しない)コードを検出します。ファイルレスマルウェアやプロセスインジェクションの発見に非常に有効です。


⚡ カテゴリ②:揮発性システム情報のアーティファクト

電源を落とすと失われる情報をコマンドで素早く記録します。スクリプトにまとめておくと初動対応が速くなります。

システム基本情報

# 日時情報(UTC で記録すること)
date -u

# ホスト名・OS情報
uname -a
hostnamectl

# 稼働時間(最後の起動日時)
uptime -s

# ハードウェア情報
lscpu
lsmem
lsblk

# 現在ログイン中のユーザー
who -a
w

# ログイン履歴(直近)
last -20
lastb -20  # 失敗したログイン

# 現在の環境変数
env
printenv

プロセス情報

# 全プロセスの詳細一覧
ps auxf

# プロセスの親子関係ツリー
pstree -a -p -s

# 各プロセスが使用している実行ファイルパス
ls -la /proc/*/exe 2>/dev/null | grep -v "Permission denied"

# 削除済みファイルを実行しているプロセスを発見(重要!)
ls -la /proc/*/exe 2>/dev/null | grep "(deleted)"

# プロセスのコマンドライン引数
for pid in /proc/[0-9]*/cmdline; do
  echo -n "$pid: "; cat "$pid" | tr '\0' ' '; echo
done

# プロセスが開いているファイル(lsof)
lsof -n -P

# 特定プロセスが開いているファイル
lsof -p 

# 実行中のプロセスのメモリマップ
cat /proc//maps

ネットワーク情報

# ネットワーク接続状態(ss コマンド推奨)
ss -tulpnae

# 古いシステム向け(netstat)
netstat -tulpne
netstat -anp

# 確立済み TCP 接続のみ
ss -tp state established

# ARP テーブル(同一セグメントの通信相手)
arp -n
ip neigh show

# ルーティングテーブル
ip route show
route -n

# ネットワークインターフェース情報
ip addr show
ifconfig -a

# ファイアウォールルール(iptables)
iptables -L -n -v
iptables -t nat -L -n -v
ip6tables -L -n -v

# nftables を使用している場合
nft list ruleset

# DNS 設定
cat /etc/resolv.conf
cat /etc/hosts

# リスニングポートと対応プロセス
ss -lptn

⚠️ 攻撃者の痕跡チェック
ss -tp state established で確立済み接続を確認する際、宛先が非標準ポート(443/80 以外)への外部接続や、内部 IP アドレスへの予期しない接続(横展開の証拠)がないか注目してください。また ls -la /proc/*/exe 2>/dev/null | grep "(deleted)" は、ディスクからは消えているのにメモリ上で動いているプロセスを発見できる強力な手法です。


📁 カテゴリ③:ファイルシステムのアーティファクト

最近作成・変更されたファイルの検出

# 過去 24 時間に変更されたファイル(全体)
find / -mtime -1 -type f 2>/dev/null

# 過去 7 日間に変更されたファイル(/tmp, /var, /home を重点的に)
find /tmp /var /home -mtime -7 -type f 2>/dev/null

# SUID/SGID ビットが設定されたファイル(権限昇格に使われる)
find / -perm /6000 -type f 2>/dev/null

# 全ユーザーから書き込み可能なファイル
find / -perm -0002 -type f 2>/dev/null

# 所有者のいないファイル(攻撃者が残したファイルに多い)
find / -nouser -o -nogroup 2>/dev/null

# 隠しファイル(.で始まるファイル)の列挙
find / -name ".*" -type f 2>/dev/null | head -100

# /tmp, /dev/shm, /var/tmp への書き込みファイル(マルウェアの一時置き場)
find /tmp /dev/shm /var/tmp -type f -ls 2>/dev/null

# 実行可能パーミッションを持つスクリプト系ファイル
find / \( -name "*.sh" -o -name "*.py" -o -name "*.pl" \) -perm /111 2>/dev/null | grep -v "^/usr"

マスターファイルテーブル相当:inode 情報の取得

# ファイルの詳細なタイムスタンプ(atime/mtime/ctime)
stat /path/to/file

# ディスクイメージから全ファイルのタイムスタンプを取得(fls コマンド)
# Sleuth Kit が必要
fls -r -m "/" /dev/sda1 > bodyfile.txt

# bodyfile から Mactime 形式のタイムラインを生成
mactime -b bodyfile.txt -d > timeline.csv

# ext4 ファイルシステムのメタデータ確認
tune2fs -l /dev/sda1

# デバイスのブロック情報
blkid

削除ファイルの発見

# Sleuth Kit を使って削除ファイルを一覧(-d オプション)
fls -r -d /dev/sda1

# 特定の inode のファイルを復元
icat /dev/sda1  > recovered_file

# extundelete による削除ファイル復元(ext3/ext4)
extundelete /dev/sda1 --restore-all --output-dir /recovery/

# PhotoRec によるカービング(ファイルシステムによらず)
photorec /dev/sda1

📜 カテゴリ④:システムログのアーティファクト

Linux の証跡情報の宝庫です。主要なログファイルの場所と取得方法を網羅します。

主要ログファイルの場所と内容

ファイルパス内容調査の観点
/var/log/auth.log
(Debian/Ubuntu)
/var/log/secure
(RHEL/CentOS)
SSH/sudo 認証ログ不正ログイン・sudo 悪用・SSHブルートフォース
/var/log/syslog
/var/log/messages
システム全般のログ異常なカーネルメッセージ・サービス起動・停止
/var/log/kern.logカーネルログカーネルモジュールのロード(ルートキット)
/var/log/cron
/var/log/cron.log
Cron ジョブ実行ログ不正な Cron ジョブによる永続化
/var/log/apache2/
/var/log/nginx/
Web サーバーログSQLi・XSS・ディレクトリトラバーサル・Web シェルアクセス
/var/log/lastlog各ユーザーの最終ログイン(バイナリ)ユーザーごとの最終アクセス日時
/var/log/wtmpログイン/ログアウト履歴(バイナリ)過去のログインセッション・再起動履歴
/var/log/btmpログイン失敗履歴(バイナリ)ブルートフォース攻撃の証跡
/var/log/audit/audit.logLinux Audit デーモンのログsyscall レベルの詳細な操作履歴
/var/log/dpkg.log
/var/log/yum.log
パッケージインストールログ不審なパッケージのインストール・削除

ログの取得コマンド

# SSH ブルートフォースの痕跡を確認
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -20

# SSH ログイン成功を確認
grep "Accepted" /var/log/auth.log

# sudo の使用履歴
grep "sudo:" /var/log/auth.log

# ログイン失敗履歴(バイナリログの読み方)
lastb -F | head -30

# ログイン成功履歴
last -F | head -50

# systemd journal(現代的な Linux では主要ログ)
journalctl --since "2024-01-01" --until "2024-12-31" -o json > journal.json

# 特定のサービスのログ
journalctl -u sshd --no-pager
journalctl -u cron --no-pager

# カーネルメッセージ
journalctl -k --no-pager

# Web アクセスログから特定IPのアクセスを抽出
grep "192.168.1.100" /var/log/apache2/access.log

# Web ログからエラーコード 500 を抽出(攻撃試行の可能性)
awk '$9 == 500 {print}' /var/log/apache2/access.log

Auditd(Linux Audit システム)のログ解析

# Auditd のログを人間が読める形式に変換
ausearch -f /etc/passwd
ausearch -x /bin/bash
ausearch --event login

# aureport でサマリーレポートを生成
aureport --summary
aureport -au  # 認証イベントのレポート
aureport -x   # 実行ファイルのレポート

# 特定の時間範囲で検索
ausearch -ts "03/01/2024 00:00:00" -te "03/31/2024 23:59:59"

👤 カテゴリ⑤:ユーザー活動のアーティファクト

シェル履歴ファイル(最重要)

# bash 履歴(最も重要!)
cat /root/.bash_history
cat /home/*/.bash_history

# 全ユーザーの bash 履歴をまとめて収集
for user in $(cut -d: -f1 /etc/passwd); do
  home=$(eval echo ~$user)
  if [ -f "$home/.bash_history" ]; then
    echo "=== $user ==="
    cat "$home/.bash_history"
  fi
done

# タイムスタンプ付きの bash 履歴を確認
# (HISTTIMEFORMAT が設定されている場合)
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " history

# zsh 履歴
cat /root/.zsh_history
cat /home/*/.zsh_history

# fish 履歴
cat /home/*/.local/share/fish/fish_history

# python, irb, node 等の REPL 履歴
cat /root/.python_history
cat /root/.irb_history
cat /root/.node_repl_history

⚠️ 攻撃者が履歴を消している場合
攻撃者はしばしば history -c や unset HISTFILE で履歴を消去します。消去された場合でもメモリダンプから復元できることがあります。また ~/.bash_history のファイルが存在するが中身が空の場合、意図的に削除された証拠になります。

ユーザーとグループ情報

# ユーザー一覧(不正作成されたユーザーを確認)
cat /etc/passwd

# パスワードハッシュ(root 権限が必要)
cat /etc/shadow

# グループ情報(sudo グループに追加されていないか確認)
cat /etc/group

# UID 0 を持つユーザー(root と同等権限 = 攻撃者のバックドア)
awk -F: '$3 == 0 {print}' /etc/passwd

# sudo 権限の設定を確認
cat /etc/sudoers
ls /etc/sudoers.d/

# 最近パスワードが変更されたユーザー
passwd -S -a 2>/dev/null

# ユーザーのログイン設定
cat /etc/login.defs

SSH 関連アーティファクト(非常に重要)

# authorized_keys(攻撃者が公開鍵を追加して永続化するケースが多い)
cat /root/.ssh/authorized_keys
for user in $(cut -d: -f1 /etc/passwd); do
  home=$(eval echo ~$user)
  if [ -f "$home/.ssh/authorized_keys" ]; then
    echo "=== $user ==="
    cat "$home/.ssh/authorized_keys"
  fi
done

# known_hosts(過去に接続したホスト)
cat /root/.ssh/known_hosts
cat /home/*/.ssh/known_hosts

# SSH 設定ファイル
cat /etc/ssh/sshd_config

# ~/.ssh/config(ユーザーの SSH 接続設定)
cat /root/.ssh/config
cat /home/*/.ssh/config

# 秘密鍵の存在確認(盗まれた可能性)
find /root/.ssh /home/*/.ssh -name "id_*" 2>/dev/null

🔄 カテゴリ⑥:永続化(Persistence)メカニズムのアーティファクト

攻撃者がシステムへの再侵入を維持するために設置する「バックドア」の痕跡です。このカテゴリは特に念入りに調査する必要があります。

Cron ジョブ

# システム全体の crontab
cat /etc/crontab

# cron.d ディレクトリ配下
ls -la /etc/cron.d/
cat /etc/cron.d/*

# 定期実行ディレクトリ
ls -la /etc/cron.hourly/
ls -la /etc/cron.daily/
ls -la /etc/cron.weekly/
ls -la /etc/cron.monthly/

# 各ユーザーの crontab
crontab -l -u root
for user in $(cut -d: -f1 /etc/passwd); do
  echo "=== $user ==="
  crontab -l -u $user 2>/dev/null
done

# crontab ファイルを直接確認
ls -la /var/spool/cron/
cat /var/spool/cron/crontabs/*

systemd サービス・タイマー

# 有効化されているサービスの一覧
systemctl list-units --type=service --state=running
systemctl list-unit-files --type=service --state=enabled

# 最近変更されたサービスファイルを探す
find /etc/systemd/system /lib/systemd/system /usr/lib/systemd/system \
  -name "*.service" -newer /tmp -ls 2>/dev/null

# 不審なサービスファイルの内容を確認
cat /etc/systemd/system/*.service

# systemd タイマー(Cron 代替として使われることがある)
systemctl list-timers --all

# ユーザーレベルの systemd サービス
ls /home/*/.config/systemd/user/

rc.local・init スクリプト・init.d

# rc.local(起動時に実行されるスクリプト)
cat /etc/rc.local

# init.d スクリプト
ls -la /etc/init.d/

# /etc/profile と関連ファイル(ログイン時に実行)
cat /etc/profile
cat /etc/profile.d/*.sh
cat /root/.bashrc
cat /root/.bash_profile
cat /root/.profile

PAM(Pluggable Authentication Module)の改ざん

# PAM 設定ファイルの確認(バックドアを仕込まれていないか)
cat /etc/pam.d/sshd
cat /etc/pam.d/sudo
cat /etc/pam.d/su
ls -la /etc/pam.d/

# PAM ライブラリの整合性確認
find /lib*/security/ -name "*.so" -newer /tmp -ls 2>/dev/null

LD_PRELOAD と共有ライブラリのハイジャック

# LD_PRELOAD の設定確認(共有ライブラリのハイジャック)
cat /etc/ld.so.preload

# 動的リンカの設定
cat /etc/ld.so.conf
cat /etc/ld.so.conf.d/*

# 環境変数での設定
grep -r "LD_PRELOAD" /etc/profile.d/ /etc/environment /root/.bashrc

📦 カテゴリ⑦:インストール済みソフトウェアとパッケージ

# インストール済みパッケージ一覧(Debian/Ubuntu)
dpkg -l > installed_packages.txt

# インストール済みパッケージ一覧(RHEL/CentOS)
rpm -qa > installed_packages.txt

# 最近インストールされたパッケージ(直近 30 件)
# Debian/Ubuntu
grep " install " /var/log/dpkg.log | tail -30

# RHEL/CentOS
rpm -qa --queryformat '%{installtime:date} %{name}\n' | sort -k1-3 | tail -30

# pip でインストールされたパッケージ
pip list
pip3 list

# npm でインストールされたグローバルパッケージ
npm list -g --depth=0

# システムバイナリの整合性確認(改ざん検出)
rpm -Va 2>/dev/null | grep "^..5"  # MD5 不一致を検出(RHEL系)
debsums -c 2>/dev/null              # チェックサム不一致(Debian系)

🌐 カテゴリ⑧:Web・アプリケーション関連のアーティファクト

Web シェルの検出

# Web ルートディレクトリに最近追加された PHP ファイル
find /var/www /srv/www -name "*.php" -newer /var/www/html/index.php 2>/dev/null

# Web シェルの特徴的な関数を含むファイルを検索
grep -r "eval(base64_decode\|system\|exec\|passthru\|shell_exec" /var/www/ 2>/dev/null

# 一般的な Web シェルのファイル名パターン
find /var/www -name "*.php" | xargs grep -l "c99\|r57\|webshell\|wso\|b374k" 2>/dev/null

# .htaccess の改ざんを確認
find /var/www -name ".htaccess" -ls

Docker・コンテナ環境のアーティファクト

# 実行中のコンテナ
docker ps -a

# コンテナのネットワーク
docker network ls

# コンテナのログ
docker logs 

# イメージ一覧(不審なイメージがないか)
docker images

# コンテナの詳細情報(マウント・環境変数・ネットワーク)
docker inspect 

# コンテナ内のプロセス
docker top 

# Docker イベント履歴
journalctl -u docker.service --no-pager

🔑 カテゴリ⑨:暗号化・証明書関連のアーティファクト

# SSL/TLS 証明書の確認
ls -la /etc/ssl/certs/
ls -la /etc/ssl/private/

# GPG 鍵の一覧
gpg --list-keys
gpg --list-secret-keys

# LUKS 暗号化ディスクの確認
cryptsetup luksDump /dev/sda1

# AIDE(侵入検知)のデータベースがある場合
aide --check

# osquery を使った整合性チェック(インストールされている場合)
osqueryi "SELECT * FROM file WHERE path LIKE '/etc/%.conf' AND mtime > 1700000000;"

🗂️ カテゴリ⑩:ブラウザ・メール・その他アプリのアーティファクト

# Firefox の履歴・クッキー・ログイン情報
find /home -name "places.sqlite" 2>/dev/null
find /home -name "cookies.sqlite" 2>/dev/null
find /home -name "logins.json" 2>/dev/null

# Chromium/Chrome の履歴
find /home -path "*/Chromium/Default/History" 2>/dev/null
find /home -path "*/google-chrome/Default/History" 2>/dev/null

# SQLite3 でブラウザ履歴を確認
sqlite3 /home/user/.mozilla/firefox/xxxxx.default/places.sqlite \
  "SELECT url, title, visit_date FROM moz_places ORDER BY visit_date DESC LIMIT 50;"

# メールクライアント(Thunderbird)
find /home -name "*.msf" 2>/dev/null
find /home -name "Inbox" 2>/dev/null

# Slack・Teams のアーティファクト
find /home -path "*/Slack/storage*" -name "*.db" 2>/dev/null

🧰 代表的な解析ツール完全ガイド

① Volatility 3 ― メモリフォレンジックの最高峰

メモリダンプの解析に特化したオープンソースフレームワークです。Linux・Windows・macOS 対応で、現在は第3世代の Volatility 3 が主流です。

# インストール
pip3 install volatility3

# シンボルの準備(カーネルバージョンに対応するシンボルが必要)
# Linux はカーネルごとにシンボルを生成する必要がある
# dwarf2json を使ってシンボルを生成
git clone https://github.com/volatilityfoundation/dwarf2json.git
cd dwarf2json && make
./dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-5.15.0 > linux-5.15.0.json

# 主要コマンドの使い方
vol -f memory.lime linux.pslist      # プロセス一覧
vol -f memory.lime linux.pstree      # プロセスツリー
vol -f memory.lime linux.bash        # bash 履歴をメモリから復元
vol -f memory.lime linux.netstat     # ネットワーク接続
vol -f memory.lime linux.malfind     # 不正コードの検出
vol -f memory.lime linux.lsmod       # カーネルモジュール
vol -f memory.lime linux.check_modules  # 隠しモジュールの検出
vol -f memory.lime linux.proc.maps   # プロセスのメモリマップ
vol -f memory.lime linux.dumpfiles --pid 1234  # ファイルを抽出

② Autopsy ― GUI 統合フォレンジックプラットフォーム

The Sleuth Kit をバックエンドに持つ GUI フォレンジックツールです。ディスクイメージの解析、削除ファイルの復元、タイムライン生成などを直感的な GUI で操作できます。

  • 公式サイト:https://www.autopsy.com/
  • ディスクイメージ(raw, E01, AFF 形式など)を読み込みして解析
  • ファイルシステムのブラウズ・キーワード検索・ハッシュ照合・タイムライン生成が可能
  • プラグイン拡張により機能追加が可能

③ log2timeline / plaso ― スーパータイムラインの生成

複数のアーティファクトから時系列タイムラインを自動生成するツールです。「いつ何が起きたか」を一本の時系列で把握するのに最適です。

# インストール
pip3 install plaso

# ディスクイメージからタイムライン生成
log2timeline.py --storage-file timeline.plaso /dev/sda

# 特定のパーサーのみ使用
log2timeline.py --storage-file timeline.plaso \
  --parsers "syslog,bash_history,utmp" /mnt/evidence

# psort でフィルタリング・CSV 出力
psort.py -o l2tcsv -w timeline.csv timeline.plaso

# 特定の時間範囲に絞り込み
psort.py -o l2tcsv -w timeline.csv timeline.plaso \
  "date > '2024-01-01T00:00:00' AND date < '2024-12-31T23:59:59'"

④ GRR Rapid Response ― リモートライブフォレンジック

Google が開発したエンタープライズ向けのリモートフォレンジックプラットフォームです。エージェントをインストールすることで、大量のエンドポイントからアーティファクトをリモートで収集・解析できます。

  • 公式サイト:https://github.com/google/grr
  • Linux・macOS・Windows のエージェント対応
  • Web UI でリモートからアーティファクト収集を指定
  • 大規模組織のインシデントレスポンスに向いている

⑤ Velociraptor ― 高速エンドポイント調査

GRR の後継として注目されているオープンソースのエンドポイント調査プラットフォームです。VQL(Velociraptor Query Language)という独自クエリ言語で柔軟な調査が可能です。

# Velociraptor を使ったアーティファクト収集例(VQL)
-- SUID ファイルを一覧
SELECT * FROM glob(globs="/**") WHERE Mode =~ "s"

-- 最近 24 時間に変更されたファイル
SELECT FullPath, Mtime FROM glob(globs="/**")
WHERE Mtime > now() - 86400

-- 実行中のプロセスで削除済みファイルを使っているもの
SELECT * FROM processes() WHERE exe =~ "deleted"

⑥ The Sleuth Kit(TSK)― ファイルシステム解析の基礎

# ディスクイメージのパーティション情報を確認
mmls disk.img

# ファイルシステムの情報
fsstat -o 2048 disk.img

# ファイル一覧(削除済み含む)
fls -r -o 2048 disk.img

# Bodyfile 形式で出力(タイムライン生成に使用)
fls -r -m "/" -o 2048 disk.img > bodyfile.txt
mactime -b bodyfile.txt -d > timeline.csv

# 特定の inode のファイル内容を取得
icat -o 2048 disk.img 12345 > recovered.file

# キーワードでファイルシステムを検索
sigfind -b 512 -o 2048 "FFD8FF" disk.img  # JPEG のシグネチャを検索

⑦ KAPE(Kroll Artifact Parser and Extractor)― トリアージの高速化

Windows 向けで有名ですが、Wine を使って Linux 環境でも実行できます。ただし Linux 専用のトリアージスクリプトとして LinEnumlinux-exploit-suggesterLinPEAS の方が一般的です。

# LinEnum の使用
wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh
chmod +x LinEnum.sh
./LinEnum.sh -t -r report.txt

# PEASS-ng (LinPEAS) - 権限昇格の可能性を含む詳細なシステム情報収集
curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh > linpeas_output.txt

⑧ ClamAV ― オープンソースウイルス対策スキャン

# インストールとシグネチャ更新
apt install clamav
freshclam

# システム全体をスキャン
clamscan -r / --log=/tmp/clamav_report.txt --infected

# マウントされたイメージをスキャン
clamscan -r /mnt/evidence/ --log=/tmp/clamav_report.txt

🚀 トリアージスクリプト:一括収集の自動化

実際のインシデントレスポンスでは、時間との戦いです。以下のスクリプトを使って、主要なアーティファクトを一括収集できます。

#!/bin/bash
# Linux フォレンジック トリアージスクリプト
# 使い方: sudo ./triage.sh /output/directory

OUTPUT_DIR="${1:-/tmp/triage_$(date +%Y%m%d_%H%M%S)}"
mkdir -p "$OUTPUT_DIR"/{system,network,users,persistence,logs}

echo "[*] トリアージ開始: $(date -u)"

# === システム情報 ===
echo "[*] システム情報を収集中..."
uname -a > "$OUTPUT_DIR/system/uname.txt"
hostname  > "$OUTPUT_DIR/system/hostname.txt"
date -u   > "$OUTPUT_DIR/system/datetime.txt"
uptime    > "$OUTPUT_DIR/system/uptime.txt"
ps auxf   > "$OUTPUT_DIR/system/processes.txt"
pstree -a -p > "$OUTPUT_DIR/system/pstree.txt"
ls -la /proc/*/exe 2>/dev/null | grep "(deleted)" > "$OUTPUT_DIR/system/deleted_exes.txt"
find /tmp /dev/shm /var/tmp -type f -ls 2>/dev/null > "$OUTPUT_DIR/system/tmp_files.txt"

# === ネットワーク ===
echo "[*] ネットワーク情報を収集中..."
ss -tulpnae > "$OUTPUT_DIR/network/connections.txt"
ip route show > "$OUTPUT_DIR/network/routes.txt"
ip neigh show > "$OUTPUT_DIR/network/arp.txt"
iptables -L -n -v > "$OUTPUT_DIR/network/iptables.txt" 2>/dev/null

# === ユーザー情報 ===
echo "[*] ユーザー情報を収集中..."
cp /etc/passwd "$OUTPUT_DIR/users/"
cp /etc/shadow "$OUTPUT_DIR/users/" 2>/dev/null
cp /etc/group  "$OUTPUT_DIR/users/"
cp /etc/sudoers "$OUTPUT_DIR/users/"
last -F > "$OUTPUT_DIR/users/last.txt"
lastb -F > "$OUTPUT_DIR/users/lastb.txt" 2>/dev/null
for user in $(cut -d: -f1 /etc/passwd); do
  home=$(eval echo ~$user)
  [ -f "$home/.bash_history" ] && cp "$home/.bash_history" "$OUTPUT_DIR/users/${user}_bash_history"
  [ -f "$home/.ssh/authorized_keys" ] && cp "$home/.ssh/authorized_keys" "$OUTPUT_DIR/users/${user}_authorized_keys"
done

# === 永続化メカニズム ===
echo "[*] 永続化の痕跡を収集中..."
cp /etc/crontab "$OUTPUT_DIR/persistence/"
cp -r /etc/cron.d "$OUTPUT_DIR/persistence/" 2>/dev/null
systemctl list-unit-files --state=enabled > "$OUTPUT_DIR/persistence/enabled_services.txt"
find /etc/systemd/system -name "*.service" -exec cat {} \; > "$OUTPUT_DIR/persistence/systemd_services.txt"
cat /etc/rc.local > "$OUTPUT_DIR/persistence/rc_local.txt" 2>/dev/null
cat /etc/ld.so.preload > "$OUTPUT_DIR/persistence/ld_preload.txt" 2>/dev/null

# === ログ ===
echo "[*] ログを収集中..."
for logfile in auth.log secure syslog messages kern.log cron dpkg.log; do
  [ -f "/var/log/$logfile" ] && cp "/var/log/$logfile" "$OUTPUT_DIR/logs/"
done

# アーカイブ化
echo "[*] アーカイブ中..."
tar -czf "${OUTPUT_DIR}.tar.gz" -C "$(dirname $OUTPUT_DIR)" "$(basename $OUTPUT_DIR)"
echo "[+] 完了: ${OUTPUT_DIR}.tar.gz"
echo "[+] MD5: $(md5sum ${OUTPUT_DIR}.tar.gz)"

🔗 アーティファクトの活用方法:実際の調査フロー

シナリオ:サーバーへの不正侵入調査

外部から SSH での不正ログインが疑われる場合の調査フローを紹介します。

Step 1(5分以内): 揮発性情報を先に記録。ss -tulpnae でネットワーク接続を確認し、見知らぬ SSH セッションや不審な外部接続がないか確認。ps auxf で不審なプロセスを確認します。

Step 2(10分以内): ログによる侵入経路の特定。/var/log/auth.log から SSH ブルートフォース→成功の流れを確認。grep "Accepted" /var/log/auth.log で侵入元 IP を特定します。

Step 3(30分以内): 攻撃者の行動追跡。.bash_history と auditd ログで攻撃者が実行したコマンドを再現。find / -newer /var/log/auth.log -type f で侵入後に作成・変更されたファイルを特定します。

Step 4(1時間以内): 永続化の確認。authorized_keys・Cron・systemd サービス・SUID ファイルをすべて確認し、バックドアを発見・除去します。

Step 5(数時間): log2timeline でスーパータイムラインを生成し、侵入から現在までの全アクティビティを時系列で整理。Timeline Explorer で可視化・レポートを作成します。


🎯 まとめ ― Linux フォレンジックのアーティファクトマップ

カテゴリ主要アーティファクト主な調査目的
メモリRAM ダンプ(LiME)ファイルレスマルウェア・暗号化キー・隠しプロセス
揮発性情報プロセス・ネットワーク接続・ARP侵害の初期状態の記録・C2 通信の特定
ファイルシステム変更ファイル・SUID・削除ファイルマルウェアの発見・改ざん検出
ログauth.log・syslog・audit.log侵入経路・攻撃者の行動の時系列再現
ユーザー活動bash_history・SSH authorized_keys攻撃者のコマンド特定・バックドア発見
永続化Cron・systemd・PAM・LD_PRELOADバックドア・再侵入メカニズムの除去
アプリWeb ログ・ブラウザ DB・DockerWeb シェル・情報漏洩経路の特定

Linux フォレンジックは、コマンドラインを駆使しながらパズルのピースを集める作業です。最初は取得すべき場所が多くて圧倒されますが、「揮発性の高い順に取得」「ログは古いものから新しいものへ読む」「タイムラインで時系列を整理する」 という3つの基本原則を守れば、体系的に調査を進めることができます。

この記事で紹介したトリアージスクリプトをカスタマイズして、自分の環境に合った初動対応キットを作っておくことをお勧めします。備えあれば憂いなし、です。

🔗 参考リソース
・SANS FOR508(Advanced Incident Response)
・Volatility 3 公式ドキュメント:https://volatility3.readthedocs.io/
・The Sleuth Kit:https://sleuthkit.org/
・Plaso/log2timeline:https://plaso.readthedocs.io/
・Velociraptor:https://www.velocidex.com/
・Linux Forensics(Philip Polstra 著)― Linux フォレンジックのバイブル


本記事のコマンドは Ubuntu 22.04 LTS / RHEL 9 系での動作を想定しています。ディストリビューションやカーネルバージョンによって挙動が異なる場合があります。ツールは継続的に更新されるため、各プロジェクトの公式ドキュメントも合わせてご確認ください。

コメント