外部 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ガイドをご参照ください。

ステップ1: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)。

  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> と呼ばれています。

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

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

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

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

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

  5. 名前を入力します。

  6. Audience 値として Snowflake Account URL を入力します。

    • オーディエンスは、組織のディレクトリ内で一意である必要があります。たとえば、 https://<アカウント>.<地域>.snowflakecomputing.com。この値は、次のステップで <SNOWFLAKE_AUDIENCE> と呼ばれています。

  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 をクリックします。

ステップ3: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> と呼ばれています。

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

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

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

重要

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

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

オーディエンスによる OAuth 認証サーバーの作成

Snowflake OAuth リソースアプリケーションをOktaで作成するときに、Snowflakeアカウント URL (つまり、 <アカウント>.<地域>.snowflakecomputing.com) ではない Audience の値を入力した場合は、 external_oauth_audience_list パラメーターをセキュリティ統合に追加し、 <SNOWFLAKE_AUDIENCE> をSnowflakeアカウント URL で置き換えます。

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_AUDIENCE>')
    external_oauth_token_user_mapping_claim = 'sub'
    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 およびネットワークポリシー をご参照ください。

テスト手順

認証サーバーとして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>

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に安全に接続できるようになりました。