第2章 アカウント管理とデータガバナンス(Account Mgmt & Governance, 20%)
🎯 この節の学習目標
Snowflake のアクセス制御はRBAC(Role-Based Access Control:ロールベースアクセス制御)を土台にしています。最も重要な原則は次の1行に集約されます。
📝 試験のポイント
権限(privilege)はロールに付与し、ロールをユーザーまたは他のロールに付与します。権限をユーザーに直接付与することはできません。「ユーザーAにSELECT権限を直接GRANTする」という選択肢は、Snowflakeでは常に誤りです。この原則は選択肢の正誤を切り分ける決定打になるので、最初に押さえておきましょう。
登場人物は次の4つです。
| 概念 | 説明 |
|---|---|
| セキュラブルオブジェクト(securable object) | アクセス制御の対象となるすべてのオブジェクト。データベース、スキーマ、テーブル、ビュー、ウェアハウスなど |
| 権限(privilege) | オブジェクトに対して許可される操作。SELECT、INSERT、USAGE、OWNERSHIP など。オブジェクトの種類ごとに付与できる権限が決まっている |
| ロール(role) | 権限を束ねる入れ物。ロールは他のロールに付与でき、ロール階層を構成する。上位ロールは下位ロールの権限を継承する |
| ユーザー(user) | ロールを付与される主体。人だけでなくアプリケーション・サービスの接続用ユーザーも含む |
権限がユーザーに届くまでの流れを図にすると次のようになります。
図:RBACにおける権限の流れ。権限→ロール→(ロール階層)→ユーザーの順に付与され、ユーザーへの直接付与はできない
なお、Snowflake のドキュメントでは RBAC に加えてDAC(Discretionary Access Control:任意アクセス制御)の側面も持つと説明されます。これは「各オブジェクトには所有者(所有ロール)がおり、所有者がそのオブジェクトへのアクセスを他者に許可できる」という考え方で、次に見る 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(所有権)という特別な権限があります。
GRANT OWNERSHIP で別のロールへ移転できます(コピーではなく移転で、所有ロールは常に1つ)権限の付与と剥奪は 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 を付けると、付与されたロール自身が同じ権限を他のロールへ再付与できるようになります。
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 ALL と ON FUTURE をセットで実行するのが定石です。また、同じ対象にスキーマレベルとデータベースレベルの両方のFUTURE GRANTSがある場合、スキーマレベルの定義が優先されます。
既定のスキーマでは、オブジェクトの所有ロールが自分のオブジェクトの権限を自由に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スキーマです。
ユーザーは複数のロールを持てますが、セッション中に有効なロールの扱いには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 のアクセス制御モデルの説明として正しいものはどれか。
正解:B
Snowflake の RBAC では、権限は必ずロールに付与し、ロールをユーザーや他のロールに付与します。AとCは「ユーザーへの直接付与」を認めている点で誤りです。Dはウェアハウスの役割の誤解で、ウェアハウスは計算資源であり権限の入れ物ではありません(ウェアハウス自体はUSAGE権限などを付与される側のセキュラブルオブジェクトです)。
問2. ロール analyst に sales_db.public.orders テーブルのSELECT権限を付与したが、analyst ロールのユーザーがクエリを実行できない。原因として考えられるものを2つ選べ。
正解:A、B
テーブルにアクセスするには、テーブル自体の権限に加えて上位コンテナ(データベース・スキーマ)のUSAGEが必要で(A)、クエリの実行にはウェアハウスのUSAGEも必要です(B)。Cは誤りで、権限はユーザーに直接付与できません。DのWITH GRANT OPTIONは「受け取った権限を他へ再付与できるか」のオプションであり、自分がSELECTを実行するためには不要です。
問3. MANAGED ACCESSスキーマの説明として最も適切なものはどれか。
正解:B
MANAGED ACCESSスキーマでは権限管理がスキーマ所有者(とMANAGE GRANTS保持ロール)に集中し、オブジェクト所有ロールは権限を付与できなくなります。Aは通常スキーマのふるまいです。Cは誤りで、読み取り専用になるわけではなく、オブジェクトの操作自体は所有ロールが引き続き行えます。DはFUTURE GRANTSの説明であり、別の機能です。
問4. セカンダリロールに関する説明として正しいものはどれか。
正解:B
セカンダリロールはセッションの権限評価にプライマリロールと合算で使われますが、CREATEしたオブジェクトの所有者になるのはプライマリロール(カレントロール)です。Aはこの所有者決定ルールに反します。Cは誤りで、プライマリの権限に「追加」されるのであって置き換えではありません。Dも誤りで、USE SECONDARY ROLES ALL によりユーザーに付与された複数のロールをまとめて有効化できます。