はじめに
こんにちは、森田と申します。
このたび、SnowPro Core認定資格に合格しました!!
そのなかで少し引っかかったクローン時の権限継承について記事にしました!
資格の詳細は、↓を見てもらえればです!
https://learn.snowflake.com/en/certifications/snowpro-core-jpn%20/
この資格は多くの人が取っているので勉強の仕方とか、
教材の話は今回しません!先人が多くいらっしゃるのでその方々を参考にしてください!!
クローンと権限継承のルール
まず、クローンする際に従うルールは2つです。
1. ほとんどのオブジェクトの CREATE <オブジェクト> ... CLONE ステートメントは、ソースオブジェクトの付与をオブジェクトクローンにコピー しません。ただし、 COPY GRANTS 句をサポートする CREATE <オブジェクト> コマンド(例: CREATE TABLE、CREATE VIEW)を使用すると、オプションでオブジェクトのクローンに付与をコピーできます。
2. ソースオブジェクトがデータベースまたはスキーマである場合、クローンは、ソースオブジェクト含まれている子オブジェクトのクローンに対して付与された すべて の権限を継承
参照元(https://docs.snowflake.com/ja/user-guide/object-clone#access-control-privileges-for-cloned-objects)
噛み砕いて理解!①
`ほとんどのオブジェクトの CREATE <オブジェクト> ... CLONE ステートメントは、ソースオブジェクトの付与をオブジェクトクローンにコピー しません。ただし、 COPY GRANTS 句をサポートする CREATE <オブジェクト> コマンド(例: CREATE TABLE、CREATE VIEW)を使用すると、オプションでオブジェクトのクローンに付与をコピーできます。`
ちょっと難しめのですので、噛み砕いて説明します。
まず、上記文章は、基本的にはオブジェクトをクローンした場合、権限は継承されませんと言ってます。
明示的に継承を行いたい場合はCOPY GRANTS 句をサポートするオブジェクトであれば、権限を継承できます。
例えば、テーブルAがあり、ロール①がselect権限を持っていたとして、accountadminでクローンを実施した場合は、COPY GRANTS 句ありなしで権限継承が変わります。
- COPY GRANTS 句なしでクローンした場合は、クローンテーブルAには、accountadminの所有権しか存在しません。
- COPY GRANTS 句ありでクローンした場合は、クローンテーブルAには、accountadminの所有権とロール①のselect権限も一緒に継承されます。
噛み砕いて理解!②
`ソースオブジェクトがデータベースまたはスキーマである場合、クローンは、ソースオブジェクト含まれている子オブジェクトのクローンに対して付与された すべて の権限を継承`
次に、上記文章は、データベースまたはスキーマをクローンした場合は、子オブジェクトのクローンに対して付与された すべて の権限を継承すると記載されてます。
例えば、前回の条件と同じで、テーブルAを含むスキーマtemp をクローンしたとします。
この場合、スキーマtempにあった権限はクローンスキーマtempに継承されず、accountadminの所有権しか存在しません。
しかし、子オブジェクトであるテーブルAはaccountadminの所有権に加えて、ロール①のselect権限も一緒に継承されます。
まとめると
クローンを実行した際の権限継承は2つのルールによって実施されます。おぼえるなら、
基本的にはオブジェクトをクローンした場合、権限は継承されず、明示的なCOPY GRANTS 句が必要で。
データベース、スキーマをコピーする時の子オブジェクトは権限継承されると覚えておけば完璧です!
終わりに
snowflakeのクローン機能は、検証をする際や、バックアップの作成の際に強力な機能です。
しかし、オブジェクト自体のクローンは明示的におこなっているので認識できますが、裏で権限の継承も行われていることもお忘れないように!
クローンしたオブジェクトを別ロールで見たいのに、元オブジェクトは見れて、クローンは見れないで困ったり、
逆にDBクローンをした際に、別ロールに見せたくないのに、権限継承がされてみれるようになっていたりと明示的な操作の裏で実行されるのでお気をつけください!!