❄️

【Snowflake】権限がなくとも使えるcreate temporary table/stage etc. と情報管理の注意点

2024/05/25に公開

本記事で参考になるケース

  • 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されない!大丈夫としている方もいるかもしれません.
その場合、完全に制限できていませんので注意しなくてはいけません.

②に関して

外部ストレージに得体の知れないファイルが増えていたらこれを疑うのもありです.

Snowflake Data Heroes

Discussion