❄️

SnowflakeのReadOnly, ReadWriteをどう作るのか

2022/10/16に公開

タイトルの通り、Snowflakeのデータベースのテーブルに対する 「ReadOnly」 と 「ReadWrite」を如何にして作成するのか、ということを書いていこうと思います。

公式ドキュメントでのReadOnlyとReadWrite

公式ドキュメントには、ReadOnly についての記述は以下の箇所にあります。
https://docs.snowflake.com/ja/user-guide/security-access-control-considerations.html#accessing-database-objects

公式ではロール設計に関する具体例を示していて、これも1つの参考になると思います。組織内の会計士とアナリストの例で説明しています。
データベースオブジェクトへのアクセス権限を機能ロール「accountant」、「analyst」に付与し、その機能ロールをユーザに対して付与することで利用します。

また、ロール設計全体の概要については、自分が以前書いた以下の記事も参考になると思います。
https://zenn.dev/mnagaa/articles/bfd40e819cbed3

以下のロール設計の記事もご紹介いただいたので、リンクを載せておきます。
https://www.analytics.today/blog/designing-snowflake-role-based-access-solutions

上記のようなロール設計でも、特に問題とはなりませんし、正しい解答ではありますが、Snowflakeの特徴を活かしたロール設計であるとは思えないため、1つの例を提示しようと思います。

階層を活かしたシンプルなロール設計

Snowflakeのロールは階層的な権限を引き継ぐことができるので、「ReadOnly」と「ReadWrite」を作成する際に活かすことができます。

具体例

「ReadOnly」と「ReadWrite」について、以下のような階層を作ります。

-- とりあえずデータベースを作る
create database test_database;

-- readonly, readwrite 用のロールを作成する
create role database_readonly_role;
create role database_readwrite_role;

-- readonlyとreadwrite に親子関係を作る
grant role database_readonly_role to role database_readwrite_role;

-- database_readonly_role に付与する権限は以下
grant usage on database test_database to role database_readonly_role;
grant usage on all schemas in database test_database to role database_readonly_role;
grant select on all tables in database test_database to role database_readonly_role;

-- database_readonly_role に付与する権限は以下
grant insert,update,delete on all tables in database test_database to role database_readwrite_role;

「developer_role」をエンジニア用、「analyst_role」をアナリスト用のユーザグループ的に使用しています。何十人もいるエンジニアやアナリストに一括で権限付与を変更したい場合に、ユーザグループロールの権限を変更するだけで良いため、シンプルになります。

-- developer_role には readwrite 権限を付与する
create role developer_role;
grant role database_readwrite_role to role developer_role;
grant role developer_role to user developer1;
grant role developer_role to user developer2;
grant role developer_role to user developer3;

-- analyst_role には readonly 権限を付与する
create role analyst_role;
grant role database_readonly_role to role analyst_role;
grant role analyst_role to user analyst1;
grant role analyst_role to user analyst2;
grant role analyst_role to user analyst3;

さらに、面倒な処理を省くために将来的に作成されるテーブルなどにも一貫して権限が付与されるように設定をしています。
「将来の付与を使用した付与管理の簡素化」の項目が参考になります。

将来の付与により、指定されたスキーマ内の特定の型のオブジェクト(テーブルまたはビューなど)に対する権限の初期セットを定義できます。新しいオブジェクトが作成されると、定義された権限がロールに自動的に付与され、付与管理が簡素化されます。

https://docs.snowflake.com/ja/user-guide/security-access-control-considerations.html#simplifying-grant-management-using-future-grants

Discussion