■ はじめに
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