外部 OAuth 用のカスタム認証サーバーを構成する¶
このトピックでは、Snowflakeで外部 OAuth セキュリティ統合を作成する方法について説明します。カスタム認証サーバーを使用した認証により、クライアントはSnowflakeデータにアクセスできるようになります。
承認サーバーがカスタムプロバイダーではなく、 サポートされているIDプロバイダー(IdP) である場合は、その特定の IdP の構成に焦点を当てたトピックをご参照ください。
このトピックの内容:
外部 OAuth トークンペイロード要件¶
カスタム認証サーバーがSnowflakeに送信するアクセストークンには、次のペイロード情報が含まれている必要があります。クレーム列の詳細については、 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セキュリティ統合の作成に必要な値を取得するために、カスタム認証サーバーと環境の構成ができることを前提としています。
重要
このトピックのステップは、カスタム認証サーバーを構成する方法の 代表的な例 です。
環境を任意の状態に構成し、 外部 OAuth セキュリティ統合 に必要な情報を取得できる限り、任意の OAuth フローを使用できます。
次のステップは、Snowflakeで外部 OAuth セキュリティ統合を作成するために必要な情報を取得するためのガイドです。
カスタム認証サーバーを構成する前に、社内のセキュリティポリシーを確認して、組織がすべての規制とコンプライアンス要件を満たすようにしてください。
外部 OAuth を使用するための主要な環境値を取得する¶
IdP と認証サーバーを構成するときは、次の値を収集して、外部 OAuth セキュリティ統合を定義する必要があります。
- 発行者 URL:
この URL を
external_oauth_issuer
パラメーターに含めます。- RSA 公開キー:
この値を
external_oauth_rsa_public_key
パラメーターと合わせて含めます。- オーディエンス URLs:
複数のオーディエンス URL が必要な場合は、
external_oauth_audience_list
パラメーター内で、各 URL をコンマで区切ります。- スコープ属性:
この値は
scp
またはscope
に設定できます。デフォルトでは、この値はscp
です。external_oauth_scope_mapping_attribute
パラメーターの値をこの値に設定できます。デフォルト値
scp
を使用しない場合は、external_oauth_scope_mapping_attribute
パラメーターの値をscope
に設定します。詳細については、 外部 OAuth トークンペイロード要件 をご参照ください。
- ユーザー属性:
この属性は、 IdP のユーザーを識別する属性を参照します。この属性値を
external_oauth_user_mapping_claim
パラメーターに含めます。- Snowflakeユーザー属性:
ユーザーを識別するSnowflakeの属性。この値を
external_oauth_snowflake_user_mapping_attribute
パラメーターに含めます。
Snowflakeで外部 OAuth セキュリティ統合を作成する¶
このステップでは、Snowflake に外部 OAuth セキュリティ統合を作成します。外部 OAuth セキュリティ統合により、Snowflakeはカスタム認証サーバーからのアクセストークンと安全に通信して検証し、アクセストークンに関連付けられたユーザーロールに基づいて、Snowflakeデータへのアクセスをユーザーに提供できます。詳細については、 CREATE SECURITY INTEGRATION をご参照ください。
重要
この SQL コマンドを実行できるのは、アカウント管理者またはグローバル CREATE INTEGRATION 権限を持つロールのみです。
外部 OAuth セキュリティ統合パラメーターの値は大文字と小文字が区別され、外部 OAuth セキュリティ統合に入力する値は、環境内の値と一致する必要があります。値の大文字と小文字が一致しない場合は、アクセストークンが検証されず、認証試行に失敗します。
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_token_user_mapping_claim = 'upn' 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;
Copyrevoke 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'
...
外部 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 セキュリティ統合の複製とフェールオーバー/フェールバックをサポートします。
詳細については、 複数のアカウントにわたるセキュリティ統合とネットワークポリシーの複製 をご参照ください。
テスト手順¶
カスタム認証サーバーの構成をテストするには、
テストユーザーが IdP に存在し、パスワードを持っていることを確認します。
login_name
属性値が<外部OAuthトークンユーザーマッピングクレーム>
に設定されたテストユーザーが、Snowflakeに存在することを確認します。OAuth 2.0クライアントを登録します。
次のように、 OAuth 2.0クライアントがカスタムトークンエンドポイントに POST リクエストすることを許可します。
リソース所有者に設定された付与タイプ
clientID とシークレットを含む HTTP 基本認証ヘッダー
ユーザー名およびパスワードを含む FORM データ
スコープを含める
サンプルコマンドが ANALYST
カスタマーロールをリクエストし、カスタム認証サーバーで 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に安全に接続できるようになりました。