専門的なツールを購入しなくてもOSに標準搭載されたコマンドだけでできるフォレンジック的な調査・ログ分析の手法を解説 対応OS:Windows / macOS / Linux

解析

「パソコンが不正操作されたかもしれない」「いつ・誰が・どのファイルにアクセスしたのか調べたい」「マルウェアに感染した痕跡を探したい」――そんな場面で力を発揮するのが、デジタルフォレンジックの技術です。

デジタルフォレンジック(Digital Forensics)とは、コンピューターやネットワーク上に残された電子的な証拠を収集・保全・分析する技術のことです。もともとは警察や法執行機関が犯罪捜査に使っていた手法ですが、現在は企業のインシデント対応や情報漏えい調査にも広く活用されています。

本記事では、専門的なツールを購入しなくてもOSに標準搭載されたコマンドだけでできるフォレンジック的な調査・ログ分析の手法を解説します。セキュリティ担当者はもちろん、「何かおかしい」と感じたときに自分で調べたい一般ユーザーにも役立つ内容です。

⚠️ 重要: 本記事の内容は、自分が管理するPCやネットワーク環境の調査を目的としています。他者のPCやシステムへの無断アクセス・調査は不正アクセス禁止法に抵触します。また、企業のシステムを調査する際は必ず上長・法務・情報セキュリティ部門の承認を得てから実施してください。


目次

  1. フォレンジック調査の基本原則
  2. 【Windows編】ログ抽出・分析コマンド
  3. 【macOS / Linux編】ログ抽出・分析コマンド
  4. 【ネットワーク証跡編】通信ログを調べるコマンド
  5. 【ファイル証跡編】ファイルの操作履歴を追うコマンド
  6. 【メモリ・プロセス編】実行中の痕跡を調べるコマンド
  7. まとめ

フォレンジック調査の基本原則

コマンドを実行する前に、フォレンジック調査における大原則を押さえておきましょう。

揮発性の高いデータから収集する

電子証拠には「揮発性(Volatility)」があります。PCの電源を切ると消えてしまうデータがあるため、調査の優先順位は次の順番が基本です。

  1. 最優先: CPUレジスタ・キャッシュ、実行中プロセス、ネットワーク接続状態
  2. 次点: メモリ(RAM)上のデータ
  3. その次: ディスク上のログファイル・ファイルシステム情報
  4. 最後: 外部メディアやバックアップ

💡 FACT: RFC 3227(証拠収集とアーカイブのガイドライン)では、デジタル証拠の収集順序として「揮発性の高いものから低いものへ」という原則が明文化されています。このガイドラインは2002年に策定されたものですが、現在も世界中のインシデント対応チームの標準手順として参照されています。

調査前に記録を残す

調査コマンドを実行する際は、実行日時・実行者・コマンド内容・出力結果をすべてログとして保存してください。後から「いつ・何を調べたか」を証明できることが、フォレンジック調査の信頼性の根拠になります。

# macOS/Linuxで調査ログを記録しながら作業する
script investigation_$(date +%Y%m%d_%H%M%S).log
# このコマンドの後、実行したすべてのコマンドと出力が記録される
# 記録を終了するには exit と入力

【Windows編】ログ抽出・分析コマンド

Windowsはシステムの動作をイベントログとして詳細に記録しています。IPA(情報処理推進機構)の「インシデント対応へのフォレンジック技法の統合に関するガイド」では、Windowsイベントログが侵害調査における最重要証拠の一つとされています。

① wevtutil — イベントログをコマンドで抽出・分析する

Windowsイベントビューアのコマンドライン版です。ログの抽出・検索・エクスポートが柔軟に行えます。

Windows(コマンドプロンプト / PowerShell):

# ログの種類一覧を表示
wevtutil el

# セキュリティログの最新50件を表示
wevtutil qe Security /c:50 /rd:true /f:text

# 特定のイベントIDを抽出(4625:ログオン失敗)
wevtutil qe Security "/q:*[System[EventID=4625]]" /f:text /rd:true

# ログをXML形式でファイルに出力
wevtutil epl Security C:\forensics\security.evtx

# ログをテキスト形式でファイルに保存
wevtutil qe Security /c:200 /f:text > C:\forensics\security_log.txt

フォレンジック調査で特に重要なイベントIDを覚えておきましょう。

イベントID意味調査上の重要度
4624ログオン成功★★★ 誰がいつログインしたか
4625ログオン失敗★★★ ブルートフォース攻撃の検出
4634ログオフ★★ 在席時間の把握
4648明示的な資格情報でのログオン★★★ 別ユーザーへのなりすまし
4663オブジェクトへのアクセス試行★★★ ファイルアクセスの追跡
4688プロセスの作成★★★ 不審なプログラムの実行
4698スケジュールタスクの作成★★★ マルウェアの永続化手法
4720ユーザーアカウントの作成★★★ 不正アカウント作成の検出
7045新しいサービスのインストール★★★ バックドアサービスの検出

② Get-WinEvent — PowerShellで高度なログ分析をする

PowerShellのGet-WinEventは、フィルタリングや集計をより柔軟に行える強力なコマンドです。

Windows(PowerShell):

# 過去24時間のログオン失敗を抽出
Get-WinEvent -FilterHashtable @{
  LogName = 'Security'
  Id = 4625
  StartTime = (Get-Date).AddHours(-24)
} | Select-Object TimeCreated, Message | Format-List

# 過去7日間のプロセス作成ログ(4688)を抽出してCSVに保存
Get-WinEvent -FilterHashtable @{
  LogName = 'Security'
  Id = 4688
  StartTime = (Get-Date).AddDays(-7)
} | Select-Object TimeCreated, @{N='Process';E={$_.Properties[5].Value}} |
  Export-Csv C:\forensics\process_creation.csv -NoTypeInformation

# 複数のイベントIDを同時に抽出(ログオン系をまとめて)
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624,4625,4634,4648} |
  Sort-Object TimeCreated -Descending | Select-Object -First 100 |
  Export-Csv C:\forensics\logon_events.csv -NoTypeInformation

# ログオン失敗のIPアドレスを集計(ブルートフォース検出)
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625} |
  ForEach-Object { $_.Properties[19].Value } |
  Group-Object | Sort-Object Count -Descending | Select-Object -First 20

💡 FACT: Windowsのプロセス作成ログ(イベントID 4688)はデフォルトでは無効になっています。有効化するには「ローカルセキュリティポリシー」→「監査ポリシー」→「プロセス追跡の監査」を「成功」に設定する必要があります。MITRE ATT&CKフレームワークでも、この監査の有効化がインシデント検出に不可欠な設定として明記されています。

③ reg query — 自動起動エントリを調べる

マルウェアはしばしばレジストリの「自動起動エントリ」に登録して、PC起動のたびに自動実行されるよう仕込みます。主要な自動起動箇所を確認しましょう。

Windows(コマンドプロンプト):

# ユーザーログオン時の自動起動プログラムを確認
reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Run
reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

# 全ユーザー共通の自動起動を確認
reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
reg query HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce

# サービスとして登録されているプログラムを確認
reg query HKLM\SYSTEM\CurrentControlSet\Services /s | findstr "ImagePath"

④ schtasks — スケジュールタスクで不審な登録を探す

マルウェアが定期実行や再起動後の自動復活のためにタスクスケジューラを悪用するケースが増えています。

Windows(コマンドプロンプト):

# すべてのタスクの詳細一覧を表示
schtasks /query /fo LIST /v

# タスク一覧をCSVに保存して後から分析
schtasks /query /fo CSV /v > C:\forensics\scheduled_tasks.csv

# 特定タスクの詳細を確認
schtasks /query /tn "\Microsoft\Windows\UpdateOrchestrator\USO_UxBroker" /fo LIST /v

【macOS / Linux編】ログ抽出・分析コマンド

LinuxとmacOSは詳細なシステムログをファイルとして保存しており、テキスト処理コマンドと組み合わせることで高度な分析が可能です。

① journalctl — systemdのログを分析する(Linux)

journalctlはsystemdベースのLinux(Ubuntu・CentOS・Debian系など)の統合ログ管理コマンドです。

Linux:

# 最新100件のログを表示
journalctl -n 100

# 特定の時間帯のログを抽出
journalctl --since "2025-03-01 00:00:00" --until "2025-03-01 23:59:59"

# 優先度:エラー以上のログのみ表示
journalctl -p err

# 特定のサービスのログを抽出
journalctl -u sshd --since "1 week ago"
journalctl -u nginx --since "24 hours ago" > /tmp/nginx_log.txt

# SSHログイン成功・失敗を時系列で表示
journalctl -u sshd | grep -E "Accepted|Failed|Invalid" | tail -100

# 前回の起動時のログのみを表示
journalctl -b -1

# カーネルメッセージのみを表示
journalctl -k --since "today"

② last / lastb / lastlog — ログイン履歴を詳しく追う

macOS / Linux:

# ログイン・ログアウト履歴を表示
last

# ログイン失敗の履歴を表示(要root権限)
sudo lastb

# 全ユーザーの最終ログイン日時を一覧表示
lastlog

# 特定ユーザーの履歴のみ表示
last username

# 最近のSSHログインを抽出
last | grep "pts" | head -30

lastbはログイン失敗の記録です。同一IPアドレスからの大量の失敗記録はSSHブルートフォース攻撃の可能性を示します。

③ /var/log ファイルを直接分析する

Linuxのシステムログはテキストファイルとして/var/log/ディレクトリに保存されます。grepやawkと組み合わせることで強力な分析ができます。

Linux:

# SSHのブルートフォース攻撃を試みているIPアドレスを集計
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -20

# 成功したSSHログインのIPアドレスと日時を抽出
grep "Accepted password\|Accepted publickey" /var/log/auth.log | tail -50

# sudoコマンドの実行履歴を確認(誰が何をsudoで実行したか)
grep "sudo" /var/log/auth.log | grep "COMMAND" | tail -50

# rootへのsuコマンド実行を確認
grep "su:" /var/log/auth.log | grep "Successful su" | tail -20

# Webサーバー(Apache)の404エラーを集計
grep " 404 " /var/log/apache2/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20

# Webサーバーに対するスキャン行為を検出(短時間に大量リクエスト)
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -10

💡 FACT: ログローテーションにより、デフォルトでは古いログファイルは圧縮・削除されます。Ubuntuでは/etc/logrotate.confの設定により、通常4週間分のログが保存されています。フォレンジック調査では、調査開始と同時にログファイルをコピーして保全することが重要です。

④ macOSのログを分析する(log コマンド)

macOS 10.12(Sierra)以降は、logコマンドで統合ログシステム(Unified Logging System)にアクセスできます。

macOS:

# 過去1時間のエラーと障害ログを表示
log show --last 1h --level error

# 特定プロセスのログを抽出
log show --predicate 'process == "sshd"' --last 24h

# ログイン・認証関連のログを抽出
log show --predicate 'category == "Authorization"' --last 7d

# 外付けデバイス接続の記録を調べる
log show --predicate 'subsystem == "com.apple.DiskArbitration"' --last 30d | grep -i "mount\|appear"

# ログをファイルに保存
log show --last 24h --level error > ~/forensics/macos_errors.txt

【ネットワーク証跡編】通信ログを調べるコマンド

情報漏えいやマルウェア感染の多くは、ネットワーク通信の異常として現れます。通信の証跡を調べることで、データが外部に送出されたか、不正なサーバーと通信しているかを確認できます。

① ss / netstat — 現在の通信状態とプロセスを紐付ける

Linux(ss):

# 確立済みのTCP接続とプロセスIDを表示
ss -tnp state established

# すべてのTCP/UDP接続をプロセス名付きで表示
ss -tunap

# 特定ポートへの接続を確認(443:HTTPS)
ss -tnp | grep ':443'

# LISTENしているポート一覧
ss -tlnp

Windows(PowerShell):

# 確立済み接続とプロセスIDを表示
Get-NetTCPConnection -State Established | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, OwningProcess |
  ForEach-Object {
    $proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
    $_ | Add-Member -NotePropertyName ProcessName -NotePropertyValue $proc.Name -PassThru
  } | Format-Table -AutoSize

# 外部との通信をフィルタリング(ローカルを除外)
Get-NetTCPConnection -State Established | Where-Object { $_.RemoteAddress -notlike "127.*" -and $_.RemoteAddress -ne "::1" }

② tcpdump — ネットワークパケットをキャプチャ・分析する

tcpdumpはネットワーク上を流れるパケットをリアルタイムでキャプチャするコマンドです。不審な通信を証拠として保存する際に使います。

macOS / Linux(要root権限):

# すべてのパケットをキャプチャしてファイルに保存
sudo tcpdump -i eth0 -w /tmp/capture.pcap

# 特定のIPアドレスとの通信のみキャプチャ
sudo tcpdump -i eth0 host 203.0.113.100 -w /tmp/suspicious_ip.pcap

# HTTPSを除く80番ポートの通信をキャプチャ
sudo tcpdump -i eth0 port 80 -A | grep -E "GET|POST|Host:"

# DNSクエリの記録(どのドメインに問い合わせているか)
sudo tcpdump -i eth0 port 53 -n -l | grep -i "A?"

# 100パケットだけキャプチャして終了
sudo tcpdump -i eth0 -c 100 -w /tmp/sample.pcap

キャプチャした.pcapファイルはWiresharkで可視化・詳細分析できます。

💡 FACT: tcpdumpは1988年にローレンス・バークレー国立研究所で開発されました。現在もLinux・macOSに標準搭載されており、世界中のネットワーク管理者・セキュリティエンジニアに使われています。SANS InstituteのGCIHなどセキュリティ資格試験でも必須知識として出題されます。

③ arp-scan / arp -a — 不審なデバイスをネットワーク上で探す

共通:

# ARPキャッシュからLAN上のデバイス一覧を確認
arp -a

# arp-scanで詳細なデバイス検出(要インストール)
sudo arp-scan --localnet

# Windowsで接続済みデバイスのMACアドレスを確認
arp -a | findstr /V "incomplete"

MACアドレスの最初の3バイト(OUI)はメーカーを示します。「IEEE OUI検索」サービスで製造元が確認でき、見覚えのないメーカーのデバイスを発見した場合は不審なデバイス接続の可能性があります。


【ファイル証跡編】ファイルの操作履歴を追うコマンド

ファイルには「いつ作成されたか」「最後にアクセスされたのはいつか」「いつ変更されたか」という3種類のタイムスタンプが記録されています。これを活用することで、不審なファイル操作の時系列を再構築できます。

① stat / Get-Item — ファイルの詳細タイムスタンプを確認する

macOS / Linux:

# ファイルの詳細情報(作成・変更・アクセス日時)を表示
stat /path/to/file

# フォルダ内のすべてのファイルのタイムスタンプを表示
stat /var/log/*

# 最近変更されたファイルを検索(24時間以内)
find /home -mtime -1 -type f | sort

# 最近アクセスされたファイルを検索(1時間以内)
find /tmp -atime -0.04 -type f

# 特定の時間帯に変更されたファイルを検索
find / -newer /tmp/reference_file -not -path "/proc/*" 2>/dev/null

Windows(PowerShell):

# ファイルの詳細タイムスタンプを確認
Get-Item C:\path\to\file | Select-Object FullName, CreationTime, LastWriteTime, LastAccessTime

# 過去24時間に変更されたファイルを再帰的に検索
Get-ChildItem C:\Users -Recurse | Where-Object { $_.LastWriteTime -gt (Get-Date).AddHours(-24) } |
  Select-Object FullName, LastWriteTime | Sort-Object LastWriteTime -Descending

② find — 不審なファイルの特性で検索する

macOS / Linux:

# SUID/SGIDが設定された実行ファイルを検索(権限昇格に悪用されることがある)
find / -perm -4000 -type f 2>/dev/null   # SUID
find / -perm -2000 -type f 2>/dev/null   # SGID

# 全員に書き込み権限があるファイルを検索
find / -perm -o+w -type f 2>/dev/null | grep -v "/proc"

# 隠しファイル(ドット始まり)を検索
find /home -name ".*" -type f

# 拡張子と実際のファイル形式が一致しないファイルを探す(.txtなのに実行ファイル等)
find /tmp /var/tmp /dev/shm -type f -executable 2>/dev/null

# 最近7日間に/tmpに作られたファイルを確認(マルウェアの一時ファイル置き場)
find /tmp /var/tmp -mtime -7 -type f | xargs ls -la

💡 FACT: セキュリティ企業CrowdStrikeの調査(2024年版Global Threat Report)によると、マルウェアが初期感染後に永続化のためのファイルを設置するまでの時間(Breakout Time)の中央値は62分とされています。侵害を疑った際には速やかなログ収集と調査開始が重要です。

③ sha256sum / certutil — ファイルのハッシュ値を確認する

ファイルが改ざんされていないか、既知のマルウェアと一致しないかを確認するためにハッシュ値を計算します。

macOS / Linux:

# SHA-256ハッシュ値を計算
sha256sum /path/to/file
sha256sum /usr/bin/ssh  # システムコマンドの改ざん確認

# ディレクトリ内のすべてのファイルのハッシュを一括計算して保存
find /usr/bin -type f | xargs sha256sum > /tmp/system_hashes.txt

# 後日比較して改ざんを検出
sha256sum -c /tmp/system_hashes.txt 2>&1 | grep "FAILED"

Windows(コマンドプロンプト):

# SHA-256ハッシュ値を計算
certutil -hashfile C:\Windows\System32\cmd.exe SHA256

# MD5ハッシュを計算
certutil -hashfile C:\path\to\file MD5

計算したハッシュ値は、VirusTotalに照合することでマルウェアとして報告されているファイルかどうかを確認できます。


【メモリ・プロセス編】実行中の痕跡を調べるコマンド

高度なマルウェアの中には「ファイルレスマルウェア(Fileless Malware)」と呼ばれる種類があります。ディスクにファイルを書かず、メモリ上だけで動作するため、ファイルスキャンでは検出できません。プロセスとメモリの状態を確認するコマンドが重要になります。

① プロセスの詳細情報を取得する

Windows(PowerShell):

# 実行中プロセスの詳細情報(実行ファイルのパスを含む)
Get-Process | Select-Object Name, Id, Path, CPU, WorkingSet | Sort-Object WorkingSet -Descending

# 実行ファイルのパスが確認できないプロセスを表示(不審なプロセスの可能性)
Get-Process | Where-Object { $_.Path -eq $null } | Select-Object Name, Id

# 特定プロセスの親プロセスを調べる(プロセスツリーの確認)
Get-WmiObject Win32_Process | Select-Object ProcessId, ParentProcessId, Name, CommandLine |
  Where-Object { $_.Name -like "*powershell*" -or $_.Name -like "*cmd*" } |
  Format-List

# PowerShellのコマンド実行履歴を確認(ファイルレスマルウェアの痕跡)
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-PowerShell/Operational'; Id=4104} |
  Select-Object TimeCreated, Message | Select-Object -First 50

macOS / Linux:

# プロセスの実行ファイルのフルパスを表示
ps aux --format=pid,user,cmd | head -50   # Linux
ps aux | awk '{print $1, $2, $11}' | head -50   # macOS

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

# プロセスが開いているファイルとネットワーク接続を表示
lsof -p 1234   # PIDを指定
lsof -i TCP    # TCP接続のみ
lsof -u root   # rootユーザーが開いているファイル

💡 FACT: 「削除済みのファイルを実行しているプロセス」(Linux:/proc/PID/exe (deleted))はマルウェア感染の重要な指標の一つです。マルウェアは自身の実行ファイルを起動後に削除し、ディスク上の痕跡を消す手法を使うことがあります。

② lsof — 開いているファイルと通信を調べる

lsof(List Open Files)はプロセスが開いているファイル・ソケット・デバイスをすべてリストアップします。

macOS / Linux:

# 特定ポートで待ち受けているプロセスを確認
lsof -i :8080
lsof -i :22

# 外部との確立済み通信を一覧
lsof -i TCP -s TCP:ESTABLISHED

# 特定ユーザーの通信を確認
lsof -u suspicious_user -i

# /tmp以下のファイルを開いているプロセス(マルウェアの疑い)
lsof +D /tmp

# 削除されたが開き続けているファイルを探す
lsof | grep "(deleted)"

まとめ

本記事で紹介したフォレンジック系コマンドを一覧で確認できるようにまとめました。

カテゴリコマンド調査目的
Windowsログwevtutil qe Securityイベントログの抽出・エクスポート
WindowsログGet-WinEventPowerShellによる高度なログ分析
Windowsログreg query …\Run自動起動エントリの確認
Windowsログschtasks /query不審なスケジュールタスクの調査
Linux/macOSログjournalctlsystemdログの時系列分析
Linux/macOSログlast / lastbログイン成功・失敗の履歴確認
Linux/macOSログgrep + /var/log認証ログのブルートフォース検出
Linux/macOSログlog show(macOS)Unified Loggingの分析
ネットワーク証跡ss / Get-NetTCPConnection通信中プロセスの特定
ネットワーク証跡tcpdumpパケットキャプチャと保全
ネットワーク証跡arp -a不審デバイスの検出
ファイル証跡stat / Get-Itemファイルタイムスタンプの確認
ファイル証跡find -mtime / -perm不審ファイルの特性で検索
ファイル証跡sha256sum / certutilファイルの改ざん検出・マルウェア照合
メモリ・プロセスGet-Process + Get-WmiObject不審プロセスとコマンドライン確認
メモリ・プロセスlsofプロセスが開いているファイル・通信の確認
メモリ・プロセスlsof | grep “(deleted)”ファイルレスマルウェアの痕跡検出

インシデント発生時の初動フロー

「何かおかしい」と感じたときの初動の流れを整理しておきます。

  1. まず記録開始scriptコマンド(macOS/Linux)またはPowerShellのログ機能を有効化
  2. 現在の接続状態を保全ss -tunap または Get-NetTCPConnection
  3. 実行中プロセスを保全ps aux または Get-Process
  4. ログイン履歴を確認last / lastb または Get-WinEvent 4624/4625
  5. 自動起動エントリを確認reg query …\Run / crontab / launchctl list
  6. ログをエクスポートして保全wevtutil epl または journalctl
  7. 疑わしいファイルのハッシュを計算sha256sum / certutil -hashfile

コマンドによるフォレンジック調査は、問題の早期発見・被害の局所化・証拠の保全において非常に重要な役割を果たします。普段からログを確認する習慣をつけておくことで、「いつもの状態」との差異をすぐに見つけられるようになります。


※ 本記事の内容は情報セキュリティの教育・調査目的で掲載しています。自分が管理するシステム以外への無断アクセスは、不正アクセス禁止法(不正アクセス行為の禁止等に関する法律)により処罰の対象となります。企業・組織内でのフォレンジック調査は、必ず適切な権限と手続きのもとで実施してください。

コメント