外部 OAuth 用のカスタム認証サーバーを構成する

このトピックでは、Snowflakeで外部 OAuth セキュリティ統合を作成する方法について説明します。カスタム認証サーバーを使用した認証により、クライアントはSnowflakeデータにアクセスできるようになります。

承認サーバーがカスタムプロバイダーではなく、 サポートされているIDプロバイダー(IdP) である場合は、その特定の IdP の構成に焦点を当てたトピックをご参照ください。

このトピックの内容:

外部 OAuth トークンペイロード要件

カスタム認証サーバーがSnowflakeに送信するアクセストークンには、次のペイロード情報が含まれている必要があります。クレーム列の詳細については、 JWTクレーム をご参照ください。

クレーム

説明

scp

スコープ。アクセストークン内のスコープのリスト。

scope

スコープ。

アクセストークン内のスコープのコンマで区切られた文字列。

Snowflakeは、カスタム認証サーバーのために外部 OAuth セキュリティ統合を 作成 または 変更 するときに EXTERNAL_OAUTH_SCOPE_DELIMITER プロパティを設定することにより、スペース(つまり、 ' ')などの区切り文字に任意の1文字を指定することをサポートします。

Snowflakeアカウントでこのプロパティを有効にするには、 Snowflakeサポート にご連絡ください。

aud

オーディエンス。アクセストークンが対象とする受信者を文字列 URI として識別します。

exp

有効時間。それ以降、アクセストークンの処理を 受け入れてはならない 有効時間を識別します。

iss

発行者。アクセストークンを発行したプリンシパルを文字列 URI として識別します。

iat

発行時刻。必須です。JWT が発行された時刻を識別します。

注釈

Snowflakeは、アクセストークンの処理を受け入れては ならない 時間を識別する、 nbf (それ以前ではない)要求をサポートします。

カスタム認証サーバーが nbf (それ以前ではない)要求をサポートしている場合は、オプションで nbf 要求をアクセストークンに含めることができます。

トークンに必要な情報が含まれていることを確認するために、 JSON ウェブトークン サイトでトークンをテストできます。

PAYLOAD: DATA インターフェイスは、次のようにトークンペイロードを表示します。

{
  "aud": "<audience_url>",
  "iat": 1576705500,
  "exp": 1576709100,
  "iss": "<issuer_url>",
  "scp": [
    "session:role:analyst"
  ]
}
Copy

構成手順

次のステップでは、Snowflakeセキュリティ統合の作成に必要な値を取得するために、カスタム認証サーバーと環境の構成ができることを前提としています。

重要

このトピックのステップは、カスタム認証サーバーを構成する方法の 代表的な例 です。

環境を任意の状態に構成し、 外部 OAuth セキュリティ統合 に必要な情報を取得できる限り、任意の OAuth フローを使用できます。

次のステップは、Snowflakeで外部 OAuth セキュリティ統合を作成するために必要な情報を取得するためのガイドです。

カスタム認証サーバーを構成する前に、社内のセキュリティポリシーを確認して、組織がすべての規制とコンプライアンス要件を満たすようにしてください。

外部 OAuth を使用するための主要な環境値を取得する

IdP と認証サーバーを構成するときは、次の値を収集して、外部 OAuth セキュリティ統合を定義する必要があります。

発行者 URL

この URL を external_oauth_issuer パラメーターに含めます。

RSA 公開キー

この値を external_oauth_rsa_public_key パラメーターと合わせて含めます。

オーディエンス URLs

複数のオーディエンス URL が必要な場合は、 external_oauth_audience_list パラメーター内で、各 URL をコンマで区切ります。

スコープ属性

この値は scp または scope に設定できます。デフォルトでは、この値は scp です。

external_oauth_scope_mapping_attribute パラメーターの値をこの値に設定できます。

デフォルト値 scp を使用しない場合は、 external_oauth_scope_mapping_attribute パラメーターの値を scope に設定します。

詳細については、 外部 OAuth トークンペイロード要件 をご参照ください。

ユーザー属性

この属性は、 IdP のユーザーを識別する属性を参照します。この属性値を external_oauth_user_mapping_claim パラメーターに含めます。

Snowflakeユーザー属性

ユーザーを識別するSnowflakeの属性。この値を external_oauth_snowflake_user_mapping_attribute パラメーターに含めます。

Snowflakeで外部 OAuth セキュリティ統合を作成する

このステップでは、Snowflake に外部 OAuth セキュリティ統合を作成します。外部 OAuth セキュリティ統合により、Snowflakeはカスタム認証サーバーからのアクセストークンと安全に通信して検証し、アクセストークンに関連付けられたユーザーロールに基づいて、Snowflakeデータへのアクセスをユーザーに提供できます。詳細については、 CREATE SECURITY INTEGRATION をご参照ください。

重要

この SQL コマンドを実行できるのは、アカウント管理者またはグローバル CREATE INTEGRATION 権限を持つロールのみです。

外部 OAuth セキュリティ統合パラメーターの値は大文字と小文字が区別され、外部 OAuth セキュリティ統合に入力する値は、環境内の値と一致する必要があります。値の大文字と小文字が一致しない場合は、アクセストークンが検証されず、認証試行に失敗します。

Snowflakeで外部 OAuth セキュリティ統合を作成する

create security integration external_oauth_custom
    type = external_oauth
    enabled = true
    external_oauth_type = custom
    external_oauth_issuer = '<authorization_server_url>'
    external_oauth_rsa_public_key = '<public_key_value>'
    external_oauth_audience_list = ('<audience_url_1>', '<audience_url_2>')
    external_oauth_token_user_mapping_claim = 'upn'
    external_oauth_snowflake_user_mapping_attribute = 'login_name';
Copy

外部 OAuth セキュリティ統合の変更

セキュリティ統合で ALTER ステートメントを実行することにより、外部 OAuth セキュリティ統合を更新できます。

詳細については、 ALTER SECURITY INTEGRATION (外部 OAuth) をご参照ください。

外部 OAuth での ANY ロールの使用

Snowflakeにセキュリティ統合を作成する構成ステップでは、 OAuth アクセストークンにスコープ定義が含まれています。したがって、実行時に外部 OAuth セキュリティ統合を使用すると、 OAuth クライアントもユーザーも、 OAuth アクセストークンで未定義のロールを使用できなくなります。

アクセストークンを検証してセッションを作成した後、 ANY ロールは OAuth クライアントとユーザーがそのロールを決定できるようにします。必要に応じて、クライアントまたはユーザーは、 OAuth アクセストークンで定義されたロールとは異なるロールに切り替えることができます。

ANY ロールを構成するには、スコープを SESSION:ROLE-ANY として定義し、 external_oauth_any_role_mode パラメーターを使用してセキュリティ統合を構成します。このパラメーターには、指定できる3つの文字列値があります。

  • DISABLE の場合、 OAuth クライアントまたはユーザーは、ロール(つまり、 use role <ロール>;)を切り替えられません。デフォルト。

  • ENABLE の場合、 OAuth クライアントまたはユーザーは、ロールを切り替えられます。

  • ENABLE_FOR_PRIVILEGE OAuth クライアントまたはユーザーは、 USE_ANY_ROLE 権限を持つクライアントまたはユーザーのロールのみを切り替えられます。この権限は、ユーザーが使用できる1つ以上のロールに対して付与および取り消しができます。例:

    grant USE_ANY_ROLE on integration external_oauth_1 to role1;
    
    Copy
    revoke USE_ANY_ROLE on integration external_oauth_1 from role1;
    
    Copy

次のようにセキュリティ統合を定義します。

create security integration external_oauth_1
    type = external_oauth
    enabled = true
    external_oauth_any_role_mode = 'ENABLE'
    ...
Copy

外部 OAuth でのセカンダリロールの使用

プライマリロールに必要なスコープが外部トークンで渡されます。ユーザーの既定のロール(session:role-any)、またはユーザーに付与された特定のロール(session:role:<ロール名>)のいずれかです。

デフォルトでは、Snowflakeは、セッション内にあるユーザー(つまり、 DEFAULT_SECONDARY_ROLES)のデフォルトの セカンダリロール をアクティブ化 しません

セッション内にあるユーザーのデフォルトのセカンダリロールをアクティブ化し、外部 OAuth の使用中に USE SECONDARY ROLES コマンドの実行を許可するには、次のステップを実行します。

  1. 接続のセキュリティ統合を構成します。セキュリティ統合の作成時(CREATE SECURITY INTEGRATION を使用)またはその後(ALTER SECURITY INTEGRATION を使用)に、EXTERNAL_OAUTH_ANY_ROLE_MODE パラメーター値を ENABLE または ENABLE_FOR_PRIVILEGE に設定します。

  2. トークンのスコープ属性に静的な値 session:role-any を渡すように認証サーバーを構成します。スコープパラメーターの詳細については、 外部 OAuth の概要 をご参照ください。

外部 OAuth でのクライアントリダイレクトの使用

Snowflakeは、サポートされているSnowflakeクライアントでのクライアントリダイレクトおよび外部 OAuth の使用を含め、外部 OAuth でのクライアントリダイレクトの使用をサポートしています。

詳細については、 クライアント接続のリダイレクト をご参照ください。

外部 OAuth でのネットワークポリシーの使用

現在、ネットワークポリシーは外部 OAuth セキュリティ統合に追加できません。ただし、Snowflakeアカウント全体に広く適用されるネットワークポリシーを実装することはできます。

ユースケースで OAuth セキュリティ統合に固有のネットワークポリシーが必要な場合は、 Snowflake OAuth を使用します。このアプローチにより、Snowflake OAuth ネットワークポリシーとSnowflakeアカウントに適用される他のネットワークポリシーを区別することができるようになります。

詳細については、 ネットワークポリシー をご参照ください。

外部 OAuth での複製の使用

Snowflakeは、ソースアカウントからターゲットアカウントへの外部 OAuth セキュリティ統合の複製とフェールオーバー/フェールバックをサポートします。

詳細については、 複数のアカウントにわたるセキュリティ統合とネットワークポリシーの複製 をご参照ください。

テスト手順

カスタム認証サーバーの構成をテストするには、

  1. テストユーザーが IdP に存在し、パスワードを持っていることを確認します。

  2. login_name 属性値が <外部OAuthトークンユーザーマッピングクレーム> に設定されたテストユーザーが、Snowflakeに存在することを確認します。

  3. OAuth 2.0クライアントを登録します。

  4. 次のように、 OAuth 2.0クライアントがカスタムトークンエンドポイントに POST リクエストすることを許可します。

    • リソース所有者に設定された付与タイプ

    • clientID とシークレットを含む HTTP 基本認証ヘッダー

    • ユーザー名およびパスワードを含む FORM データ

    • スコープを含める

サンプルコマンドが ANALYST カスタマーロールをリクエストし、カスタム認証サーバーで session:role:analyst が定義されていることを前提としています。

cURL を使用してアクセストークンを取得する例を次に示します。

curl -X POST -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" \
  --user <OAUTH_CLIENT_ID>:<OAUTH_CLIENT_SECRET> \
  --data-urlencode "username=<IdP_USER_USERNAME>" \
  --data-urlencode "password=<IdP_USER_PASSWORD>" \
  --data-urlencode "grant_type=password" \
  --data-urlencode "scope=session:role:analyst" \
  <IdP_TOKEN_ENDPOINT>
Copy

OAuth によるSnowflakeへの接続

セキュリティ統合を構成し、アクセストークンを取得したら、次のいずれかを使用してSnowflakeに接続できます。

次の点に注意してください。

  • authenticator パラメーターを oauth に、 token パラメーターを external_oauth_access_token に設定する必要があります。

  • URL クエリパラメータとして token 値を渡す場合、 token 値を URL エンコードする必要があります。

  • token 値をプロパティオブジェクト(例: JDBC ドライバー)に渡す場合、変更は必要ありません。

たとえば、Pythonコネクタを使用している場合、以下に示すように接続文字列を設定します。

ctx = snowflake.connector.connect(
   user="<username>",
   host="<hostname>",
   account="<account_identifier>",
   authenticator="oauth",
   token="<external_oauth_access_token>",
   warehouse="test_warehouse",
   database="test_db",
   schema="test_schema"
)
Copy

外部 OAuth を使用して、Snowflakeに安全に接続できるようになりました。