Snowflakeの新しいロールの機能「セカンダリロール」を試してみた

2021.10.12

こんにちは!DA(データアナリティクス)事業本部 サービスソリューション部の大高です。

Snowflakeの2021年9月のリリース(5.35)で、新しいロールの機能「セカンダリロール」が追加されました。

今回はこの「セカンダリロール」を実際に試していきたいと思います。

「セカンダリロール」とは?

セカンダリロールについては、リリースノートに以下のように記載されています。

ユーザーは、プライマリロールとセカンダリロールに付与された集約権限を使用して、セッション内のオブジェクトに対して SQL アクションを実行できます。以前、ユーザーが、異なるロール階層の一部である権限を使用して SQL アクションを実行するには、現在のロールを変更する必要がありました。セッションには1度に1つのアクティブなプライマリロールが必要ですが、セカンダリロールを使用すると、ユーザーに付与された他のすべてのロールがアクティブになることに注意してください。セキュリティモデルに多数のロールが含まれ、それぞれが認証を介して細かく許可されている組織の場合は、この機能によりロール管理が簡素化されます。

これまでSQLを実行する際にはロールの権限を考慮して利用するロールを選択してSQLを実行していましたが、セカンダリロールを利用した場合には、自分に付与されたすべてのロールの権限でSQLを実行することができます。

  • 通常
    • 選択したロールの権限でSQLを実行
  • セカンダリロール有効化
    • 自身に付与されているすべてのロールの集約された権限でSQLを実行

例えばですが、私のSnowflakeユーザーは一般ユーザ向けのロール「OOTAKA_SANDBOX_ROLE」を付与されており、このロールがデフォルトロールです。一方で「ACCOUNTADMIN」ロールも付与されているので、実質的にはアカウント内のすべてのロールが付与されている状態となります。

つまり、私のケースにおいてはセカンダリロールを利用すれば、すべての権限を持った状態でSQLを実行できるということになります。

なお、注意点としてセカンダリロールが適用されるクエリは以下になります。

  • CREATE <オブジェクト> 以外のDDL操作
  • DML操作
  • クエリ

CREATE <オブジェクト>のDDL操作はプライマリロールの権限に従うので、この点だけ注意が必要です。

試してみた

では、実際に試してみましょう。

セカンダリロールを有効化するには、3つの方法があります。

セッション内で有効化する場合

私のユーザーはACCOUNTADMINロールも付与されているので、まずは私のデフォルトロールOOTAKA_SANDBOX_ROLEを利用している状態でACCOUNTADMINロールが必要な下記クエリを実行します。

>SHOW LOCKS IN ACCOUNT;
003001 (42501): SQL access control error:                                       
Insufficient privileges to operate on account 'XXXXXXXXXX'

権限不足でエラーになっていますね。では、セカンダリロールを有効化してみます。

>USE SECONDARY ROLES ALL;
+----------------------------------+                                            
| status                           |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
1 Row(s) produced. Time Elapsed: 0.246s

これで、このセッション内ではセカンダリロールが有効化されました。再度、最初に実行したクエリを実行してみます。

>SHOW LOCKS IN ACCOUNT;
+---------+----------+------+-------------+------------------------+--------+-------------+----------+
| session | resource | type | transaction | transaction_started_on | status | acquired_on | query_id |
|---------+----------+------+-------------+------------------------+--------+-------------+----------|
+---------+----------+------+-------------+------------------------+--------+-------------+----------+
0 Row(s) produced. Time Elapsed: 0.129s

今度は、権限エラーにならずにクエリが実行できました!セカンダリロールが効いているのが分かりますね。

再度、無効化して試してみましょう。

>USE SECONDARY ROLES NONE;
+----------------------------------+                                            
| status                           |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
1 Row(s) produced. Time Elapsed: 0.261s

>SHOW LOCKS IN ACCOUNT;
003001 (42501): SQL access control error:                                       
Insufficient privileges to operate on account 'XXXXXXXXXX'

セカンダリロールが無効化されて、また権限不足のエラーになりました!

デフォルトで有効化する場合

デフォルトで有効化するには、ユーザー作成時かユーザー作成後にDEFAULT_SECONDARY_ROLESプロパティを設定します。

なお、ALTER USER文でセカンダリロールを設定する場合には、少し記述に癖があり以下のようになります。設定値が文字列であることと、括弧付きになることに注意が必要です。

-- セカンダリロールの有効化
ALTER USER FOO_BAR SET DEFAULT_SECONDARY_ROLES = ('ALL');

-- セカンダリロールの無効化
ALTER USER FOO_BAR UNSET DEFAULT_SECONDARY_ROLES;

デフォルトで有効化した場合には、該当ユーザのすべてのセッションで、セカンダリロールが有効化された状態でセッションが開始されるようになります。

まとめ

以上、Snowflakeの新しいロールの機能「セカンダリロール」を試してみました。

これまでは、必要に応じてロールを切り替えてクエリを発行していましたが、セカンダリロールのおかげでかなり利用が楽になりそうです。特に、リリースノートにも記載されていますが、BIツールなど参照系のシステムから利用する場合にも利用できるので便利そうな機能だと感じました。

どなたかのお役に立てば幸いです。それでは!