外部 OAuth 用 PingFederate の構成

このトピックでは、Snowflakeデータへの安全でプログラム的なアクセスを促進するために、Snowflakeを OAuth リソースとして、またPing Identity PingFederate を外部 OAuth 認証サーバーとして設定する方法について説明します。

このトピックの内容:

構成手順

次の2つのステップは、環境に PingFederate OAuth 認証サーバー、 OAuth クライアント、スコープ、および必要なメタデータに関連する設定が何もないことを前提としています。これらのステップは、 PingFederate の構成方法の代表的な例でもあります。

最初のステップからはじめる情報は、Snowflakeのセキュリティ統合を作成するために使用されます。

既に PingFederate 認証サーバーとクライアントが構成されている場合、以下のすべてのステップを完了する必要はありません。むしろ、最初のステップをざっと見て、目的の情報を取得し、スコープを作成し、1つ以上のポリシーにスコープを割り当て、メタデータにアクセスできることを確認してください。

PingFederate OAuth 認証サーバーとクライアントが構成されていない場合は、両方のステップを完了してください。

重要

このトピックのステップは、外部 OAuth 用に PingFederate を構成する方法の 代表的な例 です。

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

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

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

ステップ1は、 OAuth 2.0上の PingIdentity ドキュメントから派生しています。 PingIdentity が、用語、ユーザーインターフェイス、および認証サーバーに関連するオプションを定義する方法の詳細については、次の PingIdentity ガイドをご参照ください。

PingFederate を構成する

  1. PingFederate サーバーダウンロードページに移動し、 オペレーティングシステム に基づいて PingFederate インスタンスをダウンロードまたはアップグレードします。

  2. ご使用のオペレーティングシステムの PingFederate インストールガイドを使用してください。インストール後、 PingFederate にアクセスします。

  3. OAuth Server パネルの Exclusive Scopes インターフェイスに移動して、 OAuth スコープを作成します。

  4. Snowflakeロールをスコープとして追加するには、ロールを Scope Value に追加します。Snowflakeロールには session:role: プレフィックスが必要です(例: Snowflakeアナリストロールの場合は、 session:role:analyst と入力)。

  5. Scope Description ボックスにスコープの説明を入力し、 Add をクリックします。

  6. OAuth Server タブに移動して、新しいクライアントを作成します。次の値を確認します。

    フィールド

    NAME

    PingFederate OAuth 認証サーバーのわかりやすい名

    DESCRIPTION

    PingFederate OAuth 認証サーバーのわかりやすい説明

    CLIENT AUTHENTICATION

    CLIENT SECRET

    EXCLUSIVE SCOPES

    スコープ(つまり、Snowflakeロール)を選択します

    ALLOWED GRANT TYPES

    Refresh Token および Resource Owner Password Credentials の選択

    DEFAULT ACCESS TOKEN MANAGER

    JSON ウェブトークン

  7. Security タブに移動して、証明書をエクスポートします。次のステップで使用するために、証明書から公開キーを抽出します。

  8. OAuth Server タブと Access Token Management | Create Access Token Management Instance の下の Instance Configuration タブに移動し、それから

    • ISSUER CLAIM VALUE をこの OAuth 認証サーバーを参照する一意の識別子に更新します。

    • AUDIENCE CLAIM VALUE をSnowflakeアカウント URL に更新します(例: https://<アカウント識別子>.snowflakecomputing.com)。使用可能な URL 形式のリストについては、 URL での接続 をご参照ください。

  9. 開発者ツール セクションから PingFederate OAuth Playgroundアドオンをダウンロードします。このクライアントは API リクエストを実行します。

  10. OAuth Playground をインストールします。

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

このステップには、Snowflakeが PingIdentity と安全に通信し、 PingIdentity からのトークンを検証し、 OAuth トークンに関連付けされたユーザーロールに基づいて、適切なSnowflakeデータアクセスをユーザーに提供することを確実にするためのセキュリティ統合をSnowflakeに作成することが含まれます。

Snowflakeウェブインターフェイスまたは SnowSQLで次のステートメントを実行します。

external_oauth_issuer の値は、ステップ1.8で設定された一意の識別子である必要があります。たとえば、一意の識別子の値が 27f10cde-a964-4499-a88c-0c598883e5ad の場合は、 <一意のID>'27f10cde-a964-4499-a88c-0c598883e5ad' に置き換えます。一意の識別子は、一重(つまり、垂直)引用符で囲む必要があります。

ユースケースと構成のニーズに最適なセキュリティ統合を選択します。詳細については、 CREATE SECURITY INTEGRATION をご参照ください。

重要

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

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

PingFederate のセキュリティ統合を作成する

create or replace security integration external_oauth_pf_1
    type = external_oauth
    enabled = true
    external_oauth_type = ping_federate
    external_oauth_rsa_public_key = '<BASE64_PUBLIC_KEY>'
    external_oauth_issuer = '<unique_id>'
    external_oauth_token_user_mapping_claim = 'username'
    external_oauth_snowflake_user_mapping_attribute = 'login_name';
Copy

このセキュリティ統合では、 external_oauth_rsa_public_key パラメーターを使用します。Snowflakeは公開キーの値を使用して、 JWT アクセストークンの署名を確認します。

オーディエンスでセキュリティ統合を作成する

セキュリティ統合の external_oauth_audience_list パラメーターは PingFederate の構成時に指定した Audience Claim Value と一致している必要があります。

create security integration external_oauth_pf_2
    type = external_oauth
    enabled=true
    external_oauth_type = ping_federate
    external_oauth_issuer = '<ISSUER>'
    external_oauth_rsa_public_key = '<BASE64_PUBLIC_KEY>'
    external_oauth_audience_list = ('<snowflake_account_url>')
    external_oauth_token_user_mapping_claim = 'username'
    external_oauth_snowflake_user_mapping_attribute = 'login_name';
Copy

このセキュリティ統合では、 external_oauth_rsa_public_key パラメーターを使用します。Snowflakeは公開キーの値を使用して、 JWT アクセストークンの署名を確認します。

外部 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 でのネットワークポリシーの使用

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

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

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

外部 OAuth での複製の使用

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

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

テスト手順

認証サーバーとして PingFederate を使用しながら OAuth をテストするというコンテキストでは、次を実行する必要があります。

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

  2. login_name 属性値が <PING_USER_USERNAME> に設定されたテストユーザーがSnowflakeに存在することを確認します。

  3. このユーザーにアナリストのロールを付与します。

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

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

    • リソース所有者に設定されたタイプを付与します。

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

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

    • 必要なスコープを含めます。

サンプルコマンドはアナリストをリクエストし、 session:role:analystPingFederate > OAuth Server > Exclusive Scopes で定義されていることを前提としています。

次のコマンドを使用して、Pingからアクセストークンを取得します。

curl -k 'https://10.211.55.4:9031/as/token.oauth2' \
  --data-urlencode 'client_id=<CLIENT_ID>&grant_type=password&username=<USERNAME>&password=<PASSWORD>&client_secret=<CLIENT_SECRET>&scope=session:role:analyst'
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に安全に接続できるようになりました。