Snowflake Custom Role による ACCOUNTADMIN からの権限委譲
[履歴] [最終更新] (2022/02/11 10:55:51)
最近の投稿
注目の記事

概要

Snowflake アカウントの運用時において、ACCOUNTADMIN は必要な場合以外は利用しないことが推奨されます。SYSADMIN 直下ではなく ACCOUNTADMIN 直下に位置付けた Custom Role を作成することで、ACCOUNTADMIN が持つ権限を委譲する例を記載します。

関連資料:

監査ログ SNOWFLAKE database の参照権限の委譲

// accountadmin である必要はありません。
USE ROLE securityadmin;

// ロールの作成。
CREATE ROLE myrole;

// 参照権限の付与。
GRANT IMPORTED PRIVILEGES ON DATABASE snowflake TO ROLE myrole;

// useradmin が grant できるように、OWNERSHIP を移管しています。
GRANT OWNERSHIP ON ROLE myrole TO ROLE useradmin;

// accountadmin の直下に配置することで、myrole が OWNERSHIP を持つオブジェクトが発生しても accountadmin で管理できるようにしておきます。
GRANT ROLE myrole TO ROLE accountadmin;

参考資料:

以下のような情報を確認できるようになります。

  • ユーザ一覧。
  • ユーザへのロールの付与状況。
  • ロールへの privilege の付与状況。
  • Stage オブジェクト一覧。
  • Data Unload 履歴。
  • Replication 履歴。
  • ログイン履歴。
  • SQL 実行履歴。

参考資料: SNOWFLAKE database を利用した SELECT クエリの例

SYSADMIN を grant する権限を USERADMIN に委譲

セキュリティ統制上の観点からは accountadmin と securityadmin の扱いには注意する必要があります。その観点からは、useradmin が sysadmin を管理することについて問題にはなりません。以下のように sysadmin2 のような custom role を作成することで、sysadmin の管理を useradmin に委譲できます。

// accountadmin である必要はありません。
USE ROLE securityadmin;

// 空のロールを作成します。
CREATE ROLE myrole;

// sysadmin の usage 権限を付与します。
grant role sysadmin to role myrole;

// useradmin が grant できるように、OWNERSHIP を移管しています。
grant ownership on role myrole to role useradmin;

// accountadmin の直下に配置することで、myrole が OWNERSHIP を持つオブジェクトが発生しても accountadmin で管理できるようにしておきます。
grant role myrole to role accountadmin;

Account Level パラメータの確認

Public ロールであっても、Account Level で設定されたパラメータ値を確認できます。Custom Role を作成して権限を委譲する必要はありません。

USE ROLE public;
SHOW PARAMETERS IN ACCOUNT;

参考資料: Snowflake におけるセキュリティ関連の機能 / パラメータ管理](/techs/5dcf74894d#part-e8ccfb82b0e66d4b)

Network Policy の設定値を ACCOUNTADMIN を用いずに確認する方法

Account パラメータとして設定された Network Policy の値は、任意の role で確認できます。

USE ROLE public;
SHOW PARAMETERS LIKE 'network_policy' IN ACCOUNT;

ただし、Network Policy の OWNERSHIP を持つ場合にのみ、ALLOWED_IP_LIST の値を describe して確認することが可能です。そこで、「監査ログ SNOWFLAKE database の参照権限」を持った Custom Role を利用します。

SELECT
  query_type, query_text,
  user_name, role_name,
  execution_status, start_time
FROM
  snowflake.account_usage.query_history
WHERE
  execution_status = 'SUCCESS' AND
  query_type IN ('CREATE_NETWORK_POLICY', 'ALTER_NETWORK_POLICY', 'DROP_NETWORK_POLICY', 'RENAME_NETWORK_POLICY') AND
  query_text ILIKE '% MYPOLICY%' // ログを確認したい network policy 名です。ILIKE を利用します。
ORDER BY
  start_time;

セキュリティ統制上の目的で確認する際には、user level での Network Policy 設定も可能であるため、WHERE 句の query_text を指定せずに、すべての Network Policy 変更ログを確認します。

参考資料:

ユーザ一覧の確認

ロールの一覧であれば useradmin であっても確認できます。

USE ROLE useradmin;
SHOW ROLES;

ユーザの一覧を確認することは useradmin には許可されていません。そこで、「監査ログ SNOWFLAKE database の参照権限」で記載した Custom Role を利用するか、以下のように useradmin に直接権限を付与します。

USE ROLE securityadmin;
GRANT IMPORTED PRIVILEGES ON DATABASE snowflake TO ROLE useradmin;

ユーザ一覧を確認できるようになります。ただし、snowflake.account_usage.users には最大 120 分の遅延が存在します。

USE ROLE useradmin;

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;

ALL_USER_NAMES 関数を利用することもできます。public ロールでも利用できる関数です。

USE ROLE public;
SELECT ALL_USER_NAMES();

参考資料:

Behavior Change Release Management の権限委譲は不可

Behavior Change Release のステータス確認は public ロールでも可能です。一方、Enable/Disable は accountadmin が必要です。

USE ROLE public;
SELECT system$behavior_change_bundle_status('2021_02');

USE ROLE accountadmin;
SELECT system$enable_behavior_change_bundle('2021_02');
SELECT system$disable_behavior_change_bundle('2021_02');

参考資料: Snowflake の基本的な使い方 / Snowflake Releases

Storage Integration の情報確認

Integration の一覧を確認する権限は public ロールも持ちます。

USE ROLE public;
SHOW INTEGRATIONS;

Integration の作成は ACCOUNTADMIN で実行する必要がありますが、USAGE 権限を委譲することが可能です。

USE ROLE accountadmin;

CREATE STORAGE INTEGRATION mys3int
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = S3
  ENABLED = true
  STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123412341234:role/my-role-20210923'
  STORAGE_ALLOWED_LOCATIONS = ('s3://my-test-20210923/snowflake/');

GRANT USAGE ON INTEGRATION mys3int TO ROLE sysadmin;

USE ROLE sysadmin;
DESCRIBE STORAGE INTEGRATION mys3int;

参考資料: Snowflake におけるネットワーク関連の設定 / AWS S3 を External Stage として利用

Credit の使用状況を確認する権限の委譲

// accountadmin を利用します。
USE ROLE accountadmin;

// 空のロールを作成します。
CREATE ROLE myrole;

// ACCOUNT オブジェクトに対する "MONITOR USAGE" privilege を付与します。
GRANT MONITOR USAGE ON ACCOUNT TO ROLE myrole;

// useradmin が grant できるように、OWNERSHIP を移管しています。
GRANT OWNERSHIP ON ROLE myrole TO ROLE useradmin;

// accountadmin の直下に配置することで、myrole が OWNERSHIP を持つオブジェクトが発生しても accountadmin で管理できるようにしておきます。
GRANT ROLE myrole TO ROLE accountadmin;

Web コンソールから、Credit 消費の情報を確認できることが分かります。

Uploaded Image

参考資料:

Resource Monitor に関する権限委譲

// CREATE RESOURCE MONITOR を実行できるのは accountadmin だけです。委譲できません。
USE ROLE accountadmin;
CREATE RESOURCE MONITOR mylimit;

// ただし、作成した後に MODIFY, MONITOR を委譲することはできます。
GRANT MODIFY, MONITOR ON RESOURCE MONITOR mylimit TO ROLE sysadmin;

// sysadmin で warehouse を作成します。
USE ROLE sysadmin;
CREATE WAREHOUSE mywh2;

// RESOURCE_MONITOR を SET できるのは accountadmin だけです。委譲できません。
USE ROLE accountadmin;
ALTER WAREHOUSE mywh2 SET RESOURCE_MONITOR = mylimit;

// ただし、MODIFY, MONITOR が委譲されていれば、パラメータの変更は可能です。
USE ROLE sysadmin;
ALTER RESOURCE MONITOR mylimit
SET 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;

参考資料:

Task に関する権限委譲

こちらのページをご参照ください。

関連ページ
    概要 こちらのページで基本的な使い方を把握した Snowflake において、cron のように定期的に SQL を実行する仕組みとして Task が提供されています。基本的な使い方を記載します。 サンプル データベースとテーブルを作成しておきます。 CREATE DATABASE mydb; CREATE TABLE mytbl (c1 DATETIME, c2 STRING);