一覧SP-15-2 · CASB:SaaS利用の可視化と制御

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 / 固定の主体・権限・操作記録

1
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
2
show(db,"SELECT id,path,t FROM operation WHERE event='uploaded' ORDER BY id")
id | path | t
o2 | api | 10
o3 | direct | 12
3
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
4
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
5
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
6
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
7
show(db,"SELECT id,visible FROM object WHERE id='o3'")
id | visible
o3 | 1

演習完了