外部 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 互換クライアントを作成する¶
Okta管理コンソールに移動します。
Applications をクリックします。
Add Application をクリックします。
Create New App をクリックします。
Platform には、 Native App を選択します。
Create をクリックします。
アプリケーションの名前を入力します。
Login redirect URIs ボックスに、完全なSnowflake アカウント URL を追加します(つまり、
https://<アカウント識別子>.snowflakecomputing.com
)。使用可能な URL 形式のリストについては、 URL での接続 をご参照ください。Save をクリックします。
General インターフェイスの New Applications から、 Edit をクリックします。
Refresh Token および Resource Owner Password を確認します。
Save をクリックします。
Client Credentials の横にある Edit ボタンをクリックします。
Use Client Authentication オプションを選択します。
Save をクリックします。
Client Credentials コンテナーで、 ClientID と Secret を保存します。これらの2つの値は、以下のステップでそれぞれ
<OAUTH_CLIENT_ID>
および<OAUTH_CLIENT_SECRET>
と呼ばれています。
Okta情報を収集する¶
Okta管理コンソールに移動します。
Security メニューで、 API をクリックします。
Authorization Servers をクリックします。
Snowflakeリソースの認証サーバーをクリックします。
Settings タブで、 Issuer 値をコピーします。この値は、次のステップで
<OKTA_ISSUER>
と呼ばれています。その形式は、https://dev-111111.oktapreview.com/oauth2/auslh9j9vf9ej7NfT0h7
のようになります。
Metadata ドキュメントで、
Metadata URI 値をコピーし、ブラウザータブを開いて、アドレスバーに URL を貼り付けます。
ブラウザーに JSON テキストが表示されるはずです。このテキストは、テキストエディターまたはブラウザー自体で操作できます。
"jwks_uri"
パラメーターを見つけて、その値をコピーします。その形式は、https://dev-111111.oktapreview.com/oauth2/auslh9j9vf9ej7NfT0h7/v1/keys
のようになります。このエンドポイントは、次のステップで<OKTA_JWS_KEY_ENDPOINT>
として呼ばれています。"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';
外部 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;
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 でのセカンダリロールの使用¶
プライマリロールに必要なスコープが外部トークンで渡されます。ユーザーの既定のロール(session:role-any
)、またはユーザーに付与された特定のロール(session:role:<ロール名>
)のいずれかです。
デフォルトでは、Snowflakeは、セッション内にあるユーザー(つまり、 DEFAULT_SECONDARY_ROLES)のデフォルトの セカンダリロール をアクティブ化 しません。
セッション内にあるユーザーのデフォルトのセカンダリロールをアクティブ化し、外部 OAuth の使用中に USE SECONDARY ROLES コマンドの実行を許可するには、次のステップを実行します。
接続のセキュリティ統合を構成します。セキュリティ統合の作成時(CREATE SECURITY INTEGRATION を使用)またはその後(ALTER SECURITY INTEGRATION を使用)に、EXTERNAL_OAUTH_ANY_ROLE_MODE パラメーター値を ENABLE または ENABLE_FOR_PRIVILEGE に設定します。
トークンのスコープ属性に静的な値
session:role-any
を渡すように認証サーバーを構成します。スコープパラメーターの詳細については、 外部 OAuth の概要 をご参照ください。
外部 OAuth でのクライアントリダイレクトの使用¶
Snowflakeは、サポートされているSnowflakeクライアントでのクライアントリダイレクトおよび OAuth の使用を含め、外部 OAuth でのクライアントリダイレクトの使用をサポートしています。
詳細については、 クライアント接続のリダイレクト をご参照ください。
外部 OAuth でのネットワークポリシーの使用¶
現在、ネットワークポリシーは外部 OAuth セキュリティ統合に追加できません。ただし、Snowflakeアカウント全体に広く適用されるネットワークポリシーを実装することはできます。
ユースケースで OAuth セキュリティ統合に固有のネットワークポリシーが必要な場合は、 Snowflake OAuth を使用します。このアプローチにより、Snowflake OAuth ネットワークポリシーとSnowflakeアカウントに適用される他のネットワークポリシーを区別することができるようになります。
詳細については、 ネットワークポリシー をご参照ください。
外部 OAuth での複製の使用¶
Snowflakeは、ソースアカウントからターゲットアカウントへの外部 OAuth セキュリティ統合の複製とフェールオーバー/フェールバックをサポートします。
詳細については、 複数のアカウントにわたるセキュリティ統合とネットワークポリシーの複製 をご参照ください。
テスト手順¶
認証サーバーとしてOktaを使用しながら OAuth をテストするコンテキストでは、次を実行する必要があります。
テストユーザーがOktaに存在し、パスワードを持っていることを確認します。
login_name
属性値が<OKTA_USER_USERNAME>
に設定されたテストユーザーがSnowflakeに存在することを確認します。OAuth クライアントを登録します。
次のように、 OAuth クライアントがOktaトークンエンドポイントに POST リクエストすることを許可します。
リソース所有者に設定された付与タイプ
clientID とシークレットを含む HTTP 基本認証ヘッダー
ユーザーのユーザー名およびパスワードを含む FORM データ
スコープを含める
サンプルコマンドはアナリストをリクエストし、 Okta > OAuth App Resource で 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=<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_identifier>",
authenticator="oauth",
token="<external_oauth_access_token>",
warehouse="test_warehouse",
database="test_db",
schema="test_schema"
)
外部 OAuth を使用して、Snowflakeに安全に接続できるようになりました。