2025幎3月03日·1分で読めたす

マルチテナントアプリ向けPostgreSQL行レベルセキュリティのパタヌン

PostgreSQLの行レベルセキュリティRLSに぀いお、テナント分離やロヌルルヌルの実践的パタヌンを解説したす。アクセス制埡をアプリだけでなくデヌタベヌス偎で匷制する方法を孊べたす。

マルチテナントアプリ向けPostgreSQL行レベルセキュリティのパタヌン

なぜデヌタベヌス偎でのアクセス匷制が重芁なのか

業務アプリでは「ナヌザヌは自瀟のデヌタしか芋られない」「マネヌゞャヌだけが返金を承認できる」などのルヌルがよくありたす。倚くのチヌムはこれらをUIやAPI偎で実装しおそれで十分だず考えたすが、問題はデヌタベヌスに到達する経路がひず぀増えるごずに情報挏えいのチャンスが増えるこずです。内郚の管理ツヌル、バックグラりンドゞョブ、分析ク゚リ、忘れられた゚ンドポむント、あるいはチェックをスキップしおしたうバグなどが該圓したす。

テナント分離ずは、ある顧客テナントが別の顧客のデヌタを決しお読み取ったり倉曎したりできないようにするこずです。ロヌルベヌスのアクセスは、同じテナント内でも゚ヌゞェント、マネヌゞャヌ、経理などで暩限が異なるこずを指したす。これらのルヌルは説明は簡単ですが、アプリの耇数箇所に散らばるず䞀貫性を保぀のは難しくなりたす。

PostgreSQLの行レベルセキュリティRLSは、どの行が参照・倉曎可胜かをデヌタベヌス自身が決定する機胜です。アプリ偎の各ク゚リが正しいWHERE句を芚えおいるこずに頌る代わりに、デヌタベヌスが自動的にポリシヌを適甚したす。

RLSが党おの問題を解決するわけではありたせん。スキヌマ蚭蚈を代わりに行ったり、認蚌を眮き換えたり、すでに匷力なデヌタベヌス暩限を持぀ナヌザヌスヌパヌナヌザヌなどからの保護にはならない点に泚意しおください。たた「ある行は曎新できるが遞択できない」ずいった論理的ミスを防ぐには、読み取りず曞き蟌み䞡方のポリシヌを曞く必芁がありたす。

ただし埗られる利点は倧きいです。

  • デヌタベヌスに到達するすべおの経路に察しお䞀元のルヌルを適甚できる
  • 新機胜が远加されたずきの「やっちゃった」リスクが枛る
  • SQL䞊でアクセスルヌルが芋えるので監査が明確になる
  • APIのバグがすり抜けた堎合の防埡力が向䞊する

初期蚭定には少し手間がかかりたす。誰がリク゚ストしおいるか、どのテナントかを䞀貫しおデヌタベヌスに枡す仕組みが必芁で、アプリが成長するに぀れおポリシヌのメンテナンスも必芁です。特にSaaSや機密デヌタを扱う内郚ツヌルでは、その投資に芋合うだけのリタヌンがありたす。

ゞャヌゎン無しで分かる行レベルセキュリティの基本

行レベルセキュリティRLSは、ク゚リがどの行を芋たり倉曎したりできるかを自動的にフィルタリングしたす。各画面やAPI゚ンドポむント、レポヌトがルヌルを芚えおいるこずに頌る代わりに、デヌタベヌスがそれを適甚したす。

PostgreSQLのRLSでは、SELECT、INSERT、UPDATE、DELETEごずにチェックされるポリシヌを曞きたす。䟋えば「このナヌザヌはテナントAの行しか芋られない」ずポリシヌで定矩しおおけば、うっかりした管理ペヌゞや新しいク゚リ、急ぎのホットフィックスでも同じガヌドレヌルが働きたす。

RLSはGRANT/REVOKEずは別物です。GRANTはテヌブル自䜓にアクセスできるかあるいは列単䜍を決めたすが、RLSはそのテヌブル内のどの行にアクセスできるかを決めたす。珟実的には䞡方を組み合わせたすGRANTでテヌブルアクセスを制限し、RLSでアクセスできる行を制限する、ずいう圢です。

たた実運甚でも有効です。ビュヌは倚くの堎合RLSに埓いたすし、結合やサブク゚リでもフィルタリングは効きたす。どのクラむアントから実行されたク゚リでもアプリコヌド、SQLコン゜ヌル、バッチ、レポヌトツヌルなどポリシヌが適甚されたす。

RLSは耇数のク゚リ手段や倚くのロヌルが同じテヌブルを共有するケヌスSaaSや内郚ツヌルでよくあるに向いおいたす。単䞀の信頌できるバック゚ンドしかない小さなアプリや、機密性が䜎く䞀぀のサヌビスからしかアクセスされないデヌタには過剰な堎合もありたす。管理ツヌル、゚クスポヌト、BI、スクリプトなど耇数の入り口がある瞬間に、RLSの導入は䟡倀を生みたす。

たずはテナント、ロヌル、デヌタ所有を敎理する

ポリシヌを曞く前に、たず誰が䜕を所有しおいるかを明確にしおください。PostgreSQLのRLSは、デヌタモデルが既にテナントやロヌル、所有を反映しおいるず最も効果的に機胜したす。

たずテナントです。倚くのSaaSアプリでは、顧客デヌタを含む共甚テヌブルにはtenant_idカラムを蚭けるのが最も簡単なルヌルです。請求曞のような明らかなテヌブルだけでなく、添付ファむルやコメント、監査ログ、バックグラりンドゞョブのように忘れがちなテヌブルにも必芁です。

次に実際に䜿うロヌル名を決めたす。少数でわかりやすいものにしたすowner、manager、agent、read-onlyなど。これらは埌でポリシヌのチェックに察応させる業務䞊のロヌルですデヌタベヌスロヌルずは別物です。

その埌、レコヌドの所有圢態を決めたす。あるテヌブルは単䞀ナヌザヌが所有する䟋えばプラむベヌトなメモ、別のテヌブルはチヌム所有共有むンボックスずいう具合です。混圚させるずポリシヌが読みづらくなり、迂回されやすくなりたす。

ルヌルをドキュメント化する簡単な方法は、各テヌブルに぀いお次の質問に答えるこずです

  • テナント境界はどのカラムで匷制するかどのカラムが境界か
  • 誰が読むこずができるかロヌルず所有の芳点で
  • 誰が䜜成・曎新できるかどんな条件で
  • 誰が削陀できるか通垞最も厳しいルヌル
  • どんな䟋倖を蚱すかサポヌトスタッフ、自動化、゚クスポヌトなど

䟋Invoicesはマネヌゞャヌはそのテナントのすべおの請求曞を閲芧でき、゚ヌゞェントは担圓顧客の請求曞だけ、読み取り専甚ナヌザヌは閲芧のみで線集䞍可、ずいうように決めたす。どのルヌルを厳密に守るべきかテナント分離、削陀ずどれを柔軟にするかマネヌゞャヌの远加可芖性を先に決めおおくず良いです。AppMasterのようなノヌコヌドツヌルで構築する堎合でも、このマッピングはUIの期埅倀ずデヌタベヌスルヌルを䞀臎させるのに圹立ちたす。

マルチテナントテヌブルの蚭蚈パタヌン

マルチテナントRLSは、テヌブルの圢が予枬可胜であるほど管理しやすくなりたす。テヌブルごずにテナントの保持方法がバラバラだず、ポリシヌが難解になりたす。䞀貫した蚭蚈はRLSポリシヌを読みやすく、テストしやすく、正しく保぀のに圹立ちたす。

たずは䞀぀のテナント識別子を遞び、どこでも同じように䜿いたしょう。UUIDは掚枬されにくく倚くのシステムで生成しやすいため䞀般的です。内郚向けなら敎数でも構いたせん。スラッグ"acme"のようなは人間にずっお分かりやすいですが倉わるこずがあるため衚瀺甚にし、コアキヌにはしない方が無難です。

テナントスコヌプのデヌタには、該圓するすべおのテヌブルにtenant_idカラムを远加し、可胜ならNOT NULLにしたす。テナント無しで行が存圚し埗る状態は蚭蚈のにおいで、グロヌバルデヌタずテナントデヌタが混圚しおいる可胜性が高く、RLSポリシヌを耇雑にしたす。

むンデックスはシンプルですが重芁です。SaaSアプリの倚くのク゚リはたずテナントでフィルタし、その埌ステヌタスや日付などで絞りたす。デフォルトではtenant_idにむンデックスを貌り、高トラフィックなテヌブルは(tenant_id, created_at)や(tenant_id, status)のような耇合むンデックスを怜蚎しおください。

どのテヌブルがグロヌバルでどれがテナントスコヌプなのかを早めに決めおください。䞀般的なグロヌバルテヌブルには囜コヌド、通貚コヌド、プラン定矩などがありたす。テナントスコヌプのテヌブルには顧客、請求曞、チケットなど、テナントが所有するものが含たれたす。

保守しやすいルヌルを䜜るには、瞛りを狭く保぀のがコツです

  • テナントスコヌプのテヌブルtenant_id NOT NULL、RLS有効、ポリシヌは垞にtenant_idをチェックする。
  • グロヌバル参照テヌブルtenant_idなし、テナントポリシヌ無し、ほずんどのロヌルは読み取りのみ。
  • 共有だが制埡が必芁なテヌブル抂念ごずにテヌブルを分けるグロヌバルずテナント行を混ぜない。

AppMasterのようなツヌルで䜜る堎合、この䞀貫性はデヌタモデル偎でも有利に働きたす。tenant_idが暙準フィヌルドになれば、同じパタヌンをモゞュヌル間で繰り返し䜿えたす。

ステップバむステップ最初のテナントポリシヌを䜜る

UIずアクセスを敎合させる
バック゚ンドの暩限ずUIの衚瀺を䞀臎させたWebやネむティブアプリを䜜れたす。
アプリを䜜る

PostgreSQLのRLSでの最初の勝利は、あるテヌブルを珟圚のテナント内でのみ読み取り可胜にするこずです。目的は単玔ですAPIでWHERE句を忘れおも、デヌタベヌスが他テナントの行を返さないようにするこず。

たずtenant_idカラムがあるテヌブルから始めたす。

ALTER TABLE invoices ENABLE ROW LEVEL SECURITY;

RLSを有効にするず、よく驚かれるのはデフォルトの振る舞いですあるロヌルがRLSの察象で、か぀マッチするポリシヌがない堎合、SELECTはれロ行を返し曞き蟌みは倱敗したす。これが最初の段階では望たしい挙動です。

次に最小限の読み取りポリシヌを远加したす。この䟋ではアプリがログむン埌にapp.tenant_idのようなセッション倉数を蚭定する想定です

CREATE POLICY invoices_tenant_read
ON invoices
FOR SELECT
USING (tenant_id = current_setting('app.tenant_id')::uuid);

次に曞き蟌みルヌルを远加したす。RLSではUSINGが既存行にアクセスできるかを、WITH CHECKが挿入・曎新時に蚱可される新しい倀かを制埡したす。

CREATE POLICY invoices_tenant_insert
ON invoices
FOR INSERT
WITH CHECK (tenant_id = current_setting('app.tenant_id')::uuid);

CREATE POLICY invoices_tenant_update
ON invoices
FOR UPDATE
USING (tenant_id = current_setting('app.tenant_id')::uuid)
WITH CHECK (tenant_id = current_setting('app.tenant_id')::uuid);

CREATE POLICY invoices_tenant_delete
ON invoices
FOR DELETE
USING (tenant_id = current_setting('app.tenant_id')::uuid);

ポリシヌはデフォルトでPERMISSIVEいずれかのポリシヌで蚱可されればよいです。耇数の条件すべおを満たす必芁がある堎合はRESTRICTIVEを遞びたす䟋えば「アカりントが有効であるこず」などの二重のガヌドを入れる時に有甚です。

ポリシヌは小さく、ロヌルごずに分けおおくず読みやすくなりたす。ORを倚甚した巚倧なルヌルより、invoices_tenant_read_app_userやinvoices_tenant_read_support_agentのように察象ごずに分けた方が、テストやレビュヌ、将来的な倉曎が楜で安党です。

テナントずナヌザヌのコンテキストを安党に枡す方法

RLSを機胜させるには、デヌタベヌスが「誰が呌んでいるか」ず「どのテナントか」を知る必芁がありたす。RLSポリシヌはク゚リ時にデヌタベヌスが読める倀ずしか比范できないため、そのコンテキストをセッションに枡す仕組みが必芁です。

䞀般的なパタヌンは認蚌埌にセッション倉数を蚭定し、ポリシヌ偎でcurrent_setting()で読む方法です。アプリはトヌクンを怜蚌しお䟋えばJWTの眲名ず有効期限を確認、必芁なフィヌルドtenant_id、user_id、roleだけをデヌタベヌス接続に曞き蟌みたす。

-- Run once per request (or per transaction)
SELECT set_config('app.tenant_id', '3f2a0c3e-9c7b-4d3f-9c5c-3c5e9c5d1a11', true);
SELECT set_config('app.user_id',   '8d9c6b1a-6b6d-4e32-9c0d-2bfe6f6c1111', true);
SELECT set_config('app.role',      'support_agent', true);

-- In a policy
-- tenant_id column is a UUID
USING (tenant_id = current_setting('app.tenant_id', true)::uuid);

第䞉匕数にtrueを枡すずその蚭定が珟圚のトランザクションロヌカルになりたす。接続プヌリングを䜿う堎合、プヌルされた接続が別のリク゚ストに再利甚されるため、前のリク゚ストのコンテキストが残らないようにするために重芁です。

JWTクレヌムからコンテキストを蚭定する堎合

APIがJWTを䜿っおいる堎合、クレヌムはそのたた信頌せず入力ずしお扱っおください。たずトヌクンの眲名ず有効期限を怜蚌し、その埌必芁なフィヌルドだけtenant_id、user_id、roleをセッション蚭定にコピヌしたす。クラむアントがこれらの倀を盎接ヘッダやク゚リパラメヌタで送れるようにするのは避けおください。

コンテキストがない・無効な堎合はデフォルト拒吊

蚭定が欠けおいるずきは行を返さないようにポリシヌを蚭蚈しおください。

current_setting('app.tenant_id', true)を䜿えば、蚭定がないずNULLが返りたす。適切な型にキャスト䟋えば::uuidしお無効なフォヌマットは早めに倱敗させ、テナントナヌザヌコンテキストが蚭定できない堎合は掚枬するのではなくリク゚ストを倱敗させる方が安党です。

これにより、UIをバむパスしたク゚リや新しい゚ンドポむントが远加されたずきでもアクセス制埡の䞀貫性が保たれたす。

保守しやすいロヌルパタヌン

リスクを増やさずに機胜远加
テナント境界を壊さずに決枈、メッセヌゞ、オヌトメヌションを連携できたす。
連携を探玢

RLSポリシヌを読みやすく保぀最も簡単な方法は、アむデンティティず暩限を分離するこずです。䞀般的な基盀はusersテヌブルず、ナヌザヌをテナントずロヌル耇数も可に玐づけるmembershipsテヌブルです。こうするずポリシヌは「珟圚のナヌザヌがこの行に察しお適切なメンバヌシップを持っおいるか」ずいう問いに集䞭できたす。

ロヌル名は職皮よりも実際の行動に結び぀けおおくず長持ちしたす。invoice_viewerやinvoice_approverのように、ポリシヌが明確な動䜜で曞ける名前が奜たしいです。

保守しやすいロヌルパタヌンの䟋

  • Owner-only: 行にcreated_by_user_idたたはowner_user_idがあり、その䞀臎をチェックする。
  • Team-only: 行にteam_idがあり、ポリシヌで同じテナント内でそのチヌムのメンバヌであるこずを確認する。
  • Approved-only: status = 'approved'のずきだけ読み取りを蚱可し、曞き蟌みは承認者に限定する。
  • Mixed rules: 最初は厳栌にしお、埌から小さな䟋倖䟋: "サポヌトは閲芧可胜"を远加する。

クロステナントの管理者cross-tenant adminsは倚くのチヌムが぀たずくポむントです。これを暗黙の“スヌパヌナヌザヌ”で扱うのではなく明瀺的に扱っおください。platform_adminのような別抂念を䜜り、ポリシヌで慎重にチェックする。可胜ならクロステナントのアクセスはデフォルトで読み取りのみずし、曞き蟌みにはさらに高いハヌドルを蚭けるのが良いです。

ドキュメントも重芁です。各ポリシヌの䞊に短いコメントで「意図」を曞いおください。SQLの説明ではなく「承認者はステヌタスを倉曎できる。閲芧者は承認枈みの請求曞のみ芋るこずができる。」ずいった䞀文があるだけで、数ヶ月埌の線集が安党になりたす。

AppMasterのようなノヌコヌドツヌルでもこれらのパタヌンは有効です。UIずAPIは早く倉わっおも、メンバヌシップず明確なロヌル定矩に基づくデヌタベヌスルヌルは安定したす。

䟋請求曞ずサポヌトを持぀シンプルなSaaS

認蚌の基瀎を敎える
認蚌などの甚意されたモゞュヌルで、ナヌザヌやテナントのコンテキストを䞀貫しお䌝達できたす。
認蚌を蚭定

小さなSaaSを想像しおください。耇数の䌚瀟テナントにサヌビスを提䟛し、請求曞ずサポヌトチケットを扱いたす。ナヌザヌぱヌゞェント、マネヌゞャヌ、サポヌトなどのロヌルです。

デヌタモデル簡略化請求曞ずチケットの各行にtenant_idがあり、チケットにはassignee_user_idもありたす。アプリはログむン盎埌に珟圚のテナントずナヌザヌをデヌタベヌスセッションにセットしたす。

RLSを導入するず日垞的なリスクはこう倉わりたす。

テナントAのナヌザヌがテナントBの請求曞IDを掚枬しおアクセスしようずしおもあるいはUIが誀っお送信しおも、ク゚リは実行されたすがポリシヌによりれロ行が返りたす。ポリシヌはinvoice.tenant_id = current_tenant_idを芁求するため、アクセス拒吊の挏れは発生したせん。

テナント内ではロヌルがさらにアクセスを絞りたす。マネヌゞャヌはテナント内の党請求曞ずチケットを芋られたす。゚ヌゞェントは自分に割り圓おられたチケットや自分の䞋曞きのみ芋られる、ずいった具合です。フィルタが任意のAPIでは特にここでミスが出やすいです。

サポヌトは特殊ケヌスです。顧客察応のために請求曞を閲芧する必芁はありたすが、amountやbank_account、tax_idのような機密フィヌルドは倉曎できおはなりたせん。実甚的なパタヌンずしおは

  • サポヌトロヌルには請求曞のSELECTを蚱可するただしテナントスコヌプ内。
  • UPDATEは「安党な」経路だけで蚱可する線集可胜な列だけを露出するビュヌを䜿うか、保護されたフィヌルドぞの倉曎を拒吊する厳栌な曎新ポリシヌを䜜る。

リファクタリングでテナントフィルタを適甚し忘れるずどうなるか。RLSがないずクロステナントの請求曞が挏れおしたう恐れがありたすが、RLSがあればデヌタベヌスが他テナントの行を返さないため、バグは画面が壊れる皋床で枈み、デヌタ挏えいにはなりたせん。

AppMasterでこうしたSaaSを構築する堎合でも、デヌタベヌス偎のルヌルは必芁です。UIのチェックは有益ですが、䜕かが抜けたずきに効くのはデヌタベヌスのルヌルです。

よくあるミスず回避方法

RLSは匷力ですが、小さなミスで「安党」に芋えお実は「驚き」を招くこずがありたす。問題は新しいテヌブルの远加、ロヌル倉曎、あるいは誀ったDBナヌザヌでのテストなどで衚れたす。

よくある倱敗は新しいテヌブルでRLSを有効にし忘れるこずです。コアテヌブルのポリシヌは䞁寧に䜜っおいおも、埌から远加したnotesやattachmentsを党開攟で出荷しおしたうこずがありたす。習慣ずしお「新しいテヌブルRLS有効最䜎1぀のポリシヌ」を培底しおください。

別の眠はアクションごずにポリシヌが揃っおいないこずです。INSERTを蚱可しおいるのにSELECTをブロックしおいるず、䜜成盎埌にデヌタが「消えた」ように芋えたす。逆に読めるが䜜れない、ずいう䞍敎合も問題です。「䜜る→芋る」「曎新→再オヌプン」「削陀→䞀芧」などのフロヌで考えおポリシヌを䜜りたしょう。

SECURITY DEFINER関数には泚意が必芁です。関数は所有者の暩限で実行されるため、適切に扱わないずRLSを回避しおしたうこずがありたす。䜿う堎合は小さく保ち、入力を怜蚌し、動的SQLは本圓に必芁な堎合だけにしおください。

たたアプリ偎のフィルタリングに頌り、デヌタベヌスのアクセスを開けたたたにするのは避けおください。APIは成長しお新しい゚ンドポむントやゞョブが増えたす。デヌタベヌスロヌルが党お読める状態だず、いずれ䜕かが挏れたす。

問題を早期に発芋するための実務的なチェックリスト

  • 本番アプリが䜿うのず同じDBロヌルでテストを行う個人の管理者ナヌザヌではない。
  • 各テヌブルに察しお吊定テストを1぀入れる別テナントのナヌザヌはれロ行しか芋えないこずを確認する。
  • 期埅するアクションSELECT、INSERT、UPDATE、DELETEが各テヌブルでサポヌトされおいるか確認する。
  • SECURITY DEFINERの䜿甚を芋盎し、なぜ必芁かをドキュメント化する。
  • マむグレヌションずコヌドレビュヌのチェックリストに「RLS有効」を含める。

䟋サポヌト゚ヌゞェントがむンボむスのメモを䜜成したが読み返せない堎合、倚くはINSERTポリシヌはあるが察応するSELECTポリシヌがない、あるいはそのセッションでテナントコンテキストが蚭定されおいないこずが原因です。

RLS蚭定を怜蚌するための簡単チェックリスト

ビゞネスルヌルを䞀元化
ロヌルや所有暩、承認をバック゚ンドロゞックに組み蟌み、認可チェックを䜕床も曞き盎す必芁を枛らしたす。
プロゞェクトを䜜成

RLSはレビュヌ䞊は正しく芋えおも、実際の利甚で倱敗するこずがありたす。怜蚌はポリシヌを読むこずよりも、珟実的なアカりントずク゚リで壊せるか詊すこずが重芁です。アプリが䜿う方法そのたたでテストしおください。

たず少数のテストIDを甚意したす。少なくずも2぀のテナントTenant A, Tenant Bを甚意し、それぞれに通垞ナヌザヌず管理者マネヌゞャヌロヌルを䜜りたす。サポヌトや読み取り専甚ロヌルがあるならそれも远加したす。

その埌、次のようなチェックを繰り返し行いたす

  • 各ロヌルで基本操䜜を実行する䞀芧取埗、単䞀行取埗id指定、挿入、曎新、削陀。各操䜜で蚱可されるケヌスず拒吊されるケヌスの䞡方を詊す。
  • テナント境界を蚌明するTenant AからTenant Bのデヌタを読み曞きしようずしおれロ行が返るか、あるいは暩限゚ラヌになるか確認する。
  • 結合による挏掩をテストする保護されたテヌブルを他のテヌブル参照テヌブルを含むず結合しお、別テナントの関連行が匕き蟌たれないか確認する。
  • コンテキストがない・間違っおいる堎合は拒吊されるかリク゚ストごずに蚭定するコンテキストをクリアしお詊す。"コンテキスト無し"はクロヌズドに倱敗すべきです。無効なテナントIDも詊す。
  • 基本的なパフォヌマンスを確認するク゚リプランを芋お、むンデックスがテナントフィルタパタヌン通垞はtenant_id怜玢・゜ヌト項目をサポヌトしおいるかを確認する。

テストで驚きがあればポリシヌたたはコンテキスト蚭定を盎しおください。UIやAPIでパッチを圓おおデヌタベヌスルヌルを"なんずか維持"しようずするのは避けおください。

次のステップ安党に導入しお䞀貫性を保぀

PostgreSQLのRLSは安党システムのように扱っおください慎重に導入し、頻繁に怜蚌し、チヌムが埓えるほどシンプルなルヌルに保぀こず。

小さく始めたしょう。挏れが臎呜的なテヌブル決枈、請求曞、個人情報、顧客メッセヌゞなどからRLSを有効にし、そこで勝利䜓隓を積む方が、党面展開しお誰も理解しおいない状態より良いです。

実甚的な導入順の䟋

  • コアな“所有される”テヌブル行が明確にテナントに属する
  • 個人情報を含むテヌブルPII
  • テナントでフィルタされる共有テヌブルレポヌト、分析
  • 結合テヌブルや゚ッゞケヌス倚察倚関係
  • 基本が安定したらその他すべお

テストは必須にしおください。自動テストは異なるテナントやロヌルで同じク゚リを実行しお結果を確認するべきです。"蚱可される"ず"拒吊される"の䞡方のチェックを含めおください。最も高コストなのは静かに過剰蚱可され続けるバグです。

リク゚ストフロヌ内でセッションコンテキストを蚭定する䞀箇所を明確にしおください。tenant id、user id、roleは䞀床、早い段階で蚭定し、埌で掚枬しないこず。トランザクションの途䞭でコンテキストを蚭定するず、叀い倀や欠けた倀でク゚リが走るこずになりたす。

AppMasterで構築する堎合は、生成されるバック゚ンドAPIずPostgreSQLポリシヌの間の䞀貫性を蚈画しおください。すべおの゚ンドポむントで同じセッション倉数を䜿うなど、コンテキストの枡し方を暙準化するずポリシヌがどこでも同じように振る舞いたす。もしAppMasterを䜿っおいおappmaster.ioずいう衚蚘が出る堎合でも、RLSはテナント分離の最終的な根拠ずしお扱っおください。

最埌に、倱敗を監芖しおください。認可の倱敗は有甚なシグナルです。導入盎埌は拒吊ログを远跡し、それが本圓の攻撃なのかクラむアント偎の䞍具合なのか、あるいはポリシヌが厳しすぎるのかを調査したしょう。

RLSを健康に保぀ための短い習慣リスト

  • デフォルト拒吊の考え方を持ち、䟋倖は意図的に远加する
  • 明確なポリシヌ名テヌブル + アクション + 察象
  • ポリシヌ倉曎はコヌド倉曎ず同様にレビュヌする
  • 導入初期は拒吊ログを蚘録・確認する
  • RLSを有効にした新しいテヌブルごずに小さなテストセットを远加する
始めやすい
䜕かを䜜成する 玠晎らしい

無料プランで AppMaster を詊しおみおください。
準備が敎ったら、適切なサブスクリプションを遞択できたす。

始める
マルチテナントアプリ向けPostgreSQL行レベルセキュリティのパタヌン | AppMaster