Perl と Moo で、偽装サーバー(ハニーポット)に届く侵入イベントを「レーダー」のように見張るツールを作る全10回の連載です。侵入イベントをコンソールに表示するだけの最小構成から始め、脅威スコアやアラートを足すたびにループが膨らむ様子を確かめます。そのあと、通知係のクラス分離、Moo::Role による契約、IntrusionHub での一斉通知、実行中の登録・解除、does 制約、既存コードを変えない機能追加と進め、最終回で作ったものが GoF の Observer パターンだったと名前を付けます。
各回は前の回のコードに手を足していく作りなので、通して読むなら第1回からが早道です。このページは目次を兼ねた案内板です。入口は「どこから読むか」で、困りごとが決まっているなら「困りごとから探す」で、順に追うなら「全話一覧」で選んでください。
どこから読むか
- 第1回 — 最初から順に作るなら。IntrusionEvent クラスで侵入イベントを表し、コンソールに表示する。前提は Moo のクラス定義の基礎
- 第2回 — 機能追加でコードが膨らむ困りごとから入るなら。脅威スコアとアラートを足して、ループが破綻する様子を確かめる。前提は第1回のコード
- 第10回 — Observer パターンとの対応関係から知りたいなら。IntrusionHub と通知係を Subject・Observer に対応づけ、Pub/Sub との違いも整理する
困りごとから探す
機能を足すたびに、1つのループが膨らんで書き換えている
- 第2回 — 脅威スコアとアラートを足したら、ループに処理が積み重なった
- 第3回 — ログ表示とスコア計算を、通知係のクラスに分けたい
- 第8回 — RiskLevelObserver のような新しい機能を、既存コードに触れず足したい
通知先が増えて、呼び出しが散らばる・実装し忘れる
状況によって通知先を切り替えたい
- 第6回 — 日中はログとスコアだけ、深夜だけアラートも鳴らしたい
全話一覧
- 侵入イベントをコンソールに表示する最小構成
- 通知先を足してループが膨らむ破綻
- ログとスコアを通知係のクラスに分離
- Moo::Role の requires で契約化
- IntrusionHub で一斉通知
- 通知係を attach/detach で出し入れ
- does 制約で偽物を弾く
- 既存コードを変えず RiskLevelObserver を追加
- 全クラスを統合した完成コード
- Observer パターンの種明かし
前提知識
- Perl v5.36 以降の基本文法(signatures、postfix dereference など)
- Moo によるクラス定義の基礎(has、extends、with)と、Moo::Role の基礎
- 「Mooで覚えるオブジェクト指向プログラミング」シリーズを読み終えていると、スムーズに進みます
完成するもの
侵入イベントのログ表示、脅威スコアの加算、リスクレベル表示、アラート通知が連動する侵入レーダー司令室です。通知係は独立したクラスで、新しい通知係を足しても既存コードを変更する必要がありません。
