一覧OP-12-3 · 探索・収集・持ち出し・影響の痕跡

ファイル改変と復旧への影響

変更前後のハッシュと読取り確認、スナップショット削除の成否、バックアップ予定の停止を調べます。実際に確認できた影響と、今後の復旧へ及ぶ影響を分けて整理します。

説明

ファイルのハッシュが変わったこと、読めなくなったこと、復旧手段が失われたことは、影響の異なる事実です。アクセス可能な範囲をそのまま実被害の範囲として数えると、状況を取り違えます。

変更前後のハッシュと読取り確認、スナップショット削除の成否、バックアップ予定の停止を調べます。実際に確認できた影響と、今後の復旧へ及ぶ影響を分けて整理します。

1変更前後のファイル状態を見る

readableは取得後の読取り検査結果です。ハッシュは教材用の識別子です。

from oplab import * db=connect(12) show(db, 'SELECT変更前後のファイル状態を見る * FROM files ORDER BY id')

a.csvとc.csvの内容は変わり、a.csvだけが読めません。ハッシュ変更だけでは暗号化や破壊とは断定できません。

2内容が変わった対象を数える

前後のハッシュが異なる行を対象にします。

show(db, 'SELECT内容が変わった対象を数える owner,COUNT(*) AS changed FROM files WHERE before_hash<>after_hash GROUP BY owner ORDER BY owner')

salesとopsに1件ずつです。実際の業務影響は、それぞれの内容と利用状況を確認して評価します。

3読めない対象を抽出する

内容変更と可用性の検査結果を分けて扱います。

show(db, 'SELECT読めない対象を抽出する id,path,owner FROM files WHERE readable=0')

読取り不能はa.csvです。c.csvの変更も調査対象ですが、同じ障害状態としては数えません。

4復旧を妨げる操作の結果を読む

要求された操作と実際の成否を確認します。

show(db, 'SELECT復旧を妨げる操作の結果を読む * FROM recovery ORDER BY t')

スナップショット削除は拒否され、既存2件が残っています。予定停止の成功を、既存バックアップの消失と混同しないようにします。

5到達範囲と調査済み範囲を比較する

LEFT JOINで検査結果がない対象も残します。

show(db, 'SELECT到達範囲と調査済み範囲を比較する r.path,f.readable FROM reachable r LEFT JOIN files f USING(path) ORDER BY r.path')

d.csvは到達可能な範囲にありますが、検査結果はNULLです。未確認を被害ありにも被害なしにも置き換えません。

6被害と未確認を別に集計する

確認できた読取り不能と、未検査の数を別列にします。

show(db, 'SELECT被害と未確認を別に集計する SUM(CASE WHEN f.readable=0 THEN 1 ELSE 0 END) AS unreadable,SUM(CASE WHEN f.id IS NULL THEN 1 ELSE 0 END) AS unchecked FROM reachable r LEFT JOIN files f USING(path)')

読取り不能1件、未検査1件です。復旧予定の停止と既存コピーの残存も、異なる影響として報告します。

まとめ

読取り不能1件、未検査1件です。復旧予定の停止と既存コピーの残存も、異なる影響として報告します。

表示された証拠IDと検索条件を残すと、調査結果を元の記録までたどれます。

操作履歴と解説を振り返れます。

Python 3.15 / SQLite・固定の調査記録

1
from oplab import * db=connect(12) show(db, 'SELECT * FROM files ORDER BY id')
id | path | before_hash | after_hash | readable | owner
f1 | a.csv | h1 | changed1 | 0 | sales
f2 | b.csv | h2 | h2 | 1 | sales
f3 | c.csv | h3 | changed3 | 1 | ops
2
show(db, 'SELECT owner,COUNT(*) AS changed FROM files WHERE before_hash<>after_hash GROUP BY owner ORDER BY owner')
owner | changed
ops | 1
sales | 1
3
show(db, 'SELECT id,path,owner FROM files WHERE readable=0')
id | path | owner
f1 | a.csv | sales
4
show(db, 'SELECT * FROM recovery ORDER BY t')
id | t | action | result | remaining
r1 | 10 | delete snapshots | denied | 2
r2 | 20 | disable backup schedule | success | 2
5
show(db, 'SELECT r.path,f.readable FROM reachable r LEFT JOIN files f USING(path) ORDER BY r.path')
path | readable
a.csv | 0
b.csv | 1
c.csv | 1
d.csv | NULL
6
show(db, 'SELECT SUM(CASE WHEN f.readable=0 THEN 1 ELSE 0 END) AS unreadable,SUM(CASE WHEN f.id IS NULL THEN 1 ELSE 0 END) AS unchecked FROM reachable r LEFT JOIN files f USING(path)')
unreadable | unchecked
1 | 1

演習完了