記録と異常検知/ Records & Detection
残しているから、見つけられる
受取ページで起きたことは、成功も失敗もすべて残します。残す目的は 2 つあります。1 つは、発行した人が「渡した相手に届いたか」を確認できるようにすること。もう 1 つは、そこから異常を自動で見つけることです。ここでは、何をどこへ記録し、その記録からどうやって 3 種類の危険を見分けているかをご説明します。
アクセス記録Access Records
受取ページへのアクセスは、結果を 9 種類に分けて記録します。日時・結果・接続元 IP・ブラウザの種類が残り、発行者と管理者が一覧から確認できます。
| 結果 | いつ記録されるか | 意味するところ |
|---|---|---|
| 閲覧 | 必要な確認をすべて通り、受取画面に着いたとき | 相手が URL を開いた(=届いている) |
| ダウンロード | 実際に配布したとき | 相手が受け取った |
| パスワード誤り | パスワードが一致しなかったとき | 相手が値を持っていない、または攻撃 |
| 確認コード誤り | コードが一致しなかった・失効していたとき | 同上 |
| 期限切れ後のアクセス | 期限を過ぎたリンクを開いたとき | 相手が古い URL を開いている(再発行の合図) |
| 無効化後のアクセス | 無効化したリンクを開いたとき | 止めたあとに誰かが開こうとしている |
| 回数上限超過 | 上限に達したリンクで配布を求めたとき | 回数の設定が実態に合っていない可能性 |
| 不明なリンク | 存在しないトークンでアクセスされたとき | 打ち間違い、または URL の推測 |
| アクセス集中による制限 | レート制限に掛かったとき | 機械的な連打の可能性 |
接続元 IP は、負荷分散の転送ヘッダを信頼できる範囲から辿って求めた値です。求められなかった場合は空欄で残します(「不明」という文字列を入れて、あとから本物の値と混同することを避けています)。
記録の書き分けWhat Goes Where
記録の置き場所は 2 つあります。アクセス記録は共有リンク専用で、成功も失敗も細かく残します。監査ログはアプリ全体で共通の台帳で、業務上の出来事だけを残します。
| 場面 | アクセス記録 | 監査ログ |
|---|---|---|
| リンクを発行した | — | 残す |
| 案内メールを送った・再送した | — | 残す |
| 受取画面に着いた(開封) | 残す(一定時間に 1 件) | — |
| パスワード・本人確認が必要と表示した | — | — |
| パスワード・確認コードを間違えた | 残す | — |
| パスワード・確認コードを通過した | — | — |
| 期限切れ・無効化済み・回数上限のリンクを開いた | 残す | — |
| ダウンロードが成立した | 残す | 残す |
| ZIP のしきい値を超えていた | — | 残す |
| ZIP の準備・進捗の確認・配下一覧の取得 | — | — |
| レート制限に掛かった | 残す | — |
| 存在しないリンクにアクセスされた | 書けない | 残す |
| 無効化した(発行者・Owner・管理者) | — | 残す |
この分け方にしている理由
監査ログは、あとから「誰が何をしたか」を追うための台帳です。ここにパスワードの入力ミスまで書き込むと、正規の受取人の打ち間違いだけで大量に膨らみ、本当に見たい業務上の出来事が埋もれます。失敗の詳細は共有リンク専用のアクセス記録が持ち、監査ログには「発行した」「渡った」「止めた」だけを残します。
成功時のダウンロードだけは両方に残ります。受取人にとっては「アクセス」であり、業務としては「ファイルが社外に渡った」という重要な出来事でもあるためです。このとき監査ログの行為者は、人ではなく共有リンクそのものとして記録します(受取人はアカウントを持たないため)。
準備と進捗を記録しない理由
ZIP の準備・進捗の確認・配下一覧の取得は、いずれも受取人が意識して行う操作ではありません(画面が自動的に呼びます)。ここを記録すると、1 回のダウンロードのために数十件の記録が積まれ、アクセス履歴が読めなくなります。加えて、次章の異常検知はこの記録を母数にしているため、自動的に増える行を混ぜると検知そのものが狂います。
監査ログAudit Log
共有リンクが監査ログに残す出来事は 6 種類です。
| 出来事 | 行為者 | 残す内容 |
|---|---|---|
| リンクを発行した | 発行者 | 対象・期限・パスワードの有無・回数の設定・本人確認の有無(メールアドレスの実値とパスワードは残しません) |
| 案内メールを送った | 発行者 | 宛先の件数・メッセージの有無 |
| ダウンロードされた | 共有リンク自身 | どのリンクから何が渡ったか |
| ZIP のしきい値を超えた | 共有リンク自身 | 合計サイズ・ファイル数(しきい値の見直しに使う) |
| 無効化した | 発行者 or Owner | 対象のリンク |
| 管理者が強制無効化した | 管理者 | 対象のリンク・理由(10〜256 文字・必須) |
元のファイルやフォルダの削除に連動して複数のリンクが一括で無効になったときは、リンク 1 本ごとに行を積みません。削除操作そのものの記録に「同時に無効化したリンクの件数」を添える形にしています。100 件のファイルを一括削除したときに監査ログが数百行に膨れるのを避けるためです。
3 種類の異常検知Anomaly Detection
アクセス記録から、性質の違う 3 つの危険を見分けます。「異常」として扱うのは、そのリンク自身の記録から導ける、そのリンク固有の危険だけです。全社的な傾向は別の器(アクセス傾向のグラフ)が持ちます。
3 つは検知の重さも違います。総当たりだけがメール通知を伴い、管理画面の上部にバナーとして出ます。ほかの 2 つは一覧の行に印を付けるだけです。
総当たり ― 何を数えるか
数えるのは認証の失敗だけです。具体的には「パスワード誤り」「確認コード誤り」、そして「パスワードやコードの端点でレート制限に掛かった分」の 3 つを合わせて、直近 60 秒で 20 件以上なら検知します。
レート制限に掛かった分を数に含めるのは、必須の措置です。失敗が 3 件たまるとロックが立ち、ロック中の拒否は失敗として記録されません。含めなければ 1 時間に最大 3 件しか積まれず、20 件には決して届きません。つまりレート制限が効くほど検知が鈍るという逆転が起きます。
逆に、ダウンロードの成功や閲覧は数に入れません。しきい値を超えるフォルダでは 1 件ずつのダウンロードをご案内しており、そのために配布の上限を意図的に高めにしてあります。成功も数に入れると、仕様が許した正当な使い方がそのまま検知されることになります。
大量アクセス IP ― どのリンクに印を付けるか
「同じ接続元から 5 分に 100 件以上」という判定は接続元に対するものです。この接続元が触ったリンクへ印を付けるのですが、その接続元が過去に触ったすべてのリンクを対象にすると、たまたま同じ回線から普通に開いただけのリンクまで塗られてしまいます。
そこで、印を付けるのはその集中が起きていた時間帯(検知の 5 分前から)にそのリンクが触られていた場合だけに絞っています。集中の前後に無関係で開かれたリンクは対象になりません。
閲覧元の分散 ― いちばん実務的な危険
実際に起きやすいのは総当たりよりも、渡した URL が第三者に転送されることです。この場合、認証は正しく通るためどのレート制限にも掛かりませんが、閲覧してくる接続元の数が増えます。認証を通ったアクセスの異なる接続元が想定より多くなったら、一覧に印を付けます。
集計の期間は設けていません。リンクの寿命は最長 14 日で既に区切られており、「多くの場所から開かれた」という事実は時間で薄れないためです。しきい値は、案内メールの宛先の上限を踏まえ、正当な使い方(複数の受取人がそれぞれ複数の端末で開く)では到達しない数にしています。接続元の数は人数の粗い代わりでしかないので、表示も「拡散」と断定せず「閲覧元が分散」という言い方にしています。
アラートと通知Alerts & Notification
| 総当たり | 大量アクセス IP | 閲覧元の分散 | |
|---|---|---|---|
| 重さ | 重大 | 警告 | — |
| アラートの起票 | する | する | しない |
| メール通知 | 発行者と管理者へ | しない | しない |
| 管理画面のバナー | 出る | 出ない | 出ない |
| 一覧のバッジ | 総当たり疑い | 大量アクセス IP | 閲覧元が分散 |
| 判定するタイミング | アクセスと同じ処理の中で | 一覧を出すときに | |
同じ危険を何度も知らせない
総当たりの最中は、1 秒間に何度も条件を満たします。そのたびにアラートを作ってメールを送っては、受け取る側が使い物になりません。そこで1 つのリンクにつき未解決のアラートは 1 件だけとし、2 回目以降は発生回数を増やすだけにしています。メールが飛ぶのも最初の 1 回だけです。
条件が消えたら自動で片付ける
アラートを手動で解決する画面は今後実装するため、現時点では条件の消滅で自動的に解決します。
- そのリンクを無効化したとき(発行者・Owner・管理者のいずれの操作でも)── 総当たりの条件そのものが消えます
- そのリンクの期限が切れたとき── 日次の掃除処理がまとめて解決します
- その接続元から一定時間アクセスが無くなったとき── 大量アクセスの警告を解決します
この仕組みが無いと、未解決のアラートが積み上がり続け、管理画面の一覧が古い項目で埋まって「今見るべきもの」が分からなくなります。