囮へのアクセスと誤検知の調査
接触の評価条件と未観測になる範囲を具体的な資料で示します。
説明
囮に触れた理由には、探索のほか、正規のスキャンや保守作業もあります。配置した場所から到達できるか、通知の外向き経路が使えるかも検知範囲に影響します。
固定の到達表、保守予定、接触記録、外向き制限を照合します。除外を広げすぎる場合と、通知が出ない場合の意味を確認します。
接触の評価条件と未観測になる範囲を具体的な資料で示します。
1セグメント別の到達表を読む
allowedは固定構成での到達可否です。
from sp21 import *
from sp02 import showセグメント別の到達表を読む
db=connect()
show(db,"SELECT * FROM reach ORDER BY segment,decoy")segment-aからd8は到達できません。囮を一つ置けば全ネットワークを観測できるという構成ではありません。
2配置しても届かない経路を抽出する
allowed=0を探します。
show配置しても届かない経路を抽出する(db,"SELECT segment,decoy FROM reach WHERE allowed=0")segment-aとd8の組です。未接触の評価には、そもそも接触可能な配置だったかを含めます。
3保守予定と接触を結び付ける
送信元、時刻、対象場所が一致する作業を取得します。
show(db,"SELECT e.id,e.source,d.location,m.start,m.finish FROM event e JOIN decoy d ON d.id=e.target JOIN maintenance m ON m.source=e.source AND m.scope=d.location AND e.t BETWEEN保守予定と接触を結び付ける m.start AND m.finish")e4はscanner7の25〜35秒、segment-bの予定に一致します。予定との一致は正当性を検討する根拠であり、記録を消す理由にはしません。
4予定の場所が違う接触を追加する
同じscanner7が別の囮d7へ接触した場合です。
db.execute("INSERT INTO event VALUES ('e5',31,'scanner7','d7','opened')")
show予定の場所が違う接触を追加する(db,"SELECT e.id,d.location FROM event e JOIN decoy d ON d.id=e.target WHERE e.source='scanner7' ORDER BY e.t")e5はshare-aで、予定のsegment-bとは違います。送信元だけで全件除外すると、この差を見落とします。
5作業範囲と一致しない接触を抽出する
保守予定への対応がないものを残します。
show(db,"SELECT e.id,d.location FROM event e JOIN decoy d ON d.id=e.target WHERE e.source='scanner7' AND NOT EXISTS作業範囲と一致しない接触を抽出する(SELECT 1 FROM maintenance m WHERE m.source=e.source AND m.scope=d.location AND e.t BETWEEN m.start AND m.finish)")e5だけです。例外条件は主体だけでなく、対象と時間も含めて絞れます。
6通知先へ出られない端末を確認する
callbackの外向き制限表を開きます。
show通知先へ出られない端末を確認する(db,"SELECT * FROM egress ORDER BY source")192.0.2.8はcallbackを送れません。この端末でファイルが開かれても、外部通知だけでは観測できない場合があります。
7外部通知と端末内の記録を分ける
外向き制限のある端末のopenedだけを追加します。
db.execute("INSERT INTO event VALUES ('e6',40,'192.0.2.8','d7','opened')")
show外部通知と端末内の記録を分ける(db,"SELECT e.id,e.kind,n.delivered FROM event e LEFT JOIN notification n ON n.event=e.id WHERE e.id='e6'")openedはありますが通知欄はNULLです。通知の不在から接触の不在を判断せず、内部監査など別の観測点と照合します。
まとめ
囮の配置と到達範囲を確認します。
保守例外は主体・対象・時間を合わせます。
通知経路の制限による未観測を考慮します。
操作履歴と解説を振り返れます。
Python 3.15 / 固定パケット・SQLiteの接続資料
from sp21 import *
from sp02 import show
db=connect()
show(db,"SELECT * FROM reach ORDER BY segment,decoy")segment | decoy | allowed segment-a | d7 | 1 segment-a | d8 | 0 segment-b | d8 | 1
show(db,"SELECT segment,decoy FROM reach WHERE allowed=0")segment | decoy segment-a | d8
show(db,"SELECT e.id,e.source,d.location,m.start,m.finish FROM event e JOIN decoy d ON d.id=e.target JOIN maintenance m ON m.source=e.source AND m.scope=d.location AND e.t BETWEEN m.start AND m.finish")id | source | location | start | finish e4 | scanner7 | segment-b | 25 | 35
db.execute("INSERT INTO event VALUES ('e5',31,'scanner7','d7','opened')")
show(db,"SELECT e.id,d.location FROM event e JOIN decoy d ON d.id=e.target WHERE e.source='scanner7' ORDER BY e.t")id | location e4 | segment-b e5 | share-a
show(db,"SELECT e.id,d.location FROM event e JOIN decoy d ON d.id=e.target WHERE e.source='scanner7' AND NOT EXISTS(SELECT 1 FROM maintenance m WHERE m.source=e.source AND m.scope=d.location AND e.t BETWEEN m.start AND m.finish)")id | location e5 | share-a
show(db,"SELECT * FROM egress ORDER BY source")source | callback_allowed 192.0.2.7 | 1 192.0.2.8 | 0
db.execute("INSERT INTO event VALUES ('e6',40,'192.0.2.8','d7','opened')")
show(db,"SELECT e.id,e.kind,n.delivered FROM event e LEFT JOIN notification n ON n.event=e.id WHERE e.id='e6'")id | kind | delivered e6 | opened | NULL
演習完了