アラートの調査と優先度の判断
同じhigh判定の3件を調べ、バックアップ作業に一致する例と、実行者が違う例を比較します。影響の大きさと不審さの裏付けを別々に説明します。
説明
アラートの重要度ラベルは調査の入口です。実際の影響が大きい資産か、原記録が何を示すか、承認された作業に対応するかを確認して、対応の優先順位を決めます。
同じhigh判定の3件を調べ、バックアップ作業に一致する例と、実行者が違う例を比較します。影響の大きさと不審さの裏付けを別々に説明します。
1同じ重要度のアラートを読む
同じルールから複数の端末に通知されています。
from oplab import *
db=connect(7)
show(db, 'SELECT同じ重要度のアラートを読む * FROM alerts ORDER BY id')ラベルだけでは調査の順序を決める情報が足りません。原イベントと資産の用途を確認します。
2原記録へ戻る
event_idを使って、検知が参照した活動を直接調べます。
show(db, 'SELECT原記録へ戻る a.id,e.* FROM alerts a JOIN events e ON a.event_id=e.id ORDER BY a.id')db7はbackup.exe、ws7とws8はreport.exeです。ファイル名だけでなく、主体とハッシュも判断材料になります。
3資産の影響を確認する
重要業務の資産かどうかを台帳から補います。
show(db, 'SELECT資産の影響を確認する a.id,s.role,s.criticality,s.owner FROM alerts a JOIN assets s USING(host) ORDER BY a.id')db7は本番DBです。承認作業と一致しそうでも、影響の大きな資産であること自体は変わりません。
4名前と時刻だけの管理作業候補を探す
最初は実行者を条件に含めず、候補の広さを確認します。
show(db, 'SELECT名前と時刻だけの管理作業候補を探す e.id,c.id,e.actor,c.actor AS approved_actor FROM events e JOIN changes c ON e.host=c.host AND e.image=c.image AND e.t>=c.start AND e.t<c.end')e2にも管理作業の候補が出ますが、実行者aliceと承認されたopsが違います。似た作業名だけで例外扱いにはできません。
5承認内容の全条件を照合する
端末、時間、主体、実行ファイル、ハッシュ、承認状態を合わせます。
show(db, 'SELECT承認内容の全条件を照合する e.id,c.id FROM events e JOIN changes c ON e.host=c.host AND e.t>=c.start AND e.t<c.end AND e.actor=c.actor AND e.image=c.image AND e.sha256=c.sha256 WHERE c.approved=1')一致はe1だけです。一致しても管理作業自体の誤操作はあり得るため、必要に応じて結果を確認します。
6承認と一致しない候補を抽出する
例外条件に合わないアラートを、追加調査対象として残します。
show(db, 'SELECT承認と一致しない候補を抽出する a.id,a.host FROM alerts a JOIN events e ON a.event_id=e.id WHERE NOT EXISTS (SELECT 1 FROM changes c WHERE e.host=c.host AND e.t>=c.start AND e.t<c.end AND e.actor=c.actor AND e.image=c.image AND e.sha256=c.sha256 AND c.approved=1)')a2とa3は追加調査対象です。管理作業との不一致を根拠として説明でき、単にhighだからという判断より具体的になります。
まとめ
a2とa3は追加調査対象です。管理作業との不一致を根拠として説明でき、単にhighだからという判断より具体的になります。
表示された証拠IDと検索条件を残すと、調査結果を元の記録までたどれます。
操作履歴と解説を振り返れます。
Python 3.15 / SQLite・固定の調査記録
from oplab import *
db=connect(7)
show(db, 'SELECT * FROM alerts ORDER BY id')id | event_id | host | rule | severity a1 | e1 | db7 | rare_process | high a2 | e2 | ws7 | rare_process | high a3 | e3 | ws8 | rare_process | high
show(db, 'SELECT a.id,e.* FROM alerts a JOIN events e ON a.event_id=e.id ORDER BY a.id')id | id | t | host | actor | image | sha256 a1 | e1 | 10 | db7 | ops | backup.exe | h1 a2 | e2 | 11 | ws7 | alice | report.exe | h2 a3 | e3 | 12 | ws8 | alice | report.exe | h2
show(db, 'SELECT a.id,s.role,s.criticality,s.owner FROM alerts a JOIN assets s USING(host) ORDER BY a.id')id | role | criticality | owner a1 | production-db | critical | db-team a2 | workstation | normal | alice a3 | workstation | normal | bob
show(db, 'SELECT e.id,c.id,e.actor,c.actor AS approved_actor FROM events e JOIN changes c ON e.host=c.host AND e.image=c.image AND e.t>=c.start AND e.t<c.end')id | id | actor | approved_actor e1 | c1 | ops | ops e2 | c2 | alice | ops
show(db, 'SELECT e.id,c.id FROM events e JOIN changes c ON e.host=c.host AND e.t>=c.start AND e.t<c.end AND e.actor=c.actor AND e.image=c.image AND e.sha256=c.sha256 WHERE c.approved=1')id | id e1 | c1
show(db, 'SELECT a.id,a.host FROM alerts a JOIN events e ON a.event_id=e.id WHERE NOT EXISTS (SELECT 1 FROM changes c WHERE e.host=c.host AND e.t>=c.start AND e.t<c.end AND e.actor=c.actor AND e.image=c.image AND e.sha256=c.sha256 AND c.approved=1)')id | host a2 | ws7 a3 | ws8
演習完了