第2章 アカウント管理とデータガバナンス / 想定学習時間:30〜40分 / 最終確認:2026年8月

2-1. セキュリティモデル(RBAC・セキュラブルオブジェクト・GRANT・所有権)

🎯 この節の学習目標

1. RBAC:権限はロールに、ロールはユーザーに

Snowflake のアクセス制御はRBAC(Role-Based Access Control:ロールベースアクセス制御)を土台にしています。最も重要な原則は次の1行に集約されます。

📝 試験のポイント

権限(privilege)はロールに付与し、ロールをユーザーまたは他のロールに付与します。権限をユーザーに直接付与することはできません。「ユーザーAにSELECT権限を直接GRANTする」という選択肢は、Snowflakeでは常に誤りです。この原則は選択肢の正誤を切り分ける決定打になるので、最初に押さえておきましょう。

登場人物は次の4つです。

概念説明
セキュラブルオブジェクト(securable object)アクセス制御の対象となるすべてのオブジェクト。データベース、スキーマ、テーブル、ビュー、ウェアハウスなど
権限(privilege)オブジェクトに対して許可される操作。SELECT、INSERT、USAGE、OWNERSHIP など。オブジェクトの種類ごとに付与できる権限が決まっている
ロール(role)権限を束ねる入れ物。ロールは他のロールに付与でき、ロール階層を構成する。上位ロールは下位ロールの権限を継承する
ユーザー(user)ロールを付与される主体。人だけでなくアプリケーション・サービスの接続用ユーザーも含む

権限がユーザーに届くまでの流れを図にすると次のようになります。

権限(privilege)SELECT / INSERT / USAGE / CREATE TABLE など
GRANT <権限> ON <オブジェクト> TO ROLE …
ロール(role)権限の束。アクセス制御の中心
GRANT ROLE 子ロール TO ROLE 親ロール(階層化。親は子の権限を継承)
上位ロールロール階層をたどって権限が集約される
GRANT ROLE … TO USER …
ユーザー(user)付与されたロールを使い分けて作業する

図:RBACにおける権限の流れ。権限→ロール→(ロール階層)→ユーザーの順に付与され、ユーザーへの直接付与はできない

なお、Snowflake のドキュメントでは RBAC に加えてDAC(Discretionary Access Control:任意アクセス制御)の側面も持つと説明されます。これは「各オブジェクトには所有者(所有ロール)がおり、所有者がそのオブジェクトへのアクセスを他者に許可できる」という考え方で、次に見る OWNERSHIP 権限がその中心です。

2. セキュラブルオブジェクトの階層とOWNERSHIP

セキュラブルオブジェクトは階層構造になっています。最上位は組織(organization)、その下にアカウント、アカウントの中にユーザー・ロール・ウェアハウス・データベースなどが並び、データベースの中にスキーマ、スキーマの中にテーブル・ビュー・ステージ・関数などのスキーマオブジェクトが入ります。

階層オブジェクトの例代表的な権限
アカウントユーザー、ロール、ウェアハウス、データベース、リソースモニターCREATE USER、CREATE DATABASE、CREATE WAREHOUSE など
データベーススキーマUSAGE(中を参照する前提権限)、CREATE SCHEMA
スキーマテーブル、ビュー、ステージ、ファイルフォーマット、タスク、ストアドプロシージャ などUSAGE、CREATE TABLE、CREATE VIEW など
スキーマオブジェクトテーブル、ビュー などSELECT、INSERT、UPDATE、DELETE、TRUNCATE など

ここで重要なのが、テーブルを読むにはテーブルのSELECT権限だけでは足りないという点です。上位コンテナであるデータベースとスキーマのUSAGE権限もそろって初めてアクセスできます。さらに、クエリを実行するにはウェアハウスのUSAGE権限も必要です。

すべてのセキュラブルオブジェクトにはOWNERSHIP(所有権)という特別な権限があります。

3. GRANT / REVOKE と WITH GRANT OPTION

権限の付与と剥奪は GRANT / REVOKE 文で行います。基本の型を確認しましょう。

-- ロールを作成する
CREATE ROLE analyst;

-- オブジェクト権限をロールに付与する(下位コンテナのUSAGEも忘れずに)
GRANT USAGE ON DATABASE sales_db TO ROLE analyst;
GRANT USAGE ON SCHEMA sales_db.public TO ROLE analyst;
GRANT SELECT ON TABLE sales_db.public.orders TO ROLE analyst;

-- クエリ実行に必要なウェアハウスのUSAGEも付与する
GRANT USAGE ON WAREHOUSE analysis_wh TO ROLE analyst;

-- ロールをユーザーに付与する
GRANT ROLE analyst TO USER taro;

-- 権限を剥奪する
REVOKE SELECT ON TABLE sales_db.public.orders FROM ROLE analyst;

💡 具体例:まとめて付与する構文

-- スキーマ内の既存の全テーブルにSELECTを付与する
GRANT SELECT ON ALL TABLES IN SCHEMA sales_db.public TO ROLE analyst;

-- WITH GRANT OPTION:受け取ったロールが同じ権限をさらに他へ付与できる
GRANT SELECT ON TABLE sales_db.public.orders TO ROLE team_lead
  WITH GRANT OPTION;

ALL TABLES IN SCHEMA はあくまで実行時点で存在するテーブルが対象です。この後に作られるテーブルには効きません(そこで次のFUTURE GRANTSが登場します)。WITH GRANT OPTION を付けると、付与されたロール自身が同じ権限を他のロールへ再付与できるようになります。

4. FUTURE GRANTS:将来のオブジェクトへの自動付与

ETLパイプラインが毎日新しいテーブルを作るような環境では、テーブルが作られるたびに GRANT を実行するのは現実的ではありません。FUTURE GRANTS(将来権限)を使うと、これから作成されるオブジェクトに対して権限を自動的に付与できます。

-- 今後 sales_db.public に作成されるテーブルすべてに
-- 自動的にSELECTが付与されるようにする
GRANT SELECT ON FUTURE TABLES IN SCHEMA sales_db.public TO ROLE analyst;

-- データベースレベルでも定義できる(配下の全スキーマの将来テーブルが対象)
GRANT SELECT ON FUTURE TABLES IN DATABASE sales_db TO ROLE analyst;

📝 試験のポイント

既存のオブジェクトへの一括付与=ON ALL」「将来のオブジェクトへの自動付与=ON FUTURE」という対比で覚えましょう。FUTURE GRANTS は既存オブジェクトには影響しないため、実務では ON ALLON FUTURE をセットで実行するのが定石です。また、同じ対象にスキーマレベルとデータベースレベルの両方のFUTURE GRANTSがある場合、スキーマレベルの定義が優先されます。

5. MANAGED ACCESSスキーマ:権限管理の集中化

既定のスキーマでは、オブジェクトの所有ロールが自分のオブジェクトの権限を自由にGRANTできます。これは柔軟ですが、権限管理が分散し、統制の観点では好ましくない場合があります。

MANAGED ACCESSスキーマ(管理アクセススキーマ)にすると、このふるまいが変わります。

-- 管理アクセススキーマとして作成する
CREATE SCHEMA sales_db.restricted WITH MANAGED ACCESS;

-- 既存スキーマを管理アクセスに変更することもできる
ALTER SCHEMA sales_db.public ENABLE MANAGED ACCESS;
通常のスキーマMANAGED ACCESSスキーマ
権限をGRANTできるのは各オブジェクトの所有ロール(+MANAGE GRANTS保持ロール)スキーマの所有ロールMANAGE GRANTS権限を持つロールのみ。オブジェクト所有ロールはGRANT不可
オブジェクト所有ロールができること所有オブジェクトのフルコントロール(GRANTを含む)オブジェクトの操作(DROP・ALTERなど)はできるが、権限付与の意思決定はスキーマ所有者側に集中する

「オブジェクトの所有者ではなく、スキーマ所有者(またはMANAGE GRANTS権限を持つロール)が権限管理を行いたい」という要件が出てきたら、答えはMANAGED ACCESSスキーマです。

6. プライマリロールとセカンダリロール

ユーザーは複数のロールを持てますが、セッション中に有効なロールの扱いには2つの概念があります。

プライマリロールセカンダリロール
何かセッションのカレントロールUSE ROLE で切り替える。常に1つプライマリに加えて権限評価に使われるロール群。USE SECONDARY ROLES ALL などで有効化
権限の評価SQL実行の権限チェックに使われるプライマリとあわせて合算で評価される
オブジェクト作成時の所有者プライマリロールが所有者になるセカンダリロールはCREATEの権限判定には使われるが、所有者にはならない
-- カレント(プライマリ)ロールを切り替える
USE ROLE analyst;

-- 自分に付与された他のロールもすべて権限評価に加える
USE SECONDARY ROLES ALL;

-- 現在のロールコンテキストを確認する
SELECT CURRENT_ROLE(), CURRENT_SECONDARY_ROLES();

「複数ロールにまたがる権限を1つのセッションでまとめて使いたい」がセカンダリロールのユースケースです。一方で、新しく作ったオブジェクトの所有者になるのは常にプライマリロールである点が問われやすいので注意してください。

✅ この節のまとめ

練習問題

問1. Snowflake のアクセス制御モデルの説明として正しいものはどれか。

  1. 権限はユーザーに直接付与するのが基本で、ロールは補助的な仕組みである
  2. 権限はロールに付与し、ロールをユーザーまたは他のロールに付与する。権限をユーザーに直接付与することはできない
  3. 権限はユーザーとロールのどちらにも直接付与でき、管理者が自由に選べる
  4. 権限はウェアハウスに付与し、ウェアハウスを経由してユーザーがオブジェクトにアクセスする
解答と解説を見る

正解:B

Snowflake の RBAC では、権限は必ずロールに付与し、ロールをユーザーや他のロールに付与します。AとCは「ユーザーへの直接付与」を認めている点で誤りです。Dはウェアハウスの役割の誤解で、ウェアハウスは計算資源であり権限の入れ物ではありません(ウェアハウス自体はUSAGE権限などを付与される側のセキュラブルオブジェクトです)。

問2. ロール analyst に sales_db.public.orders テーブルのSELECT権限を付与したが、analyst ロールのユーザーがクエリを実行できない。原因として考えられるものを2つ選べ。

  1. データベース sales_db またはスキーマ public のUSAGE権限が analyst に付与されていない
  2. 使用するウェアハウスのUSAGE権限が analyst に付与されていない
  3. SELECT権限はロールではなくユーザーに付与しなければならない
  4. テーブルのSELECT権限にはWITH GRANT OPTIONが必須である
解答と解説を見る

正解:A、B

テーブルにアクセスするには、テーブル自体の権限に加えて上位コンテナ(データベース・スキーマ)のUSAGEが必要で(A)、クエリの実行にはウェアハウスのUSAGEも必要です(B)。Cは誤りで、権限はユーザーに直接付与できません。DのWITH GRANT OPTIONは「受け取った権限を他へ再付与できるか」のオプションであり、自分がSELECTを実行するためには不要です。

問3. MANAGED ACCESSスキーマの説明として最も適切なものはどれか。

  1. スキーマ内のオブジェクトの所有ロールが、それぞれ自分のオブジェクトの権限を自由にGRANTできる
  2. スキーマ内のオブジェクトへの権限付与は、スキーマの所有ロールまたはMANAGE GRANTS権限を持つロールだけが行える
  3. スキーマ内のオブジェクトは読み取り専用になり、いかなるロールも変更できない
  4. スキーマ内に将来作成されるオブジェクトへ権限を自動付与する仕組みである
解答と解説を見る

正解:B

MANAGED ACCESSスキーマでは権限管理がスキーマ所有者(とMANAGE GRANTS保持ロール)に集中し、オブジェクト所有ロールは権限を付与できなくなります。Aは通常スキーマのふるまいです。Cは誤りで、読み取り専用になるわけではなく、オブジェクトの操作自体は所有ロールが引き続き行えます。DはFUTURE GRANTSの説明であり、別の機能です。

問4. セカンダリロールに関する説明として正しいものはどれか。

  1. USE SECONDARY ROLES ALL を実行すると、以後作成するオブジェクトの所有者はセカンダリロールの中から自動的に選ばれる
  2. セカンダリロールはプライマリロールとあわせて権限評価に使われるが、新規オブジェクトの所有者になるのは常にプライマリロールである
  3. セカンダリロールを有効にすると、プライマリロールの権限は無効になる
  4. セカンダリロールは1つしか有効にできない
解答と解説を見る

正解:B

セカンダリロールはセッションの権限評価にプライマリロールと合算で使われますが、CREATEしたオブジェクトの所有者になるのはプライマリロール(カレントロール)です。Aはこの所有者決定ルールに反します。Cは誤りで、プライマリの権限に「追加」されるのであって置き換えではありません。Dも誤りで、USE SECONDARY ROLES ALL によりユーザーに付与された複数のロールをまとめて有効化できます。