Snowflakeで付与されている権限を知りたいときに使うSHOW GRANTSコマンドを一通り試してみた #SnowflakeDB

2022.12.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

※本エントリは、Snowflakeをもっと使いこなそう! Advent Calendar 2022の8日目の記事となります。

さがらです。

Snowflakeを使う上で、「このロールにどんな権限を付与しているっけ?」「このオブジェクトを使えるのはどのロールだ?」のように、権限周りのことを知りたいことは非常に多いです。

そんな時は基本的にSHOW GRANTSコマンドを使うのですが、下記の公式Docを見ただけでもたくさんの構文があります。正直、私もどの構文を使うべきかわからなくなることが多いですw

そこで本記事では、この公式Doc上の構文を一通り試してみたので、その内容をまとめてみます。

注意点

SHOW GRANTSコマンドですが、実行時のロールによって表示される結果が変わります

明確な範囲は確認できていないのですが、SHOW GRANTSコマンド実行時のロールがUSAGE権限を持つオブジェクトに関しては、結果が返ってくることを確認しています。

そのため、SHOW GRANTSコマンドを実行してアカウント上で該当するすべての結果を確認したい場合には、以下の2点に注意したほうが良いと感じました。

  • なるべく上位のロールを使用する(ACCOUNTADMINが望ましい)
  • ユーザーが個別に作成したカスタムロールはSYSADMINの子に連なるようにする
    • 親子関係に含まれていないと、ACCOUNTADMINSHOW GRANTSコマンドを実行したときに漏れるリスクがあるため

SHOW GRANTS

現在ログインしているユーザーに付与されているロールの一覧を返します。

構文的には、SHOW GRANTS TO USER current_userと同じ結果を返します。

SHOW GRANTS ON ACCOUNT

このアカウント上で何かのロールに付与されているAccount-level(Global) Privilegeの一覧を返します。

例えば、デフォルトのロールであるSYSADMINには最初からCREATE DATABASECREATE WAREHOUSEというAccount-level Privilegeが付与されています。

また、ユーザーが意図的に付与したAccount-level Privilegeは、granted_by列に、付与を行ったロール名が記載されています。Account-level Privilegeは強めの権限であることが多いので、定期的にgranted_by列がNULLでないカラムをチェックすることで、過剰なAccount-level Privilegeが付与されていないか監視することもできます。

※上の図を見て「APPADMINってなんだ?」と私はなったのですが、どうやらウェブインターフェースで操作する際に使われる内部用のロールのようです。

SHOW GRANTS ON [object_type] [object_name]

指定した[object_type] [object_name]に対する各権限が付与されているロールの一覧を返します。

例えば、[object_type]に「DATABASE」、[object_name]に「任意のデータベース名」を入れて実行すると、OWNERSHIPCREATE SCHEMAなどデータベースに関わる各権限がどのロールに付与されているかわかります。

SHOW GRANTS TO { ROLE [role_name] | USER [user_name] | SHARE [share_name] }

指定したROLE・USER・SHAREに付与されている権限、あるいはロールの一覧を返します。

例えばROLEの場合、指定したロールに付与されている権限とロールの一覧がわかります。

またUSERの場合、指定したユーザーに付与されているロールの一覧を返します。

SHOW GRANTS OF ROLE [role_name]

指定したロールを付与している、ロールの一覧を返します。

下図のようにrole列に指定したロール名が入り、grantee_nameに指定したロールが付与されているロール名が入って、結果が返ってきます。

SHOW FUTURE GRANTS IN SCHEMA [schema_name]

指定したスキーマに対するFUTURE GRANTが付与されている、ロールの一覧を返します。

下図のようにgrant_on列に付与されているFUTURE GRANTの名前が出てきて、対応するgrantee_nameにそのFUTURE GRANTが付与されているロール名が出てきます。

SHOW FUTURE GRANTS IN DATABASE [database_name]

指定したデータベースに対するFUTURE GRANTが付与されている、ロールの一覧を返します。

下図のようにgrant_on列に付与されているFUTURE GRANTの名前が出てきて、対応するgrantee_nameにそのFUTURE GRANTが付与されているロール名が出てきます。

SHOW FUTURE GRANTS TO ROLE [role_name]

指定したロールに付与されている、各FUTURE GRANTの一覧を返します。

下図のように、grant_on列に付与されているFUTURE GRANTの名前が出てきて、対応するgrantee_nameにそのFUTURE GRANTが付与されているロール名が出てきます。

最後に

Snowflakeで付与されている権限を知りたいときに使うSHOW GRANTSコマンドを一通り試してみました。

自分でまとめてみて、今後このブログは自分が一番見ることになるかもしれないなと感じていますw

皆さんの参考にもなると嬉しいです!