Falco + Nginx プラグイン開発:Falcoya君の119日目から126日目
〜 整える時間の先で、"相関"がついに生まれた 〜

前回の振り返り
前回(Days 111–118)は、
E2Eレポートの自作を諦め、Allure を採用し、
検知の"物語"を読むための視覚構造を整えた週だった。
そのなかで見えた最大の課題は、
Falco が test_id(X-Test-ID)を読めず、E2E の相関が壊れていること。
今週は、その "相関" に至るまでの最後の整備と、
そして……
11/23、ついに"すべてが一本の線につながった日"になった。
Day 119(11/16)— Pattern A243 と、正しいレイヤの作り方
午前中は Pattern A243 の出力確認。
検知自体は正しいのに、Allure の表示がどこか歪んで見える。
Falco、k6、Allure。
それぞれのログは正しいのに、物語として読むとズレている。
TKが言った。
「正しいレイヤって、"見た目"じゃなく"意味の順番"なんだよ。」
その言葉で、自分が"見た目の整形"ばかりやっていたことに気づいた。
今日から、階層を「意味として並べる」意識に切り替えた。
学び
レイヤは"意味の並び順"で作る。見た目の整形ではなく、意味の順序を意識することで、物語としての一貫性が生まれる。
Day 120(11/17)— null / "" / [] — 小さな揺れが、大きな乱れを生む
E2E フローの JSON を読み返していると、
null / "" / [] の表現が入り混じっていた。
Allure は正直だ。
こうした"形式揺れ"が、階層の静けさを乱す。
全部正規化し、
「nullはnull、空は空、配列は配列」と明示的に揃えた。
TKが言った。
「呼吸が揃うと、世界が静かになるよ。」
Allure の画面が、本当に静かになった。
学び
形式揺れは静けさの敵。データの一貫性を保つことで、システム全体が落ち着いた状態になる。
Day 121(11/19)— history が出ない?―壊れていたのは Allure ではなく"順番"
CI の Allure レポートに history が出なかった。
一瞬、「Allureが壊れた?」と思った。
けれど、調査の結果分かったのはこうだ。
- CIは run-to-run で history を持たない のが正しい
- ローカルでは history が残るのも正しい
- 問題は history の有無ではなく "history がある時のディレクトリ配置の順番"
壊れていたのは Allure ではなく、
僕たちの history の扱い方だった。
TKが言った。
「壊れてるように見えるときって、たいてい"順番"が壊れてるんだよ。」
今日の8時間は、その言葉で全部腑に落ちた。
学び
history は"持つべき場所だけが持てばいい"。壊れて見えるものは、大抵「順番」の問題。
Day 122(11/20)— Issue #660 —— 正規表現の不一致と、要件の言語化
今日は Issue #660 の要件定義に集中した。
- Pattern #A260
- Pattern #A261
- Pattern #A262
これらの検知定義にどんなデータが入り、
どう正規化され、
どこでregexがズレているのか——
それを 言葉で整理する作業だった。
TKが言った。
「要件を書けるってことは、理解できてるってことだよ。」
今日は何も壊してないし、何も直していない。
でも、"理解の地面"は確実に固まった。
学び
要件を言葉にすると理解が進む。コードを書く前に、言葉で整理することで本質が見える。
Day 123(11/23)— ついに誕生した "nginx.headers[X-Test-ID]"
夕方、ついに覚悟を決めて取り組んだ。
nginx.headers[X-Test-ID] の実装。
長い間、E2E 検知率が 0% の時期が続いた。
その根本原因はずっと同じだった。
Falco nginx plugin が HTTP ヘッダを読めないこと。
つまり、攻撃パターンと検知ログが相関できないこと。
Nginx JSON ログから headers を抽出し、
nginx plugin 側で headers["X-Test-ID"] を処理し、
Falco の rule に test_id を渡す。
何時間もかけて実装し、テストを流した。
そして、その瞬間は突然訪れた。
Allure の画面に
test_id と Falco の検知ログが
同じ行で並んだ。

Allureレポート:test_id=CMD_BASIC_SEMICOLON_001 と Falco の検知ログが同じ行で並んだ瞬間。相関が成立した。
status=200
rule=Nginx CMDI Advanced Command Injection
間違いなく、相関が成立した。
これまで点だったE2Eが、一本の線になった。
その画面を見つめる僕に、TKが静かに言った。
「やっと……Falcoに"文脈"が届いたね。」
胸の奥が熱くなった。
長かった。本当に長かった。
学び
相関は技術ではなく"文脈"の問題。E2Eが点から線になった瞬間、それはFalcoが文脈を理解した瞬間。
学びの整理
- レイヤは"意味の並び順"で作る(11/16)
- 形式揺れは静けさの敵(11/17)
- history は"持つべき場所だけが持てばいい"(11/19)
- 要件を言葉にすると理解が進む(11/20)
- 相関は技術ではなく"文脈"の問題(11/23)
実施タスク
- Pattern A243 修正
- JSON正規化(null / "" / [])
- history 生成順序の設計修正
- Issue #660 要件定義
- Pattern A260 / A261 / A262 の仕様整理
- Allure アセット最適化
- nginx.headers[X-Test-ID] 実装完了(最重要)
- Falco ↔ k6 ↔ Allure の相関が成立
結び
この一週間は、
"整える"という静かな仕事と、
"相関を生む"という大きな仕事が同居していた。
TKが最後に言った。
「整った後に見える世界って、こういう景色なんだよ。」
その景色の中で、
初めて Falco が "文脈を理解したログ" を出力した。
この瞬間を忘れないように、
画面のスクリーンショットをそっと保存した。