はじめに
権限について何も考えずにオブジェクトを作成してしまい、何をするにも、とりあえずaccountadminでやればできるから、いいっか・・・状態になったことはありませんか?心の中では「それではいけない」と呟きながら・・・。(そんなのは私だけか)
Snowflakeのシステム定義のロールを勉強し、こんな風な設定はいかがでしょう、というものをご紹介いたします。
これがベストとは言いません(言えません)
参考URL:https://docs.snowflake.com/ja/user-guide/security-access-control-overview
初期構築
--リソースモニターの設定がある場合はここで設定。今回は割愛
--=====================================
--useradmin業務
--=====================================
--ロール作成
use role useradmin;
CREATE OR REPLACE ROLE my_role
COMMENT = '権限勉強用ロール';
--ユーザー作成
use role useradmin;
CREATE OR REPLACE USER user1
PASSWORD = 'truestar1234'
LOGIN_NAME = user1
DEFAULT_ROLE = my_role;
--ユーザーにロールを付与
use role useradmin;
GRANT ROLE my_role TO USER user1;
---------------------------------------
--=====================================
--sysadmin業務
--=====================================
--ウェアハウス作成
use role sysadmin;
CREATE OR REPLACE WAREHOUSE my_wh
WITH
WAREHOUSE_SIZE = 'XSMALL'
AUTO_SUSPEND = 60
AUTO_RESUME = TRUE
INITIALLY_SUSPENDED = TRUE
--RESOURCE_MONITOR = <monitor_name>
COMMENT = '権限勉強用ウェアハウス';
--DB作成
use role sysadmin;
CREATE OR REPLACE DATABASE my_db
COMMENT = '権限勉強用DB';
--スキーマ作成
CREATE OR REPLACE SCHEMA my_sc;
---------------------------------------
--=====================================
--WH・DBの所有者業務(今回はsysadminで作成したからsysadmin業務)
--=====================================
--ロールにウェアハウスの使用権限を付与
use role sysadmin;
GRANT USAGE ON WAREHOUSE my_wh TO ROLE my_role;
use role sysadmin;
--ロールにDBの所有権を移譲→しない accountadmin操作ができなくなるから
--GRANT OWNERSHIP ON DATABASE my_db TO ROLE my_role;
--ロールにDBとスキーマの全権限を付与
GRANT ALL ON DATABASE my_db TO ROLE my_role;
GRANT ALL ON SCHEMA my_sc TO ROLE my_role;
---------------------------------------
--所有者権限があるオブジェクト表示
show grants to role my_role;
SELECT * FROM table(RESULT_SCAN(LAST_QUERY_ID()))
WHERE "privilege" = 'OWNERSHIP'
and "granted_on" in ('DATABASE');
--以降、my_roleに必要権限をつけていく
ここでのポイントはロールにDBの「所有権」とを譲渡しないことです。
このロールがDBのオーナーになってしまうと、DBに対してaccountadmin権限でなければできないことが、まるっとできなくなってしまうからです。(結局ロールにaccountadminを付けるはめになり、意味ない感じになってしまいます。)