Snowflake におけるセキュリティ関連の機能
[履歴] [最終更新] (2021/11/27 16:24:37)
最近の投稿
注目の記事

概要

こちらのページで基本的な使い方を把握した Snowflake について、以下の観点でセキュリティ設定を記載しました。

本ページでは、その他の観点における Snowflake のセキュリティ関連の機能について記載します。

パラメータ管理

Snowflake における設定値はパラメータとよばれます。設定する対象によって分類すると、以下の三種類が存在します。

  • Account パラメータ。
    • Account-level でのみ設定可能です。
  • Session パラメータ。
    • Account-level および User-level, Session-level で設定可能です。
  • Object パラメータ。
    • Account-level および Object-level で設定可能です。
      • Object には Database や Warehouse だけでなく User も含まれます: object 一覧
    • 上位の階層の Object に対する設定値は下位の Object に伝搬します。
      • 例えば Database object に対する設定値は Schema object に伝搬します。

Uploaded Image

SHOW PARAMETERS コマンド

Account-level におけるパラメータの確認です。Account パラメータだけでなく、Session パラメータ、Object パラメータも表示されます。

SHOW PARAMETERS IN ACCOUNT;

User-level におけるパラメータの確認です。Session パラメータだけでなく、User object パラメータも表示されます。

SHOW PARAMETERS LIKE 'timezone' IN USER;  ← Session パラメータ
SHOW PARAMETERS LIKE 'network_policy' IN USER;  ← Object パラメータ

Session-level におけるパラメータの確認です。Session パラメータのみが表示されることになります。IN SESSION は省略可能です。

SHOW PARAMETERS LIKE 'timezone' IN SESSION;

Object-level におけるパラメータの確認です。Object パラメータのみが表示されます。

SHOW PARAMETERS IN DATABASE mydb;

ALTER ACCOUNT コマンド

Account-level におけるパラメータ設定を行います。Account パラメータだけでなく、Session パラメータ、Object パラメータも設定できます。

例: Session パラメータ TIMEZONE を Account-level で設定

ALTER ACCOUNT SET TIMEZONE = 'Asia/Tokyo';

ACCOUNT-level, User-level, Session-level で TIMEZONE Session パラメータの設定値が変更されたことを確認

SHOW PARAMETERS LIKE 'TIMEZONE' IN ACCOUNT;
SHOW PARAMETERS LIKE 'TIMEZONE' IN USER;
SHOW PARAMETERS LIKE 'TIMEZONE' IN SESSION;

例: こちらのページに記載した IP 制限のための NETWORK_POLICY は、Account パラメータとして振る舞う場合と、User object パラメータとして振る舞う場合がある特殊なパラメータです。

Account-level で設定すると Account パラメータが設定されます。User object は Account object の下位に存在するため、User object の既定値となります。

CREATE NETWORK POLICY mypolicy ALLOWED_IP_LIST = ('123.123.123.123');
ALTER ACCOUNT SET NETWORK_POLICY = mypolicy;
SHOW PARAMETERS LIKE 'network_policy' IN USER;

Uploaded Image

User-level で設定すると、User object パラメータが設定されます。

CREATE NETWORK POLICY mypolicy2 ALLOWED_IP_LIST = ('234.234.234.234');
ALTER USER myuser SET NETWORK_POLICY = mypolicy2;
SHOW PARAMETERS LIKE 'network_policy' IN USER;

Uploaded Image

参考資料:

セキュリティ設定に関連するパラメータ

NETWORK_POLICY パラメータ (Account パラメータ、User object パラメータ)

  • アクセス元 IP アドレスを制限するためのパラメータです。
  • Account パラメータとして設定する場合と、User object パラメータとして設定する場合があります。
    • User object パラメータとしての設定値が優先されます。
      • より正確には、Accout object パラメータとして設定すると、Object の階層構造において下位に位置する User object の既定値が設定されます。
      • User object の設定で上書きしない限りは、Account object に対して設定した値が有効となります。
  • ALTER USER によってパラメータの値を設定できます。
    • user の OWNERSHIP privilege を持つ場合に ALTER USER を実行可能です。
    • 各 user は ALTER USER コマンドを実行可能ですが、その際に SET 可能なパラメータには NETWORK_POLICY は含まれません
      • DEFAULT_WAREHOUSE
      • DEFAULT_NAMESPACE
      • DEFAULT_ROLE
      • DEFAULT_SECONDARY_ROLES
      • "Any of their session parameter defaults"
    • 注意: UNSET は可能です。
      • Account パラメータとして設定した値が有効になることに注意します。
      • 以下のような挙動になります。事前に mypolicy および mypolicy2 を作成しておきます。
        • SECURITYADMIN で実行
          • ALTER USER myuser SET NETWORK_POLICY = mypolicy;
        • 各 user で実行
          • ALTER USER myuser SET NETWORK_POLICY = mypolicy; → Statement executed successfully.
          • → 同じ値に設定可能。
          • ALTER USER myuser SET NETWORK_POLICY = mypolicy2; → Network policy MYPOLICY2 does not exist or not authorized.
          • → 別の値に変更不可。
          • ALTER USER myuser UNSET NETWORK_POLICY; → Statement executed successfully.
          • → 値の削除は可能。
          • ALTER USER myuser UNSET FIRST_NAME; → SQL access control error: Insufficient privileges to operate on user 'MYUSER'
          • → FIRST_NAME 等は値の削除も不可。
  • MINS_TO_BYPASS_NETWORK_POLICY によって一時的に network policy を無効化できます。
  • Account パラメータとして設定する場合には SECURITYADMIN 以上の権限が必要です。

関連資料:

PREVENT_UNLOAD_TO_INLINE_URL パラメータ (Account パラメータ)

Stage を用いない Data Unload を禁止できます。Data Load は禁止されません。

ALTER ACCOUNT SET PREVENT_UNLOAD_TO_INLINE_URL = true;
SHOW PARAMETERS LIKE 'PREVENT_UNLOAD_TO_INLINE_URL' IN ACCOUNT;

動作検証

CREATE DATABASE mydb;
CREATE OR REPLACE TABLE mytbl (c1 STRING, c2 DATE);

CREATE OR REPLACE WAREHOUSE mywh WITH
WAREHOUSE_SIZE = XSMALL
AUTO_SUSPEND = 60
AUTO_RESUME = true
INITIALLY_SUSPENDED = true;

COPY INTO 's3://mybucket-20211003/unload/'
FROM mydb.public.mytbl
CREDENTIALS = (AWS_KEY_ID='xxxx' AWS_SECRET_KEY='xxxxx')
FILE_FORMAT = (TYPE = CSV);

Uploaded Image

参考資料:

REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_CREATION パラメータ (Account パラメータ)

ALTER ACCOUNT SET REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_CREATION = true;
SHOW PARAMETERS LIKE 'REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_CREATION' IN ACCOUNT;
  • External STAGE object を作成する際に、STORAGE INTEGRATION object の利用を必須とするための Account パラメータです。
    • INTEGRATION object は ACCOUNT object 直下に存在しています。
    • STAGE object は Schema object 直下に存在しています。
  • INTEGRATION object 作成のためには CREATE INTEGRATION privilege が必要です。
    • ACCOUNTADMIN が持つ privilege です。

参考資料:

REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_OPERATION パラメータ (Account パラメータ)

REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_CREATION パラメータは External Stage 作成時の制限を行うためのパラメータです。REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_OPERATION パラメータは External Stage 利用時における制限を行うためのパラメータです。

参考資料: REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_OPERATION

監査ログの利用

SNOWFLAKE database

Uploaded Image

監査ログは SNOWFLAKE database 内に格納されています。

  • Snowflake アカウントには "SNOWFLAKE" という名称の database が一つ存在しています。
    • 後述の Data Sharing 機能を用いて Snowflake 社から read-only な database として提供されています。
  • 用語の整理
    • SNOWFLAKE
      • SNOWFLAKE アカウントが Data Sharing の Provider となっています。
      • share オブジェクトによって import されているものは SNOWFLAKE database です。
    • ACCOUNT_USAGE
      • ACCOUNT_USAGE という share オブジェクトを介して提供されています。
      • database 内には ACCOUNT_USAGE schema と READER_ACCOUNT_USAGE schema が存在します。
        • それぞれの schema 内には view が複数存在しており、監査ログ等を持ちます。
        • READER_ACCOUNT_USAGE schema
          • Snowflake アカウントが reader account を持つ場合に利用します。

Uploaded Image

  • ACCOUNT_USAGE schema
    • 後述の Information schema と基本的に同じ情報を含みます。
      • Information schema と異なり、DROP された object の情報も含みます。
    • データの view における保持期間
      • ACCOUNT_USAGE schema に含まれる view には object タイプと historical タイプの二種類があります: ACCOUNT_USAGE Views
        • historical タイプの view のデータ保持期間は、基本的に 1 年です。
      • Information schema のデータ保持期間は、長くても 6 ヶ月です。
    • データが view に格納されるまでの時間
      • Information schema は即時で view を用いてデータ参照できるようになります。
      • ACCOUNT_USAGE schema では少なくとも 45 分待つ必要があります。

参考資料: Account Usage

Information schema

  • "Information Schema" は snowflake に限らず、database 製品に共通する概念です。
    • Data Dictionary とも呼ばれます。
  • Information Schema は、各 database に存在します。

参考資料: Information Schema

SNOWFLAKE database を利用した SELECT クエリの例

クエリを実行するためには Warehouse が必要です。

USE warehouse mywh;

USERS View (snowflake.account_usage)

MFA 設定状況等を確認できます。

SELECT
  name, email, disabled,
  created_on, last_success_login,
  has_password, password_last_set_time,
  has_rsa_public_key,
  ext_authn_duo, ext_authn_uid
FROM
  snowflake.account_usage.users
WHERE
  deleted_on IS NULL
ORDER BY
  last_success_login DESC;

参考資料: USERS View

GRANTS_TO_USERS View (snowflake.account_usage)

ACCOUNTADMIN role が grant されている user 一覧等を確認できます。

SELECT
  created_on, deleted_on, role,
  grantee_name, granted_by
FROM
  snowflake.account_usage.grants_to_users
WHERE
  role = 'ACCOUNTADMIN';

参考資料: GRANTS_TO_USERS View

GRANTS_TO_ROLES View (snowflake.account_usage)

CREATE INTEGRATION privilege が grant されている role 一覧等を確認できます。

SELECT
  created_on, deleted_on,
  privilege, granted_on, name,
  grantee_name, granted_by, grant_option
FROM
  snowflake.account_usage.grants_to_roles
WHERE
  privilege = 'CREATE INTEGRATION';

参考資料: GRANTS_TO_ROLES View

STAGES View (snowflake.account_usage)

特定のリージョンに対する External Stage 一覧等を確認できます。

SELECT
  stage_name, stage_catalog, stage_schema,
  stage_url, stage_region, stage_type, created, deleted
FROM
  snowflake.account_usage.stages
WHERE
  stage_type = 'External Named' AND
  stage_region NOT IN ('ap-northeast-1', 'asia-northeast1');

参考資料: STAGES View

COPY_HISTORY View (snowflake.account_usage)

COPY コマンドまたは snowpipe による Data Load の履歴を確認できます。

SELECT
  stage_location, last_load_time, status,
  table_catalog_name, table_schema_name, table_name,
  pipe_name
FROM
  snowflake.account_usage.copy_history;

参考資料: COPY_HISTORY View

LOAD_HISTORY View (snowflake.account_usage)

COPY コマンドによる Data Load の履歴を確認できます。Snowpipe による Data Load 履歴は含まれません。

SELECT
  catalog_name, schema_name, table_name,
  file_name, last_load_time, status
FROM
  snowflake.account_usage.load_history;

参考資料: LOAD_HISTORY View

DATA_TRANSFER_HISTORY View (snowflake.account_usage)

Data Unload や Replication による、他の Cloud provider や Region に対するデータ転送の履歴を確認できます。

SELECT * FROM snowflake.account_usage.data_transfer_history;

参考資料: DATA_TRANSFER_HISTORY View

REPLICATION_USAGE_HISTORY View (snowflake.account_usage)

組織内の他のアカウントとのデータレプリケーションについて、履歴を確認できます。

SELECT * FROM snowflake.account_usage.replication_usage_history;

参考資料: REPLICATION_USAGE_HISTORY View

LOGIN_HISTORY View (snowflake.account_usage)

想定していない IP からのログイン履歴等を確認できます。

SELECT
  event_timestamp, event_type,
  user_name, client_ip,
  reported_client_type,
  first_authentication_factor,
  second_authentication_factor,
  is_success
FROM
  snowflake.account_usage.login_history
WHERE
  client_ip NOT IN ('123.123.123.123');

参考資料:

QUERY_HISTORY View (snowflake.account_usage)

クエリの実行履歴を確認できます。

SELECT
  database_name, schema_name,
  query_type, query_text,
  user_name, role_name,
  execution_status,
  start_time
FROM
  snowflake.account_usage.query_history
WHERE
  role_name = 'ACCOUNTADMIN' AND
  execution_status = 'SUCCESS' AND
  query_type NOT IN ('SHOW', 'SELECT', 'DESCRIBE', 'USE');

Information Schema 内の View を用いても同様のクエリを実行可能です

SELECT
  database_name, schema_name,
  query_type, query_text,
  user_name, role_name,
  execution_status,
  start_time
FROM
  TABLE(mydb.information_schema.query_history())
WHERE
  role_name = 'ACCOUNTADMIN' AND
  execution_status = 'SUCCESS' AND
  query_type NOT IN ('SHOW', 'SELECT', 'DESCRIBE', 'USE');

参考資料:

CONTRACT_ITEMS View, REMAINING_BALANCE_DAILY View (snowflake.organization_usage)

ORGADMIN role が必要です。組織における、前払い情報等を取得できます。

SELECT * FROM snowflake.organization_usage.contract_items;
SELECT * FROM snowflake.remaining_balance_daily;

参考資料:

Warehouse による Credit 消費に関するアラート設定

Uploaded Image

  • 顧客が作成した Virtual Warehouses による Credit 消費に関するアラート設定です。
    • Snowpipe 等が稼働する Snowflake-managed Virtual Warehouses による Credit 消費は対象外です。
    • 関連資料: 利用料金について
  • Account-level と Warehouse-level の二種類が存在します。
    • Account-level の RESOURCE MONITOR は最大で 1 つまで作成できます。
  • 既定では Snowflake の billing 期間に合わせたアラートとなります。
    • 毎月 1 日にリセットされます。
  • ACCOUNTADMIN のみが RESOURCE MONITOR を作成可能です。
    • 閲覧 privilege (MONITOR) および 編集 privilege (MODIFY) は他の role に grant 可能です。
  • Notification は ACCOUNTADMIN にのみ通知されます。
    • 事前に Web Interface の設定で有効化する必要があります。
    • Email で Notification を受け取るためには、メールアドレスの認証も完了する必要があります。

Uploaded Image

作成例

CREATE OR REPLACE RESOURCE MONITOR mylimit
WITH CREDIT_QUOTA = 10
TRIGGERS ON 50 PERCENT DO NOTIFY
         ON 75 PERCENT DO NOTIFY
         ON 90 PERCENT DO SUSPEND
         ON 100 PERCENT DO SUSPEND_IMMEDIATE;

設定例

ALTER ACCOUNT SET RESOURCE_MONITOR = mylimit;
ALTER WAREHOUSE mywh SET RESOURCE_MONITOR = mylimit;

Web Interface における通知例

Uploaded Image

Email による通知例

Uploaded Image

参考資料:

その他の話題

  • Data Encryption
    • データ暗号化のための機能です。
    • Snowflake 内におけるデータの暗号化は、Snowflake 管理の鍵によって行われます。
      • Tri-Secret Secure とよばれる機能を有効化すると、顧客管理の鍵を合成した鍵によって暗号化することができます。
    • Internal Stage を用いる場合、Snowflake クライアントによってデータが暗号化された後にアップロードされます。
      • 鍵は Snowflake が管理します。
      • Tri-Secret Secure とよばれる機能を有効化すると、顧客管理の鍵を合成した鍵によって暗号化することができます。
    • External Stage を用いている場合、Stage 内におけるデータの暗号化は必須ではありません。
      • 暗号化されていない場合は External Stage から table に Data Load する際に、Snowflake によってデータが暗号化されます。
      • External Stage が S3 の場合、以下の三種類の暗号化が可能です: CREATE STAGE
        • Client-side Encryption。
          • master key を対称鍵として用意しておきます。
          • External Stage object を作成する際に master key の値を設定しておきます。
          • External Stage にアップロードするプログラムは乱数による一時鍵を生成します。
          • 一時鍵によってデータを暗号化して External Stage にアップロードします。
          • 一時鍵は master key によって暗号化して External Stage にアップロードします。
        • AWS-managed key による Server-side encryption。
        • Customer-managed key (KMS) による Server-side encryption。
  • Sharing Data Securely in Snowflake
    • 他のアカウントとのデータ共有のための機能です。
    • 同じ cloud provider かつ同じ region の Snowflake アカウントに対してのみ Share できます。
      • 異なる場合には、同じ cloud provider かつ同じ region の Snowflake アカウントを用意して、レプリケーションすることで対応します。
  • External Functions
    • Snowflake 外の API を利用する関数の定義が可能です。
    • API INTEGRATION object によって External Function object で利用可能な認証情報を定義します。
      • STORAGE INTEGRATION object によって External Stage object で利用可能な認証情報を定義したのと同様です。
    • API INTEGRATION object の認証先となるサービスは、以下のいずれかです。
      • Amazon API Gateway
      • Microsoft Azure API Management Service
      • Google Cloud API Gateway
  • Database Replication and Failover/Failback
    • 組織内の他のアカウントとのデータレプリケーションを行い、リージョンレベルでの災害等に備えることができます。
    • Data Sharing の Provider となる場合に、Consumer と同じ Cloud Provider かつ Region のアカウントにレプリケーションしておく必要があります。
  • Access Control Privileges
    • Snowflake における Privilege の一覧です。
関連ページ
    概要 GCP BigQuery でクエリを実行すると利用料金が発生します。分析用のプロジェクトから、他のプロジェクトの Dataset に対してクエリを実行することができます。その際に、利用料金は分析用のプロジェクトにおいて発生します。Snowflake における Data Sharing と同様です。 関連資料:
    概要 Snowflake アカウントの運用時において、ACCOUNTADMIN は必要な場合以外は利用しないことが推奨されます。SYSADMIN 直下ではなく ACCOUNTADMIN 直下に位置付けた Custom Role を作成することで、ACCOUNTADMIN が持つ権限を委譲する例を記載します。 関連資料:
    概要 こちらのページで基本的な使い方を把握した Snowflake において、cron のように定期的に SQL を実行する仕組みとして Task が提供されています。基本的な使い方を記載します。 サンプル データベースとテーブルを作成しておきます。 CREATE DATABASE mydb; CREATE TABLE mytbl (c1 DATETIME, c2 STRING);
    CloudTrail 例: リソースが削除された原因を調査できます。 既定で account 内で有効化されています。 保存期間は 90日です。 "trail" (証跡) を作成すると S3 にデータを連携でき、90日を越えて保存できます。What are trails? S3 に加えて、CloudWatch Logs への連携もオプション設定で可能です。
    概要 こちらのページで準備した Looker から、Snowflake の DB を OAuth 認証で参照する設定例を記載します。 参考資料: Looker / feedbackSnowflake / Configuring OAuth for Snowflake connections Snowflake 内の Looker 用 Role/User/Warehouse/DB 作成