Snowflake アカウントの運用時において、ACCOUNTADMIN は必要な場合以外は利用しないことが推奨されます。SYSADMIN 直下ではなく ACCOUNTADMIN 直下に位置付けた Custom Role を作成することで、ACCOUNTADMIN が持つ権限を委譲する例を記載します。
関連資料:
// 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;
参考資料:
以下のような情報を確認できるようになります。
参考資料: SNOWFLAKE database を利用した SELECT クエリの例
セキュリティ統制上の観点からは 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;
Public ロールであっても、Account Level で設定されたパラメータ値を確認できます。Custom Role を作成して権限を委譲する必要はありません。
USE ROLE public;
SHOW PARAMETERS IN ACCOUNT;
参考資料: Snowflake におけるセキュリティ関連の機能 / パラメータ管理](/techs/5dcf74894d#part-e8ccfb82b0e66d4b)
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 のステータス確認は 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
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 として利用
// 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 消費の情報を確認できることが分かります。
参考資料:
// 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;
参考資料:
こちらのページをご参照ください。