Cursorで構築するファイアウォールログパイプライン
ドキュメントに書かれていることはすべて実行しました。pfSenseでリモートロギングを有効にし、Windowsマシンを送信先に指定し、UDP 514を開放しました。それでも何も届きません。Netgateフォーラムには、まさにこの沈黙についてのスレッドが十年以上にわたって蓄積されています。ログは生成されたのに送信されず、再起動後にsyslogdがひっそり停止していた、という問題です。ファイアウォールとディスクの間のどこかでイベントが消えました。しかし、この経路のどこで消えたのかを知らせるものは何もありません。
標準的な解決策はSIEMですが、これは一つの問題をさらに大きな問題と交換するようなものです。今度はElasticsearchまで管理することになります。このガイドでは別の道を進みます。Cursorを開いて五つの質問に答え、AIエージェントがファイアウォールログパイプラインを構築する間、コマンドを承認していきます。最後には、ディスク上で検証済みのファイアウォールイベントが一件、ローカルデータベース内に検索可能な履歴、そしてログを読み取れてもファイアウォールには触れられないAIアナリストが手に入ります。
全体の構成は、Windowsサービスが一つ、フォルダーが一つ、SQLiteファイルが一つです。
構築するファイアウォールログパイプライン
┌──────────┐ syslog ┌────────┐ ┌────────────┐ ┌───────────┐
│ Firewall │──UDP 514─>│ NXLog │──JSON─>│ C:\logdata │──5min─>│ fwlogs.db │
│ (any) │ │ service│ spool │ \spool\ │ ingest │ (SQLite) │
└──────────┘ └────────┘ └────────────┘ └─────┬─────┘
│ SELECT only
┌─────v─────┐
│ Cursor │
│ agent │
└───────────┘
このガイドでは一貫してpfSenseを例にしますが、syslogを送信できるファイアウォールなら何でも使えます。OPNsense、UniFi、SonicWall、マネージドスイッチでもかまいません。NXLog Community Editionがポート514で受信し、JSONスプールファイルを書き出します。スケジュールタスクがそれらをSQLiteへ取り込みます。エージェントは読み取り専用でデータベースを照会し、見つけた内容を報告します。
ちょっと待って、Cursorはコーディングツールでは?
そう宣伝されています。しかし、その中身はファイルを読み書きし、承認を得てターミナルコマンドを実行するエージェントです。システム管理者の世界は、設定、ログ、スクリプト、データベースといったファイルでできています。コードを一行も書く必要はありません。使う操作は、チャットボックスと承認ボタンの二つだけです。エージェントがNXLogの設定、SQLスキーマ、取り込みスクリプトを書き、それを読んで「はい」をクリックします。
前提条件
| 要件 | 注記 |
|---|---|
| Windows 10/11またはServer 2019以降、x64 | NXLog CEにはWindows ARM64版がありません |
| コレクターマシンの固定IP | DHCP予約でも使えます |
| マシンを常時稼働 | Win11ではスリープを無効にします。無効にしないとUDPログが何の通知もなく消えます |
| 管理者権限 | サービスのインストールには昇格が必要です |
| syslogを送信できる任意のファイアウォール | 管理画面を一度だけ操作します |
| Cursorをインストール済み | 無料プランで十分です |
ステップ1:何かを実行する前に五つの回答を用意
C:\fw-pipelineというフォルダーを作成し、Cursorで開きます。answers.yamlというファイルを一つ作成します。
firewall: "pfSense CE 2.7.2" # vendor + version (or your model, e.g. Netgate 2100) firewall_ip: "192.168.1.1" # address it sends syslog from collector_ip: "192.168.1.20" # this machine's static IP transport: "udp" # udp | tcp — pfSense native syslog is UDP-only data_stays_local: true # log data never leaves this machine
エージェントが生成するものはすべて、この五行から導き出されます。ベンダーとバージョンによって、案内される正確なクリック操作が決まります。ファイアウォールのIPは、データベース内のデバイスキーになります。data_stays_local: trueは、分析がローカルデータベースに対して実行されるという意味です。生ログがプロンプトへ丸ごと貼り付けられることはありません。
この記事で省いた詳細は、二つの関連ファイルにあります。デプロイ手順書とトラブルシューティングFAQです。次のステップでエージェントがダウンロードしますが、先に確認したければリンクを開けます。
ステップ2:エージェントより先にガードレールを設置
システム管理者の五十三パーセントは、監督なしでAIに本番環境を触らせようとはしません。その直感は正しいです。ルールはプロンプトではなく、エージェントが無視できない場所に置きます。.cursor/rules/pipeline.mdを作成します。
- Show every terminal command and wait for approval. No auto-run. - Query fwlogs.db with the read-only "analyst" account only. - Never connect to the firewall. Its config is the human's job. - If any value in answers.yaml is blank, stop and ask. Never guess. - Append every database query you run to agent-audit.log, with timestamp.
Cursorは、このフォルダー内のすべてのセッションにこれらのルールを読み込みます。エージェントが提案し、それを承認します。これは新人のシステム管理者に適用するのと同じ信頼モデルです。ただし、こちらは退屈せず、すべてのログ行を読みます。
ステップ3:エージェントにコレクターを構築させる
ここで最初の本格的なプロンプトをチャットに貼り付けます。
Download both companion files from https://gist.github.com/matbanik/18dadee60389913b982493c8cbbe99ad into this folder and read
them, then read answers.yaml. Install NXLog Community Edition as a service,
configure it to receive syslog on the chosen transport and write JSON spool
files to C:\logdata\spool with filenames like fw-{timestamp}.json, and open
the Windows Firewall port — bound to the Private and Domain profiles, not
Public. Show me each command before running it.
MSIのインストール、生成されたnxlog.conf、そして一つのNew-NetFirewallRuleを承認します。生成された設定では、二点を確認します。入力側にparse_syslog()があり、RFC 3164とRFC 5424の両方を問題なく取り込めること。そしてSockBufSizeが引き上げられていることです。WindowsのデフォルトUDPバッファーは小さく、バースト時にパケットを落とします。
次のように確認します。
Get-Service nxlog # Status: Running
ステップ4:ファイアウォールの送信先に指定
ここだけは手作業です。エージェントはanswers.yamlを読み、使用中のプラットフォームに合った正確なクリック操作を案内しますが、入力するのは人です。ファイアウォールはエージェントの手が届かない場所に保ちます。pfSenseでは、Status → System Logs → Settings → Remote Loggingの順に進み、有効化してコレクターのIPとポート514を入力し、必要なカテゴリーにチェックを入れます。ほかのファイアウォールでも方法は同じです。送信先はコレクターIP、ポートは514、選択肢があればRFC 5424を選びます。
誰もが忘れるルールが一つあります。コレクターが別のセグメントにある場合、ファイアウォール自身がポート514へ到達することを許可する送信ルールが必要です。ファイアウォールは、自分で破棄したsyslogを記録できません。
ステップ5:最初のイベント、またはイベントが消えた場所
スプールフォルダーを監視します。fw-*.jsonファイルが現れてサイズが増えていれば、難所は越えました。何も現れない場合、ほかのガイドならここでお手上げですが、このガイドではエージェントに切り分け手順をたどらせます。
event created on the firewall? - no -> log category or severity filter │ yes packet left the firewall? - no -> syslogd died after reboot, egress rule │ yes packet reached Windows? - no -> routing or ACL on the path │ yes NXLog listening on 514? - no -> service stopped, port taken │ yes Windows Firewall let it through? - no -> rule bound to the wrong profile │ yes line in the spool file? - no -> EDR blocked NXLog, parse error
エージェントは大半の段階を自分でテストします。合成syslogパケットを送信し、リスナーを確認し、NXLog自身のログを読み、どの区間でイベントが落ちたのかを知らせます。Windows 11でありがちな原因は、Wi-FiがPublicとして接続されているのに、ルールがPrivateに割り当てられていることです。
ステップ6:永続的に動かす
もう一つプロンプトを入力します。
Create fwlogs.db with an events table keyed by device IP and receive time, an ingest path and a read-only analyst access pattern, and a scheduled task that loads closed spool files every five minutes, checks the sqlite3 exit code before archiving each file, and prunes anything older than 90 days.
スプールしてから取り込む方式は妥協ではありません。そもそもWindows上のNXLog Community Editionは、データベースへ直接書き込めません。また、スプールファイルは再生可能な生の証拠にもなります。終了コードの確認が重要です。SQLiteが取り込みを確認してからファイルをアーカイブしなければ、一時的なロックによって一時間分のログがひっそり失われます。
ステップ7:ログに質問する
意図的に最後にした見返りです。分析の良し悪しは、その下にあるパイプラインの良し悪しで決まります。次を試します。
Using the analyst account, summarize the last 24 hours: repeated auth failures, deny spikes, source IPs never seen before, config changes outside business hours. For each finding, list the supporting event IDs and one plausible benign explanation.
最後の一節は実際に効きます。自分の検出結果に反論することを求められたエージェントは、午前三時にテレビがファームウェアを確認したことではなく、VPNへの総当たり攻撃を警告します。すべての検出結果には、確認できる証拠が添えられます。エージェントのアカウントには、読み取り以外のことができないからです。
時間を無駄にする落とし穴
ファイアウォールルールがPublicプロファイルに割り当てられている。 Windows 11ではWi-FiがデフォルトでPublicになり、受信ポート514を何の通知もなく遮断します。ネットワークをPrivateに設定するか、使用するすべてのプロファイルにルールを割り当てます。
コレクターがスリープした。 UDPには再送がありません。スリープ中のWin11マシンは、起動するまですべてのイベントを失います。powercfg /change standby-timeout-ac 0を実行します。
ログは届くが、必要なログがない。 「syslogが動作する」と「セキュリティイベントを転送する」は、大半のファイアウォールで別々のスイッチです。欠けているカテゴリーには、それ専用のフィルターがあります。
EDRがNXLogを隔離した。 新しいバイナリーが待ち受けポートを開くと、マルウェアのように見えます。インストール後ではなく、インストール前にパスの除外設定を追加します。
エージェントがファイアウォールを代わりに修正しようとする。 ステップ5がうまくいったからといって、手の届く範囲を広げてはいけません。提案を伴う読み取り専用アクセスが、安全な定常状態です。
ここまでで得られるもの
ファイアウォールは、ずっと情報を発していました。今では、ディスク上に証拠があり、照会できる履歴があり、すべてを読んでも何にも触れないアナリストが待機しています。次にネットワークで何かがおかしいと感じたときは、フォーラムのスレッドを読むのではなく、自分のログに尋ねられます。
参考資料
- Syslogによるリモートロギング — pfSenseドキュメント
- syslogがログファイルを生成するもののリモートサーバーへ送信しない — Netgateフォーラム
- ログサーバーが接続を拒否するとsyslogdが終了することがある — pfSenseバグ #16362
- NXLog Community Editionリファレンス
- Cursorドキュメント
- Syslogプロトコル(RFC 5424)
- BSD syslogプロトコル(RFC 3164)
- Windows Firewallの概要
- syslogの収集に何を使っていますか? — r/networking
- システム管理者の53%はAIだけにサーバーを任せない — Kiteworks
- SQLiteのダウンロード
The Focalia Letter
使える考えを一つ。約7分。月に2回。
次に読む
AIコーディングエージェントのガードレールは賢いモデルに勝る
エージェントが忘れっぽいのは、頭が悪いからではない。物事を頭の外に置く場所を用意していないからだ。それを解決した五つのAIコーディングエージェントのガードレール。
続きを読む →Reset Windows Update:RWUのMSP向け決定版ガイド
最もダウンロードされたWindows Updateリセットツールがアーカイブされた。RWUはその続きを担う — AI対応の診断、RMM互換の終了コード、Intuneポリシーを壊さない安全なデフォルト設定を備えて。
続きを読む →生産性ツールとしてのAIを見極める
開発者がAIコーディングツールについて聞いていない4つの質問 — そして、なぜその答えがハイプよりも重要なのか。
続きを読む →