【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
 デフォルトロール
  a)AccountAdmin - アカウント管理者
  b)SysAdmin - システム管理者
  c)Public
  d)SecurityAdmin - セキュリティ管理者
  e)UserAdmin - ユーザー管理者
【5】ユーザー - user
【6】権限 - grant

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

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

アクセス制御に対するSnowflakeのアプローチは、
次の両方のモデルの側面を組み合わせたものです。

1)DAC(Discretionary Access Control)

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

2)RBAC(Role-Based Access Control)

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

補足:強制アクセス制御(MAC: Mandatory Access Control)

* Snowflakeとは関係ないが、上記以外のアクセス制御としては、
 強制アクセス制御(MAC: Mandatory Access Control)ってのがある。
 => リソース所有者の意図に関らず、
 システムの管理者により一定のアクセス制御を強制する方式
 => 例として、SELinux (以下の関連記事を参照のこと)

https://dk521123.hatenablog.com/entry/2017/12/10/222000

【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';

2)デフォルトロール

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

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

【5】ユーザー - 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

【5】権限 - 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 ~ ユーザ/ロールあれこれ ~
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 / SET ~
https://dk521123.hatenablog.com/entry/2024/02/20/095207
権限トラブル時の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