Snowflake

Snowflake Secondary Rolesの権限評価ロジックと監査への影響

2026-03-26
更新: 2026-03-27
NicheeLab編集部

Snowflakeのロールモデルでは、セッションに対して1つのPrimary Roleと、0個以上のSecondary Rolesを設定できます。 Primary RoleはUSE ROLEで切り替える従来のロールで、Secondary Rolesを有効にすると、ユーザーに付与されている他のロールの権限もクエリ実行時に同時に評価されます。 これにより「USE ROLEで頻繁にロールを切り替える」運用負荷を大幅に削減できます。

基本構文

-- セッションでSecondary Rolesを有効化(付与済み全ロールの権限を使用)
USE SECONDARY ROLES ALL;

-- Secondary Rolesを無効化(Primary Roleのみで評価)
USE SECONDARY ROLES NONE;

-- 現在のSecondary Roles設定を確認
SELECT CURRENT_SECONDARY_ROLES();

-- 現在のPrimary Roleを確認
SELECT CURRENT_ROLE();

-- ユーザーのデフォルト設定を変更
ALTER USER analyst_user
  SET DEFAULT_SECONDARY_ROLES = ('ALL');

-- デフォルトをNONEに戻す
ALTER USER analyst_user
  SET DEFAULT_SECONDARY_ROLES = ();

権限評価ロジック

Secondary Roles有効時、Snowflakeはクエリで参照するオブジェクトに対して、Primary Roleとすべての Secondary Rolesのロール階層を合算して権限チェックを行います。 いずれかのロール階層にSELECT権限があればクエリは成功します。

権限評価の詳細比較

評価項目SECONDARY ROLES = NONESECONDARY ROLES = ALL
権限評価対象Primary Roleのロール階層のみPrimary Role + 全Granted Rolesのロール階層
CURRENT_ROLE()の戻り値Primary Role名Primary Role名(変わらない)
IS_ROLE_IN_SESSION()Primary Roleの階層のみTRUE全Granted Rolesの階層でTRUE
オブジェクト作成時のOWNERPrimary RolePrimary Role(変わらない)
監査ログのROLE_NAMEPrimary RolePrimary Role
監査ログのSECONDARY_ROLE空欄ALL
Masking Policy内のCURRENT_ROLE()Primary Roleを返すPrimary Roleを返す(Secondary考慮なし)
Row Access Policy内のIS_ROLE_IN_SESSION()Primary Role階層のみ評価全Granted Rolesの階層を評価

実務シナリオ

あるユーザーにANALYST_ROLE(Primary)とDATA_ENGINEER_ROLE(Secondary候補)が付与されている場合の動作を確認します。

-- Primary RoleをANALYSTに設定
USE ROLE ANALYST_ROLE;

-- この状態ではDATA_ENGINEER_ROLEが持つテーブルにはアクセスできない
SELECT * FROM raw.events;  -- ERROR: Insufficient privileges

-- Secondary Rolesを有効化
USE SECONDARY ROLES ALL;

-- DATA_ENGINEER_ROLEの権限も評価され、アクセス可能に
SELECT * FROM raw.events;  -- 成功

-- しかしCURRENT_ROLE()は依然としてANALYST_ROLE
SELECT CURRENT_ROLE();  -- 'ANALYST_ROLE'

-- IS_ROLE_IN_SESSION()で両方のロールを確認可能
SELECT IS_ROLE_IN_SESSION('DATA_ENGINEER_ROLE');  -- TRUE
SELECT IS_ROLE_IN_SESSION('ANALYST_ROLE');         -- TRUE

監査ログへの影響

Secondary Roles有効時、SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORYビューのROLE_NAME列にはPrimary Roleが記録されます。 Secondary Rolesが使われたかどうかはQUERY_HISTORYに直接記録されないため、LOGIN_HISTORYやSESSIONS ビューと組み合わせて監査する必要があります。

-- セッションごとのSecondary Roles使用状況を監査
SELECT
  s.session_id,
  s.user_name,
  s.login_event_id,
  q.role_name AS primary_role,
  q.query_text,
  q.start_time
FROM SNOWFLAKE.ACCOUNT_USAGE.SESSIONS s
JOIN SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY q
  ON s.session_id = q.session_id
WHERE q.start_time >= DATEADD(DAY, -7, CURRENT_TIMESTAMP())
  AND q.query_text ILIKE '%USE SECONDARY ROLES%'
ORDER BY q.start_time DESC;

ポリシー設計上の注意点

  • CURRENT_ROLE()の限界:Masking PolicyやRow Access PolicyでCURRENT_ROLE()を使ってアクセス制御している場合、Secondary Rolesの権限は考慮されない。IS_ROLE_IN_SESSION()に置き換えることで、Secondary Rolesも含めた評価が可能になる
  • 最小権限の原則との緊張関係:Secondary Roles ALLは利便性が高い一方、意図しないロールの権限が適用されるリスクがある。機密データを扱う環境ではIS_ROLE_IN_SESSION()ベースのポリシー設計を推奨
  • DEFAULT_SECONDARY_ROLESの管理:ユーザーごとにALTER USERで設定する必要があり、一括変更にはスクリプトが必要

CURRENT_ROLE()からIS_ROLE_IN_SESSION()への移行パターン

-- 移行前: CURRENT_ROLE()ベースのMasking Policy
CREATE OR REPLACE MASKING POLICY mask_ssn AS (val STRING)
  RETURNS STRING ->
  CASE
    WHEN CURRENT_ROLE() IN ('HR_ADMIN', 'COMPLIANCE')
      THEN val
    ELSE '***-**-****'
  END;

-- 移行後: IS_ROLE_IN_SESSION()ベース(Secondary Roles対応)
CREATE OR REPLACE MASKING POLICY mask_ssn AS (val STRING)
  RETURNS STRING ->
  CASE
    WHEN IS_ROLE_IN_SESSION('HR_ADMIN')
      OR IS_ROLE_IN_SESSION('COMPLIANCE')
      THEN val
    ELSE '***-**-****'
  END;

問題で確認

Security & Governance

問題 1

あるユーザーがPrimary RoleにANALYSTを設定し、USE SECONDARY ROLES ALLを実行した。このユーザーにはDATA_ENGINEERロールも付与されている。Row Access Policyの条件にCURRENT_ROLE() = 'DATA_ENGINEER'が使われているテーブルにクエリを実行した場合、どうなるか。

  1. DATA_ENGINEERロールの権限でアクセスでき、Row Access Policyの条件もTRUEと評価されて全行が見える
  2. DATA_ENGINEERロールの権限でテーブルにアクセスできるが、CURRENT_ROLE()はANALYSTを返すためRow Access Policyの条件はFALSEとなり、行がフィルタされる
  3. Secondary RolesではRow Access Policyの評価が無効化されるため、全行が見える
  4. Secondary Rolesが有効でもDATA_ENGINEERロールの権限は使えないため、クエリ自体がエラーになる

正解: B

Secondary Roles ALLを有効にすると、テーブルへのアクセス権限(SELECT等)はPrimary Role+全Secondary Rolesで評価されるため、DATA_ENGINEERの権限でテーブルにはアクセスできます。しかしCURRENT_ROLE()は常にPrimary Role(ANALYST)を返すため、Row Access Policyの条件CURRENT_ROLE() = 'DATA_ENGINEER'はFALSEとなります。この動作はIS_ROLE_IN_SESSION('DATA_ENGINEER')を使えばTRUEと評価されます。

よくある質問

Secondary Rolesを有効にするとRow Access PolicyやMasking Policyの挙動はどう変わりますか?

USE SECONDARY ROLES ALLを有効にすると、クエリ実行時にPrimary Roleだけでなく全てのGranted Rolesの権限が評価されます。しかしRow Access PolicyやMasking Policyの中でCURRENT_ROLE()を使っている場合、CURRENT_ROLE()はPrimary Roleのみを返します。Secondary Rolesの権限はIS_ROLE_IN_SESSION()で評価できます。ポリシー設計でCURRENT_ROLE()に依存している環境でSecondary Rolesを有効化すると、想定外のデータ可視性が生じる可能性があるため、IS_ROLE_IN_SESSION()への移行を検討してください。

Secondary Rolesを有効にした状態でオブジェクトを作成すると、所有者はどのロールになりますか?

オブジェクトの所有者(OWNERSHIP権限)は常にPrimary Roleに付与されます。Secondary Rolesはクエリ実行時のアクセス権限を拡張するだけで、DDLで作成されたオブジェクトの所有権には影響しません。そのため、USE ROLEで適切なPrimary Roleをセットしてからオブジェクトを作成する運用は、Secondary Roles有効時でも変わりません。

USE SECONDARY ROLES ALLはセッション単位ですか?アカウント全体に影響しますか?

USE SECONDARY ROLES ALLはセッション単位の設定です。他のセッションやユーザーには影響しません。ただしDEFAULT_SECONDARY_ROLESユーザーパラメータを'ALL'に設定すると、そのユーザーの新しいセッションでは自動的にSecondary Rolesが有効になります。ALTER USER u SET DEFAULT_SECONDARY_ROLES = ('ALL') で設定し、NONEに戻す場合はALTER USER u SET DEFAULT_SECONDARY_ROLES = () を実行します。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Snowflake

Snowflake資格一覧|全11試験(SnowPro)の難易度・費用

Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...

Snowflake

Snowflake試験の難易度ランキング|全11資格を徹底比較

Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...

Snowflake

Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ

Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...

Snowflake

SnowPro Core試験完全解説|出題範囲・問題例・合格戦略

SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...

Snowflake

SnowPro Platform Associate完全解説|入門試験の攻略

SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...

Snowflakeの記事一覧 (102件)
© 2026 NicheeLab All rights reserved.