CASBのAPI連携とインライン制御
制御を行った場所と時刻を示し、対象外の経路を説明します。
説明
API連携はSaaS側に保存された操作やファイルを取得して調べます。インライン制御は経路上で要求に介入します。どちらも、対象の経路と取得範囲を通じて作用します。
同じ種類のアップロードを、インライン、API監視、直接接続の固定記録で比較します。後から隔離した場合に残るコピーも確認します。
制御を行った場所と時刻を示し、対象外の経路を説明します。
1三つの経路を時系列で読む
o1、o2、o3は別のアップロード操作です。
from sp15 import *
from sp02 import show三つの経路を時系列で読む
db=connect()
show(db,"SELECT * FROM operation ORDER BY id,t")o1は要求後にblocked、o2はuploaded後にobservedとquarantined、o3はdirectでuploadedです。
2アップロードが記録された操作を抽出する
要求の受付と実際のアップロードを分けます。
showアップロードが記録された操作を抽出する(db,"SELECT id,path,t FROM operation WHERE event='uploaded' ORDER BY id")o2とo3が出ます。o1は要求記録があっても、今回の資料ではアップロード完了の行がありません。
3API観測までの遅延を求める
同じ操作IDでアップロードと観測を結びます。
showAPI観測までの遅延を求める(db,"SELECT a.id,b.t-a.t AS delay FROM operation a JOIN operation b USING(id) WHERE a.event='uploaded' AND b.event='observed'")o2は10秒後に観測されています。配送前の制御と同じタイミングではありません。
4隔離までの公開期間を求める
アップロードからquarantinedまでの差です。
show隔離までの公開期間を求める(db,"SELECT a.id,b.t-a.t AS seconds FROM operation a JOIN operation b USING(id) WHERE a.event='uploaded' AND b.event='quarantined'")15秒です。後の隔離記録から、その間に誰もアクセスしなかったとは推測できません。
5隔離を対象オブジェクトへ反映する
教材用の保存状態でo2だけを非表示へ変えます。
db.execute("UPDATE object SET visible=0 WHERE id='o2'")
show隔離を対象オブジェクトへ反映する(db,"SELECT * FROM object ORDER BY id")o2のvisibleは0ですがcopy_existsは1です。既に作られたコピーへの対応は別途必要です。
6観測記録のない直接接続を探す
uploadedがありobservedがない操作を抽出します。
show(db,"SELECT a.id,a.path,a.device FROM operation a WHERE a.event='uploaded' AND NOT EXISTS観測記録のない直接接続を探す(SELECT 1 FROM operation b WHERE b.id=a.id AND b.event='observed')")o3が該当します。制御した経路だけの成功率では、直接接続の範囲を評価できません。
7未観測の操作が残る状態を確認する
o3の保存状態を読みます。
show未観測の操作が残る状態を確認する(db,"SELECT id,visible FROM object WHERE id='o3'")visibleは1です。APIの対象サービス・権限・取込遅延と、インラインを通る接続条件を合わせて点検します。
まとめ
要求前後のどの時点で評価したかを確認します。
隔離後もコピーや直接経路を調べます。
API取得範囲とインラインの通過範囲を把握します。
操作履歴と解説を振り返れます。
Python 3.15 / SQLite / 固定の主体・権限・操作記録
from sp15 import *
from sp02 import show
db=connect()
show(db,"SELECT * FROM operation ORDER BY id,t")id | t | path | device | event o1 | 10 | inline | managed | requested o1 | 11 | inline | managed | blocked o2 | 10 | api | unmanaged | uploaded o2 | 20 | api | unmanaged | observed o2 | 25 | api | unmanaged | quarantined o3 | 12 | direct | unmanaged | uploaded
show(db,"SELECT id,path,t FROM operation WHERE event='uploaded' ORDER BY id")id | path | t o2 | api | 10 o3 | direct | 12
show(db,"SELECT a.id,b.t-a.t AS delay FROM operation a JOIN operation b USING(id) WHERE a.event='uploaded' AND b.event='observed'")id | delay o2 | 10
show(db,"SELECT a.id,b.t-a.t AS seconds FROM operation a JOIN operation b USING(id) WHERE a.event='uploaded' AND b.event='quarantined'")id | seconds o2 | 15
db.execute("UPDATE object SET visible=0 WHERE id='o2'")
show(db,"SELECT * FROM object ORDER BY id")id | visible | copy_exists o1 | 0 | 0 o2 | 0 | 1 o3 | 1 | 0
show(db,"SELECT a.id,a.path,a.device FROM operation a WHERE a.event='uploaded' AND NOT EXISTS(SELECT 1 FROM operation b WHERE b.id=a.id AND b.event='observed')")id | path | device o3 | direct | unmanaged
show(db,"SELECT id,visible FROM object WHERE id='o3'")id | visible o3 | 1
演習完了