本文へ移動

2026-08-01 時点の資料です。読みやすさのために、一部の文字の色を濃くしています。

松葉 / Matsuba ・ 開発過程資料

期限つき共有リンク/ Secure Share Links

アカウントを持たない相手へ、期限・パスワード・本人確認つきでファイルを渡す仕組み

取引先へ渡したいファイルが 1 件だけあるとき、そのためにアカウントを用意してもらうのは重すぎます。かといってメールに添付すると、容量で弾かれ、宛先を間違えても取り消せず、いつまで手元に残るかも分かりません。共有リンクは、この「渡すだけ」の受け渡しを、期限と回数と本人確認つきで完結させる仕組みです。まずは実際の動きをご覧ください。

この資料について: システム担当向けの技術共有です。用いる技術は正式名で記し、初出には短い注釈を、末尾の用語集にも一覧を用意しています。稼働中のサービス名(例:matsuba-batch)は名前と役割を併記します。各章へは目次から移動できます。通読の目安は 12〜15 分です。
01

デモンストレーションDemonstration

発行から受け取り、ダウンロードまでを一本の操作で通した記録です。この先の各章は、ここで起きていることを分解してご説明します。

(動画は掲載していません)
発行ダイアログでの設定 → 受取人が URL を開く → パスワードと確認コードを通す → ダウンロード。
02

共有リンクの全構成System Map

この仕組みを構成する稼働リソース(サービス・バケット・ジョブ・トピック)と、その間を流れるものを一枚にまとめました。①発行 → ②案内メールの配送 → ③受け取り → ④配布の実体 → ⑤記録・検知・管理、の 5 区画で読めます。①だけがログインを必要とし、③以降はアカウントを持たない相手が通る経路です。各要素の詳しい役割は、この先の各章で扱います。

図 01 · 共有リンクの全構成 — 稼働リソースと受け渡しの全体マップ
① 発行 — 本体ホスト portal.example.com(ログインが必要)発行者Box の Editor / Ownermatsuba-web発行ダイアログmatsuba-api対象の検証・トークン生成PostgreSQLshare_links に保存(32 バイトのトークン)案内メールの送信予定outbox_eventsaudit_logs — 監査ログshare_link.create / email_sent保存積む記録1 分ごとに払い出し② 案内メールの配送 — 発行と同じ処理の中では送らないmatsuba-batch送信予定を払い出す(Cloud Run Jobs)Pub/Subshare_link.created+ デッドレターmatsuba-api取込・宛先の解決文面の組み立てResendメール配送受取人(社外)発行配信送信着信パスワードはこのメールに載せない — 発行者が電話・対面など別の連絡手段で伝える受け取った URL を開く③ 受け取り — 公開ホスト inbox.portal.example.com(ログイン不要)受取人のブラウザ/s/{token}Cloud DNS / Load Balancingホスト名で本体と分岐Cloud ArmorIP ごとのレート制限inbox.portal.example.com共有リンク用に開くのは 2 経路だけ同じオリジンの API を呼ぶmatsuba-api — 共有リンクの公開 8 端点状態確認 / パスワード照合 / 確認コードの送信・照合 / 配布 / ZIP の準備・進捗 / 配下一覧レート制限とロックホスト単位と端点別のレート制限失敗 3 件で 1 時間ロック認可 Cookie通過済みの確認・短時間署名つき・HttpOnly確認コードResend へ直送・6 桁有効 10 分PostgreSQL範囲を限定した読み取り対象範囲 ∩ 検査済み ∩ 最新版④ 配布の実体 — 署名付き URL と ZIPファイルフォルダ検査済みバケット検査済みのファイル(Cloud Storage)署名付き URLファイル・短時間だけ有効原ファイル名で保存matsuba-batchfolder-zip-builder配下をまとめて ZIP 化共有 ZIP バケットZIP の一時置き場72 時間で自動削除受取人のブラウザが直接取得配布のときだけ回数が 1 増えるZIP の署名付き URL も短時間72 時間を過ぎた ZIP は自動削除。状態の後始末は日次の掃除処理(Cloud Scheduler)が行うアクセスと結果を記録⑤ 記録・検知・管理 — 残すから見つけられるshare_link_accessesアクセス記録(9 種)閲覧・配布・失敗・制限…異常検知 3 種総当たり / 大量アクセス IP閲覧元の分散app_alerts + 通知メールshare_link.brute_force発行者と管理者へaudit_logs監査ログ(6 種)業務イベントのみ判定起票Box の共有リンクタブ一覧・再送・無効化・アクセス履歴(Box メンバー)全社管理画面 /admin/share-links異常の一覧・強制無効化・アクセス傾向・主要指標(管理者のみ)

色の凡例 ― テール=処理サービス・アプリ/金茶=保管と時間に関わるもの・社外の人/赤=防御と危険/破線=補足。稼働リソース名(matsuba-batch など)はすべて用語集に説明があります。

03

概要Overview

共有リンクは、Box に招待していない相手へファイルやフォルダを一時的に渡すための仕組みです。相手にアカウントを作ってもらう必要はなく、受け取る側がすることは「送られた URL を開く」だけです。

発行できるのは、その Box の Editor または Owner です。対象を選び、有効期限・パスワード・ダウンロード回数・受取人の本人確認を決めると、推測できない URL が 1 本できます。案内メールを同時に送ることもできます。渡せるのはウイルス検査を通過したファイルだけで、検査中や隔離されたファイルは対象に選べません。

受け取る側は、その URL を開くと、必要な確認(パスワード・確認コード)を順に通ってからダウンロードします。単ファイルはそのまま、フォルダは ZIP にまとめて渡します。ファイルの中身が API を通ることはありません。短時間だけ有効な URL を発行し、ブラウザが Cloud Storage から直接取得します。

渡したあとも止められます。発行者と Box Owner はいつでも無効化でき、管理者は全社の一覧から強制的に失効させられます。元のファイルを削除すれば、そのファイルを指す共有リンクは自動的に無効になります。そしてすべてのアクセスが記録され、そこから 3 種類の異常を自動で見つけます。

この仕組みが引き受けている難しさ: 受け取る側はログインしていません。つまり「誰が来ているか」をアカウントで判断できないまま、正しい相手には確実に渡し、それ以外には渡さない必要があります。この資料の後半(防御の設計・記録と異常検知)は、そのために積み上げた層を扱います。
04

この資料の構成Pages

渡す側 → 受け取る側 → 守る仕組み → 記録と運用、の順にご説明します。「受け取りの流れ」と「防御の設計」は図つきで厚めに扱います。

01 · Background

設計の背景Why This Design

この仕組みが引き受けた業務課題。受取ページを本体と別のホストに分けた理由。ログイン不要のまま安全を成り立たせる考え方と、設計の四原則。

開く
02 · Issue

リンクの発行Issuing a Link

対象の検証、設定できる 5 項目とその既定値、推測できないトークンとパスワードの保存方式、案内メールを取りこぼさず配送する仕組み。

開く
03 · Receive

受け取りの流れReceiving

状態の解決順、パスワードと本人確認の順次通過、ダウンロード、フォルダの ZIP。全体像・シーケンス・状態遷移の 4 枚の図で追います。

開く
04 · Protection

防御の設計Defense in Depth

四層のレート制限とロック、トークン規格、秘密の保存方式、列挙への対策、データベース側の範囲制限、キャッシュと露出の制御。

開く
05 · Audit

記録と異常検知Records & Detection

9 種類のアクセス記録と、どこに何を書くかの書き分け。3 種類の異常をどう定義し、どう通知し、どう自動で片付けるか。

開く
06 · Manage

管理機能Management

発行者側の一覧・再送・無効化・アクセス履歴。元データに連動した無効化の 6 起点。全社管理画面の主要指標・異常バッジ・強制無効化。

開く
07 · Tech

採用技術Tech Stack

この仕組みを構成する技術と、それぞれの役割。

開く
08 · Glossary

用語集Glossary

本文で用いた技術用語と、稼働中のサービス名の一覧・説明。

開く
05

規模と主要指標Key Figures

この仕組みの主な数字です(根拠は各ページに記載)。

43文字 / 256 bit
推測できない URL のトークン長(32 バイトの乱数)
14日
有効期限の上限(運用中に短くできる)
4層
重ねたレート制限とロック(外周から端点別まで)
3種
自動で見つける異常(総当たり/大量アクセス IP/閲覧元の分散)
9種
記録するアクセス結果(閲覧・配布・失敗・制限ほか)
検査済みのみ
共有リンクで渡せるファイルの状態

このほか、受け取り用の公開 API が 8 本、発行と管理の API が 9 本、全社管理の API が 6 本。画面は受取ページ・Box の共有リンクタブ・全社管理画面の 3 面。自動テストは単体 17 ファイル、データベース結合 9、アクセス権限の網羅 5、画面の通しテスト 3 スイートです。