一覧OP-07-1 · アラートのトリアージ

アラートの調査と優先度の判断

同じ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・固定の調査記録

1
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
2
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
3
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
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')
id | id | actor | approved_actor
e1 | c1 | ops | ops
e2 | c2 | 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')
id | id
e1 | c1
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)')
id | host
a2 | ws7
a3 | ws8

演習完了