Supabase DatabaseのRLSを使ってセキュアなアプリケーションを構築する方法|東京のWEB制作会社・ホームページ制作会社|株式会社GIG

Supabase DatabaseのRLSを使ってセキュアなアプリケーションを構築する方法

2024-08-30 制作・開発

こんにちは!株式会社GIGのサービス開発事業部で、アプリケーションエンジニアとして働くちいかた(片田)です!

0 -> 1でプロダクトを開発するのが好きな私は、SupabaseやFirebase等のBaaSを採用することが多いです。

BaaSを活用した開発は、プロダクトの開発工数を大幅に減らし、短期間でプロダクトを完成させられるメリットがありますが、反対にセキュリティ面が心配だったりしませんか?

SupabaseはデータベースにPostgreSQLを採用しているため、RLS (Row Level Security)を設定することで、データベースレイヤーでのアクセス制限を実装できます!

今回はSupabaseを普段から使い倒している私が、適切にRLSを設定することでアプリケーションのセキュリティを高める方法をご紹介します!

Supabaseとは

Supabaseは、オープンソースのデータベースである PostgreSQL をベースにした、Backend as a Service (BaaS) プラットフォームです。データベース、認証、ストレージ、Functionsなど、ほぼすべてのバックエンド機能を提供しています。

Supabaseのことが大好きな私が書いた過去の記事もよろしければご覧ください!Supabase Authを使って簡単に認証機能を実装する方法、SupabaseとFirebaseの比較などを記事にまとめています。

■関連記事
Supabase Edge Functionsでサーバーレス入門
Supabase Authを使って爆速で安全なアプリケーションを開発する方法
Supabase + Next.jsで認証機能付きWebアプリケーションを作る方法
Supabase Storageを使ってセキュアなファイルアップロード機能を作る方法

Supabase Database と RLS について

Supabase Database

Supabaseは、データベースにPostgreSQLを採用しています。

インターフェースもRESTだけでなく、GraphQLも用意してくれていることから、開発者ファーストなプロダクトということがひしひしと伝わってきます……!

もちろんSupabaseはBaaSなので、他のAuthやStorageと組み合わせて使う方法が一般的ですが、海外ではPostgreSQLのみを使用するユースケースも流行ってきているみたいです。

RLS (Row Level Security)

PostgreSQLを採用することにより、RLS (Row Level Security)を設定できます。

RLSとは、PostgreSQLのデータにアクセスする際にアクセス制御をするためのもので、適切に設定することでアプリケーションのセキュリティを高められます。

RLSを有効にすると対象のテーブルへのアクセスはできなくなり、ホワイトリスト的に設定を記述することで許可されたユーザーのみ対象のテーブルの行(Row)へアクセスできるように。

RLSは強力で便利なセキュリティ機能ですが、アプリケーションのパフォーマンスも考慮して設計する必要があります。アクセス可能な条件を複雑にするほど処理に時間がかかり、結果としてアプリケーションのパフォーマンスの低下や、インフラリソースのコストの増加などにつながります。

セキュリティとパフォーマンス、コストのちょうど良い塩梅を見つけ、設計する必要があります。

ログイン可能なアプリケーションにおけるRLS設定の一例

ここからは実際に手を動かしつつ、ログイン可能なアプリケーションにおけるRLS設定の一例をご紹介します。

Supabase Authを使ってユーザー管理しつつ、自身のプロフィールを管理するprofilesテーブルと、投稿した記事データを管理するpostsテーブルがあると想定します。

profilesにはid, profileというカラムがあり、idはSupabase Authのuidと紐づいています。postsテーブルにはid, title, profile_idというカラムを用意し、profilesテーブルとリレーションしています。

まずはprofilesテーブルに対するRLS設定をselect, insert, update, deleteと用意していきます。

selectは誰でもできて、insertはログインしているユーザーのみ。update, deleteはログインしている本人のみ実行可能なRLSを設定していきます。

-- rls policyを作成します
alter table public.profiles enable row level security;

create policy "Profiles can visible by everyone"
  on profiles
  for select
  to authenticated, anon
  using (true);

create policy "Profiles can insert only by authenticated user"
  on profiles
  for insert
  to authenticated
  with check (true);

create policy "Profiles can be updated only by their own data"
  on profiles
  for update
  to authenticated
  using (auth.uid() = id);

create policy "Profiles can be deleted only by their own data"
  on profiles
  for delete
  to authenticated
  using (auth.uid() = id);


次にpostsテーブルに対してもRLS設定していきましょう。

postsテーブルは、誰でもselect可能で、insertはログインユーザーのみ、update, deleteは本人の記事のみ可能にします。selectとinsertはprofilesと同様なので割愛します!

 create policy "Posts can be updated only by their own data"
  on posts
  for update
  to authenticated
  using (auth.uid() = profile_id);

create policy "Posts can be deleted only by their own data"
  on posts
  for delete
  to authenticated
  using (auth.uid() = profile_id);


Authenticationにメタデータを仕込んでいる場合、下記のようにロールベースでのアクセス制御も可能です。

 create policy "Profiles can insert only by owner user"
  on profiles
  for insert
  to authenticated
  with check (
    (auth.jwt() -> 'user_metadata' -> 'role'::text = 'owner)
  );


ほかにも時間ベースでのアクセス制御や、外部テーブルのデータを参照したアクセス制御なども実装可能です。

おわりに

BaaSとしても使いやすくて最高なSupabaseですが、PostgreSQL単体で使ってもOKだなんてますますSupabaseのこと、好きになっちゃいました…。

とはいえアプリケーション側でも適切にアクセス制御をする必要はありますし、本文中にも記載した通りパフォーマンスや運用コストとのトレードオフでもあるので、適切に設計してよりセキュアなアプリケーションを構築したいですね!

株式会社GIGは、ナショナルクライアントからスタートアップまで、Webコンサルティング、UI/UXデザイン、システム開発など、DX支援をおこなうデジタルコンサルティング企業です。また、50,000人以上が登録するフリーランス・副業向けマッチングサービス『Workship』や、7,000人以上が登録するデザイナー特化エージェントサービス『クロスデザイナー』、リード獲得に必要な機能を備えたCMS『LeadGrid』、UXコンサルティングサービス『UX Design Lab』などを展開しています。

WebやDX支援のご相談はいつでもご連絡ください。

Web制作/Webマーケティングに関するご相談・ご依頼はこちら
会社紹介資料のダウンロードはこちら

また、株式会社GIGでは一緒に働くメンバーも募集中です!私が所属するLeadGrid開発チームではセキュリティ向上を目指して日々取り組んでいます。どんどん挑戦できる環境なので、LeadGridの開発に少しでもご興味を持っていただいた方は、ぜひカジュアル面談でお話しましょう。

採用応募はこちら(GIG採用サイト)
採用応募はこちら(Wantedly)

WebやDXの課題、お気軽にご相談ください。

片田 凌太

1997年10月生まれ。自動車のコネクティッドサービス開発や日本最大のコーヒーサブスクリプションサービス開発などの経験を経て2023年10月に株式会社GIGに入社。現在は、Webサイト制作からコンテンツSEO、問い合わせ管理、LP制作などWebマーケティングに必要な機能をもったCMS『LeadGrid』の開発チームに所属。