本文へ移動

データ保護と検査/ Data Protection

外に出さない・持ち込ませない・失っても取り戻せる

松葉が守るものは 2 方向あります。1 つは、Box の中のファイルが関係のない人の手に渡らないこと。もう 1 つは、外から持ち込まれたファイルで社内が汚染されないことです。前者は画面・データベース・ストレージの三層で、後者はアップロードの全量検査と隔離で受け止めます。この章では、その仕組みと、管理者が異常時に取れる手立て、そして失ったときの取り戻し方を説明します。

01

三層の守りThree Layers

「Box の外に出さない」という決まりを、画面だけで守らせていません。画面の出し分け・データベース側の範囲制限・ファイル実体への期限付きの入口という 3 つの層で、それぞれ独立に同じ判定を行います。1 つの層をすり抜けても、次の層で止まる構図です。稼働中

図 05 · 三層の守り — 外側をすり抜けても内側で止まる
① 画面の出し分け — アプリロールと公開範囲に応じて、押せないボタンや見えない項目を作ります① を回避されても ↓② データベース側の範囲制限 — Row Level Security利用者ごとに、そもそも取り出せる行が限られます。画面を通さない要求でも同じです② を回避されても ↓③ 期限付きの署名付き URL — Cloud Storageファイルの実体には、その場で発行した期限付きの URL でしか触れません③ で止まりますファイルの実体(Cloud Storage のバケット)バケットは非公開。URL を知らないかぎり誰も読めませんダウンロード用・アップロード用とも短時間で期限切れ期限が切れた URL は、たとえ手元に残っていても読み出せませんURL には推測できない署名が入っており、別のファイルへ差し替えることもできませんBox の外のファイルは、そもそも URL の発行対象になりません

色の役割 — Teal:アプリの層とファイルの実体 / 金茶:データベースの層 / 赤:最も内側の層と、すり抜けを止める位置。3 つの層はそれぞれ独立に判定するため、どれか 1 つの実装ミスが即座に情報漏洩につながることはありません。

Layer by Layer
層何をしているかすり抜けたとき
① 画面の出し分け
アプリ
ロールと公開範囲に応じて、ボタンやメニュー、一覧の項目を出し分けます。利用者にとっての「できること」の見た目を作る層です② が止めます
② データベース側の範囲制限
Row Level Security
データを保管している PostgreSQL 自身が、要求してきた人ごとに取り出せる範囲を絞ります。画面を通さずに直接問い合わせても、自分に関係のない Box の行は 1 件も返りません③ が止めます
③ 期限付きの署名付き URL
Cloud Storage
ファイルの実体はバケットに置かれ、外から直接は読めません。読み書きのたびに、その 1 ファイル・その 1 回だけに効く期限付きの URL を発行します(ダウンロード用・アップロード用とも短時間で失効)ここで止まります
Row Level Security(データベース側の範囲制限)とは: 表の行 1 つひとつに「誰なら見てよいか」の条件を付け、データベース自身がその条件で絞り込む仕組みです。松葉ではこれを Box の単位で敷いており、別の Box のファイルやメンバー情報は、どんな経路から問い合わせても返りません。アプリの不具合や、想定していなかった要求の組み立て方があっても、この層は独立に効き続けます。
02

アップロードの全量検査Scan Pipeline

松葉に上がってくるファイルは、社内・社外を問わずすべてウイルス検査を通ります。検査の前と後で置き場(バケット)を分けており、検査を通ったものだけが Box に現れます。稼働中

図 06 · 検査の流れ — 検査を通ったものだけが Box に現れる
アップロードブラウザから直接ストレージへ(期限付きの URL)未検査バケット検査前の置き場。Box には現れませんmatsuba-scannerClamAV で 1 件ずつ検査。定義は 6 時間ごとに更新クリーン検査済みバケットへ移動Box に現れ、Drive にも複製隔離済み隔離バケットへ管理者と関係者へ即時メールスキャン失敗・スキャンできません検査前の置き場に残ります管理コンソールから再検査利用者に開示されますダウンロード・共有リンク・Drive利用者には出しません取り出し・削除は管理者だけ利用者には出しません結果が変われば通常の流れへ検査を通っていないファイルは、一覧にも検索結果にも出ません。共有リンクにも載せられません

色の役割 — Teal:検査を通った経路 / 赤:検出と隔離 / 金茶:検査前の保管と、結果が確定しなかった経路。3 つのバケットを物理的に分けているため、検査前のファイルと検査済みのファイルが同じ場所に混ざることがありません。

ファイルの状態表示Status Labels

検査の結果は、ファイルごとの状態として画面に出ます。日常的に目にするのは次の 6 つです。「クリーン」だけが利用者に開示され、Google Drive への複製と共有リンクへの掲載が許されます。

Six States
表示意味利用者から見た状態管理者の手立て
スキャン待ち受け取り済みで、検査の順番を待っていますダウンロード・共有はできません長く滞留していれば管理コンソールから再検査
スキャン中検査を行っています同上同上
クリーン問題は見つかりませんでした通常どおり使えます。Drive にも複製されます—
隔離済み検出されたため隔離しました一覧から消えます一覧・取り出し・恒久削除(次章)
スキャン失敗検査そのものが完了しませんでした使えません管理コンソールから再検査
スキャンできません暗号化されている、または大きすぎて中身を確かめられませんでした使えません相手に確認のうえ、上げ直しを依頼するか判断

このほかに「整合性エラー(取り消し)」という終端の状態があります。アップロード時に申告されたファイルの指紋と、検査サービスが実測した指紋が食い違ったことを意味し、通信の途中で内容が入れ替わったか壊れたことを表します。再検査では直らないため、その版を破棄して上げ直してもらう扱いです。

検査の前に断る形式Denied Extensions

検査に回す前の入口で、そもそも受け付けない拡張子を決めています。既定は 22 種です。内訳は実行ファイル系(.exe .dll .bat .ps1 .jar など)と、マクロを含められる Office 形式(.docm .xlsm .pptm)、およびマクロが混ざりうる旧形式の Office(.doc .xls .ppt)です。この一覧は全社設定として変更できます(設定画面は実装予定 · Step 4b)。

(画面の画像は掲載していません)
ファイル一覧では、検査が済んでいない行にその状態がバッジで出ます。検査中のファイルはダウンロードのボタンが押せない状態になります。
(画面の画像は掲載していません)
用途ごとに分かれた 9 つのバケットが並んでいる様子です。検査前・検査済み・隔離のほか、アバターやサムネイル、一括ダウンロード用の一時ファイル、監査ログの退避先が別々に置かれています。いずれも東京リージョンで、外部への公開は禁止されています。
03

検出パターンの鮮度と訓練Freshness & Drill

ウイルス検査は、検出パターンの定義が古くなった瞬間に「動いているのに見つけられない」状態へ静かに変わります。これは画面には何も現れません。そこで、定義の鮮度と、検査が本当に反応するかどうかを、それぞれ別の仕組みで見張っています。稼働中

Two Safeguards
仕組み頻度内容失敗したとき
定義の更新6 時間ごと専用のジョブ clamav-mirror-updater が最新の定義を取り寄せて ミラーバケット(ウイルス定義) に置き、時間をおいて検査サービスへ読み込みを指示します。取り寄せと読み込みを分けているのは、置いただけで反映されていない状態を作らないためです連続して 3 回失敗するとアラートが起票されます
検出の訓練毎月EICAR(ウイルス対策の動作確認のために世界共通で使われている、無害な検査用ファイル)を実際に流し込み、検査が反応するかを確かめます検出できなかった場合は緊急のアラートになります
成功しても報告します: 月次の訓練は、検出に成功した場合でも結果のメールが届きます。「異常があったときだけ知らせる」形にすると、知らせが来ないことが「正常」と「見張り自体が止まっている」のどちらなのか区別できなくなるためです。毎月 1 通の成功報告が届いていること自体が、見張りが生きている証拠になります。
04

隔離ファイルの運用Quarantine

検出されたファイルは削除せず、専用の 隔離バケット へ移して保管します。取引先から届いたファイルが検出された場合、何が届いたのかを確かめなければ相手への連絡もできないためです。ここから先の操作はすべてシステム管理者だけが行えます。稼働中

Administrator Actions
操作できること付いている制約
一覧・参照隔離されたファイルの一覧を、検出名・元の Box・アップロードした方・隔離された日時つきで確認できます件数・合計サイズ・90 日を過ぎた件数が計器として出ます
取り出し中身を確かめるために、その場で 1 回だけダウンロードできます理由の入力が必須(10〜256 字)+ 危険性を理解した旨の確認。発行される URL は短時間で切れ、URL 自体は記録に残しません。実行と同時に全システム管理者へ即時メールが飛びます
恒久削除隔離したファイルを完全に消します理由の入力が必須(10〜256 字)。実行の記録は監査ログに残ります
古い隔離の整理90 日を過ぎた隔離ファイルは削除候補として件数が出て、その条件で絞り込めますまとめての削除を自動で提案する仕組みは実装予定 · Step 4bです
取り出しは記録される操作です: 隔離ファイルの取り出しは、危険と分かっているものをあえて手元に降ろす操作です。そのため、理由を書かないと実行できず、実行すると本人以外の全システム管理者にもその場でメールが届きます。1 人だけで完結させない形にしてあるのは、後から経緯を説明できる状態を保つためです。
05

社外との受け渡しの防御Sharing Boundaries

アカウントを持たない相手にファイルを渡す共有リンクと、逆に受け取るファイルリクエストは、URL さえ知られれば誰でも到達できる入口です。ここには、受け渡し専用のホストを分けたうえで、期限・本人確認・回数の 3 方向から制限をかけています。稼働中

受け渡しは別のホストで受けるHost Separation

共有リンクとファイルリクエストの URL は、本体とは別の inbox.portal.example.com というホストで受けます。このホストが受け付けるのは受け渡しに必要な 4 つの経路だけ(共有リンクの受取ページとその処理、ファイルリクエストの受取ページとその処理)で、Box やファイルの一覧といった本体の機能は一切公開していません。さらに手前に Cloud Armor を置き、1 つの接続元からの要求数に上限を設け、超えた要求は遮ります(既定・変更可)。受け渡しページの内容は検索エンジンに載せない設定にしており、ファイル名やフォルダ名が検索エンジンに控えられることもありません。

渡すとき・受け取るときの制限Limits

Share Link vs. File Request
項目共有リンク(渡す)ファイルリクエスト(受け取る)
期限24 時間 / 7 日 / 14 日 / 日付指定。最長 14 日同じく最長 14 日
本人確認受取人のメールアドレスを指定すると、確認コードでの本人確認が必須になります(最大 10 宛先)常に必須。提出者のメールアドレスの指定と、確認コードの通過が要ります
パスワード任意で設定できます持ちません。本人確認を必ず通るため、二重にはしていません
回数・量の上限ダウンロード回数の上限を設定できます累計 100 件まで、合計容量にも上限あり(既定・変更可)
中身クリーンなファイルだけ受け取ったファイルも全量が検査を通ります

総当たりと大量アクセスの検知Abuse Detection

  • 確認コードの総当たり:1 つの URL に対して 1 分間に 20 件の認証失敗が起きると、緊急のアラートを起票し、そのリンクを発行した方にもメールが飛びます稼働中
  • 同じ接続元からの大量アクセス:同じ接続元から 5 分間に 100 回のアクセスがあると警告のアラートになります(共有リンクとファイルリクエストの合算・既定・変更可)
  • 全社横断の一覧:発行済みの共有リンクとファイルリクエストは、管理コンソールから全社まとめて一覧でき、必要なものをその場で強制失効できます(詳しくは管理コンソール)

しきい値は「気づける程度に低く、日常の利用では鳴らない程度に高く」を狙って置いた既定値で、運用の実態に合わせて調整できます。

06

保存データとバックアップAt Rest & Backup

守りの最後は「失っても取り戻せること」です。データベースとストレージはそれぞれ別の方法で控えを持ち、Google Drive 側にも複製が残ります。取り戻す速さの目標も決めてあります。稼働中

保存時の暗号化Encryption

データベースに保管されたデータも、ストレージに置かれたファイルも、ディスク上では暗号化されています。利用者のブラウザとの間の通信はすべて TLS 1.2 以上で、暗号化されていない経路は開いていません。氏名やメールアドレスといった項目単位でのさらなる暗号化は行っていません。

控えの取り方と、取り戻す速さBackup & Recovery

Backup Matrix
対象控えの取り方どこまで戻せるか
データベース
PostgreSQL(Supabase)
日次のスナップショット + ポイントインタイムリカバリ(PITR)過去の一定期間の範囲で任意の時点の状態へ復元できます
ファイル
Cloud Storage
バケットの世代管理(Object Versioning)上書き・削除された内容を一定期間さかのぼって取り出せます
Google Drive 側の複製Drive 同期を有効にした Box のファイルが複製されていますDrive 側で消えたものは Google Workspace の管理者機能で一定期間復元できます
鍵・接続情報秘密情報の保管庫が過去の版を保持します一定の世代前まで戻せます
RPO目標
失われうる最大の期間(RPO)。障害の直前ではなく、最悪でも一定時間前の状態には戻せるという目標です。
RTO目標
復旧までにかける最大の時間(RTO)。定めた時間内に業務を再開できる状態へ戻すことを目標にしています。
定期
復元演習の頻度。実際に控えから戻す手順を通し、目標の時間内に収まるかを確かめます。
演習まで含めて 1 つの備えです: 控えを取っていることと、そこから戻せることは別です。実際に復元の手順を通す演習を、運用の定例に組み込んでいます。
(画面の画像は掲載していません)
データベースの控えが日々取られている様子です。日次のスナップショットの一覧と、ポイントインタイムリカバリで戻せる期間が並んでいます。