外部 OAuth 用カスタムクライアントの構成

このトピックでは、Snowflakeデータへの安全でプログラム的なアクセスを容易にするために、Snowflakeを OAuth リソースとして、またカスタムクライアントを外部 OAuth 認証サーバーとして構成する方法について説明します。

このトピックの内容:

概要

Snowflakeは、、ユーザーの確認と OAuth アクセストークンの生成のために サポートされている 以外ではサポートされていないIDプロバイダー(IdPs)のカスタム統合をサポートして、Snowflakeデータへの安全なプログラムアクセスを容易にします。

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

外部 OAuth カスタムクライアント用として次の表は、Snowflakeがアクセストークンを処理するために外部 OAuth アクセストークンに含める必要がある必要なペイロード情報を示しています。クレーム列の詳細については、 JWTクレーム をご参照ください。

クレーム

説明

scp

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

scope

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

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"
  ]
}

構成手順

次のステップでは、Snowflake Security Integrationの作成に必要な値を取得するために、 IdP と環境の構成ができることを前提としています。

重要

このトピックのステップは、外部 OAuth 用にカスタムクライアントを構成する方法の 代表的な例 です。

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

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

組織が必要なすべての規制とコンプライアンス要件を満たしていることを確認するために、認証サーバーの構成に関する内部セキュリティポリシーを必ず確認してください。

ステップ1:外部 OAuth を使用するための主要な環境値を取得する

IdP および認証サーバーを構成します。次のステップでSnowflake Security Integrationに含める次の値を特定する必要があります。

発行者 URL

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

RSA 公開キー

この値を external_oauth_rsa_public_key_value に含めます。

オーディエンス URLs

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

スコープ属性

この値は、 scp または scope を使用するように構成できます。この値を external_oauth_scope_mapping_attribute に含めます。詳細については、 外部 OAuth トークンペイロード要件 をご参照ください。

ユーザー属性

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

Snowflakeユーザー属性

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

ステップ2:Snowflakeで OAuth 認証サーバーを作成する

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

重要

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

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

Snowflakeで OAuth 認証サーバーを作成する

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

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

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

詳細については、 ALTER SECURITY INTEGRATION をご参照ください。

外部 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;
    
    revoke USE_ANY_ROLE on integration external_oauth_1 from role1;
    

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

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

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

現在、ネットワークポリシーは外部 OAuth セキュリティ統合に追加できません。

ユースケースで OAuth とSnowflakeネットワークポリシーが必要な場合は、 Snowflake OAuth を使用してください。

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

テスト手順

認可サーバーとしてカスタムクライアントを使用しながら OAuth をテストするコンテキストでは、次を実行する必要があります。

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

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

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

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

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

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

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

    • スコープを含める

サンプルコマンドはアナリストをリクエストし、 OAuth 認証サーバーで 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>

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_name>",
   authenticator="oauth",
   token="<external_oauth_access_token>",
   warehouse="test_warehouse",
   database="test_db",
   schema="test_schema"
)

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