RLSによるテナント分離:セキュリティ要件からPostgreSQLを選定した理由
株式会社ROXX / mrkmtkm
メンバー / バックエンドエンジニア / 従業員規模: 11名〜50名 / エンジニア組織: 10名以下
| ツールの利用規模 | 事業形態 |
|---|---|
| 11名〜50名 | B to B |
| ツールの利用規模 | 11名〜50名 |
|---|---|
| 事業形態 | B to B |
導入の背景・解決したかった問題
導入背景
PostgreSQLの導入は、単なる機能要件を満たすだけでなく、過去のセキュリティ課題の根本解決と将来の技術基盤の構築という、二重の目的を持って決定されました。
ツール導入前の課題
A. データセキュリティ上の深刻な懸念(テナント分離の欠如) 課題の核心: 過去に、異なる顧客や組織(テナント)のデータが誤って表示されてしまうという、情報漏洩につながるセキュリティインシデントが発生していました。
根本的な問題: データを格納するデータベース層で、顧客ごとのデータアクセスを厳密に分離する仕組み(テナント分離)が確立されていなかったことです。
既存の選択肢の限界: 他の一般的なデータベース(例:MySQL)でデータベース層のテナント分離を実現しようとすると、「顧客ごとにクラスタやデータベース自体を物理的に分ける」必要があり、構築や日々の運用管理の負荷が非常に高く、現実的ではありませんでした。
B. 新しい技術検証の環境不足 課題: 将来的にシステムの大規模な刷新(アーキテクチャの全面的な見直し)が計画されていましたが、新しい言語や設計パターン(例:Go言語、クリーンアーキテクチャ、gRPCなど)を試すための安全な検証環境が不足していました。
リスク: 顧客向けの既存の基幹システムでいきなり新技術を試すことは、サービス停止やバグのリスクが大きすぎるという懸念がありました。
どのような状態を目指していたか
PostgreSQLを採用することで、上記の課題を解決し、以下の2つの状態を同時に実現することを目指しました。
A. RLSによる最高レベルのセキュリティ基盤の確立 目指す状態: データベースの機能を用いて、「顧客ごとのデータアクセスを厳密に分離する」 仕組みを実装すること。
PostgreSQLの優位性: PostgreSQLのRow Level Security (RLS) 機能を利用すれば、アプリケーションのコードに頼るだけでなく、データベース自体が「このセッション(ユーザー)はこの行(レコード)にしかアクセスできない」というルールを強制できます。これにより、運用負荷を抑えつつ、セキュリティインシデントの根本的な再発防止を実現することを目指しました。
B. 将来の基幹システムへ繋がる技術の確立と知見の蓄積 目指す状態: 内部向けの小規模なアプリケーションを**「技術的な実験場」**として活用し、新しいバックエンド技術の組み合わせを検証すること。
PostgreSQLと組み合わせる検証要素:
開発効率: ORM(GORM)とその**コード自動生成機能(GORM Gen)**をPostgreSQLと組み合わせることで、開発効率がどの程度向上するかを検証する。
設計知見: RLSの運用方法、Go言語によるトランザクション管理など、将来の大規模システムへ適用できる貴重なノウハウを蓄積することを目指しました
比較検討したサービス
- MySQL
比較した軸
- セキュリティと運用負荷(最重要項目) 最も重要視されていたのは、過去のインシデントの根本対策として求められたデータ分離の確実性と、それによる運用負荷の現実性でした。
Row Level Security (RLS) によるテナント分離の実現性:
重要性: 過去のインシデント(他社候補者が一覧に表示される事象)を受けて、**「テナント分離」**が根本的な再発防止策として必須となっていました。
比較観点: 既存の選択肢(例:MySQL)では、テナント分離を実現するために「クラスタごと、データベースごと、またはスキーマごとに分ける」必要があり、構築・運用負荷が非現実的に高いと判断されていました。
PostgreSQLの利点: RLS機能であれば、現実的な実装負荷で、データベース層においてデータアクセスを厳密に分離するセキュリティ要件を満たせることが、最大の選定理由となりました。
- 将来的な技術戦略への適合性 次に重要視されていたのは、本プロジェクトが「五大陸プロジェクト」という将来の基幹システム刷新の実験場であるという役割から、新しい技術スタックとの親和性と開発の効率性でした。
技術的な親和性:
重要性: 強い例外がない限り、標準または人気のあるパッケージを採用し、今後の技術選定のベースとなる主流技術に触れておくことが方針でした。
観点: Go言語、クリーンアーキテクチャ、gRPCといった新しい技術スタックと高い親和性を持ち、安定して連携できるかどうかが重要でした。
開発効率の向上:
観点: 開発効率を高めるため、GORMのようなORMツールや、DBスキーマからコードを自動生成するGORM Genといったツール群とPostgreSQLが効果的に連携できるかが重視されました。
特定の機能検証:
観点: PostgreSQLのRLSだけでなく、トランザクション境界とみなされるDDDの集約単位でのデータ操作、そしてその永続化をORMを通じて適切に実装できるかも検証対象とされていました。
導入の成果
導入に向けた社内への説明
上長・チームへの説明
PostgreSQLの導入は、セキュリティリスクの解消と将来の技術基盤への投資という、二つの不可欠な価値を提供することを重点的に説明しました。
- 最重要要件:セキュリティの確実な担保 課題: 過去の重大なセキュリティインシデント(他顧客のデータ誤表示)を受けて、データベース層での**顧客データ分離(テナント分離)**が必須の根本対策でした。
PostgreSQLの利点: 他のDBで分離を実現すると運用負荷が極めて高くなりますが、PostgreSQLのRow Level Security (RLS) 機能を使えば、データベース自体がアクセス権限を強制するため、現実的な実装負荷でセキュリティ要件を確実に満たせると説明しました。
- 費用対効果:将来的な技術への投資 目的: この内部向けプロジェクトを**「安全な実験場」**として活用し、将来の大規模システム刷新に必要な技術(Go言語、GORM Gen、新しいアーキテクチャ)の知見を、低リスクで蓄積できると説明しました。
コスト効率: RLSによるセキュリティ担保という緊急の課題を解決しつつ、同時に技術的な負債の予防とノウハウの獲得ができるため、これは非常にコスト効率の高い先行投資であると強調しました。
- 満たすべき条件 導入した技術(RLS、GORM Genなど)の設計や実装の知見を、ドキュメントやコードレビューを通じてチーム全体に共有し、今後の技術選定に役立てられる状態にすることが求められました。
活用方法
よく使う機能
Row Level Security (RLS) によるテナント分離
ツールの良い点
- データの信頼性が高い
- テナント分離の構築・運用コストが低い
ツールの課題点
特に感じていない
株式会社ROXX / mrkmtkm
メンバー / バックエンドエンジニア / 従業員規模: 11名〜50名 / エンジニア組織: 10名以下
株式会社ROXX / mrkmtkm
メンバー / バックエンドエンジニア / 従業員規模: 11名〜50名 / エンジニア組織: 10名以下
目次
- 導入の背景・解決したかった問題
- 活用方法


