Zeek(旧Bro)入門|ネットワークの“飛行記録”で攻撃を見抜く(ネットワークセキュリティ監視・NSM)

🛰 実務者向け・ネットワークセキュリティ監視入門

Zeek(旧Bro)入門|ネットワークの“飛行記録”で攻撃を見抜く

Wiresharkが「1つの通信を精密に見る顕微鏡」なら、Zeekは「ネットワーク全体を“意味のある記録”に変え続ける飛行記録装置」。通信ログの読み方から、暗号化通信の手がかり、Zeekスクリプト、Security Onionでの実習、SIEM連携まで、防御者の視点で日本語でやさしく解説します。

🛰 Zeek / Bro 📡 NSM(監視) 🪵 conn.log 🔎 脅威ハンティング 🧅 Security Onion

インシデントが起きてから「あのとき、ネットワークで何が起きていたのか」を知りたくても、記録がなければ何も分かりません。かといって、すべてのパケットを丸ごと保存し続けるのは現実的ではない——。この“ジレンマ”を解くのが Zeek(ジーク/旧称 Bro)です。Zeekは、流れる通信を黙って観察し、「誰が・いつ・どこへ・どのプロトコルで・どれだけ通信したか」を、軽くて検索しやすいログに変え続けます。まさに航空機のフライトレコーダー(飛行記録装置)Wiresharkが1つの通信を深く解剖する顕微鏡なら、Zeekはネットワーク全体を見張り、後から追跡できるようにする監視基盤です。日本語でまとまった解説がまだ少ないこの分野を、DFIR完全ロードマップの一歩進んだ実践編として、基礎からていねいに解き明かします。

⚠ 大切な前提(この記事の立ち位置)

本記事は、守る側(青チーム)が、自分の管理するネットワークを監視して攻撃の兆候を見つけるための「ネットワークセキュリティ監視(NSM)」を学ぶ教育目的の解説です。通信の監視・キャプチャは、あなた自身が管理または正式に許可されたネットワークでのみ行ってください。他者の通信を無断で傍受・解析する行為は、電気通信事業法の「通信の秘密」や不正アクセス禁止法に関わり得ます。学習は、自分の検証環境(自宅ラボ)や、公開されている演習用のパケットデータ(pcap)で進めましょう。

01

🛰 Zeekとは? ネットワークの“飛行記録装置”

アラートを鳴らす道具ではなく、通信を“記録”に変える監視フレームワーク。その発想を理解しましょう。

🛰

Zeek=通信を高品質なログに変える、オープンソースの監視フレームワーク

Zeekは、ネットワークを流れる通信を受動的に観察し、プロトコルごとの構造化されたログを生成する、オープンソースのネットワークセキュリティ監視(NSM)基盤です。1990年代にローレンス・バークレー国立研究所のVern Paxson氏が“Bro”として開発し、2018年にZeekへ改称されました。単に「悪い通信を見つけてアラートを鳴らす」道具ではなく、「通信のすべてを、後から調べられる記録に変える」——ここがZeek最大の特徴です。

多くの人が最初に戸惑うのが、「ZeekはIDS(侵入検知システム)なの?」という点です。答えは“半分そう、半分違う”。SnortやSuricataのような典型的なIDSは、「既知の悪いパターン(シグネチャ)」に一致したらアラートを出します。一方Zeekは、シグネチャ照合もできますが、本領は「観測した通信を、淡々と意味のあるログに書き起こす」こと。たとえば1本のHTTP通信から、アクセス先URL・ユーザーエージェント・応答コード・転送量などを抽出し、http.log に1行として残します。悪いと決めつける前に、まず“事実”を記録する。この姿勢が、後からの追跡(フォレンジック)と脅威ハンティングを支えます。

🛰 Zeekの位置づけ——通信を観測し、“意味のあるログ”に変える

🌐 ネットワーク 流れる通信(パケット) SPAN/TAP 通信の複製 Zeek 観測→構造化ログ化 conn.log(全接続の背骨) dns.log / http.log ssl.log(JA3・証明書) files.log(ファイル・ハッシュ) notice.log(注目イベント) パケットそのものを溜め込まず、“意味”を抽出して軽量なログに。だから長期保存・横断検索ができる

Zeekの真価は「3つのツールの役割分担」を知ると、はっきりします。下の表のとおり、Wireshark・Suricata・Zeekは“競合”ではなく“補完”の関係。とくにSuricataとZeekは併用するのが定番で、「既知の悪はSuricataで即アラート、振る舞いと記録はZeekで網羅」という組み合わせが、現代のNSMの王道です。

観点WiresharkSuricataZeek
役割1つのpcapを精密に見る“顕微鏡”シグネチャで既知脅威を検知(IDS/IPS)通信を構造化ログに変える“監視基盤”
主な出力パケット詳細(GUI)アラート豊富なトランザクションlog+notice
得意深掘り・1事象の解剖既知の悪を素早く止める振る舞いの記録・事後追跡・ハント
立ち位置手動の精密解析Zeekと併用が定番SuricataとSIEMの間をつなぐ
💡

ひとことで言うと

Zeekは「ネットワークの出来事を、後から検索できる“台帳”に書き起こし続ける記録係」です。Wiresharkが“その瞬間”を拡大するなら、Zeekは“過ぎたこと”を遡れるようにする。だからインシデントの後でも、「3週間前のあの通信」をログから追えるのです。

02

🪵 Zeekのログ:通信を“意味のある記録”に変える

Zeekの主役はログ。怖がらなくて大丈夫、ただの“整理された表”です。

Zeekを動かすと、ディレクトリにたくさんの .log ファイルが生まれます。それぞれがプロトコルや観点ごとの“台帳”で、1行が1つの出来事(トランザクション)です。まずは代表的なログを押さえましょう。

ログ記録される内容
conn.logすべての接続の背骨。送信元/宛先のIP・ポート、プロトコル、継続時間、転送量、接続の状態。
dns.logDNSの問い合わせと応答。どのドメインを、いつ引いたか。トンネリング検知の宝庫。
http.logHTTPのURL・ホスト・ユーザーエージェント・メソッド・応答コード・転送量。
ssl.logTLSのSNI(接続先名)・証明書・JA3フィンガープリント。暗号化通信でも手がかりが残る。
files.log通信から見えたファイルの種別とハッシュ(MD5/SHA1)。脅威情報との照合に直結。
x509.log証明書の詳細(発行者・有効期限・自己署名か)。怪しいTLSの判断材料。
notice.logZeekが“注目に値する”と判断した出来事。スクリプトやIntelの“気づき”の出口。
weird.logプロトコル的に“おかしい”事象。回避・異常の兆候が紛れていることも。

この中で絶対の主役が conn.log です。ネットワーク上のあらゆる接続を1行ずつ記録する“背骨”で、ほかのログはここから枝分かれします。1行を読んでみましょう。

# conn.log の1行(タブ区切り)。先頭の #fields がカラム名の定義 #fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state 1717_ CwjjJk2…uid 10.0.0.5 49832 93.184.216.34 443 tcp ssl 3725.4 1842 9d S1 # 読み方:内部 10.0.0.5 が 外部 :443(ssl) へ、約3725秒=1時間以上つなぎっぱなし # → 「長時間・少データ」の常時接続は、C2ビーコンの典型サイン

duration(継続時間)や orig_bytes/resp_bytes(転送量)、conn_state(接続の状態:SF=正常終了、S0=応答なし、REJ=拒否 等)を見るだけで、通信の“性格”が浮かびます。

そして、すべてのログをつなぐ“背番号”が uid(ユニークID)です。1つの接続には固有のuidが振られ、同じuidが conn.log・http.log・files.log…に共通で現れます。だから「この怪しい接続(conn.log)は、どのURLへ行き(http.log)、どんなファイルを運んだか(files.log)」を、uidをたどるだけで串刺しに復元できる。これがZeekログの“魔法”です。

🧵 uid が全ログを縫い合わせる——1接続を“串刺し”で復元

1つの接続 uid = CwjjJk2… conn.log IP・ポート・転送量 dns.log / http.log 引いた名前・URL ssl.log SNI・JA3・証明書 files.log 種別・ハッシュ 同じ uid を共有するから、バラバラのログを1つの“物語”に組み直せる
🗂️

ログは「JSON」でも出せる=SIEMと相性抜群

Zeekのログは既定ではタブ区切り(TSV)ですが、JSON形式でも出力できます。JSONにしておくと、SplunkやElasticといったログ分析基盤へそのまま取り込め、検索・相関・可視化が一気にやりやすくなります。“記録”が“検知”に化けるのは、この連携があってこそです。

03

🔎 Zeekで攻撃を狩る:何が見えるか

記録があるからこそ“狩れる”。Zeekログに浮かぶ、代表的な攻撃のサインを見ます。

Zeekログの価値は、攻撃の“足跡”が構造化された形で残ることにあります。シグネチャに頼らず、「振る舞いの異常」から脅威を狩る(ハンティング)——これがNSMの醍醐味です。代表的な4つの着眼点を見ましょう。

C2通信

ビーコン(長時間・規則的な接続)

conn.logで「長いduration」「等間隔の再接続」「少ない転送量」を探す。感染端末が司令塔(C2)へ定期連絡するビーコンの痕跡が浮かびます。

暗号化C2

TLSの異常(JA3・自己署名)

中身は暗号でも、ssl.logJA3(クライアントの指紋)や自己署名証明書・不審なSNIは見えます。マルウェア特有のTLSの“癖”を手がかりにできます。

DNSトンネル

DNSを使った密通・持ち出し

dns.logで「異常に長い・ランダムなサブドメイン」「大量のNXDOMAIN」「1ドメインへの問い合わせ集中」を探す。DNSに紛れた通信路や持ち出しの兆候です。

持ち出し・配送

転送量の偏り&ファイル抽出

conn.logで「内→外のorig_bytesが突出」=持ち出しの疑い。files.logのハッシュを脅威情報と照合すれば、運ばれたマルウェアも特定できます。

こうした“狩り”は、特別なツールがなくても始められます。Zeekに付属する zeek-cut を使えば、巨大なログから必要な列だけを抜き出し、見慣れたコマンドで料理できます。下は「長時間つなぎっぱなしの接続=C2ビーコン候補」を炙り出す例です。

# conn.log から「長時間接続」を上位抽出(C2ビーコンの候補を探す) cat conn.log | zeek-cut id.orig_h id.resp_h service duration orig_bytes resp_bytes \ | sort -k4 -rn | head # dns.log から「長すぎるドメイン名」を探す(DNSトンネリングの兆候) cat dns.log | zeek-cut query | awk ‘length($1) > 50’ | sort -u

zeek-cut は“列の抜き出し”専用ツール。あとは sortawk など使い慣れたコマンドと組み合わせるだけ。正規表現でのログ解析の発想がそのまま活きます。

🚨 Zeekは“中身”を読むわけではない——メタデータの強さと限界

通信の大半がTLSで暗号化された今、Zeekは通信の“中身(本文)”までは読めません。見えるのは、接続先・タイミング・転送量・TLSの指紋(JA3)・証明書といった“メタデータ(外形)”です。ただ、これは弱点であると同時に強みでもあります。「いつ・誰が・どこへ・どれだけ・どんな癖で」は暗号化されても残るため、中身が読めなくても振る舞いの異常から攻撃を炙り出せるのです。逆に言えば、Zeek単体で何でも分かるわけではありません。Wiresharkでの深掘りC2通信の解析、エンドポイントのログと突き合わせてこそ、点が線になります。

04

🧠 Zeekスクリプト:振る舞いをコードで捕まえる

Zeekの“本当の力”は、ログだけではありません。出来事に反応するスクリプトです。

ここまでは「Zeekが吐くログを読む」話でした。でもZeekの真骨頂は、独自のスクリプト言語を持ち、通信中に起きる“出来事(イベント)”に反応してロジックを走らせられることにあります。Zeekは通信を解析しながら、dns_request(DNS問い合わせがあった)、http_request(HTTP要求があった)、ssl_established(TLSが確立した)、connection_state_remove(接続が終わった)といったイベントを次々に発火させます。そこに「こういう出来事を見たら、こうする」という処理を書けるのです。

百聞は一見にしかず。下は「1時間を超える長時間接続を見つけたら、notice(注目イベント)に上げる」という、小さなZeekスクリプトです。

# long-conn.zeek — 1時間を超える長時間接続を notice に上げる @load base/frameworks/notice redef enum Notice::Type += { Long_Duration_Conn }; event connection_state_remove(c: connection) { if ( c$duration > 1hr ) NOTICE([$note=Long_Duration_Conn, $msg=fmt(“長時間接続: %s 秒”, c$duration), $conn=c]); }

event connection_state_remove(c) は接続が終わるたびに発火。c$duration(継続時間)を見て、1hr を超えたら NOTICE(...) で notice.log に記録します。これだけで“振る舞いベースの検知”が1つ完成です。

この“気づき”を束ねる仕組みが、Zeekの2つのフレームワークです。脅威ハンティングの現場では、この2つを押さえておくと一気に世界が広がります。

Notice Framework

「注目すべき出来事」を一元化

スクリプトが見つけた異常を NOTICEnotice.log に集約。メール通知や、特定noticeの抑制(サプレッション)も設定でき、アラートの“出口”を整えます。

Intel Framework

脅威情報(IOC)と通信を自動照合

悪性のIP・ドメイン・証明書・ファイルハッシュの脅威情報(IOC)を読み込ませると、流れる通信とリアルタイム照合。一致すれば即 notice に上がります。

「自分でスクリプトを書くなんて難しそう」と感じるかもしれません。でも安心してください。Zeekには最初から、有用なスクリプトが大量に同梱されています(標準で多くのプロトコル解析や検知ロジックが有効)。さらにコミュニティが公開するパッケージ(zkg)を入れれば、書かずとも高度な検知を足せます。まずは「既存のスクリプトを読む・使う」ところから始め、慣れてきたら上の例のような小さな1本を書いてみる——これが王道の学び方です。なお、より軽量なZeekシグネチャ(パターン照合)の仕組みもあり、用途で使い分けます。

🧩

Sigmaやマルウェア解析とつながる

Intel Frameworkに入れるIOCは、脅威インテリジェンスの成果物そのもの。マルウェア解析で得たC2ドメインやハッシュをZeekに食わせれば、“同じ脅威が他にも来ていないか”をネットワーク全体で見張れます。検知を“つくって終わり”にせず、循環させるのがコツです。

05

⚙️ 動かす・置く・育てる:導入と運用

最初の一歩は驚くほど簡単。“1つのpcapを食わせる”だけで、Zeekは動きます。

Zeekを学ぶ一番やさしい入口は、手元のパケットデータ(pcap)をオフラインで解析することです。Wiresharkで開いていたあの .pcap を、そのままZeekに渡してみましょう。サーバー構築は要りません。

# ① pcap をオフライン解析(まずはここから。各種 .log が生成される) zeek -r suspicious.pcap # ② 生成された conn.log を zeek-cut で読む(-d で時刻を読みやすく) cat conn.log | zeek-cut -d ts id.orig_h id.resp_h service duration # ③ ライブ監視(監視用IFを指定。自分が許可された環境でのみ) sudo zeek -i eth0

-r=pcap読み込み(オフライン)、-i=インターフェイス指定(ライブ)。同じZeekが、過去のpcap調査にも、常時監視にも使えます。

本格運用では、Zeekを「センサー」として、ネットワークの“通り道”に置きます。重要なのは設置場所。スイッチのSPANポート(ミラーポート)ネットワークTAPから通信の複製を受け取り、インターネットの出入口(境界)など、トラフィックが集まる“くびれ”に置くのが定石です。ここを押さえれば、最小のセンサーで最大の視界が得られます(この“キャプチャ位置”の考え方はWireshark実践ガイドと共通です)。導入の選択肢は、大きく3つです。

入門に最適

pcapをオフライン解析

zeek -r で、演習用pcap(例:malware-traffic-analysis.netの教材)を解析。サーバー不要で、Zeekログの読み方を安全に体得できます。

本番監視

ライブ・センサー設置

SPAN/TAPから通信を受け、境界で常時監視。高トラフィックではZeekクラスタで複数CPUに負荷分散します。

学習の決定版

Security Onionで丸ごと体験

Zeek+Suricata+Elasticを統合した無料のNSMディストロ。自宅ラボに導入すれば、現場と同じ“狩り”の環境が手に入ります。

とくに学習でおすすめなのが、無料のセキュリティ監視向けLinux「Security Onion」です。Zeek・Suricata・Elasticスタック・可視化ツールが最初から組み合わさっており、検証環境に入れるだけで、プロのSOCに近いハンティング環境が手に入ります。Zeekの商用版としては、Zeek開発者たちが設立したCorelightのセンサーもあり、大規模環境で広く使われています。まずはSecurity Onion(または素のZeek+pcap)で“触って慣れる”のが、遠回りに見えて最短です。

🏗 現代のNSMスタック——Zeekは“記録”の中核に座る

SPAN / TAP 通信の複製 センサー Zeek(記録) +Suricata(アラート) SIEM Splunk / Elastic 検知・相関 Sigma / ルール 🔎 ハント 対応へ 「記録(Zeek)→ 集約(SIEM)→ 検知(Sigma)→ 狩り → 対応」。Zeekは“質の高い記録”でこの流れ全体を底上げする
06

🎛 検知をつなぐ:SIEM・Sigma・脅威ハント運用

Zeekの記録は、ほかの仕組みと“つなぐ”ことで、検知と対応の力に変わります。

Zeekは“記録の達人”ですが、記録は使われて初めて価値になります。ここで効いてくるのが、これまでの記事で扱ってきた仲間たちです。ZeekのログをSIEM(Splunk等)へ流し込み、Sigmaで検知ルールを当てる——じつはSigmaにはZeekログ専用のログソース定義があり、「Zeekの conn.log や dns.log に対する検知ルール」をそのまま書けます。NSMの一連の流れを整理しましょう。

1

収集する(Collect)

境界のセンサーでZeekを動かし、conn/dns/http/ssl/files…のログを生成。「取れていない通信は、後から調べようがない」——まずは記録の網を張る。

2

集約する(Aggregate)

ZeekログをJSONでSIEMへ。SplunkやElasticに集めれば、横断検索・相関・ダッシュボードでの可視化ができる。

3

検知する(Detect)

ZeekのNotice/IntelSigmaルール、ベースラインからの逸脱で、怪しい通信を浮かび上がらせる。MITRE ATT&CKで“どの段階か”を整理。

4

狩る(Hunt)

怪しい接続のuidを軸に、ログを串刺しでピボット。「この接続→このドメイン→このファイル」と物語を復元し、仮説を検証する。

5

対応する(Respond)

確証が得られたらインシデント対応へ。Zeekの記録は、影響範囲の特定と“いつから・どこまで”の判断を支える“証拠”になる。

この流れの根っこにあるのが、NSMの大原則「予防は破られる前提で、見える化しておく」という考え方です(NSMを体系化したRichard Bejtlich氏の思想として知られます)。完璧に侵入を防ぎ切ることはできない——だからこそ、侵入されても“気づける”ように、ネットワークの出来事を記録し続ける。Zeekは、その“見える化”を最も豊かに実現する道具なのです。Velociraptorのようなエンドポイント可視化と組み合わせれば、“通信”と“端末”の両面から、攻撃を立体的に追えます。

✅ Zeek学習・はじめの一歩

ネットから隔離した検証環境を用意した(監視は自分が許可された範囲で)/□ 演習用pcap(malware-traffic-analysis.net等)を zeek -r で解析してみた/□ 生成された conn.logzeek-cut で読み、列の意味をつかんだ/□ dns.logssl.log から“長いドメイン”や“自己署名証明書”を探してみた/□ Security Onion を自宅ラボに入れ、Zeek+Suricata+可視化の流れを体験した/□ 余裕が出たら、§4の例を真似て小さなZeekスクリプトを1本書いてみた。まずは「pcapを食わせる→ログを読む」。それだけで、ネットワークの見え方が一変します。

07

📚 用語集・FAQ・次に読む

つまずきやすい用語と、よくある疑問をまとめました。

ここまでに登場した言葉の“答え合わせ”として、用語集とFAQをまとめました。Zeekは奥が深い分野ですが、入口はこの記事の範囲で十分です。あとは安全な環境で手を動かしながら、少しずつ守備範囲を広げていきましょう。最初に conn.log を自分の目で読めたとき、ネットワークが“見える”感覚がきっとつかめます。

📖 用語集

用語意味
Zeek(旧Bro)通信を構造化ログに変えるオープンソースのネットワーク監視フレームワーク。
NSMネットワークセキュリティ監視。通信を記録・検知・分析して攻撃に備える営み。
conn.logすべての接続を記録するZeekの“背骨”ログ。IP・ポート・時間・転送量など。
uid接続ごとの一意のID。複数ログを串刺しで関連づける“背番号”。
JA3 / JA3STLSのクライアント/サーバーの“指紋”。暗号化通信でもマルウェアの癖を見分ける手がかり。
Notice Framework注目すべき出来事を notice.log に集約する、Zeekの“気づき”の仕組み。
Intel FrameworkIOC(脅威情報)を読み込み、通信とリアルタイム照合する仕組み。
Suricataシグネチャ型のIDS/IPS。Zeekと併用するのが定番。
SPAN / TAP通信を複製してセンサーに渡す手段(ミラーポート/専用機器)。
Security OnionZeek+Suricata+Elastic等を統合した無料のNSM向けLinux。学習に最適。
zeek-cutZeekログから必要な列を抜き出す付属ツール。sort等と組み合わせる。

❓ よくある質問(FAQ)

プログラミング経験がなくても使えますか?

はい。最初は「ログを読むだけ」で十分価値があります。zeek -r でpcapを解析し、zeek-cutconn.log を眺める——ここにプログラミングは要りません。スクリプトは“次の一歩”。同梱・公開済みのスクリプトを使うだけでも高度な検知ができ、書けるようになるのは慣れてからで大丈夫です。

ZeekとWireshark、Suricataはどう使い分けるの?

役割が違います。Wiresharkは1つの通信を精密に見る顕微鏡、Suricataは既知の悪をシグネチャで止めるIDS、Zeekは通信を記録に変える監視基盤です。競合ではなく補完関係で、実務では「ZeekとSuricataを併用し、深掘りはWireshark」という組み合わせがよく使われます。

通信が暗号化されていても役に立ちますか?

役に立ちます。中身(本文)は読めなくても、接続先・タイミング・転送量・TLSの指紋(JA3)・証明書といった“外形”は ssl.log 等に残ります。マルウェアのC2通信は、こうしたメタデータに“癖”が出ることが多く、暗号化されていても振る舞いから炙り出せるのがZeekの強みです。

まず何から始めればいいですか?

演習用pcap+zeek -rが最短です。Wireshark記事で紹介したような安全な教材pcapをZeekに食わせ、生成された conn.log を読んでみましょう。腰を据えて学ぶなら、Security Onionを自宅ラボに入れると、Zeek+Suricata+可視化を一気に体験できます。

Zeekのログはどこに送って活用するの?

多くの現場では、ログをJSONで出力してSIEM(Splunk・Elastic等)に集約します。そこにSigmaルールを当てたり、ダッシュボードで可視化したり。SigmaにはZeekログ向けのログソース定義もあり、「記録(Zeek)→検知(Sigma/SIEM)」がスムーズにつながります。

センサーはネットワークのどこに置けばいい?

トラフィックが集まる“くびれ”=インターネットとの境界が基本です。スイッチのSPAN(ミラー)ポートTAPから通信の複製を受け取ります。これはWiresharkのキャプチャ位置と同じ考え方。高トラフィック環境では、Zeekを複数CPUに分散させるクラスタ構成で処理能力を確保します。

🧭 次に読む

📚 参考・出典(一次情報)

  • Zeek 公式ドキュメント(docs.zeek.org)/Zeek プロジェクト(zeek.org、旧 Bro)
  • Vern Paxson「Bro: A System for Detecting Network Intruders in Real-Time」(1998, LBNL)
  • Security Onion 公式ドキュメント(securityonionsolutions.com)/Corelight(商用Zeekセンサー)
  • Richard Bejtlich「The Practice of Network Security Monitoring」(NSMの体系)
  • JA3(Salesforce, TLSフィンガープリント)/SigmaHQ(Zeekログソース定義)/MITRE ATT&CK

コメント