【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 の ロールや権限などのアクセス制御 について
メモっておく。

目次

【0】アクセス制御
【1】セキュリティ保護可能なオブジェクト
【2】ロール - role
 デフォルトロール
  a)AccountAdmin - アカウント管理者
  b)SysAdmin - システム管理者
  c)Public
  d)SecurityAdmin - セキュリティ管理者
  e)UserAdmin - ユーザー管理者
【3】ユーザー - user
【4】権限 - grant

【0】アクセス制御

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

より抜粋

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

【1】セキュリティ保護可能なオブジェクト
【2】ロール - role
【3】ユーザー - user
【4】権限 - grant

【1】セキュリティ保護可能なオブジェクト

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

【2】ロール - role

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

Snowflake のロールの特徴

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

サンプル

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

CREATE ROLE IF NOT EXISTS demo_role;

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

SHOW ROLES LIKE 'demo_role';

デフォルトロール

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

a)アカウント管理者 - AccountAdmin

* システムで最も強力なロール
* 他の管理者ロールは、このロールの子

具体的な範囲

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

b)SysAdmin

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

c)Public

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

d)SecurityAdmin

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

e)UserAdmin

* ユーザーとロールを作成および管理するための権限が含まれている

【3】ユーザー - user

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

サンプル

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;

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

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

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

【4】権限 - grant

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

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

サンプル

例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 ~ GRANT OWNERSHIP ~
https://dk521123.hatenablog.com/entry/2022/02/25/094250