← Security from Zeroの一覧へ

Security from Zero 第4回:初めてのセキュリティログ

Windowsのログオンイベントを読み、時刻と重複を確認して、根拠を示せるタイムラインとトリアージメモを作ります。アナリストへの応募で説明できる練習です。

この回: 第4回・読む、実践する、まとめるまで約3時間出典確認日: 2026/10/21

30秒でわかる要点

この回で学ぶこと
Windows Securityの4624と4625を読みます。架空のエクスポート8行からタイムラインを作り、観測した事実と解釈を分けたトリアージメモを書きます。
関係するチーム
SOCアナリストやジュニアセキュリティアナリストを目指す人
最初にやること
練習ログとワークブックをダウンロードします。集計する前に、1行のコンピューター、イベントID、レコードID、時刻を特定してください。
始める前に
練習ファイルは簡略化した教材で、Windowsからの実際のエクスポートや実事件ではありません。Securityログへのアクセスは権限や監査設定によります。記録がないことは、何も起きなかった証明にはなりません。
第4回。1件のログを読み、根拠を時系列に並べ、説明できるトリアージメモを書く。
この回でいちばん大事なこと

出典、時刻、対象アカウント、結果を読んでから判断します。失敗の後の成功は調べるべき流れですが、それだけで侵害とは断定できません。

面接で数件のログを渡され、「何が起きましたか」と聞かれたら、まず根拠を示せる短い流れを説明しましょう。どのPCが記録したのか、どのアカウントが対象なのか、結果は何か、何がまだ分からないのか。この順番で読む力が役に立ちます。

第3回ではユーザー、権限、プロセス、サービスを観察しました。今回は操作の記録を読み、ログのタイムラインと1枚のトリアージメモを作ります。SOCやジュニアセキュリティアナリストの仕事で使う基礎です。

用意するもの: ブラウザー、テキストエディター、練習ログ。中心の演習はどのOSでもできます。任意のWindows演習は、自分のPCのSecurityログを読む権限がある場合に、イベントビューアーとWindows PowerShellを使います。目安は約3時間。SIEMのアカウントは不要です。

第4回のワークブックをダウンロードしてください。6枚の図は注釈付きの教材用イメージです。値は架空で、実事件の画面を撮影したものではありません。選択すると元のサイズで開けます。

1. 集計の前に1件を読む

ログは記録の集まりです。イベントは観測された内容の記録で、アラートはルールや検知による通知です。複数のイベントから1つのアラートが作られることもあります。どちらも単独で事件全体を説明するものではありません。

今回読むのは、プロバイダーMicrosoft-Windows-Security-AuditingのWindows Securityイベント2種類です。

イベントID 記録していること それだけでは分からないこと
4624 アカウントのログオン成功。アクセス先のコンピューターにログオンセッションが作られた。 許可された操作か、安全な操作か。
4625 アカウントのログオン失敗。試行が行われたコンピューターに記録される。 誰が試したのか、攻撃だったのか。

イベントIDはプロバイダーとチャネルと一緒に扱います。すべての製品で同じ番号が同じ意味になるわけではありません。イベントビューアーの「情報」はイベントのレベルであり、安全性の判定ではありません。監査の結果と各フィールドを読みます。

失敗ログオン1件を読む教材図。プロバイダーはMicrosoft-Windows-Security-Auditing、チャネルはSecurity、記録したPCはLAB-PC1。時刻は2026-10-20T09:01:20Z、イベントIDは4625、レコードIDは12002。対象はLAB\mira、ログオンタイプ3、送信元192.0.2.44。種類を表す番号と、個別の記録を参照する番号を分けて示す。

図1:イベントIDは種類、レコードIDは元のログ内の個別の記録を探す手がかりです。

ダウンロードはJSON Lines形式で、1行に1つのJSONオブジェクトを入れています。教材としてフィールド名を短く正規化しています。Windowsの生のXML、.evtx、SIEMのテーブルではありません。例えば次のような内容です。

{
  "time_utc": "2026-10-20T09:01:20Z",
  "provider": "Microsoft-Windows-Security-Auditing",
  "channel": "Security",
  "computer": "LAB-PC1",
  "record_id": 12002,
  "event_id": 4625,
  "user": "LAB\\mira",
  "logon_type": 3,
  "source_ip": "192.0.2.44",
  "status": "0xC000006D",
  "sub_status": "0xC000006A"
}

JSONではバックスラッシュをエスケープするため2つ書きます。実際のアカウント表記は、バックスラッシュ1つのLAB\miraです。この教材のuserは対象アカウントのドメインと名前を結合し、source_ipはIpAddress、time_utcはTimeCreated/SystemTimeに対応させています。他の項目はComputer、EventRecordID、EventID、LogonType、Status、SubStatusに対応します。このファイルの変換規則であり、他のログにそのまま当てはめるものではありません。

実際の4624では新しいログオン(New Logon)、4625では**ログオンに失敗したアカウント(Account For Which Logon Failed)**を読みます。**サブジェクト(Subject)**はログオンを報告・要求した側のアカウントで、対象とは異なることがあります。最初に見つけたアカウント名を、そのまま対象として写さないようにします。

確認ポイント: イベントID 4625とレコードID 12002の違いを説明してください。どちらもプロセスIDではありません。

2. 任意のWindows演習:元の記録を探す

自分のWindows PCでコマンドプロンプトを開き、実行します。

eventvwr.msc

イベントビューアーでWindowsログ → セキュリティを開きます。現在のログをフィルターの記録日時でユーザー設定の範囲を選び、過去15分を含む開始・終了を設定します。イベントIDに4624,4625を指定します。1件選び、全般と詳細 → XML表示を比べてください。プロバイダー、コンピューター、イベントID、レコードID、時刻、対象アカウント、ログオンタイプを探します。Windowsやイベントのバージョンによって、表示名や利用できるフィールドは異なります。

イベントビューアーの簡略図。Windowsログのセキュリティを選び、過去15分、ID 4624と4625で絞り込む。選択した失敗ログオンの全般には対象アカウントとログオンタイプ、XMLにはEventID、EventRecordID、TimeCreatedが表示される。記録は架空の教材用。

図2:全般で内容を読み、XMLでフィールド名と元の時刻を確認します。

アクセス拒否なら、その制約を記録して練習ファイルを使います。管理された端末では組織のアクセス手順に従ってください。監査ポリシーの変更、ログの消去、意図的なログオン失敗は必要ありません。記録が少ない理由には、監査設定、保存期間、選んだ時間帯、アクセス制限などがあります。

Securityログへの既存のアクセス権がある場合、次のWindows PowerShellはローカルPCだけを対象に、過去15分の範囲を固定し、最大20件を取得します。

$end = Get-Date
$start = $end.AddMinutes(-15)
$events = @(Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    ProviderName = 'Microsoft-Windows-Security-Auditing'
    Id = 4624, 4625
    StartTime = $start
    EndTime = $end
} -MaxEvents 20 -ErrorAction Stop)
$events | Select-Object TimeCreated, Id, RecordId, MachineName |
    Format-Table -AutoSize

Get-WinEventは標準では新しい順に返します。上限が20件なので、活動の多い時間帯の総件数とは限りません。該当なしとアクセス拒否は別の結果です。実際のメッセージを記録してください。取得できた場合は、選んだ中で最新の1件のXMLを見ます。

$events[0].ToXml()

実際のアカウント名、ホスト名、エクスポートしたログは公開しないでください。公開用のポートフォリオには架空の教材を使えます。練習ファイルだけを使った場合、Windows演習は「未実行」と記録します。

3. 時刻の基準をそろえる

教材の時刻の末尾にあるZはUTCを示します。2026-10-20T09:01:20Zと2026-10-20T18:01:20+09:00は同じ瞬間です。タイムゾーンやUTCからの差がない時刻は、その文脈が分かるまで不完全な情報として扱います。

時刻を比べる図。XMLのSystemTime 2026-10-20T09:01:20Zと、ローカル表示の例2026-10-20T18:01:20+09:00は同じ瞬間。別の受信時刻は収集の遅れにより後になることがある。今回の教材にはイベント時刻しかなく、受信時刻のフィールドはない。

図3:元のタイムスタンプを残し、タイムラインの基準を明記します。表示時刻と収集時刻は別の問いに答える情報です。

WindowsのXMLではTimeCreatedのSystemTime属性を確認できます。Microsoftのイベント例はUTC表記です。イベントビューアーなどがローカル時刻に変換して表示する場合もあるので、元の文字列と同じ基準だと決めつけず、表示のタイムゾーンを確認します。

今回の演習はUTCで統一します。ファイルの行順ではなく、日時として読んだイベント時刻で並べてください。実環境では受信の遅れや順序の逆転、端末時計のずれがあります。近い時刻に並ぶことは流れを考える手がかりですが、因果関係の証明ではありません。教材には収集時刻や時計の状態の情報はありません。

確認ポイント: ファイルの1行目が最初に起きたイベントとは限らない理由を説明してください。

4. 結果とログオンタイプを読む

このWindowsイベントのタイプ2は対話型、タイプ3はネットワークログオンです。タイプ10はリモート対話型で、リモートデスクトップなどで使われますが、教材にはありません。タイプ3だけでRDPや特定のアプリを使ったとは言えません。

LAB-PC1のLAB\miraに関する失敗ログオンのフィールド図。イベント4625、ログオンタイプ3、Status 0xC000006D、SubStatus 0xC000006A。ネットワークログオンの失敗、一般的なログオン失敗、パスワード誤りという読み方を示す。人物や意図は特定できない。

図4:イベントIDで結果を読み、タイプと失敗情報で状況を補います。

教材の値 文書上の意味 読み取れる範囲
0xC000006D ユーザー名や認証情報に問題がある、一般的なログオン失敗。 SubStatusがあれば、詳細も確認する。
0xC000006A パスワードが正しくない。 入力ミス、保存された古い資格情報、不正な推測などが候補になる。
0xC0000064 指定されたユーザーが存在しない。 その試行のアカウント検索に関する結果で、すべての環境やアカウントの話ではない。

このファイルのnullは値がないことを示します。成功イベントの失敗専用フィールドや、対話型イベントで送信元IPがない場合に使っています。0.0.0.0というアドレスではありません。実際のWindows記録では、フィールドや状況により-、空の値、ループバックなど別の表現があります。

192.0.2.44と192.0.2.80は文書用の予約アドレスです。遮断したり、脅威情報で照合したりする指標ではありません。実際のIPでも、それだけで人物は特定できません。プロキシ、NAT、共有端末などの状況も必要です。

5. 演習:7件のタイムラインを作る

練習ログをダウンロードし、テキストとして開きます。時刻順ではない8行が入っています。うち1行は、架空のエクスポート処理で同じ記録が再度含まれたものです。下の答えを見る前に試してください。

  1. ファイル名、プロバイダー、チャネル、コンピューター、最も早い時刻と遅い時刻を書く。
  2. 重複を探す。コンピューター、チャネル、レコードIDを比べ、その上でレコード全体が一致するか確認する。
  3. コンピューターが異なる12001は両方残す。12002も同様。レコードIDはPCやログをまたいで共通の一意な番号ではない。
  4. 作業用タイムラインから、完全一致した重複1行だけを除く。元のファイルは保存する。
  5. 異なる7件をUTCのイベント時刻で並べ、失敗と成功を別々に数える。
  6. LAB-PC1、LAB\mira、192.0.2.44、タイプ3に絞る。流れを記述し、考えられる説明を2つと、それを区別するために必要な根拠を書く。

小さなファイルなので手作業で比べられます。この組み合わせは固定した教材内での確認用です。実環境でログがリセットされた場合や、出典の変更、値が食い違う記録がある場合は、さらに状況を確かめてから重複を除きます。

PowerShellで一覧にする場合、ダウンロードのあるフォルダーでPowerShellを開き、実行します。

$rows = @(Get-Content -LiteralPath .\security-from-zero-topic-04-auth.jsonl |
    ForEach-Object { $_ | ConvertFrom-Json })
$rows | Sort-Object { [DateTimeOffset]::Parse($_.time_utc) } |
    Select-Object time_utc, computer, record_id, event_id, user |
    Format-Table -AutoSize

これは入力8行を並べるだけで、重複の除去や安全性の判定はしません。他のフィールドは元のファイルで確認します。並べ替えは読むための補助であり、各記録の確認の代わりにはなりません。

LAB-PC1、LAB\mira、送信元192.0.2.44、ログオンタイプ3のタイムライン。UTC 09:01:00、09:01:20、09:01:40に失敗し、09:02:10に成功。重複行、LAB-PC2の記録、後のタイプ2の対話型ログオンは、この絞り込んだ流れから分けて扱う。

図5:絞り込んだ流れは異なる4件です。関連のない操作を同じ話にまとめず、全体の記録も残します。

答え合わせ: 以下はすべて2026年10月20日、UTCで、同じプロバイダーとSecurityチャネルです。重複はLAB-PC1 / Security / 12002です。

時刻(UTC) コンピューター / レコードID イベントID 対象アカウント タイプ 送信元IP
09:01:00 LAB-PC1 / 12001 4625 LAB\mira 3 192.0.2.44
09:01:10 LAB-PC2 / 12001 4625 LAB\backup 3 192.0.2.80
09:01:20 LAB-PC1 / 12002 4625 LAB\mira 3 192.0.2.44
09:01:40 LAB-PC1 / 12003 4625 LAB\mira 3 192.0.2.44
09:02:10 LAB-PC1 / 12004 4624 LAB\mira 3 192.0.2.44
09:02:20 LAB-PC2 / 12002 4624 LAB\svc-backup 3 192.0.2.80
09:02:30 LAB-PC1 / 12005 4624 LAB\mira 2 値なし

ファイル全体では異なる7件、失敗4件、成功3件です。絞り込んだ流れは70秒間の失敗3件と成功1件です。後のタイプ2は別の情報であり、ネットワークログオンの流れに成功を1件追加するものではありません。LAB-PC2の2つのアカウントも同一視しません。

6. 次の担当者が動けるメモを書く

観測した事実は、例えばこう書けます。「LAB-PC1では、対象LAB\mira、送信元192.0.2.44、タイプ3の異なる失敗ログオン3件がUTC 09:01:00〜09:01:40に記録された。同じ項目を持つタイプ3の成功が09:02:10に続いた。エクスポート内の重複1行は集計から除いた。」

この書き方なら、攻撃者を想像で作らずに根拠を伝えられます。利用者が入力を直した、アプリが古い資格情報で再試行した、不正に推測した、などは仮説です。どれに該当するか、同じ人物の操作かは、このファイルだけでは確定できません。

トリアージメモの例。観測:ネットワークログオン失敗3件の後に成功、参照番号を記載。解釈:追加の状況確認が必要。不明:送信元端末、想定された操作か、成功後の活動。次の確認:送信元の特定、利用目的の確認、範囲を絞った関連ログの確認。扱いは「状況確認を継続、侵害は未確認」。

図6:次の担当者に、問い、根拠の参照先、具体的な確認手順を渡します。

次に確認すること 解決したい問い
許可された資産台帳、DHCP、VPNなどの記録で、その時刻の送信元端末を特定する。 想定された端末か。IPだけでは人物は分からない。
組織のサポート・調査手順で、アカウントの想定された操作を確認する。 既知のサインイン、保存された資格情報の問題、定期処理などがあったか。
成功時刻の前後5分を最初の範囲にして、アクセス先、ID、端末の関連ログを確認する。 どのセッションや活動が続いたか。ホストと時刻に加え、利用できるログオン・セッションIDも使う。
監査設定、収集の状態、保存期間、時刻同期を確認する。 欠落や時計のずれが読み方に影響していないか。

教材にはSID、ログオンID、認証パッケージ、プロセス詳細、ログオン後の活動がありません。名前とIPは記録を選ぶ手がかりですが、単一のセッションだった証明にはなりません。実際の調査では元の情報をより多く保存し、チームのエスカレーション基準に従います。

ワークブックを使って1枚にまとめます。問いと範囲、出典、タイムライン、事実、考えられる説明、不明点、次の確認、現時点の扱いを含めてください。今回なら**「追加の状況確認が必要。侵害は未確認」**という扱いが妥当です。失敗3件だけで共通の重大度を決めたり、この架空の教材だけを根拠に送信元の遮断を勧めたりしません。

終えた後の応募書類には、例えば「架空のWindowsログオンデータを分析し、重複を照合してUTCタイムラインを作成。根拠、不明点、追加の確認事項を記録した」と正確に書けます。イベントビューアーの経験は、その演習も実施した場合に別途記載してください。

7. 面接で説明する練習

質問 答えに含めたいこと
4624と4625の違いは? このプロバイダーのSecurityイベントでは成功と失敗。単独では意図は決まらない。
8行が7件になった理由は? 出典も含めて確認した、完全一致のエクスポート重複1行。レコードIDだけでは不十分。
タイプ3はリモートデスクトップ? ネットワークログオン。リモート対話型はタイプ10で、サービスやプロトコルの特定には別の根拠が必要。
失敗の後の成功は侵害の証明? 違う。流れ、他の説明、次に必要な根拠を述べる。
検索結果がない理由は? 時間帯、アクセス権、監査設定、保存期間、収集の問題、または本当に該当する操作がない。
次の担当者に何を渡す? 範囲と基準時刻が明確なタイムライン、出典の参照、事実、不明点、具体的な確認事項。

他の人が同じ7件のタイムラインを再現でき、数字の意味を聞き直さなくても判断を理解できれば、次へ進めます。第5回のアカウント、認証、アクセスは、まだロードマップ上の予定です。

出典と実行に関する注記

フィールドの意味は2026年10月21日にMicrosoftの4624、4625、Audit Logon、NTSTATUS値、TimeCreated、EventRecordIDの文書で確認しました。Get-WinEventとFilterHashtableも参照してください。

JSON Lines教材は公開作業環境でPythonのJSONライブラリーを使って解析し、件数、重複、時刻順を確認しました。ホスト、アカウント、イベントはすべて架空です。アドレスはRFC 5737の文書用範囲です。Windows画面とPowerShellの手順は文書で確認したもので、Windows上では実行していません。教材の検査は、実環境での収集や検知の検証ではありません。

2026年10月22日(日本時間): 日英で初公開。ロードマップに戻る。

Security from Zeroの一覧へ →Read in English ↗