Thanks to visit codestin.com
Credit goes to docs.snowflake.com

接続の認証

Snowflakeに対する認証には、次のいずれかのオプションを使用できます。

さらに、Snowflake Node.js ドライバーは、 SSO および MFA トークンをキャッシュする機能をサポートしています。詳細については、 トークンキャッシング認証 をご参照ください。

ウェブブラウザーを介したシングルサインオン(SSO)を使用する

シングルサインオン(SSO)を使用するようにSnowflakeを構成 している場合は、認証にブラウザーベースの SSO を使用するようにクライアントアプリケーションを構成できます。

アプリケーションコード内で、

  1. authenticator オプションを EXTERNALBROWSER に設定します。

  2. To establish a connection, call the connect or connectAsync method.

例:

// Use a browser to authenticate via SSO.
const connection = snowflake.createConnection({
  ...,
  authenticator: 'EXTERNALBROWSER'
});

// Establish a connection.
connection.connect((err, conn) => {
  if (err) {
    ... // Handle any errors.
  } else {
    // Execute SQL statements.
    const statement = connection.execute({...});
  }
});

認証にブラウザーベースの SSO を使用する方法の詳細については、 ブラウザーベース SSO をご参照ください。

Oktaを介したネイティブ SSO を使用する

Oktaを介して シングルサインオン(SSO)を使用するようにSnowflakeを構成 している場合は、Oktaを介してネイティブ SSO 認証を使用するようにクライアントアプリケーションを構成できます。

アプリケーションコード内で、

  1. 次のオプションを設定します。

    • authenticator オプションをOktaアカウントのOkta URL エンドポイントに設定します(例: https://<Oktaアカウント名>.okta.com)。

    • username および password オプションをIDプロバイダー(IdP)のユーザー名とパスワードに設定します。

  2. To establish a connection, call the connect or connectAsync method.

例:

// Use native SSO authentication through Okta.
const connection = snowflake.createConnection({
  ...,
  username: '<user_name_for_okta>',
  password: '<password_for_okta>',
  authenticator: 'https://myaccount.okta.com'
});

// Establish a connection.
connection.connect((err, conn) => {
  if (err) {
    ... // Handle any errors.
  } else {
    // Execute SQL statements.
    const statement = connection.execute({...});
  }
});

Oktaを介したネイティブ SSO 認証の使用の詳細については、 ネイティブ SSO --- Oktaのみ をご参照ください。

キーペア認証とキーペアローテーションを使用する

ドライバーは、キーペア認証とキーローテーションをサポートします。キーペア認証とキーローテーションを使用するには、次の手順に従います。

  1. キーペア認証とキーペアローテーション で説明されているように、キーペア認証を構成します。

  2. アプリケーションコード内で、

    1. authenticator オプションを SNOWFLAKE_JWT に設定します。

    2. 秘密キーを使用して、次のいずれかの方法で認証します。

      • privateKey オプションを秘密キーに設定します。

      • privateKeyPath オプションを秘密キーファイルへのパスに設定します。

        ファイルが暗号化されている場合は、 privateKeyPass オプションをパスフレーズに設定して秘密キーを復号化する必要もあります。

次の例では、ファイルから秘密キーをロードし、 privateKey オプションを秘密キーに設定します。

import crypto from 'crypto';
import fs from 'fs';

// Read the private key file from the filesystem.
const privateKeyFile = fs.readFileSync('<path_to_private_key_file>/rsa_key.p8');

// Get the private key from the file as an object.
const privateKeyObject = crypto.createPrivateKey({
  key: privateKeyFile,
  format: 'pem',
  passphrase: 'passphrase'
});

// Extract the private key from the object as a PEM-encoded string.
const privateKey = privateKeyObject.export({
  format: 'pem',
  type: 'pkcs8'
});

// Use the private key for authentication.
const connection = snowflake.createConnection({
  ...
  authenticator: 'SNOWFLAKE_JWT',
  privateKey: privateKey
});

// Establish a connection.
connection.connect((err, conn) => {
  ... // Handle any errors.
});

// Execute SQL statements.
const statement = connection.execute({...});

次の例では、 privateKeyPath オプションを暗号化された秘密キーファイルに設定し、 privateKeyPass オプションを秘密キーの復号化に使用されるパスフレーズに設定します。

// Use an encrypted private key file for authentication.
// Specify the passphrase for decrypting the key.
const connection = snowflake.createConnection({
  ...
  authenticator: 'SNOWFLAKE_JWT',
  privateKeyPath: '<path-to-privatekey>/privatekey.p8',
  privateKeyPass: '<passphrase_to_decrypt_the_private_key>'
});

// Establish a connection.
connection.connect((err, conn) => {
  ... // Handle any errors.
});

// Execute SQL statements.
const statement = connection.execute({...});

OAuth を使用する

OAuth を使用して接続するには、 authenticator オプションを OAUTH に設定し、 token オプションを OAuth アクセストークンに設定します。例:

// Use OAuth for authentication.
const connection = snowflake.createConnection({
  ...
  authenticator: 'OAUTH',
  token: '<your_oauth_token>'
});

// Establish a connection.
connection.connect((err, conn) => {
  ... // Handle any errors.
});

// Execute SQL statements.
const statement = connection.execute({...});

詳細については、 クライアント、ドライバー、およびコネクタ をご参照ください。

OAuth 2.0認証コードフローを使用する

OAuth 2.0認証コードフローは、ユーザーの認証情報を公開することなく、クライアントアプリケーションがユーザーに代わって認証サーバーからアクセストークンを取得するための安全な方法です。

OAuth 2.0 認証コードフローを有効にするには:

  1. authenticator 接続パラメーターを oauth_authorization_code に設定します。

  2. 以下の OAuth 接続パラメーターをセットします。

    • oauthClientId:Snowflake統合(Snowflake セキュリティ統合メタデータ)用にプロバイダーから提供された client id の値。

    • oauthClientSecret: IDプロバイダーがSnowflake統合用に提供する client secret の値(Snowflake セキュリティ統合メタデータ)。

    • oauthAuthorizationUrl: 認証コードをドライバーに供給する ID プロバイダーのエンドポイント。SnowflakeをIDプロバイダーとして使用する場合、この値は server または account パラメーターから取得されます。

    • oauthTokenRequestUrl: ドライバーにアクセストークンを供給するIDプロバイダーエンドポイント。SnowflakeをIDプロバイダーとして使用する場合、この値は server または account パラメーターから取得されます。

    • oauthScope: IDプロバイダーの認可リクエストでリクエストされたスコープ。デフォルトでは、ロールから派生します。複数のスコープが必要な場合、値はスペースで区切られた複数のスコープのリストでなければなりません。

    • oauthRedirectUri: URI 認証コードリダイレクトに使用します(Snowflakeセキュリティ統合メタデータ)。デフォルト:http://127.0.0.1:{randomAvailablePort}

OAuth 2.0クライアント認証情報フローを使用する

OAuth 2.0クライアント認証情報フローは、Python用Snowflake Connectorがバックエンドサービスに接続するような、マシン間(M2M)認証のためのセキュアな方法を提供します。OAuth 2.0認証コードフローとは異なり、このメソッドはユーザー固有のデータに依存しません。

OAuth 2.0 クライアント認証フローを有効にするには:

  1. codenowrap:authenticator 接続パラメーターを oauth_client_credentials に設定します。

  2. 以下の OAuth 接続パラメーターをセットします。

    • oauthClientId:Snowflake統合(Snowflake セキュリティ統合メタデータ)用にプロバイダーから提供された client id の値。

    • oauthClientSecret: IDプロバイダーがSnowflake統合用に提供する client secret の値(Snowflakeセキュリティ統合メタデータ)

    • oauthTokenRequestUrl: ドライバーにアクセストークンを供給するIDプロバイダーエンドポイント。

    • oauthScope: IDプロバイダーの認可リクエストでリクエストされたスコープ。デフォルトでは、ロールから派生します。複数のスコープが必要な場合、値はスペースで区切られた複数のスコープのリストでなければなりません。

ワークロードIDフェデレーションで認証(WIF)

ワークロードIDフェデレーション は、Snowflakeのサービス間の認証方法を提供します。この方法により、アプリケーション、サービス、コンテナは、 AWSIAM、Microsoft Entra ID またはGoogle CloudサービスアカウントのようなクラウドプロバイダーのネイティブIDシステムを活用して、Snowflakeで認証することができます。このアプローチでは、長期間有効な認証情報を管理する必要がなくなり、外部 OAuth のような他の方法と比較して、認証情報の取得が簡素化されます。Snowflakeコネクタは、プラットフォームのIDプロバイダーから有効期間が短い認証情報を自動的に取得するように設計されています。

ワークロードIDフェデレーション認証コードを有効にするには、以下を実行します。

  1. Set the authenticator connection parameter to WORKLOAD_IDENTITY.

  2. codenowrap: workloadIdentityProvider`接続パラメーターをプラットフォームに応じてcodenowrap: `AWSAZUREGCP または:codenowrap:OIDC に設定します。

  3. OpenID 接続(OIDC)の場合、token 接続パラメーターを指定します。

MFA パスコードを使用する

注釈

この機能を使用するには、Snowflake Node.jsドライバーのバージョン1.13.1以降が必要です。

Duoからのプッシュ通知など外部からの確認を待つ代わりに、多要素認証(MFA)のパスコードを渡すことでSnowflakeに接続できます。ドライバーには、 MFA パスコードを指定する以下の方法があります。

  • passcodeInPassword オプションを true に設定し、以下のようにパスワード文字列の一部としてパスコードを含めます。

    const connection = snowflake.createConnection({
      account: '<account_identifier>',
      username: '<username>',
      ...
      authenticator: 'USERNAME_PASSWORD_MFA',
      password: 'abc123987654', // passcode 987654 is part of the password
      passcodeInPassword: true // because passcodeInPassword is true
    });
    
  • passcode オプションをパスコードの値に設定し、以下のようにパスワードとパスコードを別々に指定します。

    const connection = snowflake.createConnection({
      account: '<account_identifier>',
      username: '<username>',
      ...
      authenticator: 'USERNAME_PASSWORD_MFA',
      password: 'abc123', // password and MFA passcode are input separately
      passcode: '987654'
    });
    

    この方法を使うには、 passcodeInPassword オプションが false (デフォルト値)になっていることを確認してください。

注釈

passcodeInPassword オプションを有効にし、 passcode オプションを設定すると、 passcodeInPassword オプションが優先されます。

これらのオプションの詳細については、 passcode をご参照ください。

トークンキャッシング認証

Snowflake Node.js ドライバーは、 SSO と MFA トークンをキャッシュする機能を提供します。

重要

トークン・キャッシュはデフォルトで無効になっています。トークンをローカルにキャッシュすると、セキュリティ・リスクが高まります。トークンは4時間失効しないため、ローカル・システムでトークンにアクセスした人は、トークンの有効期限が自然に切れるまで、トークンの所有者になりすますことができます。従って、トークンをキャッシュすることを選択する前に、以下を考慮します。

  • 潜在的なリスクを認識し、留意すること。

  • 社内のセキュリティおよびコンプライアンス担当者に相談し、組織のポリシーがトークン・キャッシュを許可しているかどうかを確認してください。

  • デフォルトの設定では、キャッシュされたトークンを保存するファイルは $HOME ディレクトリ、または構成したパスに書き込まれます。あなたは、指定されたディレクトリ内のデータのセキュリティに責任を負います。

  • ファイル所有者のみがアクセスできるように、ファイルに適切なパーミッションが設定されていることを確認する責任があります。

キャッシュ SSO (ID) トークン

外部ブラウザー認証 で Snowflake に接続すると、リクエストからSSO(ID)トークンが生成されます。クライアント・ドライバー側での SSO (ID) トークンのキャッシュは、サーバーがキャッシュを許可している場合にのみ機能します。Snowflakeに接続するクライアントアプリケーションでの SSO の使用 で説明されているように、 SQL ステートメントを実行することで、 SSO トークンのキャッシュをサーバー側で有効にすることができます。

ALTER ACCOUNT SET ALLOW_ID_TOKEN = TRUE;

Node.jsドライバーで SSO トークンキャッシュを使用するには、 snowflake.createConnection() 呼び出しで以下のオプションを設定します。

  • authenticatorEXTERNALBROWSER に設定します。詳細については、 認証オプション をご参照ください。

  • clientStoreTemporaryCredentialtrue に設定します。

const connection = snowflake.createConnection({
  account: '<account_identifier>',
  username: '<username>',
  authenticator: 'EXTERNALBROWSER',
  clientStoreTemporaryCredential: true
});

有効にすると、ドライバーはトークンの有効期限が切れるまで、キャッシュされたトークンをその後の接続に使用します。ドライバーが再度接続を認証するためにブラウザを開いた場合、ドライバーはローカル・認証情報・ストレージでトークン情報を見つけることができないか、トークンの有効期限が切れています。

MFA トークンをキャッシュする

USERNAME_PASSWORD_MFA 認証で Snowflake に接続すると、リクエストからMFA トークンが生成されます。クライアント・ドライバー側での MFA トークンのキャッシュは、サーバーがキャッシュを許可している場合にのみ機能します。MFA トークンキャッシングを使用して認証中のプロンプトの数を最小限に抑える --- オプション で説明されているように、 SQL ステートメントを実行することで、 MFA トークンのキャッシュをサーバー側で有効にすることができます。

ALTER ACCOUNT SET ALLOW_CLIENT_MFA_CACHING = TRUE;

Node.jsドライバーで MFA トークンキャッシュを使用するには、 snowflake.createConnection() 呼び出しで以下のオプションを設定します。

  • authenticatorUSERNAME_PASSWORD_MFA に設定します。詳細については、 認証オプション をご参照ください。

  • clientRequestMFATokentrue に設定します。

const connection = snowflake.createConnection({
  account: '<account_identifier>',
  username: '<username>',
  password: '<password>',
  authenticator: 'USERNAME_PASSWORD_MFA',
  clientRequestMFAToken: true
});

有効にすると、ドライバーはトークンの有効期限が切れるまで、キャッシュされたトークンをその後の接続に使用します。ドライバーが MFA プロバイダーに再度アクセスすると、ドライバーがローカルの認証情報ストレージでトークン情報を見つけられないか、トークンの有効期限が切れています。

デフォルトの認証情報マネージャーを使用する

The Snowflake Node.js driver provides a credential manager and credential storage. By default, the driver stores cached tokens in your $HOME directory.

キャッシュされたトークンを別の場所に格納する場合は、 snowflake.createConnection() 関数の credentialCacheDir パラメーターで希望の場所を指定できます。以下のように、相対パスまたは絶対パスを指定できます。

  • 相対サブパス

    const connection = snowflake.createConnection({
      credentialCacheDir: '../../<folder name>'
    });
    
  • 絶対パス

    const connection = snowflake.createConnection({
      credentialCacheDir: 'C:\\<folder name>\\<subfolder name>'
    });
    

credentialCacheDir を設定しない場合、Snowflake Node.jsドライバーは $HOME/temporary_credential.json を使用して認証情報を保存します。

カスタムの認証情報マネージャーを使用する

Snowflake node.js ドライバーは、ローカルの JSON ファイルを使用して認証情報を格納する、デフォルトの認証情報マネージャーを提供します。認証情報・マネージャーが明示的に設定されていない場合、ドライバーはこのデフォルトの認証情報マネージャーを使用します。

デフォルトの認証情報マネージャーを使用したくない場合は、カスタムの認証情報・マネージャーを作成することができます。カスタム・認証情報マネージャーは、以下の要件を満たす必要があります。

  • readwriteremove 関数を最低限含んでいる必要があります。他の関数を含めることもできます。

  • object データ型である必要があります。

以下の例は、最小限のカスタム・認証情報マネージャーのテンプレートを示しています。

const sampleCustomManager = {
  read: function (key) {
    // (do something with the key)
    return token;
  },
  write: function (key, token) {
    // (do something with the key and token)
  },
  remove: function (key) {
    // (do something with the key)
  }
};

カスタム認証情報マネージャーが完成したら、 snowflake.configure() メソッドで、ドライバー用に設定することができます。この例は MFA トークンを反映したものですが、 SSO トークン用のカスタム認証情報マネージャーを作成することもできます。

import snowflake from 'snowflake-sdk';
import myCredentialManager from '<your custom credential manager module>';

snowflake.configure({
  customCredentialManager: myCredentialManager
});

const connection = snowflake.createConnection({
  account: '<account_identifier>',
  username: '<username>',
  password: '<password>',
  authenticator: 'USERNAME_PASSWORD_MFA',
  clientRequestMFAToken: true
});

Snowflake Node.js ドライバーは、カスタムの認証情報マネージャーを実装して使用するためのプラグインのようなインターフェイスを提供しますが、Snowflake はカスタマーのカスタムの認証情報マネージャーの作成、実装、サポートに責任を負いません。