一覧SP-09-2 · メールセキュリティ:配送前後の評価

メール配送後のURL検査と隔離

送信元の認証、内容検査、配送後の処理をそれぞれの根拠で評価します。

説明

配送時に許可したURLでも、後から評価が変わる場合があります。クリック時の検査、サーバー上のメール隔離、既に作られたコピーへの対応は、それぞれ作用する場所と時点が異なります。

固定メールのURLを取り出し、時刻による判定と期限付き例外をSQLで確認します。サーバー上のコピーを隔離した後、別に保存されたコピーの状態も調べます。

送信元の認証、内容検査、配送後の処理をそれぞれの根拠で評価します。

1メール内のURLと配送済みコピーを開く

m7にはサーバーとオフライン保存の2コピーがあります。

from sp09 import * from sp02 import showメール内のURLと配送済みコピーを開く db=connect() url='https://docs.example.test/report' show(db,"SELECT * FROM copy ORDER BY id") show(db,"SELECT * FROM verdict ORDER BY t")

配送時0秒ではallow、60秒からblockです。評価がいつ更新されたかを含めて読みます。

2配送直後のクリックを評価する

10秒の判定を取得します。

print(click配送直後のクリックを評価する(db,10,'alice',url))

allowです。この教材のクリック関数は時点に対応する評価を参照し、アクセス記録をDBへ残します。

3評価更新後のクリックを比較する

同じURLを70秒に評価します。

print(click評価更新後のクリックを比較する(db,70,'alice',url)) show(db,"SELECT t,user,result FROM access ORDER BY t")

blockに変わりました。0秒の配送許可を、その後も安全である根拠として使い続けません。

4サーバーのコピーを隔離する

配送後の隔離をコピー台帳へ適用します。

db.execute("UPDATEサーバーのコピーを隔離する copy SET state='quarantine' WHERE mail='m7' AND location='server'") show(db,"SELECT * FROM copy ORDER BY id")

c1だけがquarantineになります。オフラインへ保存したc2のstateはsavedのままです。

5利用者と期限を限定した例外を追加する

理由付きの例外をaliceにだけ設定します。

db.execute("INSERT INTO exception VALUES (?,?,?,?)",('alice',url,90,'reviewed public sample')) print(click利用者と期限を限定した例外を追加する(db,80,'alice',url)) print(click(db,80,'bob',url))

aliceはallow_exception、bobはblockです。宛先全体や全利用者を一括して除外する条件ではありません。

6期限境界で例外が切れることを確認する

expiresより現在時刻が小さいときだけ例外を認めます。

print(click期限境界で例外が切れることを確認する(db,89,'alice',url)) print(click(db,90,'alice',url))

89秒は例外、90秒はblockです。期限が過ぎた例外を残したまま有効扱いしません。

7クリック許可とメールの隔離を別々に確認する

最終の判定履歴とコピー状態を開きます。

showクリック許可とメールの隔離を別々に確認する(db,"SELECT t,user,result FROM access ORDER BY t,user") show(db,"SELECT id,state FROM copy ORDER BY id")

URLに例外を追加してもc1の隔離は解除されていません。URL判定とメールコピーへの措置は別の状態として確認します。

まとめ

配送時点とクリック時点の評価を分けます。

隔離の対象となるコピーを確認します。

例外には主体、対象、期限、理由を持たせます。

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

Python 3.15 / 公開試験鍵によるDKIM試料 / SQLite

1
from sp09 import * from sp02 import show db=connect() url='https://docs.example.test/report' show(db,"SELECT * FROM copy ORDER BY id") show(db,"SELECT * FROM verdict ORDER BY t")
id | mail | location | state
c1 | m7 | server | inbox
c2 | m7 | offline-export | saved
t | url | result
0 | https://docs.example.test/report | allow
60 | https://docs.example.test/report | block
2
print(click(db,10,'alice',url))
allow
3
print(click(db,70,'alice',url)) show(db,"SELECT t,user,result FROM access ORDER BY t")
block
t | user | result
10 | alice | allow
70 | alice | block
4
db.execute("UPDATE copy SET state='quarantine' WHERE mail='m7' AND location='server'") show(db,"SELECT * FROM copy ORDER BY id")
id | mail | location | state
c1 | m7 | server | quarantine
c2 | m7 | offline-export | saved
5
db.execute("INSERT INTO exception VALUES (?,?,?,?)",('alice',url,90,'reviewed public sample')) print(click(db,80,'alice',url)) print(click(db,80,'bob',url))
allow_exception
block
6
print(click(db,89,'alice',url)) print(click(db,90,'alice',url))
allow_exception
block
7
show(db,"SELECT t,user,result FROM access ORDER BY t,user") show(db,"SELECT id,state FROM copy ORDER BY id")
t | user | result
10 | alice | allow
70 | alice | block
80 | alice | allow_exception
80 | bob | block
89 | alice | allow_exception
90 | alice | block
id | state
c1 | quarantine
c2 | saved

演習完了