ファイル改変と復旧への影響
変更前後のハッシュと読取り確認、スナップショット削除の成否、バックアップ予定の停止を調べます。実際に確認できた影響と、今後の復旧へ及ぶ影響を分けて整理します。
説明
ファイルのハッシュが変わったこと、読めなくなったこと、復旧手段が失われたことは、影響の異なる事実です。アクセス可能な範囲をそのまま実被害の範囲として数えると、状況を取り違えます。
変更前後のハッシュと読取り確認、スナップショット削除の成否、バックアップ予定の停止を調べます。実際に確認できた影響と、今後の復旧へ及ぶ影響を分けて整理します。
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・固定の調査記録
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
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
show(db, 'SELECT id,path,owner FROM files WHERE readable=0')id | path | owner f1 | a.csv | sales
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
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
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
演習完了