システム定義のロールPUBLICには何もGRANTしちゃだめだよ #SnowflakeDB

Snowflake安全予報
2023.02.08

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

Snowflakeを実運用する際には、ロールに応じてどのデータにアクセス可能かを管理すると思います。SnowflakeではRoleベースでデータベースへのアクセスやSnowflake内の権限の管理を行います。

Snowflakeにはシステム定義のロールが用意されています。今回はシステム定義のロールの一つで全ユーザーに自動的に付与されるPUBLICロールの取り扱い方に関する話をします。

きっかけは、会社のSnowflake検証環境を使用しているときのことでした。

対象のDBだけにusage権限を付与したロールのはずが...

会社のSnowflake検証環境を利用して登壇準備をしていた時のことです。Snowflake画面を共有したデモを行うのでなるべく関係のないDBなんかは画面に映らない方がいいと思い、デモをするDBだけにusage権限を付与したロールを作成しました。

このように権限の付与をすれば、セッションロールでそのロールを選択したらそのロールにusage権限が付与されているDBしかインターフェイスに表示されない・・・と思っていました。

わたしが想定していた画面

ワークシートのロールがSYSADMINの状態

たくさんのデータベースが表示されています。

ワークシートのロールがHORI_ROLEの状態

カスタムロールのHORI_ROLEにusage権限を付与したデータベースのみが表示されています。

現実

ワークシートのロールがHORI_ROLEの状態

ABARERO??なんだテメェコノヤロー

間違いなくhori_roleロールにはhoriデータベースとcompute_whウェアハウスへのusage権限しか付与されていません。

show grants to role HORI_ROLE;
+-------------------------------+-----------+------------+------------+------------+--------------+--------------+--------------+
| created_on                    | privilege | granted_on | name       | granted_to | grantee_name | grant_option | granted_by   |
|-------------------------------+-----------+------------+------------+------------+--------------+--------------+--------------|
| 2023-02-07 21:18:23.406 -0800 | USAGE     | DATABASE   | HORI       | ROLE       | HORI_ROLE    | false        | SYSADMIN     |
| 2023-02-07 21:28:01.361 -0800 | USAGE     | WAREHOUSE  | COMPUTE_WH | ROLE       | HORI_ROLE    | false        | SYSADMIN |
+-------------------------------+-----------+------------+------------+------------+--------------+--------------+--------------+

だがしかし、SnowsightのGUIではABAREROが幅を利かせています。

PUBLICに雑にいろいろ付与するものではないという教訓

では、いったいABAREROデータベースには何が起きていたのでしょうか?SHOW SCHEMASコマンドでABAREROデータベースを確認してみましょう。

SHOW SCHEMAS;
+-------------------------------+--------------------+------------+------------+---------------+----------+-----------------------------------------------------------+---------+----------------+
| created_on                    | name               | is_default | is_current | database_name | owner    | comment                                                   | options | retention_time |
|-------------------------------+--------------------+------------+------------+---------------+----------+-----------------------------------------------------------+---------+----------------|
| 2023-02-08 00:32:10.873 -0800 | INFORMATION_SCHEMA | N          | N          | ABARERO       |          | Views describing the contents of schemas in this database |         | 1              |
| 2023-02-07 22:09:18.640 -0800 | PUBLIC             | N          | Y          | ABARERO       | SYSADMIN |                                                           |         | 1              |
| 2023-02-07 23:54:03.015 -0800 | PUCLIC_SCHEMA      | N          | N          | ABARERO       | PUBLIC   |                                                           |         | 1              |
+-------------------------------+--------------------+------------+------------+---------------+----------+-----------------------------------------------------------+---------+----------------+
3 Row(s) produced. Time Elapsed: 0.220s

なんとまぁ、PUCLIC_SCHEMAのownerがPUBLICではありませんが!

システム定義のPUBLICロール

それではここでシステム定義のPUBLICロールについておさらいしましょう。

アカウント内のすべてのユーザーおよびすべてのロールに自動的に付与される疑似ロール。PUBLIC ロールは、他のロールと同様にセキュリティ保護可能なオブジェクトを所有できます。ただし、ロールが所有するオブジェクトは、定義上、アカウント内の他のすべてのユーザーとロールが使用できます。通常、このロールは、明示的なアクセス制御が不要で、すべてのユーザーがアクセスに関して平等であると見なされる場合に使用されます。

Snowflake公式ドキュメント - システム定義のロール

ドキュメントにもしっかりと記載されていますが、PUBLICロールが所有するオブジェクトはすべてのユーザーおよびロールが使用できてしまいます。

デフォルトの設定では、PUBLICはSNOWFLAKE_SAMPLE_DATAという、アカウントを作成したときにSnowflakeから共有されているサンプルデータベースの各スキーマへのusage権限と各テーブルへのselect権限しか付与されていません。

PUBLICにデフォルトで付与されている以外の権限が付与されていることが周知されていないと、事情を知らない他の開発者やアナリストの意図しない挙動をしてしまう可能性があるため、PUBLICへの権限の付与には注意が必要です。

まとめ

トライアルの際に雑にPUBLICにusage権限を渡してしまっていたり、現在Snowflakeにログインできる全ユーザーに見てほしいデータがあったりするかもしれません。

ただ、現在は良くても利用が拡大するにつれユーザーも増えたり社外の人に作業を委託することもあると思います。そのような場合に本当にそのDBはPUBLICに権限がついていていいのかというのは考えておく必要があると思います。

意図しない共有をしてしまうのを避けるために、システム定義のロールのPUBLICには何の権限も与えておかないというのが安全でしょう。