外部 OAuth 用カスタムクライアントの構成¶
このトピックでは、Snowflakeデータへの安全でプログラム的なアクセスを容易にするために、Snowflakeを OAuth リソースとして、またカスタムクライアントを外部 OAuth 認証サーバーとして構成する方法について説明します。
このトピックの内容:
概要¶
Snowflakeは、、ユーザーの確認と OAuth アクセストークンの生成のために サポートされている 以外ではサポートされていないIDプロバイダー(IdPs)のカスタム統合をサポートして、Snowflakeデータへの安全なプログラムアクセスを容易にします。
外部 OAuth トークンペイロード要件¶
外部 OAuth カスタムクライアント用として次の表は、Snowflakeがアクセストークンを処理するために外部 OAuth アクセストークンに含める必要がある必要なペイロード情報を示しています。クレーム列の詳細については、 JWTクレーム をご参照ください。
クレーム |
説明 |
---|---|
scp |
スコープ。アクセストークン内のスコープのリスト。 |
scope |
スコープ。 アクセストークン内のスコープのコンマで区切られた文字列。 Snowflakeは、カスタムクライアントの統合のために外部 OAuth セキュリティ統合を 作成 または 変更 するときに Snowflakeアカウントでこのプロパティを有効にするには、 Snowflakeサポート に連絡してください。 |
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 = '<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 でのセカンダリロールの使用¶
プライマリロールに必要なスコープが外部トークンで渡されます。ユーザーの既定のロール(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 セキュリティ統合に追加できません。
ユースケースで OAuth とSnowflakeネットワークポリシーが必要な場合は、 Snowflake OAuth を使用してください。
詳細については、 OAuth およびネットワークポリシー をご参照ください。
テスト手順¶
認可サーバーとしてカスタムクライアントを使用しながら OAuth をテストするコンテキストでは、次を実行する必要があります。
テストユーザーが IdP に存在し、パスワードを持っていることを確認します。
login_name
属性値が<外部OAuthトークンユーザーマッピングクレーム>
に設定されたテストユーザーが、Snowflakeに存在することを確認します。OAuth クライアントを登録します
次のように、 OAuth クライアントがカスタムトークンエンドポイントに POST リクエストすることを許可します。
リソース所有者に設定された付与タイプ
clientID とシークレットを含む HTTP 基本認証ヘッダー
ユーザーのユーザー名およびパスワードを含む FORM データ
スコープを含める
サンプルコマンドは、 ANALYST
カスタマーロールをリクエストし、 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_identifier>",
authenticator="oauth",
token="<external_oauth_access_token>",
warehouse="test_warehouse",
database="test_db",
schema="test_schema"
)
外部 OAuth を使用して、Snowflakeに安全に接続できるようになりました。