@nqounetです。
ハッカー(というか攻撃者)がサーバーに侵入を試みたとき、その痕跡をリアルタイムで可視化できたらカッコいいと思いませんか?
このシリーズでは、偽装サーバー(ハニーポット)に届く侵入イベントを「レーダー」のように可視化するツールを作っていきます。セキュリティ運用の雰囲気を味わいながら、オブジェクト指向プログラミングの設計原則を自然に学べる構成にしています。
対象読者と前提知識
このシリーズは以下の方を対象としています。
- Perl入学式を卒業したばかりの入門者
- 「Mooで覚えるオブジェクト指向プログラミング」シリーズを読了した方
- モダンなPerlでデザインパターンを学びたい方
前提として、以下の知識があるとスムーズです。
- Perl v5.36の基本文法(signaturesなど)
- Mooの基本的な使い方(has、メソッド定義)
- クラスとオブジェクトの概念
ハニーポットって何?
本題に入る前に、ハニーポットについて簡単に説明しておきましょう。
ハニーポット(Honeypot)は「攻撃者をおびき寄せるための囮サーバー」です。本物のサーバーに見せかけて放置しておくと、攻撃者がやってきて侵入を試みます。その痕跡を記録・分析することで、攻撃手法の研究やセキュリティ対策に役立てます。
今回は実際のハニーポットは使いませんが(モックで十分です)、「侵入イベントが次々と届く」というシナリオを想定して通知システムを作っていきます。
このシリーズで学べること
このシリーズでは、以下のことを学びます。
- イベント通知の設計パターン
- SOLID原則(特にSRPとOCP)
- Moo::Roleによるインターフェース定義
- 型制約を使った堅牢な設計
この記事のゴール
今回は最初の一歩として、侵入イベントを受け取ってコンソールに表示する最小構成を作ります。
まだ派手な機能はありませんが「ちゃんと動く」ことを確認するのが大事です(地味だけど、これが後で効いてきます)。
侵入イベントを表すクラス
まず、侵入イベントを表現するクラスを作りましょう。
侵入イベントには以下の情報が含まれます。
- イベントのタイムスタンプ
- 侵入元のIPアドレス
- 攻撃の種類(SSHブルートフォース、ポートスキャンなど)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| #!/usr/bin/env perl
# 言語: perl
# バージョン: 5.36以上
# 依存: Moo(cpanmでインストール)
use v5.36;
package IntrusionEvent;
use Moo;
has timestamp => (
is => 'ro',
required => 1,
);
has source_ip => (
is => 'ro',
required => 1,
);
has attack_type => (
is => 'ro',
required => 1,
);
package main;
# 侵入イベントを作成
my $event = IntrusionEvent->new(
timestamp => '2026-01-18T06:00:00+09:00',
source_ip => '192.168.1.100',
attack_type => 'SSH Brute Force',
);
# イベント情報を表示
say "=== 侵入イベント検知 ===";
say "時刻: " . $event->timestamp;
say "発信元: " . $event->source_ip;
say "攻撃種別: " . $event->attack_type;
|
このスクリプトを動かすと、侵入イベントの情報がコンソールに表示されます。
1
2
3
4
| === 侵入イベント検知 ===
時刻: 2026-01-18T06:00:00+09:00
発信元: 192.168.1.100
攻撃種別: SSH Brute Force
|
複数イベントを処理する
実際のハニーポットでは、次々とイベントが発生します。複数のイベントを順番に処理してみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
| #!/usr/bin/env perl
# 言語: perl
# バージョン: 5.36以上
# 依存: Moo(cpanmでインストール)
use v5.36;
package IntrusionEvent;
use Moo;
has timestamp => (
is => 'ro',
required => 1,
);
has source_ip => (
is => 'ro',
required => 1,
);
has attack_type => (
is => 'ro',
required => 1,
);
package main;
# 複数の侵入イベントを作成
my @events = (
IntrusionEvent->new(
timestamp => '2026-01-18T06:00:00+09:00',
source_ip => '192.168.1.100',
attack_type => 'SSH Brute Force',
),
IntrusionEvent->new(
timestamp => '2026-01-18T06:01:15+09:00',
source_ip => '10.0.0.55',
attack_type => 'Port Scan',
),
IntrusionEvent->new(
timestamp => '2026-01-18T06:02:30+09:00',
source_ip => '172.16.0.22',
attack_type => 'SQL Injection Attempt',
),
);
# 各イベントを処理
for my $event (@events) {
say "=== 侵入イベント検知 ===";
say "時刻: " . $event->timestamp;
say "発信元: " . $event->source_ip;
say "攻撃種別: " . $event->attack_type;
say ""; # 空行で区切り
}
|
実行結果は以下のようになります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| === 侵入イベント検知 ===
時刻: 2026-01-18T06:00:00+09:00
発信元: 192.168.1.100
攻撃種別: SSH Brute Force
=== 侵入イベント検知 ===
時刻: 2026-01-18T06:01:15+09:00
発信元: 10.0.0.55
攻撃種別: Port Scan
=== 侵入イベント検知 ===
時刻: 2026-01-18T06:02:30+09:00
発信元: 172.16.0.22
攻撃種別: SQL Injection Attempt
|
レーダーっぽく表示できていますね(まだシンプルですが)。
今回のまとめ
今回は侵入イベントを表すIntrusionEventクラスを作り、コンソールに表示する最小構成を実装しました。
IntrusionEventクラスで侵入イベントをモデル化- タイムスタンプ、IPアドレス、攻撃種別を属性として定義
- 複数イベントをループで処理して表示
とてもシンプルですが、これがハニーポット侵入レーダーの土台になります。
次回予告
次回は「通知先を増やしたい」という要望に応えようとして地獄を見る話です。ログ表示に加えて脅威スコアの計算も追加しようとすると、コードがどんどん複雑になっていきます。
その破綻から、より良い設計へのヒントが見えてきます。お楽しみに。