![[新機能]SnowflakeのWITH GRANT OPTIONでロールの付与が可能に!部門ごとの管理者ロールにロール付与を委任するシナリオを試してみた](https://devio2024-media.developers.io/image/upload/f_auto,q_auto,w_3840/f_auto,q_auto/v1790872527/eyecatch/cxntufvdsz1bwbpuiokz.png)
[新機能]SnowflakeのWITH GRANT OPTIONでロールの付与が可能に!部門ごとの管理者ロールにロール付与を委任するシナリオを試してみた
さがらです。
Snowflakeの新機能として、ロールを別のロールに付与する際にWITH GRANT OPTIONを指定できるようになりました。WITH GRANT OPTION付きでロールを受け取ったロールは、そのロールを他のロールへ付与できます。
これまでロールを付与するには、付与するロールのOWNERSHIP権限か、グローバル権限のMANAGE GRANTSが必要でした。今回のアップデートで、OWNERSHIPやMANAGE GRANTSがなくても、WITH GRANT OPTION付きで受け取ったロールであれば付与が可能になり、「特定のロールだけ、付与する権限を別のロールに委任する」ことができるようになります。
そこで本記事では、以下のシナリオで試してみました。
- 部門用のデータベースと、部門管理者・データエンジニア向け・BIユーザー向けの3つのロールを用意する
- 中央の管理者(SECURITYADMIN)が、データエンジニア向けロール・BIユーザー向けロールを、部門管理者ロールに
WITH GRANT OPTION付きで付与する - 部門管理者ロールから、委任されたロールを他のロールへ付与できるかを確認する
機能概要
今回のアップデートにより、以下の3種類のロールでWITH GRANT OPTIONを指定した付与ができるようになりました。
- アカウントロール(
GRANT ROLE) - データベースロール(
GRANT DATABASE ROLE) - アプリケーションロール(
GRANT APPLICATION ROLE)
構文は以下のとおりです。
GRANT ROLE <name> TO ROLE <parent_role_name> [ WITH GRANT OPTION ]
WITH GRANT OPTION付きでロールを受け取ったロールは、そのロールを他のロールへ付与できます。その際にもWITH GRANT OPTIONを指定できるため、付与の権限をさらに下位のロールへ委任することも可能です。
付与したロールの権限取り消しにはREVOKE ROLEを使います。REVOKE GRANT OPTION FORを指定すると付与オプションのみを取り消し、ロールの付与自体は残ります(受け取ったロールの権限は引き続き継承されます)。
REVOKE [ GRANT OPTION FOR ] ROLE <name> FROM ROLE <parent_role_name> [ RESTRICT | CASCADE ]
RESTRICTとCASCADEは、そのロール付与から派生した付与(再付与)の扱いを指定するオプションです。
RESTRICT(デフォルト):派生した付与が存在する場合、取り消しは失敗するCASCADE:派生した付与もあわせて取り消す
なお、SHOW GRANTS TO ROLEでは、ロールの付与は付与されたロールに対するUSAGE権限として表示されます。WITH GRANT OPTION付きで付与した場合は、grant_option列がTRUEになります。
これまでとの違い
公式DocのGRANT ROLEのAccess control requirementsでは、ロールを付与するのに必要な権限が以下のように記載されています。
- 付与するロールに対する
OWNERSHIP権限 - または、グローバル権限の
MANAGE GRANTS(デフォルトではSECURITYADMIN以上のロールのみが保持) - (今回追加)
WITH GRANT OPTION付きでそのロールを受け取ったロール
MANAGE GRANTSはアカウント内のあらゆるオブジェクトの権限を付与・取り消しできる強力な権限のため、部門の管理者に渡すには強すぎます。また、OWNERSHIPを部門管理者ロールに移譲する方法もありますが、ロールの所有権ごと渡すことになります。
WITH GRANT OPTIONを使うと、ロールの所有権はSECURITYADMINなどの中央管理者に残したまま、「このロールを付与する」ことだけを部門管理者に委任できるようになります。
事前準備
今回は、営業部門での権限管理を想定して検証します。用意するオブジェクトは以下のとおりです。
| 種類 | 名前 | 用途 |
|---|---|---|
| データベース | SALES_DB |
営業部門用のデータベース |
| ロール | SALES_ADMIN |
部門管理者ロール |
| ロール | SALES_ENGINEER |
データエンジニア向けロール |
| ロール | SALES_BI_USER |
BIユーザー向けロール |
1. ロールの作成
USERADMINロールで、3つのロールを作成します。
USE ROLE USERADMIN;
CREATE ROLE SALES_ADMIN;
CREATE ROLE SALES_ENGINEER;
CREATE ROLE SALES_BI_USER;
部門管理者ロールをSYSADMINの配下に入れ、検証作業を行う自分のユーザーにも付与しておきます。
USE ROLE SECURITYADMIN;
GRANT ROLE SALES_ADMIN TO ROLE SYSADMIN;
-- <your_user_name>は自分のユーザー名に置き換えてください
GRANT ROLE SALES_ADMIN TO USER <your_user_name>;
2. データベースの作成と権限付与
SYSADMINロールで部門用のデータベースを作成し、データエンジニア向けロールとBIユーザー向けロールにUSAGE権限を付与します。
USE ROLE SYSADMIN;
CREATE DATABASE SALES_DB;
GRANT USAGE ON DATABASE SALES_DB TO ROLE SALES_ENGINEER;
GRANT USAGE ON DATABASE SALES_DB TO ROLE SALES_BI_USER;
試してみた
1. 部門管理者ロールにWITH GRANT OPTION付きでロールを付与
SECURITYADMINロールで、データエンジニア向けロール・BIユーザー向けロールを、部門管理者ロールにWITH GRANT OPTION付きで付与します。
USE ROLE SECURITYADMIN;
GRANT ROLE SALES_ENGINEER TO ROLE SALES_ADMIN WITH GRANT OPTION;
GRANT ROLE SALES_BI_USER TO ROLE SALES_ADMIN WITH GRANT OPTION;
付与できたら、SHOW GRANTS TO ROLEで確認します。
SHOW GRANTS TO ROLE SALES_ADMIN;
SALES_ENGINEERとSALES_BI_USERに対するUSAGE権限が表示され、grant_option列がtrueになっていればOKです。

2. 部門管理者ロールからロールを付与
SALES_ADMINロールに切り替えて、SALES_BI_USERロールをSALES_ENGINEERロールへ付与します。データエンジニアにもBIユーザーと同じ権限を持たせる、というイメージです。
USE SECONDARY ROLES NONE;
USE ROLE SALES_ADMIN;
GRANT ROLE SALES_BI_USER TO ROLE SALES_ENGINEER;
エラーにならずStatement executed successfully.と表示されればOKです。SALES_ADMINはSALES_BI_USERのOWNERSHIPもMANAGE GRANTSも持っていませんが、ロールを付与できました。

SHOW GRANTS OF ROLEで、SALES_BI_USERがどのロールに付与されているかを確認します。
SHOW GRANTS OF ROLE SALES_BI_USER;
SALES_ENGINEERへの付与が表示され、granted_by列がSALES_ADMINになっていればOKです。

3. 付与オプションの取り消し
最後に、REVOKE GRANT OPTION FORでSALES_ADMINからSALES_BI_USERの付与オプションのみを取り消します。
SALES_ADMINは手順2でSALES_ENGINEERへ付与しているため、デフォルトのRESTRICTでは取り消しが失敗するはずです。
USE ROLE SECURITYADMIN;
REVOKE GRANT OPTION FOR ROLE SALES_BI_USER FROM ROLE SALES_ADMIN;
依存する付与が存在する旨のエラーになればOKです。

続いて、CASCADEを指定して取り消します。こちらはエラーなく成功します。
REVOKE GRANT OPTION FOR ROLE SALES_BI_USER FROM ROLE SALES_ADMIN CASCADE;

SHOW GRANTS OF ROLE SALES_BI_USER;
以下の状態になっていればOKです。
SALES_ADMINへの付与は残っている(SHOW GRANTS TO ROLE SALES_ADMINで、SALES_BI_USERのgrant_option列がfalseになっている)SALES_ADMINが行ったSALES_ENGINEERへの付与が取り消されている

最後に
SnowflakeのWITH GRANT OPTIONでロールの付与が可能になったので、部門ごとの管理者ロールにロール付与を委任するシナリオを試してみました。
これまでは、部門の管理者にロールの付与を任せたい場合でも、ロールのOWNERSHIPを渡すか、アカウント全体に効くMANAGE GRANTSを渡すしかありませんでした。今回のアップデートにより、ロールの所有権は中央の管理者に残したまま、「自部門のロールを付与すること」だけを部門管理者に委任できるようになったのは、1つのアカウントを複数部門で共有している環境ではかなり嬉しいアップデートだと感じました!
部門ごとにデータ基盤の運用を分けたいけれど、アカウントは1つにまとめたい、という方はぜひ試してみてください。









