

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 行レベルのセキュリティに関する推奨事項
<a name="rls"></a>

PostgreSQL でプールされたモデルでテナントデータの分離を維持するには、行レベルのセキュリティ (RLS) が必要です。RLS は、分離ポリシーの適用をデータベースレベルで一元化し、ソフトウェア開発者からの分離を維持する負担を軽減します。RLS を実装する最も一般的な方法は、PostgreSQL DBMS でこの機能を有効にすることです。RLS では、指定した列の値に基づいてデータの行へのアクセスをフィルタリングします。データへのアクセスをフィルタリングするには、次の 2 つの方法を使用できます。
+ テーブル内の指定されたデータの列は、現在の PostgreSQL ユーザーの値と比較されます。ログインした PostgreSQL ユーザーと同等の列の値には、そのユーザーがアクセスできます。
+ テーブル内の指定されたデータの列は、アプリケーションによって設定されたランタイム変数の値と比較されます。ランタイム変数と同等の列の値は、そのセッション中にアクセスできます。

2 番目のオプションが推奨されます。1 番目のオプションでは、テナントごとに新しい PostgreSQL ユーザーを作成する必要があるためです。代わりに、PostgreSQL を使用する SaaS アプリケーションは、PostgreSQL にクエリを実行するときに、実行時にテナント固有のコンテキストを設定する責任があります。これは RLS を適用する効果があります。RLS はtable-by-table有効にすることもできます。ベストプラクティスとして、テナントデータを含むすべてのテーブルで RLS を有効にする必要があります。

次の例では、2 つのテーブルを作成し、RLS を有効にします。この例では、データの列をランタイム変数 の値と比較します`app.current_tenant`。

```
-- Create a table for our tenants with indexes on the primary key and the tenant’s name
CREATE TABLE tenant (
    tenant_id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
    name VARCHAR(255) UNIQUE,
    status VARCHAR(64) CHECK (status IN ('active', 'suspended', 'disabled')),
    tier VARCHAR(64) CHECK (tier IN ('gold', 'silver', 'bronze'))
);
 
-- Create a table for users of a tenant
CREATE TABLE tenant_user (
    user_id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
    tenant_id UUID NOT NULL REFERENCES tenant (tenant_id) ON DELETE RESTRICT,
    email VARCHAR(255) NOT NULL UNIQUE,
    given_name VARCHAR(255) NOT NULL CHECK (given_name <> ''),
    family_name VARCHAR(255) NOT NULL CHECK (family_name <> '')
);
 
-- Turn on RLS
ALTER TABLE tenant ENABLE ROW LEVEL SECURITY;
 
-- Restrict read and write actions so tenants can only see their rows
-- Cast the UUID value in tenant_id to match the type current_setting
-- This policy implies a WITH CHECK that matches the USING clause
CREATE POLICY tenant_isolation_policy ON tenant
USING (tenant_id = current_setting('app.current_tenant')::UUID);
 
-- And do the same for the tenant users
ALTER TABLE tenant_user ENABLE ROW LEVEL SECURITY;
 
CREATE POLICY tenant_user_isolation_policy ON tenant_user
USING (tenant_id = current_setting('app.current_tenant')::UUID);
```

詳細については、ブログ記事[PostgreSQL 行レベルセキュリティによるマルチテナントデータ分離](https://aws.amazon.com/blogs/database/multi-tenant-data-isolation-with-postgresql-row-level-security/)」を参照してください。また AWS SaaS Factory チームには、RLS の実装を支援するいくつかの[例が GitHub にあります](https://github.com/aws-samples/aws-saas-factory-postgresql-rls)。