❄️
【Snowflake】権限がなくとも使えるcreate temporary table/stage etc. と情報管理の注意点
本記事で参考になるケース
- temporaryの動作と場合によっては表出する危険性
- 意図せぬstageに対するload/unload許可
記事の概要
-
create temporary XXX
において、XXXの権限がなくとも利用可能 -
integration
権限の管理設計次第ではcreate temporary stage
が実行されることには気をつける必要がある
20240525現在
はじめに - temporaryオブジェクトは権限がなくとも作成可能 -
temporaryオブジェクトは作成権限がなくとも作成が可能である.
例えば、
create stage
権限を保有していないRoleもcreate temporary stage
は実行可能である.
<検証>
create role test_stage;
create warehouse test_wh;
create database test_stage_db;
create schema test_stage_db.test_schema;
grant usage on warehouse test_wh to role test_stage;
grant usage on database test_stage_db to role test_stage;
grant usage on schema test_stage_db.test_schema to role test_stage;
################
## test_stage roleにはstage系の権限は一才付与していない.
################
USE ROLE test_stage;
CREATE TEMPORARY STAGE test_stage_db.test_schema.test;
Stage area TEST successfully created.
stage
の作成が可能である.
また、table
なども作成が可能である
CREATE TEMPORARY TABLE test_stage_db.test_schema.test_table(id NUMBER);
Table TEST_TABLE successfully created.
上記踏まえ注意しなければならないこと
①と②の組み合わせによって情報漏洩や追跡が面倒な事象が起きる可能性があります
① Roleに外部Stage用INTEGRATIONのUSAGE権限を誤って付与していた場合、そのRoleによって外部stageに意図せぬload/unloadをされる可能性がある
## 検証時に引き続き
use role accountadmin;
CREATE STORAGE INTEGRATION test_snowflake_stage
TYPE = EXTERNAL_STAGE
STORAGE_PROVIDER = S3
ENABLED = true
STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::12345678910:role/test-snowflke-stage'
STORAGE_ALLOWED_LOCATIONS = ('s3://test-snowflake-stage1234/');
GRANT USAGE ON INTEGRATION test_snowflake_stage to role test_stage;
################
## test_stage roleにはstage系の権限は一才付与していない.
################
USE ROLE test_stage;
CREATE temporary STAGE test_stage_db.test_schema.test_stage
STORAGE_INTEGRATION = test_snowflake_stage
URL = 's3://test-snowflake-stage1234/';
COPY INTO @test_stage_db.test_schema.test_stage/test_file
from (select 1)
file_format = (TYPE = CSV COMPRESSION = GZIP FIELD_DELIMITER = '\t' SKIP_HEADER = 1 );
Unloadは成功する
rows_unloaded input_bytes output_bytes
1 2 22
② 外部stageに置かれたファイルは消えない
temporary stage
おいて
- 内部stageを作成した場合であればtemporaryの標準的な仕様として、セッション終了時にstage内のファイルごと削除される.
- 外部stageを作成した場合、セッション終了時も外部stageからファイルは消えない
①、②が合わさると面倒なことが起きかねませんね
まとめ
①に関して
これは可能性としては少ないかもしれません. しかし包括的な上位権限が意図せず付与されているかもしれません. もしくはintegrationのusage権限をつけていても stageの権限をつけてないからload/unloadされない!大丈夫としている方もいるかもしれません.
その場合、完全に制限できていませんので注意しなくてはいけません.
②に関して
外部ストレージに得体の知れないファイルが増えていたらこれを疑うのもありです.
Snowlfake データクラウドのユーザ会 SnowVillage のメンバーで運営しています。 Publication参加方法はこちらをご参照ください。 zenn.dev/dataheroes/articles/db5da0959b4bdd
Discussion