← エピソード一覧に戻る
Episode 162

認証しても守れない? ― SaaS開発で外せないテナント分離の設計

12分 5チャプター 日本語
0:00 / 0:00

スクリプト

Chapter 1

オープニング ― ログインできるのに事故は起きる

タカシ

皆さんこんにちは、タカシです。今日は SaaS 開発の中でもかなり重い論点、テナント分離を扱います。実は、ちゃんとログインできて権限もあるのに、別会社のデータへ触れてしまう事故は設計次第で起こりえます。

ミカ

ミカです。えっ、それは怖いですね。認証と権限があれば十分だと思っていました。でもそれだけだと、SaaS の一番大事な境界は守れないんですか。

タカシ

そこが大事な誤解です。AWS も、認証や認可はセキュリティの一部であって、tenant isolation そのものではないと説明しています。今日はその違いと、経営者がどこまで統制すべきかを整理しましょう。

ミカ

API やデータベースの話だけで終わらず、運用や商談条件にもつながりそうですね。大口顧客が増える前に聞いておきたいテーマです。

Chapter 2

基本 ― tenant context をどこまで通すか

タカシ

テナント分離の本質は、いま誰のデータに触ってよいのかを示す tenant context を、リクエストから最後まで落とさないことです。画面だけ守っても、SQL やキャッシュ、バッチ、ログで境界が抜ければ意味がありません。

ミカ

なるほど。フロント画面で会社名が切り替わっているだけでは不十分で、裏側の全経路で同じ会社 ID が効いていないと危ないわけですね。地味ですが本質です。

タカシ

その通りです。さらに Microsoft は、外部 ID を招待してリソースを分けても、それは resource isolation であって identity isolation ではないと説明しています。社内アカウント侵害が顧客向け SaaS に波及する余地が残るんです。

ミカ

ということは、顧客データを守る話なのに、実は SRE やサポート担当の運用 ID まで設計対象なんですね。DB を分けたら終わりじゃないのか。

タカシ

まさにそこです。テナント分離はデータモデルの話に見えますが、実態は誰がどう本番へ入るかまで含んだ統制設計です。技術と運用を別々に考えると、境界は一番弱いところから破れます。

Chapter 3

具体例 ― shared を伸ばしつつ、必要な顧客だけ強く分ける

ミカ

ここで実務のイメージが欲しいです。大規模 SaaS は実際にどうやって分離しているんでしょう。全部を顧客専用にしているわけではないですよね。

タカシ

Atlassian が分かりやすい例です。Jira と Confluence Cloud では tenant context service を使い、各顧客のデータ配置先や機能設定を tenant ID と結び付けて処理しています。誤った DB 接続への追加防波堤になると公式資料で説明しています。

ミカ

なるほど、設定情報の台帳を中央で持って、すべての操作に tenant ID を乗せる感じですね。人が気をつけるのではなく、基盤が毎回チェックする設計だ。

タカシ

しかも Atlassian は 2025 年末時点で 350,000 超の顧客を持ち、Jira Cloud は単一サイトで 100,000 ユーザーまで対応すると公表しています。この規模で shared を回すには、境界を属人運用にできません。

ミカ

大きくなるほど、営業が取ってきた 1 社の例外対応を手作業で吸収するのは無理になりますね。だから tenant context を仕組みに埋め込む必要があるわけか。

タカシ

さらに面白いのは、Atlassian が Isolated Cloud も準備している点です。標準はマルチテナントで伸ばしつつ、高統制の顧客には dedicated virtual private cloud を用意する。一部だけ isolated にする混在運用も想定しています。

Chapter 4

落とし穴 ― 境界はバッチと管理画面から崩れる

ミカ

失敗しやすい場所も知りたいです。エンジニアが一生懸命 API を守っていても、別のところから漏れそうな気がします。

タカシ

一番多いのは、認証と RBAC を入れた時点で安心することです。CSV エクスポート、非同期ジョブ、サポート用管理画面、共有キャッシュは tenant context が抜けやすい。OWASP も cross-tenant vulnerability の典型原因として設計漏れを挙げています。

ミカ

たしかに本番事故って、華やかな画面より裏方で起きそうです。しかも表面上は 200 OK で、ユーザーが気づくまで見逃されるタイプの不具合ですよね。

タカシ

もう一つは、顧客ごとに例外構成を増やしすぎることです。Azure も、個別カスタマイズや専用インフラの乱立は運用を複雑にし、境界の一貫性を壊すと示しています。例外が多いほど、人の判断に依存します。

ミカ

つまり、分離を強めるつもりで個別対応を増やしたのに、逆に運用ミスの余地を広げることがあるんですね。専用化そのものより、専用化の仕方が問題なんだ。

タカシ

その通りです。shared と dedicated の切り替え条件を決めず、営業案件ごとに場当たり対応すると危険です。専用鍵、個別バックアップ、地理要件、大口契約など、分離を上げる条件は先に経営ルールにしておくべきです。

Chapter 5

クロージング ― 分離条件を先に決める

ミカ

明日からやるなら、まず API、バッチ、キャッシュ、ログ、管理運用の五つで tenant context が抜けていないかを点検したいです。ここが曖昧だと、あとで大きい顧客が来たときに苦しみそうです。

タカシ

加えて、どの条件で shared から dedicated へ上げるのか、営業条件まで含めて文章にしてください。テナント分離はセキュリティだけでなく、粗利、受注力、運用再現性を守る SaaS の経営基盤です。

ミカ

ログインと権限で安心せず、境界を最後まで通し切る。しかも例外対応をルール化しておく。SaaS がきれいに伸びるかどうかは、この地味な設計にかかっているんですね。今回はここまでです。