一覧OP-06-3 · クラウド・SaaSの監査記録

クラウド監査ログの収集範囲

ダウンロードの収集が途中で停止した固定記録を調べます。別テナントの同名対象も含め、対象範囲、停止時刻、設定変更者を確認し、未観測の区間を明示する方法を学びます。

説明

ログ検索で結果が出ない場合、活動がなかったのか、記録対象外だったのかを調べる必要があります。監査設定の変更と収集側の範囲を確認すると、検索で答えられる時間帯を限定できます。

ダウンロードの収集が途中で停止した固定記録を調べます。別テナントの同名対象も含め、対象範囲、停止時刻、設定変更者を確認し、未観測の区間を明示する方法を学びます。

1収集対象を一覧する

start以上end未満の期間にenabledの設定が有効だったものとして扱います。

from oplab import * db=connect(6) show(db, 'SELECT収集対象を一覧する * FROM coverage ORDER BY tenant,source,start')

tenant7のダウンロードは20で停止し、tenant8は全期間が対象外です。サインインとダウンロードの収集条件も異なります。

2設定変更の主体を調べる

監査設定を変更した記録は、対象ログとは別に保管された固定資料です。

show(db, 'SELECT設定変更の主体を調べる * FROM config')

q1はadminが時刻20に収集を無効化した記録です。変更の理由や承認の有無は、この行だけでは分かりません。

3観測した利用が有効期間内か調べる

テナント、ログ種別、時間帯を合わせて結合します。

show(db, 'SELECT観測した利用が有効期間内か調べる s.id,c.id,c.enabled FROM saas s JOIN coverage c ON s.tenant=c.tenant AND s.action=c.source AND s.t>=c.start AND s.t<c.end ORDER BY s.id')

a3とa4は有効期間内の記録です。記録が存在する範囲と、設定上収集するはずの範囲を照合できます。

4停止後の検索結果を確認する

tenant7の時刻20以後のダウンロードを検索します。

show(db, 'SELECT停止後の検索結果を確認する id,t,action FROM saas WHERE tenant="tenant7" AND action="download" AND t>=20')

行はありませんが、その期間は収集が無効です。「ダウンロードはなかった」という結論には使えません。

5未観測の区間を抽出する

enabled=0の期間を、追加確認が必要な範囲として取り出します。

show(db, 'SELECT未観測の区間を抽出する tenant,source,start,end FROM coverage WHERE enabled=0 ORDER BY tenant,start')

tenant7の後半とtenant8の全区間が残ります。別サービスの監査や端末側の記録が補足資料の候補です。

6収集できた時間の長さを比較する

この表の区間は重複していません。テナントと種別ごとに有効時間を合計します。

show(db, 'SELECT収集できた時間の長さを比較する tenant,source,SUM(CASE WHEN enabled=1 THEN end-start ELSE 0 END) AS covered_seconds FROM coverage GROUP BY tenant,source ORDER BY tenant,source')

同じ30秒の調査期間でも有効時間は0、20、30秒です。検索結果の件数を比較する前に、分母となる観測時間をそろえます。

まとめ

同じ30秒の調査期間でも有効時間は0、20、30秒です。検索結果の件数を比較する前に、分母となる観測時間をそろえます。

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

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

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

1
from oplab import * db=connect(6) show(db, 'SELECT * FROM coverage ORDER BY tenant,source,start')
id | tenant | source | start | end | enabled
c2 | tenant7 | download | 0 | 20 | 1
c3 | tenant7 | download | 20 | 30 | 0
c1 | tenant7 | signin | 0 | 30 | 1
c4 | tenant8 | download | 0 | 30 | 0
2
show(db, 'SELECT * FROM config')
id | t | tenant | actor | change
q1 | 20 | tenant7 | admin | download collection disabled
3
show(db, 'SELECT s.id,c.id,c.enabled FROM saas s JOIN coverage c ON s.tenant=c.tenant AND s.action=c.source AND s.t>=c.start AND s.t<c.end ORDER BY s.id')
id | id | enabled
a3 | c1 | 1
a4 | c2 | 1
4
show(db, 'SELECT id,t,action FROM saas WHERE tenant="tenant7" AND action="download" AND t>=20')
id | t | action
5
show(db, 'SELECT tenant,source,start,end FROM coverage WHERE enabled=0 ORDER BY tenant,start')
tenant | source | start | end
tenant7 | download | 20 | 30
tenant8 | download | 0 | 30
6
show(db, 'SELECT tenant,source,SUM(CASE WHEN enabled=1 THEN end-start ELSE 0 END) AS covered_seconds FROM coverage GROUP BY tenant,source ORDER BY tenant,source')
tenant | source | covered_seconds
tenant7 | download | 20
tenant7 | signin | 30
tenant8 | download | 0

演習完了