← システム思考に戻る

Cursorで構築するファイアウォールログパイプライン

cursorai-agentssyslognxlogpfsensefirewallwindowssqlite

ドキュメントに書かれていることはすべて実行しました。pfSenseでリモートロギングを有効にし、Windowsマシンを送信先に指定し、UDP 514を開放しました。それでも何も届きません。Netgateフォーラムには、まさにこの沈黙についてのスレッドが十年以上にわたって蓄積されています。ログは生成されたのに送信されず、再起動後にsyslogdがひっそり停止していた、という問題です。ファイアウォールとディスクの間のどこかでイベントが消えました。しかし、この経路のどこで消えたのかを知らせるものは何もありません。

標準的な解決策はSIEMですが、これは一つの問題をさらに大きな問題と交換するようなものです。今度はElasticsearchまで管理することになります。このガイドでは別の道を進みます。Cursorを開いて五つの質問に答え、AIエージェントがファイアウォールログパイプラインを構築する間、コマンドを承認していきます。最後には、ディスク上で検証済みのファイアウォールイベントが一件、ローカルデータベース内に検索可能な履歴、そしてログを読み取れてもファイアウォールには触れられないAIアナリストが手に入ります。

全体の構成は、Windowsサービスが一つ、フォルダーが一つ、SQLiteファイルが一つです。

ピクセルアートのレンガ造りのファイアウォール、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が取り込みを確認してからファイルをアーカイブしなければ、一時的なロックによって一時間分のログがひっそり失われます。

書類がケーブルリールへ流れ、縞模様のバリケード、保護された円筒、緑のチェック、鍵穴のある木箱へと続くピクセルアート
バリケードが終了コードの確認です。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への総当たり攻撃を警告します。すべての検出結果には、確認できる証拠が添えられます。エージェントのアカウントには、読み取り以外のことができないからです。

虫眼鏡を持った人が、イベントID付きの検出タイプ一覧を表示するモニターを見ており、もっともらしい無害な説明を書いたメモ帳が横にあるピクセルアート
メモ帳は、プロンプトの最後の一節を表しています。すべての検出結果は、ありふれた説明に耐えなければなりません。

時間を無駄にする落とし穴

ファイアウォールルールがPublicプロファイルに割り当てられている。 Windows 11ではWi-FiがデフォルトでPublicになり、受信ポート514を何の通知もなく遮断します。ネットワークをPrivateに設定するか、使用するすべてのプロファイルにルールを割り当てます。

コレクターがスリープした。 UDPには再送がありません。スリープ中のWin11マシンは、起動するまですべてのイベントを失います。powercfg /change standby-timeout-ac 0を実行します。

ログは届くが、必要なログがない。 「syslogが動作する」と「セキュリティイベントを転送する」は、大半のファイアウォールで別々のスイッチです。欠けているカテゴリーには、それ専用のフィルターがあります。

EDRがNXLogを隔離した。 新しいバイナリーが待ち受けポートを開くと、マルウェアのように見えます。インストール後ではなく、インストール前にパスの除外設定を追加します。

エージェントがファイアウォールを代わりに修正しようとする。 ステップ5がうまくいったからといって、手の届く範囲を広げてはいけません。提案を伴う読み取り専用アクセスが、安全な定常状態です。

ここまでで得られるもの

ファイアウォールは、ずっと情報を発していました。今では、ディスク上に証拠があり、照会できる履歴があり、すべてを読んでも何にも触れないアナリストが待機しています。次にネットワークで何かがおかしいと感じたときは、フォーラムのスレッドを読むのではなく、自分のログに尋ねられます。

参考資料


購読