外部 OAuth 用Oktaの構成

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

構成手順

次の5つのステップでは、Okta OAuth 認証サーバー、 OAuth クライアント、スコープ、および必要なメタデータに関連する構成が、環境に含まれていないことを前提としています。

ステップ1~3の情報を使用して、Snowflakeのセキュリティ統合を作成します。

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

Okta OAuth 認証サーバーとクライアントが設定されていない場合は、次の5つのステップをすべて完了します。

重要

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

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

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

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

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

Snowflakeで使用する OAuth 互換クライアントを作成する

  1. Okta管理コンソールに移動します。

  2. Applications をクリックします。

  3. Add Application をクリックします。

  4. Create New App をクリックします。

    • Platform には、 Native App を選択します。

  5. Create をクリックします。

  6. アプリケーションの名前を入力します。

  7. Login redirect URIs ボックスに、完全なSnowflake アカウント URL を追加します(つまり、 https://<アカウント識別子>.snowflakecomputing.com)。使用可能な URL 形式のリストについては、 URL での接続 をご参照ください。

  8. Save をクリックします。

  9. General インターフェイスの New Applications から、 Edit をクリックします。

  10. Refresh Token および Resource Owner Password を確認します。

  11. Save をクリックします。

  12. Client Credentials の横にある Edit ボタンをクリックします。

  13. Use Client Authentication オプションを選択します。

  14. Save をクリックします。

  15. Client Credentials コンテナーで、 ClientIDSecret を保存します。これらの2つの値は、以下のステップでそれぞれ <OAUTH_CLIENT_ID> および <OAUTH_CLIENT_SECRET> と呼ばれています。

OAuth 認証サーバーの作成

  1. Okta管理コンソールに移動します。

  2. Security メニューで、 API をクリックします。

  3. Authorization Servers をクリックします。

  4. Add Authorization Server をクリックします。

  5. 名前を入力します。

  6. Audience 値としてSnowflakeアカウント URL を入力します。使用可能な URL 形式のリストについては、 URL での接続 をご参照ください。

  7. Save をクリックします。

新しく追加された認証サーバーのために、次のステップを実行します。

  1. Issuer 値をコピーします。その形式は、 https://dev-390798.oktapreview.com/oauth2/auslh9j9vf9ej7NfT0h7 のようになります。この値は、次のステップで <OKTA_ISSUER> と呼ばれています。

  2. Scopes をクリックします。

  3. Add Scope をクリックします。

  4. Snowflakeロールをスコープとして追加するには、snowflakeロールの名前に session:role: プレフィックスを付けてスコープを入力します(例:Snowflake Analystロールの場合は、 session:role:analyst と入力)。

  5. Create をクリックします。

  6. Access Policies をクリックします。

  7. Add Policy をクリックします。

  8. ポリシーの名前と説明を入力します。前に作成したクライアントに割り当てて、 Create をクリックします。

  9. 新しく追加されたアクセスポリシーで、 Add Rule をクリックします。

  10. ルール名を入力します。

  11. 認証済みの Grant Types を選択します。組織のポリシーに一致する他の要素とともに Resource Owner PasswordClient Credentials を選択する必要があります。

  12. スコープの場合、任意のスコープ、またはこのポリシーに割り当てられたクライアントが(必要に応じて、更新トークンのoffline_accessを含めて)リクエストできるように、以前に作成された必要なスコープを選択できます。必要に応じて追加設定を構成します。

  13. Create Rule をクリックします。

Okta情報を収集する

  1. Okta管理コンソールに移動します。

  2. Security メニューで、 API をクリックします。

  3. Authorization Servers をクリックします。

  4. Snowflakeリソースの認証サーバーをクリックします。

  5. Settings タブで、 Issuer 値をコピーします。この値は、次のステップで <OKTA_ISSUER> と呼ばれています。その形式は、 https://dev-111111.oktapreview.com/oauth2/auslh9j9vf9ej7NfT0h7 のようになります。

Metadata ドキュメントで、

  1. Metadata URI 値をコピーし、ブラウザータブを開いて、アドレスバーに URL を貼り付けます。

  2. ブラウザーに JSON テキストが表示されるはずです。このテキストは、テキストエディターまたはブラウザー自体で操作できます。

  3. "jwks_uri" パラメーターを見つけて、その値をコピーします。その形式は、 https://dev-111111.oktapreview.com/oauth2/auslh9j9vf9ej7NfT0h7/v1/keys のようになります。このエンドポイントは、次のステップで <OKTA_JWS_KEY_ENDPOINT> として呼ばれています。

  4. "token_endpoint" パラメーターを見つけて、その値をコピーします。その形式は、 https://dev-111111.oktapreview.com/oauth2/auslh9j9vf9ej7NfT0h7/v1/token のようになります。このエンドポイントは、次のステップで <OKTA_OAUTH_TOKEN_ENDPOINT> と呼ばれています。

Okta用にセキュリティ統合を作成する

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

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

重要

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

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

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

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

create security integration external_oauth_okta_2
    type = external_oauth
    enabled = true
    external_oauth_type = okta
    external_oauth_issuer = '<OKTA_ISSUER>'
    external_oauth_jws_keys_url = '<OKTA_JWS_KEY_ENDPOINT>'
    external_oauth_audience_list = ('<snowflake_account_url')
    external_oauth_token_user_mapping_claim = 'sub'
    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 セキュリティ統合の複製とフェールオーバー/フェールバックをサポートします。

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

テスト手順

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

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

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

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

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

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

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

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

    • スコープを含める

サンプルコマンドはアナリストをリクエストし、 Okta > OAuth App Resourcesession: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=<OKTA_USER_USERNAME>" \
  --data-urlencode "password=<OKTA_USER_PASSWORD>" \
  --data-urlencode "grant_type=password" \
  --data-urlencode "scope=session:role:analyst" \
  <OKTA_OAUTH_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に安全に接続できるようになりました。