Snowflake

Snowflake OAuth Security Integration: External OAuth vs Snowflake OAuth

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

SnowflakeのOAuth Security Integrationは、パスワードを使わずにOAuth 2.0プロトコルでSnowflakeに認証する仕組みを提供します。External OAuth(外部認証サーバーがトークンを発行)とSnowflake OAuth(Snowflake自身がトークンを発行)の2つのモデルがあり、 ユースケースに応じて使い分けます。

External OAuth vs Snowflake OAuth比較表

比較項目External OAuthSnowflake OAuth
認可サーバー外部IdP(Azure AD、Okta、Custom)Snowflake自身
TYPE値EXTERNAL_OAUTHOAUTH
トークン発行元外部認証サーバーSnowflake
トークン検証JWKSエンドポイントで公開鍵を取得して検証Snowflake内部で検証
ユーザーマッピングトークンのクレーム(upn、email等)からSnowflakeユーザーを特定Snowflakeのログイン情報で認証
ロール制御スコープ(sn:role:ROLE_NAME)またはANY_ROLE_MODEセッションのデフォルトロール
リフレッシュトークン管理外部認証サーバーが管理Snowflakeが管理(有効期間設定可能)
主な用途カスタムアプリ、マイクロサービスBIツール(Tableau、Looker等)、Snowsight
クライアント認証外部IdPのclient_id/secretSnowflakeが発行するclient_id/secret
複数Integration複数作成可能複数作成可能

External OAuth Security Integrationの作成

-- Azure AD向けExternal OAuth
CREATE SECURITY INTEGRATION ext_oauth_azure
  TYPE = EXTERNAL_OAUTH
  ENABLED = TRUE
  EXTERNAL_OAUTH_TYPE = AZURE
  EXTERNAL_OAUTH_ISSUER = 'https://sts.windows.net/<tenant-id>/'
  EXTERNAL_OAUTH_JWS_KEYS_URL = 'https://login.microsoftonline.com/<tenant-id>/discovery/v2.0/keys'
  EXTERNAL_OAUTH_AUDIENCE_LIST = ('https://<account>.snowflakecomputing.com')
  EXTERNAL_OAUTH_TOKEN_USER_MAPPING_CLAIM = 'upn'
  EXTERNAL_OAUTH_SNOWFLAKE_USER_MAPPING_ATTRIBUTE = 'LOGIN_NAME'
  EXTERNAL_OAUTH_ANY_ROLE_MODE = 'DISABLE';

-- Okta向けExternal OAuth
CREATE SECURITY INTEGRATION ext_oauth_okta
  TYPE = EXTERNAL_OAUTH
  ENABLED = TRUE
  EXTERNAL_OAUTH_TYPE = OKTA
  EXTERNAL_OAUTH_ISSUER = 'https://myorg.okta.com/oauth2/default'
  EXTERNAL_OAUTH_JWS_KEYS_URL = 'https://myorg.okta.com/oauth2/default/v1/keys'
  EXTERNAL_OAUTH_AUDIENCE_LIST = ('https://<account>.snowflakecomputing.com')
  EXTERNAL_OAUTH_TOKEN_USER_MAPPING_CLAIM = 'sub'
  EXTERNAL_OAUTH_SNOWFLAKE_USER_MAPPING_ATTRIBUTE = 'LOGIN_NAME'
  EXTERNAL_OAUTH_ANY_ROLE_MODE = 'ENABLE';

-- カスタムOAuth 2.0サーバー向け
CREATE SECURITY INTEGRATION ext_oauth_custom
  TYPE = EXTERNAL_OAUTH
  ENABLED = TRUE
  EXTERNAL_OAUTH_TYPE = CUSTOM
  EXTERNAL_OAUTH_ISSUER = 'https://auth.example.com'
  EXTERNAL_OAUTH_JWS_KEYS_URL = 'https://auth.example.com/.well-known/jwks.json'
  EXTERNAL_OAUTH_AUDIENCE_LIST = ('snowflake-api')
  EXTERNAL_OAUTH_TOKEN_USER_MAPPING_CLAIM = 'email'
  EXTERNAL_OAUTH_SNOWFLAKE_USER_MAPPING_ATTRIBUTE = 'EMAIL'
  EXTERNAL_OAUTH_ANY_ROLE_MODE = 'ENABLE';

Snowflake OAuth Security Integrationの作成

-- Tableau Desktop向け(プリセット使用)
CREATE SECURITY INTEGRATION sf_oauth_tableau
  TYPE = OAUTH
  ENABLED = TRUE
  OAUTH_CLIENT = TABLEAU_DESKTOP
  OAUTH_ISSUE_REFRESH_TOKENS = TRUE
  OAUTH_REFRESH_TOKEN_VALIDITY = 86400;

-- カスタムアプリケーション向け(Confidentialクライアント)
CREATE SECURITY INTEGRATION sf_oauth_webapp
  TYPE = OAUTH
  ENABLED = TRUE
  OAUTH_CLIENT = CUSTOM
  OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'
  OAUTH_REDIRECT_URI = 'https://myapp.example.com/oauth/callback'
  OAUTH_ISSUE_REFRESH_TOKENS = TRUE
  OAUTH_REFRESH_TOKEN_VALIDITY = 7776000;

-- SPA/モバイル向け(Publicクライアント)
CREATE SECURITY INTEGRATION sf_oauth_spa
  TYPE = OAUTH
  ENABLED = TRUE
  OAUTH_CLIENT = CUSTOM
  OAUTH_CLIENT_TYPE = 'PUBLIC'
  OAUTH_REDIRECT_URI = 'https://spa.example.com/callback'
  OAUTH_ISSUE_REFRESH_TOKENS = TRUE
  OAUTH_REFRESH_TOKEN_VALIDITY = 3600;

External OAuthのロールマッピング

-- スコープベースのロール制御(デフォルト)
-- IdP側のトークンスコープに以下を含める:
--   session:role:ANALYST_ROLE
-- → Snowflakeセッションでは ANALYST_ROLE が使用される

-- ANY_ROLE_MODEの設定変更
ALTER SECURITY INTEGRATION ext_oauth_azure
  SET EXTERNAL_OAUTH_ANY_ROLE_MODE = 'ENABLE';
-- → ユーザーに付与されている任意のロールを使用可能

-- ENABLE_FOR_PRIVILEGE(ACCOUNTADMINを除外)
ALTER SECURITY INTEGRATION ext_oauth_azure
  SET EXTERNAL_OAUTH_ANY_ROLE_MODE = 'ENABLE_FOR_PRIVILEGE';

OAuth認証フロー

External OAuthの場合、クライアントアプリは外部認証サーバーからアクセストークンを取得し、 そのトークンをSnowflakeドライバの接続パラメータに渡します。 Snowflakeはトークンの署名を検証し、クレームからユーザーを特定してセッションを確立します。

-- Python Connectorでの接続例(External OAuth)
import snowflake.connector

conn = snowflake.connector.connect(
    account='<account>',
    authenticator='oauth',
    token='<external_oauth_access_token>',
    warehouse='COMPUTE_WH',
    database='ANALYTICS',
    schema='PUBLIC'
)

-- SnowSQL接続例(External OAuth)
-- snowsql -a <account> --authenticator oauth --token <access_token>

管理と監査

-- Integration一覧の確認
SHOW SECURITY INTEGRATIONS;

-- Integration詳細(client_idの確認等)
DESCRIBE SECURITY INTEGRATION sf_oauth_webapp;

-- OAuth接続の監査(LOGIN_HISTORY)
SELECT
  user_name,
  client_ip,
  first_authentication_factor,
  second_authentication_factor,
  is_success,
  error_message,
  event_timestamp
FROM SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY
WHERE first_authentication_factor = 'OAUTH_ACCESS_TOKEN'
  AND event_timestamp >= DATEADD(DAY, -7, CURRENT_TIMESTAMP())
ORDER BY event_timestamp DESC;

問題で確認

Security & Governance

問題 1

カスタムWebアプリケーションからExternal OAuth(Azure AD)を使ってSnowflakeに接続している。ユーザーがUSE ROLE DATA_ENGINEERを実行するとエラーが発生するが、同じユーザーがSnowsightにパスワード認証でログインするとDATA_ENGINEERロールを使用できる。最も可能性の高い原因はどれか。

  1. External OAuth IntegrationのEXTERNAL_OAUTH_ANY_ROLE_MODEがDISABLEで、トークンのスコープにDATA_ENGINEERロールが含まれていない
  2. DATA_ENGINEERロールがEnterprise Edition以上でのみ利用可能な機能を使っている
  3. External OAuth IntegrationのENABLEDがFALSEに設定されている
  4. Azure ADのトークン有効期限が切れている

正解: A

EXTERNAL_OAUTH_ANY_ROLE_MODE = 'DISABLE'(デフォルト)では、OAuthトークンに含まれるスコープ(session:role:ROLE_NAME形式)で指定されたロールのみ使用可能です。トークンのスコープにDATA_ENGINEERが含まれていないため、USE ROLEが失敗します。パスワード認証ではこの制限がないため正常に動作します。解決策はIdP側でスコープにDATA_ENGINEERを追加するか、ANY_ROLE_MODEをENABLEに変更することです。

よくある質問

External OAuthとSnowflake OAuthでリフレッシュトークンの扱いはどう違いますか?

Snowflake OAuthではOAUTH_ISSUE_REFRESH_TOKENS = TRUEを設定し、OAUTH_REFRESH_TOKEN_VALIDITYで有効期間を制御します。リフレッシュトークンはSnowflakeが発行・管理します。External OAuthではリフレッシュトークンは外部認証サーバー(Azure AD、Okta等)が管理し、Snowflake側ではリフレッシュトークンの有効期間を制御できません。External OAuth環境でのトークン有効期間管理はIdP側で設定します。

External OAuthでEXTERNAL_OAUTH_ANY_ROLE_MODEを有効にすべきですか?

EXTERNAL_OAUTH_ANY_ROLE_MODE = 'DISABLE'(デフォルト)では、外部OAuthトークンに含まれるスコープ(sn:role:ROLE_NAME形式)に対応するロールのみ使用可能です。ENABLEに設定すると、ユーザーに付与されている任意のロールを使用できます。セキュリティの観点からはDISABLEのままスコープで制御するのが望ましいですが、複数ロールの柔軟な切り替えが必要な場合はENABLEを検討します。ENABLE_FOR_PRIVILEGEではACCOUNTADMINを除外する中間的な設定も可能です。

Snowflake OAuthのOAUTH_CLIENTプリセットにはどのような種類がありますか?

Snowflakeは主要BIツール向けにTABLEAU_DESKTOP、TABLEAU_SERVER、LOOKERなどのプリセットを用意しています。プリセットを使うとリダイレクトURIやクライアントタイプが自動設定されます。CUSTOMを指定すると任意のアプリケーション向けにOAUTH_REDIRECT_URIやOAUTH_CLIENT_TYPEを手動で設定できます。OAUTH_CLIENT_TYPEにはCONFIDENTIAL(サーバーサイドアプリ)とPUBLIC(SPAやモバイル)があり、CUSTOMの場合に指定が必要です。

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

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.