Snowflake のセキュリティ関連の機能について記載します。
パラメータ管理
Snowflake における設定値はパラメータとよばれます。設定する対象によって分類すると、以下の三種類が存在します。
- Account パラメータ。
- Account-level でのみ設定可能です。
- Session パラメータ。
- Account-level および User-level, Session-level で設定可能です。
- Object パラメータ。
- Account-level および Object-level で設定可能です。
- Object には Database や Warehouse だけでなく User も含まれます
- 上位の階層の Object に対する設定値は下位の Object に伝搬します。
- 例えば Database object に対する設定値は Schema object に伝搬します。
- Account-level および Object-level で設定可能です。
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;
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;
参考資料:
セキュリティ設定に関連するパラメータ
NETWORK_POLICY パラメータ (Account パラメータ、User object パラメータ)
- アクセス元 IP アドレスを制限するためのパラメータです。
- Account パラメータとして設定する場合と、User object パラメータとして設定する場合があります。
- User object パラメータとしての設定値が優先されます。
- より正確には、Accout object パラメータとして設定すると、Object の階層構造において下位に位置する User object の既定値が設定されます。
- User object の設定で上書きしない限りは、Account object に対して設定した値が有効となります。
- User object パラメータとしての設定値が優先されます。
ALTER USER
によってパラメータの値を設定できます。- user の OWNERSHIP privilege を持つ場合に ALTER USER を実行可能です。
- "Only the role with the OWNERSHIP privilege on the user, or a higher role, can activate a network policy for an individual user."
- 現在ログインしている user の NETWORK_POLICY は、現在の接続元 IP が許可されるような値にしか変更できません。
- OWNERSHIP privilege を持つ user の NETWORK_POLICY は、任意の値に変更できます。
- 各 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 等は値の削除も不可。
- SECURITYADMIN で実行
- user の OWNERSHIP privilege を持つ場合に ALTER USER を実行可能です。
MINS_TO_BYPASS_NETWORK_POLICY
によって一時的に network policy を無効化できます。- Snowflake 社のみが設定できる user object に対する property です。
- Bypassing a Network Policy
- Account パラメータとして設定する場合には SECURITYADMIN 以上の権限が必要です。
- SECURITYADMIN が設定できる Account パラメータは NETWORK_POLICY のみです。
- "This is the only account parameter that can be set by security administrators (i.e users with the SECURITYADMIN system role) or higher."
関連資料:
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);
参考資料:
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_CREATION
- その他の認証方法
- object 一覧
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
監査ログは 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 を持つ場合に利用します。
- SNOWFLAKE
- 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 ヶ月です。
- ACCOUNT_USAGE schema に含まれる view には object タイプと historical タイプの二種類があります: ACCOUNT_USAGE Views
- データが view に格納されるまでの時間
- Information schema は即時で view を用いてデータ参照できるようになります。
- ACCOUNT_USAGE schema では少なくとも 45 分待つ必要があります。
- 後述の Information schema と基本的に同じ情報を含みます。
参考資料: Account Usage
Information schema
- "Information Schema" は snowflake に限らず、database 製品に共通する概念です。
- Data Dictionary とも呼ばれます。
- Information Schema は、各 database に存在します。
- その database 内のすべての object に関する view を含みます。
- 加えて account-level object に関する view を含みます。
- role, warehouse, 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 消費に関するアラート設定
- 顧客が作成した 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 を受け取るためには、メールアドレスの認証も完了する必要があります。
作成例
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 における通知例
Email による通知例
参考資料:
その他の話題
- 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。
- Client-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 の一覧です。
関連記事
- Snowflake Task による SQL の定期実行Snowflake において、cron のように定期的に SQL を実行する仕組みとして Task が提供されています。基本的な使い方を記載します。 サンプル データベースとテーブルを作成しておきます。 CREATE DATABASE mydb; CREATE TABLE mytbl (c1 DATETIME, c2 STRING); 1分毎に INSERT を実行する task を作成します。W...
- Snowflake におけるアクセス制御の設定Snowflake について、アクセス制御の設定を記載します。 参考資料: Access Control in Snowflake user と role の関係 [Role Hierarchy and Privilege
- Looker から Snowflake への OAuth 接続Looker から Snowflake の DB を OAuth 認証で参照する設定例を記載します。 参考資料: Looker / feedbackSnowflake / Configuring OAuth for Snowflake connections Snowflake 内の Looker 用 Role/User/Warehouse/DB 作成 Role と
- Snowflake に対する SSO 設定 (Auth0)Snowflake に対して、外部の ID 基盤 (IdP; ID Provider) による認証でログインするための設定例を記載します。IdP としては Auth0 を用います。 参考資料: [HOWTO: CONFIGURE AUTH0 AS IDENTITY PROVIDER FOR SNOWFLAKE SINGLE SIGN-ON](https://community.snowflake....
- Snowflake Custom Role による ACCOUNTADMIN からの権限委譲Snowflake アカウントの運用時において、ACCOUNTADMIN は必要な場合以外は利用しないことが推奨されます。SYSADMIN 直下ではなく ACCOUNTADMIN 直下に位置付けた Custom Role を作成することで、ACCOUNTADMIN が持つ権限を委譲する例を記載します。 関連資料: [Access Control Privileges](https://docs.s...