snowflakeロール解説:ロールによるアクセス制御
アクセス制御とは以下の内容のこと - 誰がどのロールを使用できるか - どのロールがオブジェクトにアクセスできるか - どのような操作をオブジェクトに対し実行できるか - 誰がアクセス制御ポリシーを変更できるか
ユーザーおよびロール
アカウントアイコンから「ロールを切り替え」ボタンで切り替えることができる。 このロールを変更することで、確認できるデータベースが変更したり、実行できるプロシージャが変わる。
- 例.オブジェクトに対して実行するのは、USAGE権限を持っていなければ、実行できない。
- SELECT文を実行したい場合、selectの権限だけを持つのではんく、USAGE権限も持つことが必須。
デフォルトのロール
snowflakeのデフォルトのロールは以下の通り(上位にいるロールほど、役割を与えられている。)
ACOUNTADMIN : これはシステムの最上位のロールであり、アカウント内の限られた/制御された数のユーザーにのみ付与する必要があります。
SECURITYADMIN : MANAGE GRANTS セキュリティ権限が付与されており、付与の取り消しを含め、あらゆる付与を変更できます。
USERADMIN : ユーザーとロールの管理のみに専用のロール。
SYSADMIN : アカウントでウェアハウスとデータベース(およびその他のオブジェクト)を作成する権限を持つロール。(データベース管理者)
PUBLIC : 基本は何もできない、ログインだけ
snowflakeでロールを作る
ロールを作るためには、まずロールを作れる権限を持つロールに自分自身がならなければならない。
サンプルコードは以下の通り
USE ROLE useradmin;
CREATE ROLE PROD;
snowflakeでロールに権限を与える
ロールは、以下のSQLの通り
GRANT CREATE SCHEMA ON DATABASE prod_db TO ROLE PROD
この場合は、データベースにスキーマを与える権利を、PRODロールに与えている。
GRANT SELECT, INSERT, DELETE ON ALL TABLES IN SCHEMA my_schema TO ROLE analyst dba;
この場合は、select insert deleteのmy_schemaの中にある全てのテーブルに対し実行できる権限を、analyst dbaのロールに与えている。
snowflakeでロールをユーザーに付与
このロールは、ユーザーに与えることで使用可能となる。 一ユーザーは複数のロールをもらうことができるし、その場合はwebuiの操作で変更が可能。
GRANT ROLE PROD TO USER JENN; GRANT ROLE PROD TO USER ANN;
ロール関連の裏話
snowflakeのオブジェクトツリーは以下の通り
この権限ツリーを見ると、Schemaの中にRoleとUesrは独立している。 これらが独立していることで、権限のGTANTとREVOKEが可能になっている。
ウェアハウスの権限は二種類ある
各ユーザーに対して、次のウェアハウスに対する権限を次の2通りでコントロールできる。
- USAGE : ウェアハウスを使用してクエリを実行する
- OPETATE : 仮想ウェアハウスを開始、停止、設定を変更
snowflakeの所有権
所有権についての解説。
各オブジェクトは、ロールに紐づいている。 あるロールを使用したユーザーがオブジェクトを作ると、そのオブジェクトの所有者はそのユーザーではなく、ロールになる
オブジェクトの所有権はロールに宿る。
- 所有者は、オブジェクトに対して任意の操作を実行できる
- 所有者は、自身またはその他のロールに対して権限を付与できる
- 所有権は、所有者によって移譲できる。
GRANT OWUNERSHIP ON WAREHOUSE dev_ws TO ROLE dba
- ただし、オブジェクトを共同で所有することはできないので、移譲した人はそのオブジェクトの閲覧などができなくなる
SQL、テーブルレベルのセキュリティ
セキュアビュー、およびユーザー定義関数について
プログラム手法を介してデータが間接的に開示されることを防止できる。
権限のあるユーザーのみにビューまたはUDF定義を表示させる機能が、セキュアビュー
セキュアビュー帯びセキュアUDFは、セキュリティ向上のために、クエリ最適化の一部をバイパスしている
行レベルのアクセスの認可
行レベルのセキュリティも提供している。
これを実装するには、CURRENT_ROLE
またはCURRENT_USER
関数を使用する
SELECT * FROM table_a JOIN table_b ON table_a.role=table_b.auth AND table_b.auth=CURRENT_ROLE()
CURRENT_ROLE関数は、現在のセッションのロールによって帰る値が異なる。
アカウントロールである場合は、現在のセッションで利用しているプライマリロール名を返す
データベースロールである場合は、NULLを返す
ユーザー管理
ユーザー管理をクエリで行う
snowflakeでもユーザー管理はクエリで可能である。
例えば、別のユーザーのためにパスワードを変更する場合、次のようなSQLになる。
USE ROLE useradmin; ALTER USER johnsmith SET PASSEORD='rosebud2' must_change_password = true
または、
ALTER USER johnsmith RESET PASSWORD
を実行することで、ユーザーのパスワードを変更するためのURLを発行してくれる。
snowflake ユーザー ロック 何分
ログインに5回失敗すると、ユーザーは15分間ロックアウトされます。
別のアカウントからアンロックしてもらう場合、
ALTER USER joohsmith SET minutes_to_unlock = 0
をUSERADMINロールを持ったユーザーから実行する。
備考
title:snowflakeロール完全解説
category_script:page_name.startswith("7")