SnowflakeのOAuth Security Integrationは、パスワードを使わずにOAuth 2.0プロトコルでSnowflakeに認証する仕組みを提供します。External OAuth(外部認証サーバーがトークンを発行)とSnowflake OAuth(Snowflake自身がトークンを発行)の2つのモデルがあり、 ユースケースに応じて使い分けます。
| 比較項目 | External OAuth | Snowflake OAuth |
|---|---|---|
| 認可サーバー | 外部IdP(Azure AD、Okta、Custom) | Snowflake自身 |
| TYPE値 | EXTERNAL_OAUTH | OAUTH |
| トークン発行元 | 外部認証サーバー | Snowflake |
| トークン検証 | JWKSエンドポイントで公開鍵を取得して検証 | Snowflake内部で検証 |
| ユーザーマッピング | トークンのクレーム(upn、email等)からSnowflakeユーザーを特定 | Snowflakeのログイン情報で認証 |
| ロール制御 | スコープ(sn:role:ROLE_NAME)またはANY_ROLE_MODE | セッションのデフォルトロール |
| リフレッシュトークン管理 | 外部認証サーバーが管理 | Snowflakeが管理(有効期間設定可能) |
| 主な用途 | カスタムアプリ、マイクロサービス | BIツール(Tableau、Looker等)、Snowsight |
| クライアント認証 | 外部IdPのclient_id/secret | Snowflakeが発行するclient_id/secret |
| 複数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';-- 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;-- スコープベースのロール制御(デフォルト)
-- 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';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ロールを使用できる。最も可能性の高い原因はどれか。
正解: 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の場合に指定が必要です。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...