Snowflake 用の外部 OAuth 設定: クライアント クレデンシャルのフロー
OAuth クライアント クレデンシャル認証を使用すると、ユーザーの操作を必要とせずに、Snowflake へのマシン間接続が可能になります
。この方法は次のような場合に最適です。
-
データの自動更新のためのサービス アカウント
-
スケジュールされている抽出ジョブ
-
CI/CD パイプライン
-
埋め込みクレデンシャルを必要とするパブリッシュされたデータ ソース
認可コードのフローを使用する標準の OAuth とは異なり、クライアント クレデンシャルのフローは
ユーザーにサインインを求めるプロンプトを表示しません。代わりに、Tableau はクライアント ID とクライアント シークレットを使用して、ID プロバイダーと直接認証を行います
。
注: クライアント クレデンシャルのフローには、Snowflake の外部 OAuth 機能と、対応できる ID プロバイダーが必要です。これは、Snowflake のネイティブ OAuth とは異なります。
はじめる前に
Snowflake で OAuth クライアント クレデンシャルを使用するには、次が必要です。
| 要件 | 説明 |
|---|---|
| ID プロバイダー | クライアント クレデンシャル グラント用に設定された Okta、Azure AD、または Ping Federate |
| Snowflake のアカウント | Enterprise 版またはそれ以上、および ACCOUNTADMIN アクセス権 |
| OAuth アプリケーション | API サービス (Okta)、アプリの登録 (Azure AD)、または同等のサービス |
| カスタム スコープ | Snowflake ロール割り当てのスコープ (例: `session:role:SYSADMIN`) |
ID プロバイダーの設定
以下の手順では、例として Okta を使用します。その他のプロバイダーについては、クライアント クレデンシャルの設定について、各プロバイダーのドキュメントを参照してください。
ステップ 1: API サービス アプリケーションの作成
-
Okta Admin Console にサインインします。
-
[アプリケーション]、[アプリケーション] の順に移動します。
-
[アプリ統合の作成] を選択します。
-
**API サービス** を選択し、**次へ** を選択します。
-
アプリケーション名を入力します (例:
snowflake-tableau-service)。 -
[保存] を選択します。
-
クライアント ID と クライアント シークレット をコピーします。これらの値は後で必要になります。
ステップ 2: DPoP の無効化 (有効な場合)
クライアント クレデンシャルのフローでは、DPoP (所有証明の提示) を無効にする必要があります。
-
アプリケーション設定で、[全般]、[クライアント資格情報] の順に移動します。
-
トークン要求の [DPoP (所有証明の提示) を要求] チェックボックスをオフにします。
-
[保存] を選択します。
Step 3: カスタム スコープの追加
Snowflake では、認証されたセッションにロールを割り当てるためにカスタム スコープが必要です。
-
[セキュリティ]、[API]、[認可サーバー] の順に移動します。
-
[既定] の認可サーバー (またはカスタム サーバー) を選択します。
-
[スコープ] タブを選択し、[スコープの追加] を選択します。
-
これらのスコープを追加します。
スコープ名 説明 Snowflake Snowflake の一般的なアクセス スコープ session:role:SYSADMIN SYSADMIN ロールを割り当てます (お使いのロールに合わせて調整) 注: サービス アカウントに必要なその他のロールのスコープも作成してください。
ステップ 4: アクセス ポリシーの設定
-
[アクセス ポリシー] タブを選択します。
-
既存のポリシーを選択するか、新しいポリシーを作成してください。
-
これらの設定でルールを追加します。
-
グラント タイプ: クライアント クレデンシャル
-
スコープ: 任意のスコープ (または特定のスコープを選択)
-
-
[ルールの作成] または [保存] を選択します。
Snowflake の設定
ACCOUNTADMIN として、次の SQL ステートメントを Snowflake で実行します。プレースホルダーの値は設定に合わせて置き換えてください。
ステップ 1: 外部 OAuth 統合の作成
USE ROLE ACCOUNTADMIN;
CREATE OR REPLACE SECURITY INTEGRATION okta_oauth_integration
TYPE = EXTERNAL_OAUTH
ENABLED = TRUE
EXTERNAL_OAUTH_TYPE = OKTA
EXTERNAL_OAUTH_ISSUER = 'https://<your-okta-domain>.okta.com/oauth2/default'
EXTERNAL_OAUTH_JWS_KEYS_URL = 'https://<your-okta-domain>.okta.com/oauth2/
default/v1/keys'
EXTERNAL_OAUTH_TOKEN_USER_MAPPING_CLAIM = 'sub'
EXTERNAL_OAUTH_SNOWFLAKE_USER_MAPPING_ATTRIBUTE = 'login_name'
EXTERNAL_OAUTH_AUDIENCE_LIST = ('api://default', 'snowflake')
EXTERNAL_OAUTH_ANY_ROLE_MODE = 'ENABLE';
| パラメーター | 説明 |
|---|---|
EXTERNAL_OAUTH_TYPE
|
ID プロバイダー: OKTA、AZURE、または PING_FEDERATE |
EXTERNAL_OAUTH_ISSUER
|
認可サーバーからの発行者の URL |
EXTERNAL_OAUTH_JWS_KEYS_URL
|
トークンの検証用の JWKS エンドポイント |
EXTERNAL_OAUTH_TOKEN_USER_MAPPING_CLA
IM
|
ユーザーを識別する JWT クレームです。Okta には sub を使用します。 |
EXTERNAL_OAUTH_ANY_ROLE_MODE
|
スコープを介したロールの割り当てを許可するには、ENABLE に設定します。 |
ステップ 2: サービス ユーザーの作成
OAuth クライアント ID と一致する LOGIN_NAME を持つ Snowflake ユーザーを作成します。
CREATE USER IF NOT EXISTS service_account_user
LOGIN_NAME = '<your-okta-client-id>'
DISPLAY_NAME = 'OAuth Service Account'
MUST_CHANGE_PASSWORD = FALSE
DISABLED = FALSE;
-- Grant role to the service user
GRANT ROLE SYSADMIN TO USER service_account_user;
-- Set the default role
ALTER USER service_account_user SET DEFAULT_ROLE = 'SYSADMIN';
-- Grant warehouse access
GRANT USAGE ON WAREHOUSE <your-warehouse> TO USER service_account_user;
-- Grant database and schema access
GRANT USAGE ON DATABASE <your-database> TO USER service_account_user;
GRANT USAGE ON SCHEMA <your-database>.<your-schema> TO USER
service_account_user;
GRANT SELECT ON ALL TABLES IN SCHEMA <your-database>.<your-schema> TO USER
service_account_user;
重要: LOGIN_NAME は、OAuth トークンの sub クレームと完全に一致している必要があります。Okta API サービス アプリケーションの場合、これがクライアント ID です。
Tableau Desktop からの接続
-
Tableau Desktop で [接続]、[Snowflake] の順に選択します。
-
接続の詳細を入力します。
フィールド 値 サーバー Snowflake アカウントの URL (例: account.snowflakecomputing.com)ロール 使用するロール (例: SYSADMIN)ウェアハウス お使いの Snowflake ウェアハウス 認証 OAuth クライアント クレデンシャル -
Oauth の設定を入力します。
フィールド 値 OAuth トークン要求 URL https://<your-okta-domain>.okta.com/oauth2/default/ v1/tokenユーザー名 OAuth クライアント ID パスワード OAuth クライアント シークレット OAuth のスコープ snowflake session:role:SYSADMIN注: OAuth スコープには、ロールの割り当て用に設定した任意のカスタム スコープが含まれている必要があります。
-
[サインイン] を選択します。
Tableau Cloud または Tableau Server へのパブリッシュ
OAuth クライアント クレデンシャルを使用するワークブックまたはデータ ソースをパブリッシュする場合、
-
[パブリッシュ] ダイアログで、[データ ソース] の横にある [編集] を選択します。
-
[認証] で、[埋め込みパスワード] を選択します。
-
クライアント クレデンシャルは、パブリッシュされたコンテンツに埋め込まれています。
重要: 標準の OAuth とは異なり、クライアント クレデンシャルは埋め込みパスワードとして処理されます。パブリッシュされたコンテンツにアクセスするユーザーは、自身の ID ではなく、サービス アカウントのクレデンシャルを使用します。
クレデンシャルのローテーション
OAuth のクライアント シークレットがローテーションされる際、Tableau Cloud で埋め込みクレデンシャルを更新します。
-
Tableau Cloud にサインインします。
-
パブリッシュされたデータ ソースに移動します。
-
[接続]を選択します。
-
新しいクライアント シークレットで接続を更新します。
自動ローテーションの場合は、Tableau REST API を使用して、接続のクレデンシャルをプログラムで更新します。
よくある質問
標準の OAuth ではなく、OAuth クライアント クレデンシャルを使用すべき場合は?
無人でマシン対マシンの認証が必要な場合は、クライアント クレデンシャルを使用します。標準の
OAuth では、最初のサインインと定期的な再認証でユーザーによる操作が必要です。クライアント クレデンシャルでは、
サービス アカウントの ID を使用し、ユーザー操作を必要としません。
Snowflake のネイティブ OAuth でクライアント クレデンシャルを使用できますか?
いいえ。Snowflake のネイティブ OAuth では、認可コードのフローのみがサポートされています。クライアント クレデンシャルでは、対応している ID プロバイダー (Okta、Azure AD、Ping Federate) を使用した外部 OAuth が必要です。
パブリッシュ済みコンテンツのシークレットのローテーションはどのように処理しますか?
OAuth クライアント シークレットがローテーションされたら、Tableau Cloud で埋め込みの認証資格情報を更新する必要があります。Tableau Cloud UI を介して手動で行うか、Tableau REST API を使用してプログラムで実行できます。シークレットのローテーション ワークフローの一部として、このプロセスの自動化を検討してください。
EXTERNAL_OAUTH_ANY_ROLE_MODE が有効になっているのに、接続がロール エラーで失敗するのはなぜですか?
Snowflake では、OAuth トークンにロール情報を含める必要があります。カスタム スコープ (例: session:role:SYSADMIN) を認可サーバーに追加し、Tableau から接続するときにそのスコープを [OAuth スコープ] フィールドに含めてください。
トラブルシューティング
| エラー メッセージ | 原因 | 解決策 |
|---|---|---|
| 「ユーザーが存在しないか、認可されていません」 | Snowflake ユーザー LOGIN_NAME が OAuth クライアント ID と一致しない |
ユーザーの LOGIN_NAME を sub クレーム (Okta のクライアント ID) と一致するように設定します。 |
| 「要求されたロールがアクセス トークンに記載されていません」 | トークンにロール スコープがない | session:role:<ROLE> スコープを認可サーバーに追加し、それを OAuth スコープに含めます。 |
| 「無効な DPoP 証明」 | Okta で DPoP が有効になっている | Okta アプリで [DPoP (所有証明の提示) を要求] を無効にします |
| 「無効なスコープ」 | カスタム スコープが設定されていない | 必要なスコープを認可サーバーに追加します。openid は含めないでください。 |
| 「トークン検証の失敗」 | JWKS URL または issuer が正しくない | EXTERNAL_OAUTH_JWS_KEYS
_URL と EXTERNAL_OAUTH_ISSUER が認可サーバーと一致することを確認します。 |
関連項目
-
Tableau Server での Snowflake 接続用 OAuth の設定(新しいウィンドウでリンクが開く) - Snowflake を使用した標準的な OAuth 認証について説明します。
-
外部 OAuth セキュリティ統合(新しいウィンドウでリンクが開く) - 外部 OAuth プロバイダーを設定するための Snowflake のドキュメント。
-
Okta クライアント クレデンシャルのフロー(新しいウィンドウでリンクが開く) - クライアント クレデンシャルを実装するための Okta ドキュメント。
-
データ ソース接続の更新(新しいウィンドウでリンクが開く) - クレデンシャルの更新に関する Tableau REST API リファレンス。
