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とFalco検知ログの相関成立

Allureレポート:test_id=CMD_BASIC_SEMICOLON_001 と Falco の検知ログが同じ行で並んだ瞬間。相関が成立した。

test_id=CMD_BASIC_SEMICOLON_001-xxxx
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 が "文脈を理解したログ" を出力した。

この瞬間を忘れないように、
画面のスクリーンショットをそっと保存した。