【Snowflake】Snowflake ~ アクセス制御 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2021/11/02/130111
https://dk521123.hatenablog.com/entry/2021/11/22/212520
https://dk521123.hatenablog.com/entry/2021/11/15/221245

の続き。

今回は、Snowflake の ロールや権限などのアクセス制御
について、メモっておく。

目次

【1】アクセス制御の種類
 1)DAC(Discretionary Access Control)
 2)RBAC(Role-Based Access Control)
【2】アクセス制御を理解するための重要な概念
【3】セキュリティ保護可能なオブジェクト
【4】ロール - role
【5】システム定義のロール
 1)GLOBALORGADMIN - 組織アカウントの組織管理者
 2)ORGADMIN - 通常アカウントの組織管理者
 3)ACCOUNTADMIN - アカウント管理者
 4)SYSADMIN - システム管理者
 5)PUBLIC
 6)SECURITYADMIN - セキュリティ管理者
 7)USERADMIN - ユーザー管理者
【6】ユーザー - user
【7】権限 - grant

【1】アクセス制御の種類

https://docs.snowflake.com/ja/user-guide/security-access-control-overview.html

アクセス制御に対するSnowflakeのアプローチは、
次の両方のモデルの側面を組み合わせたものです。
 => 詳細は、以下の関連記事を参照の事

Snowflake 〜 アクセス制御種類 〜
https://dk521123.hatenablog.com/entry/2025/05/13/162636

1)DAC(Discretionary Access Control)

* 任意アクセス制御
* 各オブジェクトに所有者がおり、
 所有者はそのオブジェクトへのアクセスを許可できます。

2)RBAC(Role-Based Access Control)

* ロールベースアクセス制御
* 個々のユーザごとではなく、
 ユーザに割り当てられたロール(role:役割)ごとに
 権限を付与する方式

【2】アクセス制御を理解するための重要な概念

1)オブジェクト - object
2)権限 - grant
3)ロール - role
4)ユーザ - user

1)関連図

+-------------------+
| object <=> grant | <=> Role => User
+-------------------+      |
  ^                        | Ownership
  |                        | 
  +-----------------------+

補足

* ユーザは何も所有しない

【3】オブジェクト

* Werehouse
* Database
 + Schema
   + Table
   + View
   + etc...
* Role
* User
 => ほぼすべてが、セキュリティ保護可能なオブジェクト

1)関連図

+ 組織 -------------------------------+
| +アカウント-----------------------+ |
| | +データベース-----------------+ | |
| | | +スキーマ-----------------+ | | |
| | | | +スキーマオブジェクト--+ | | | |
| | | | |  テーブルなど        | | | | |
| | | | +---------------------+ | | | |
| | | +-------------------------+ | | |
| | +-----------------------------+ | |
| | ユーザとロール                   | |
| | 仮想ウェアハウス                 | |
| | リソースモニター                 | |
| | 統合など                         | |
| +---------------------------------+ |
+-------------------------------------+

【4】ロール - role

https://docs.snowflake.com/ja/user-guide/security-access-control-configure.html

Snowflake のロールの特徴

* ロールを別のロールに付与すると、ロール間に「親子」関係ができる
 => 「ロール階層」とも呼ばれている
 => ロールを「継承」する形になる

1) サンプル

https://docs.snowflake.com/ja/sql-reference/sql/create-role.html

-- ロール「demo_role」を作成(存在してたら作らない)
CREATE ROLE IF NOT EXISTS demo_role;

https://docs.snowflake.com/ja/sql-reference/sql/show-roles.html

-- 確認
SHOW ROLES LIKE 'demo_role';

【5】システム定義のロール

https://docs.snowflake.com/ja/user-guide/security-access-control-overview#system-defined-roles
https://docs.snowflake.com/ja/user-guide/security-access-control-considerations.html
https://docs.snowflake.com/ja/user-guide/security-access-control-configure.html
https://docs.snowflake.com/ja/user-guide/security-access-control-overview.html

1)GLOBALORGADMIN - 組織アカウントの組織管理者

* 組織レベルで複数アカウント組織の運営を管理するロール

2)ORGADMIN - 通常アカウントの組織管理者

* 組織レベルで運用を管理するロール

3)ACCOUNTADMIN - アカウント管理者

* SYSADMIN および SECURITYADMIN システム定義のロールをカプセル化した
 システムの最上位のロール
* 他の管理者ロールは、このロールの子

具体的な範囲

* アカウント内にあるすべてのオブジェクトの表示と操作
* Snowflakeの請求
* クレジットデータの表示と管理
* 実行中の SQL ステートメントの停止

4)SYSADMIN - システム管理者

* データベース、スキーマ、ウェアハウスを作成・管理。

以下を作成する権限が含まれている
* ウェアハウス
* データベース
* すべてのデータベースオブジェクト(スキーマ、テーブルなど)

5)PUBLIC

* アカウント内のすべてのユーザーおよびすべてのロールに
 自動的に付与される疑似ロール

6)SECURITYADMIN - セキュリティ管理者

* 権限付与の管理

以下の権限が付与されている
* アカウント内のオブジェクトに対する権限
* 取り消すためのグローバルMANAGE GRANTS権限 << ★超強力な権限

7)USERADMIN - ユーザー管理者

* ユーザとロールの作成・管理

SECURITYADMIN(セキュリティ管理者)との使い分け

* SECURITYADMIN(セキュリティ管理者)でも
 「ユーザとロールの作成・管理」は可能だが、USERADMINで作業する方がいい
 => 極力USERADMINで行い、できないものをSECURITYADMINで行う

【6】ユーザー - user

* snowflake を使用するユーザーを定義する

1)サンプル

https://docs.snowflake.com/ja/sql-reference/sql/create-user.html

-- システム内の指定したユーザーがいなければ、新しいユーザーを作成する
CREATE USER IF NOT EXISTS demo_user
  LOGIN_NAME = "demo_user"
  DEFAULT_ROLE = "demo_role"
  MUST_CHANGE_PASSWORD = TRUE
;

https://docs.snowflake.com/ja/sql-reference/sql/show-users.html

-- システム内のユーザーをリストを表示
SHOW USER LIKE 'demo_user';

例1:ユーザー作成の一連の流れ

-- ユーザ用のロール作成
CREATE ROLE IF NOT EXISTS "demo_role_for_user";

-- ユーザー作成
CREATE USER IF NOT EXISTS demo_user
  LOGIN_NAME = "demo_user"
  DEFAULT_ROLE = "demo_role_for_user"
  PASSWORD = "password"
  MUST_CHANGE_PASSWORD = TRUE
;

-- 作成したロールとユーザーを紐づける形でGRANTする
GRANT ROLE demo_role
  TO USER demo_user;

-- 後は、必要なものをGRANTしていく
GRANT USAGE
 ON WAREHOUSE demo_warehouse
 TO ROLE demo_role;

例2:読み取り専用ロール・ユーザ作成

* 以下の関連記事を参照のこと。

Snowflake ~ 入門編 / Hello world
https://dk521123.hatenablog.com/entry/2021/11/22/212520

【7】権限 - grant

https://docs.snowflake.com/ja/sql-reference/sql/grant-privilege.html

* ユーザーやロールへの権限を付与
* cf. GRANT = 承諾する, 授ける, 許可する
* 「GRANT <権限> ... TO ROLE」の形

1)サンプル

例1:GRANT ROLE TO USER
https://docs.snowflake.com/ja/sql-reference/sql/grant-role.html

-- ユーザーまたは別のロールにロールを割り当てます
-- ユーザーにロールを付与すると、ユーザーはロールに許可された
-- すべての操作を(ロールに付与されたアクセス権を介して)実行できます
GRANT ROLE demo_role
  TO USER demo_user;

例2:GRANT USAGE TO ROLE

-- WAREHOUSE の使用許可を付与する
-- (USE <オブジェクト> コマンドを実行する権限)
GRANT USAGE
  ON WAREHOUSE demo_warehouse
  TO ROLE demo_role
;

例3:GRANT OWNERSHIP TO ROLE

GRANT OWNERSHIP
 ON USER demo_user
 TO ROLE demo_owner_role;

GRANT OWNERSHIP
 ON ROLE demo_role
 TO ROLE demo_owner_role;

-- GRANT OWNERSHIP については、以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2022/02/25/094250

例4:GRANT MONITOR, MODIFY TO ROLE
https://docs.snowflake.com/ja/user-guide/security-access-control-privileges.html#resource-monitor-privileges

-- デモ用のリソースモニターを作成
CREATE RESOURCE MONITOR demo_resource_monitor WITH
  REDIT_QUOTA = 8
  FREQUENCY = DAILY
  START_TIMESTAMP = IMMEDIATELY
  TRIGGERS
   ON 50 percent do notify
   ON 75 percent do notify
   ON 99 percent do notify
;

-- 権限付与
-- MONITOR : リソースモニターを表示できるようにします
-- MODIFY : リソースモニターのプロパティを変更できるようにします
GRANT MONITOR, MODIFY
  ON RESOURCE MONITOR demo_resource_monitor
  TO ROLE demo_role
;

例5:GRANT ALL TO ROLE

GRANT ALL
 ON DATABASE demo_database
 TO ROLE demo_role;

例6:ON FUTURE
https://docs.snowflake.com/ja/sql-reference/sql/grant-privilege.html

GRANT ALL
  -- ON FUTUREによって将来的な許可も可能
  ON FUTURE VIEWS
  IN SCHEMA demo_detabase.demo_schema
  TO ROLE demo_role
;

-- Read Only なユーザにはSELECTしかさせないみたいな管理ができる
GRANT ALL
  ON FUTURE TABLES
  IN SCHEMA demo_detabase.demo_schema
  TO ROLE demo_readonly_role
;

参考文献

https://dev.classmethod.jp/articles/create-snowflake-objects-by-snowsql-matome/
https://dev.classmethod.jp/articles/how-to-check-the-pliviledges-granted-to-a-role/
https://datumstudio.jp/blog/1029_snowflake3/

関連記事

Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
Snowflake ~ 入門編 / Hello world
https://dk521123.hatenablog.com/entry/2021/11/22/212520
Snowflake ~ 基本編 / データロード ~
https://dk521123.hatenablog.com/entry/2021/11/15/221245
Snowflake ~ 基本編 / ゼロコピークローン ~
https://dk521123.hatenablog.com/entry/2021/11/27/134934
Snowflake 〜 アクセス制御種類 〜
https://dk521123.hatenablog.com/entry/2025/05/13/162636
Snowflake ~ ユーザ/ロールあれこれ ~
https://dk521123.hatenablog.com/entry/2022/11/02/144541
Snowflake ~ GRANT OWNERSHIP ~
https://dk521123.hatenablog.com/entry/2022/02/25/094250
Snowflake ~ Data Sharing ~
https://dk521123.hatenablog.com/entry/2024/02/19/152927
Snowflake ~ IDENTIFIER ~
https://dk521123.hatenablog.com/entry/2024/02/20/095207
Snowflake 〜 SET / 変数定義 〜
https://dk521123.hatenablog.com/entry/2025/06/05/183947
権限トラブル時のTips
https://dk521123.hatenablog.com/entry/2022/08/19/131922
エラー「Insufficient privileges to operate」時の対応
https://dk521123.hatenablog.com/entry/2022/08/02/090439
エラー「Table does not exist or not authorized」時の対応
https://dk521123.hatenablog.com/entry/2022/08/18/120935
SELinux
https://dk521123.hatenablog.com/entry/2017/12/10/222000