JDBC ドライバーを構成する

このトピックでは、ドライバーを使用してSnowflakeに接続する方法など、 JDBC ドライバーを構成する方法について説明します。

このトピックの内容:

JDBC ドライバークラス

JDBC アプリケーションでドライバークラスとして net.snowflake.client.jdbc.SnowflakeDriver を使用します。

注釈

  • アプリケーションコード内で他のSnowflakeクラスまたはメソッドを参照しないでください。将来、改善および修正を実装するために変更される可能性があります。

  • 以前のドライバークラス com.snowflake.client.jdbc.SnowflakeDriver は引き続きサポートされますが、非推奨です(つまり、将来の TBDリリースで削除されます)。そのため、以前のクラス名を参照するコードは引き続き機能しますが、変更が実装されているため、新しいクラス名を参照するように、コードを更新する必要があります。

JDBC ドライバー接続文字列

JDBC ドライバーを使用してSnowflakeに接続するには、次の構文の接続文字列が必要です。

構文

jdbc:snowflake://<account_name>.snowflakecomputing.com/?<connection_params>

接続パラメーター

<アカウント名>

アカウントのフルネームを指定します(Snowflakeが提供)。完全なアカウント名には、アカウントがホストされている 地域 および クラウドプラットフォーム を識別する 追加 のセグメントが含まれている場合があります。

地域別のアカウント名の例

アカウント名が xy12345 の場合、

クラウドプラットフォーム/地域

完全なアカウント名

AWS

US 西部(オレゴン)

xy12345

US 東部(オハイオ)

xy12345.us-east-2.aws

US 東部(バージニア北部)

xy12345.us-east-1

US 東部(商業組織、バージニア政府北部)

xy12345.us-east-1-gov.aws

カナダ(中部)

xy12345.ca-central-1.aws

EU (アイルランド)

xy12345.eu-west-1

EU (フランクフルト)

xy12345.eu-central-1

アジア太平洋(東京)

xy12345.ap-northeast-1.aws

アジア太平洋(ムンバイ)

xy12345.ap-south-1.aws

アジア太平洋(シンガポール)

xy12345.ap-southeast-1

アジア太平洋(シドニー)

xy12345.ap-southeast-2

GCP

US 中央部1(アイオワ)

xy12345.us-central1.gcp

ヨーロッパ西部2(ロンドン)

xy12345.europe-west2.gcp

ヨーロッパ西部4(オランダ)

xy12345.europe-west4.gcp

Azure

西 US 2(ワシントン)

xy12345.west-us-2.azure

東 US 2(バージニア)

xy12345.east-us-2.azure

US 政府バージニア

xy12345.us-gov-virginia.azure

カナダ中央部(トロント)

xy12345.canada-central.azure

西ヨーロッパ(オランダ)

xy12345.west-europe.azure

スイス北部(チューリッヒ)

xy12345.switzerland-north.azure

東南アジア(シンガポール)

xy12345.southeast-asia.azure

オーストラリア東部(ニューサウスウェールズ)

xy12345.australia-east.azure

重要

次のいずれかの条件に該当する場合、アカウント名はこの例の構造とは異なります。

  • Snowflake Editionが VPS の場合、アカウント名の詳細については Snowflakeサポート にお問い合わせください。

  • AWS PrivateLink がアカウントで有効になっている場合、アカウント名には追加の privatelink セグメントが 必要 です。詳細については、 AWS PrivateLink とSnowflake をご参照ください。

<地域ID> --- 非推奨

アカウントが存在する 地域 の ID を指定します。

必要に応じて地域情報が完全なアカウント名の一部として含まれるため、このパラメーターは使用されなくなりました。ここでは、下位互換性のためにのみ文書化されています。

<接続パラメーター>

一連の1つ以上のパラメーターを <パラメーター>=<値> の形式で指定します。各パラメーターはアンパサンド文字(&)で区切られ、接続文字列のどこにもスペースはありません。

user=<ログイン名>

接続のためのユーザーのログイン名を指定します。

password=<文字列>

指定したユーザーのパスワードを指定します。

パスワードを指定するには2つの方法があります。

  • 最初の方法は、ユーザー ID とパスワードを getConnection メソッドに直接渡すことです。

    String user = "<user>";          // replace "<user>" with your user name
    String password = "<password>";  // replace "<password>" with your password
    Connection con = DriverManager.getConnection("jdbc:snowflake://<account>.snowflakecomputing.com/", user, password);
    
  • 2番目の方法は、 Properties オブジェクトを作成し、パスワードでオブジェクトを更新し、オブジェクトを getConnection メソッドに渡すことです。

    String user = "<user>";          // replace "<user>" with your user name
    String password = "<password>";  // replace "<password>" with your password
    Properties props = new Properties();
    props.put("user", user);
    props.put("password", password);
    Connection con = DriverManager.getConnection("jdbc:snowflake://<account>.snowflakecomputing.com/", props);
    

注意

Snowflakeへの接続に文字列を使用するクライアントアプリケーションによってパスワードが誤って公開される可能性があるため、 JDBC 接続文字列にユーザーパスワードを直接 含めない ように強くお勧めします。代わりに、アプリケーションが提供するインターフェイスを使用してユーザーパスワードを指定します。

authenticator=<文字列>

ユーザーのログイン認証情報の確認に使用する認証方式を指定します。

  • snowflake は、内部Snowflake認証方式を使用します。

  • externalbrowser to use your web browser to authenticate with Okta, ADFS, or any other SAML 2.0-compliant identity provider (IdP) that has been defined for your account.

  • https://<Oktaのアカウント名>.okta.com (つまり、Oktaの URL エンドポイント)から ネイティブOktaを介して認証 します( IdP がOktaの場合にのみサポート)。

  • OAuth を使用して認証する oauth。OAuth が認証コードとして指定されている場合は、 OAuth トークンを指定するために token パラメーターも設定する必要があります( 以下を参照)。

  • キーペア認証を使用した snowflake_jwt の認証。キーペア認証の詳細については、 キーペア認証の使用 をご参照ください。

デフォルトは snowflake です。

接続文字列がキーペアを指定する場合、認証方式パラメーターが設定されていないか、「snowflake」に設定されている場合でも、キーペア認証が使用されます。

認証の詳細については、 フェデレーション認証の管理/使用 および OAuth のクライアント、ドライバー、およびコネクター をご参照ください。

token=<文字列>

認証に使用する OAuth トークンを指定します。 <文字列> はトークンです。このパラメーターは、 authenticator=oauth パラメーターが設定されている場合にのみ必要です。

デフォルトはありません。

role=<名前>

ドライバーによって開始されたSnowflakeセッションで使用する、デフォルトのアクセス制御ロールを指定します。指定されたロールは、ドライバーのために指定されたユーザーに既に割り当てられている既存のロールでなければなりません。指定されたロールがユーザーにまだ割り当てられていない場合、ドライバーによってセッションが開始されるときにロールは使用されません。

接続後、 USE ROLE コマンドを実行して、セッションに別のロールを設定できます。

ロールとアクセス制御の詳細については、 Snowflakeのアクセス制御 をご参照ください。

db=<名前>

接続後に使用するデフォルトのデータベース、または空の文字列を指定します。指定されたデータベースは、指定された既定のロールが権限をもつ、既存のデータベースである必要があります。

接続後、 USE DATABASE コマンドを実行して、セッションに別のデータベースを設定できます。

schema=<名前>

接続後に指定されたデータベースに使用するデフォルトのスキーマ、または空の文字列を指定します。指定されたスキーマは、指定された既定のロールが権限をもつ、既存のスキーマでなければなりません。

接続後、 USE SCHEMA コマンドを実行して、セッションに別のスキーマを設定できます。

warehouse=<名前>

接続後に使用する仮想ウェアハウス、または空の文字列を指定します。指定されたウェアハウスは、指定された既定のロールが権限をもつ、既存のウェアハウスでなければなりません。

接続後、 USE WAREHOUSE コマンドを実行して、セッションに別のウェアハウスを設定できます。

tracing=<文字列>

ドライバーのログレベルを指定します。ドライバーは、標準のJavaログユーティリティを使用します。ログレベルの有効な値は次のとおりです。

OFFSEVEREWARNINGINFOCONFIGFINEFINERFINESTALL.

デフォルト値は INFO です。

passcode=<文字列>

多要素認証に使用するパスコードを指定します。

多要素認証の詳細については、 多要素認証(MFA) をご参照ください。

passcodeInPassword=<文字列>

多要素認証のパスコードをパスワードに追加するかどうかを指定します。

  • on (または true)は、パスコードが追加されることを指定します。

  • off (または false)またはその他の値は、パスコードが追加されないことを指定します。

デフォルトは off です。

loginTimeout

ログイン失敗エラーを返す前に、Snowflakeサービスに接続する際の応答を待機する時間を指定します。

デフォルトは60秒です。

networkTimeout

Snowflakeサービスと対話するときにエラーを返すまでの応答を待機する時間を指定します。ゼロ(0)は、ネットワークタイムアウトが設定されていないことを示します。

デフォルトは0秒です。

queryTimeout=<数値>

エラーを返す前に、クエリが完了するまで待機する時間を指定します。ゼロ(0)は無期限に待機することを示します。

デフォルトは0秒です。

application=<文字列>

Snowflakeパートナーによる使用のみ : JDBC を介して接続するパートナーアプリケーションの名前を指定します。

disableSocksProxy=<文字列>

Javaシステムオプション(指定されている場合)で指定された SOCKS プロキシ構成をドライバーが無視するかどうかを指定します。

  • on (または true)は、プロキシを無視することを指定します。

  • off (または false)またはその他の値は、プロキシの使用を指定します。

デフォルトは off です。

注意 :この接続パラメーターを設定すると、同じ JVM (Java仮想マシン)にあるすべての接続の動作が変更されます。

stringsQuotedForColumnDef=<ブール値>

このパラメーターが true に設定されている場合は、 DatabaseMetaData .getColumns()および DatabaseMetaData.getProcedureColumns()が COLUMN_DEF 列に String 型の値を返すとき、その値は一重引用符に埋め込まれます。(値のデータ型が String ではない場合、このパラメーターの設定に関係なく、値は引用符で囲まれません。)

  • true は、文字列値を一重引用符で埋め込むことを指定します(引用符は区切り文字ではなく文字列の一部)。これは JDBC 標準に準拠しています。

  • false は、文字列値が一重引用符で埋め込まれないことを指定します。

デフォルトは false です。

その他のパラメーター

任意のセッションパラメーターを接続文字列に含めることができます。例:

CLIENT_SESSION_KEEP_ALIVE=<ブール値>

非アクティブな状態が一定時間続いた後、現在のセッションをアクティブのままにするか、ユーザーに再度ログインさせるかを指定します。値が true の場合、Snowflakeは、ユーザーからのアクティビティがない場合でも、セッションを無期限にアクティブに保ちます。値が false の場合、ユーザーは4時間の非アクティブ後に再度ログインする必要があります。

デフォルトは false です。

すべてのセッションパラメーターの説明については、 パラメーター をご参照ください。

US 西にあるアカウント:

jdbc:snowflake://xy12345.snowflakecomputing.com/?user=peter&warehouse=mywh&db=mydb&schema=public

EU にあるアカウント(フランクフルト):

jdbc:snowflake://xy12345.eu-central-1.snowflakecomputing.com/?user=peter&warehouse=mywh&db=mydb&schema=public

認証でのシングルサインオン(SSO)の使用

シングルサインオン(SSO)を使用するようにSnowflakeを構成 している場合、認証に SSO を使用するようにクライアントアプリケーションを構成できます。詳細については Snowflakeに接続するクライアントアプリケーションでの SSO の使用 をご参照ください。

キーペア認証の使用

Snowflakeは一般的なユーザー名/パスワード認証ではなく、キーペア認証の使用をサポートしています。この認証方法には、2048ビット(最小)の RSA キーペアが必要です。 OpenSSLを使用して公開キーと秘密キーのペアを生成します。公開キーは、Snowflakeクライアントを使用するSnowflakeユーザーに割り当てられます。

公開/秘密キーペアを構成するには:

  1. ターミナルウィンドウのコマンドラインから、秘密キーを生成します。

    秘密キーは、暗号化バージョンまたは非暗号化バージョンのいずれかを生成できます。

    非暗号化バージョンを生成するには、次のコマンドを使用します。

    $ openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
    

    暗号化バージョンを生成するには、次の(「-nocrypt」を省略する)コマンドを使用します。

    $ openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8
    

    通常は、暗号化されたバージョンを生成する方が安全です。

    2番目のコマンドを使用して秘密キーを暗号化する場合、 OpenSSL は秘密キーファイルの暗号化に使用されるパスフレーズの入力を求めます。強力なパスフレーズを使用して秘密キーを保護することをお勧めします。このパスフレーズを安全な場所に記録します。Snowflakeに接続するときに入力します。パスフレーズは秘密キーの保護にのみ使用され、Snowflakeには送信されないことに注意してください。

    サンプル PEM 秘密キー

    -----BEGIN ENCRYPTED PRIVATE KEY-----
    MIIE6TAbBgkqhkiG9w0BBQMwDgQILYPyCppzOwECAggABIIEyLiGSpeeGSe3xHP1
    wHLjfCYycUPennlX2bd8yX8xOxGSGfvB+99+PmSlex0FmY9ov1J8H1H9Y3lMWXbL
    ...
    -----END ENCRYPTED PRIVATE KEY-----
    
  2. コマンドラインから、秘密キーを参照して公開キーを生成します:

    秘密キーが暗号化され、「rsa_key.p8」という名前のファイルに含まれていると仮定して、次のコマンドを使用します:

    $ openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
    

    サンプル PEM 公開キー

    -----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy+Fw2qv4Roud3l6tjPH4
    zxybHjmZ5rhtCz9jppCV8UTWvEXxa88IGRIHbJ/PwKW/mR8LXdfI7l/9vCMXX4mk
    ...
    -----END PUBLIC KEY-----
    
  3. 公開キーファイルと秘密キーファイルを保存用のローカルディレクトリにコピーします。ファイルへのパスを記録します。秘密キーは PKCS#8(公開キー暗号化標準)形式を使用して格納され、前の手順で指定したパスフレーズを使用して暗号化されることに注意してください。ただし、オペレーティングシステムが提供するファイル許可メカニズムを使用して、ファイルを不正アクセスから保護する必要があります。ファイルが使用されていない場合、ファイルを保護するのはユーザーの責任です。

  4. ALTER USER を使用して、Snowflakeユーザーに公開キーを割り当てます。例:

    ALTER USER jsmith SET RSA_PUBLIC_KEY='MIIBIjANBgkqh...';
    

    注釈

    • ユーザーを変更できるのは、セキュリティ管理者(つまり、 SECURITYADMIN ロールのユーザー)以上のみです。

    • SQL ステートメントで公開キーのヘッダーとフッターを除外します。

    DESCRIBE USER を使用してユーザーの公開キーの指紋を検証します:

    DESC USER jsmith;
    +-------------------------------+-----------------------------------------------------+---------+-------------------------------------------------------------------------------+
    | property                      | value                                               | default | description                                                                   |
    |-------------------------------+-----------------------------------------------------+---------+-------------------------------------------------------------------------------|
    | NAME                          | JSMITH                                              | null    | Name                                                                          |
    ...
    ...
    | RSA_PUBLIC_KEY_FP             | SHA256:nvnONUsfiuycCLMXIEWG4eTp4FjhVUZQUQbNpbSHXiA= | null    | Fingerprint of user's RSA public key.                                         |
    | RSA_PUBLIC_KEY_2_FP           | null                                                | null    | Fingerprint of user's second RSA public key.                                  |
    +-------------------------------+-----------------------------------------------------+---------+-------------------------------------------------------------------------------+
    

    注釈

    RSA_PUBLIC_KEY_2_FP プロパティについては、このトピックの キーローテーション で説明しています。

  5. 秘密キーペアを作成したら、Snowflakeへの接続時の認証に使用できます。

    秘密キーの値を直接使用するか、秘密キーをファイルに保存して、接続時にファイル名とそのファイルのパスワードを渡すことができます。

    1. 接続プロパティのprivateKeyプロパティを介して秘密キーを指定します。

    2. 接続プロパティで個別のプロパティとして秘密キーファイル名とパスワードを指定します。

    3. 接続文字列の一部として秘密キーファイル名とパスワードを指定します。

これらについては、次の3つのセクションの1つで詳しく説明します。

接続プロパティの privateKey プロパティ

以下のサンプルコードを変更して実行します。コードは秘密キーファイルを復号化し、Snowflakeドライバーに渡して接続を作成します。サンプルコードで、セキュリティパラメーターとセッションパラメーターを更新します。

  • セキュリティパラメーター:

    • パス :作成した秘密キーファイルへのローカルパスを指定します。

  • セッションパラメーター:

    • ユーザー :Snowflakeログイン名を指定します。

    • アカウント :アカウントの名前を指定します(Snowflakeが提供)。

サンプルコード

import java.util.Properties;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.DriverManager;
import java.io.File;
import java.io.FileInputStream;
import java.io.DataInputStream;
import java.util.Base64;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.KeyFactory;
import java.security.PrivateKey;
import javax.crypto.EncryptedPrivateKeyInfo;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;

public class TestJdbc
{
    public static void main(String[] args)
        throws Exception
    {
      File f = new File("<path>/rsa_key.p8");
      FileInputStream fis = new FileInputStream(f);
      DataInputStream dis = new DataInputStream(fis);
      byte[] keyBytes = new byte[(int) f.length()];
      dis.readFully(keyBytes);
      dis.close();

      String encrypted = new String(keyBytes);
      String passphrase = System.getenv("PRIVATE_KEY_PASSPHRASE");
      encrypted = encrypted.replace("-----BEGIN ENCRYPTED PRIVATE KEY-----", "");
      encrypted = encrypted.replace("-----END ENCRYPTED PRIVATE KEY-----", "");
      EncryptedPrivateKeyInfo pkInfo = new EncryptedPrivateKeyInfo(Base64.getMimeDecoder().decode(encrypted));
      PBEKeySpec keySpec = new PBEKeySpec(passphrase.toCharArray());
      SecretKeyFactory pbeKeyFactory = SecretKeyFactory.getInstance(pkInfo.getAlgName());
      PKCS8EncodedKeySpec encodedKeySpec = pkInfo.getKeySpec(pbeKeyFactory.generateSecret(keySpec));
      KeyFactory keyFactory = KeyFactory.getInstance("RSA");
      PrivateKey encryptedPrivateKey = keyFactory.generatePrivate(encodedKeySpec);

      String url = "jdbc:snowflake://<account>.snowflakecomputing.com";
      Properties prop = new Properties();
      prop.put("user", "<user>");
      prop.put("account", "<account>");
      prop.put("privateKey", encryptedPrivateKey);

      Connection conn = DriverManager.getConnection(url, prop);
      Statement stat = conn.createStatement();
      ResultSet res = stat.executeQuery("select 1");
      res.next();
      System.out.println(res.getString(1));
      conn.close();
    }
}

接続プロパティとしての秘密キーファイル名とパスワード

秘密キーファイル名とパスワードを個別の接続プロパティとして指定できます。次に例を示します。

Properties props = new Properties();
props.put("private_key_file", "/tmp/rsa_key.p8");
props.put("private_key_file_pwd", "dummyPassword");
Connection connection = DriverManager.getConnection(properties, "jdbc:snowflake://exampleaccount.snowflake.com");

private_key_file および private_key_file_pwd パラメーターを指定する場合、接続プロパティで privateKey パラメーターを指定しないでください。

接続文字列の秘密キーファイル名とパスワード

以下に示すように、接続文字列で秘密キーファイル名とパスワードを指定できます。

Connection connection = DriverManager.getConnection(properties,
    "jdbc:snowflake://exampleaccount.snowflake.com/?private_key_file=/tmp/rsa_key.p8&private_key_file_pwd=dummyPassword");

接続文字列で秘密キーとパスワードを指定する場合は、接続プロパティでパラメーター private_key_fileprivate_key_file_pwd、または privateKey を指定しないでください。

キーローテーション

Snowflakeは、複数のアクティブキーをサポートして、連続したローテーションを可能にします。内部的に従う有効期限のスケジュールに基づいて、公開キーと秘密キーをローテーションして交換します。

現在、 ALTER USERRSA_PUBLIC_KEY および RSA_PUBLIC_KEY_2 パラメーターを使用して、最大2個の公開キーを1人のユーザーに関連付けることができます。

キーをローテーションするには:

  1. キーペア認証の使用 の手順を完了して:

    • 新しい秘密キーと公開キーのセットを生成します。

    • ユーザーに公開キーを割り当てます。公開キーの値を RSA_PUBLIC_KEY または RSA_PUBLIC_KEY_2 (現在使用されていないキーの値)に設定します。例:

      alter user jsmith set rsa_public_key_2='JERUEHtcve...';
      
  2. Snowflakeに接続するようにコードを更新します。新しい秘密キーを指定します。

    Snowflakeは、接続情報とともに送信された秘密キーに基づいて、認証用の正しいアクティブな公開キーを検証します。

  3. ユーザープロファイルから古い公開キーを削除します。例:

    alter user jsmith unset rsa_public_key;
    

SnowCD を使用したSnowflakeへのネットワーク接続の検証

ドライバーを設定したら、 SnowCD を使用して、Snowflakeへのネットワーク接続を評価およびトラブルシューティングできます。

初期設定プロセス中にオンデマンドで SnowCD をいつでも使用して、Snowflakeへのネットワーク接続を評価およびトラブルシューティングできます。

プロキシサーバーを使用した接続

Snowflake JDBC ドライバーでプロキシサーバーを使用するには、2つの方法があります。

  • クライアントアプリケーションの JVM (Java仮想マシン)オプションにパラメーターを追加します。

  • プロキシホストとポート情報を JDBC 接続文字列または DriverManager.getConnection()メソッドに渡されたプロパティに含めます。

両方の手法を以下に文書化します。

JVM オプションの設定によるプロキシサーバーの指定

プロキシサーバーを介して接続するには、コード内でオプションを設定するか、コマンドラインパラメーターをクライアントアプリケーション JVM (Java仮想マシン)に渡します。2つの手法は同等です。

コード内でオプションを指定するには、次の手順を実行します。

System.setProperty("http.useProxy", "true");
System.setProperty("http.proxyHost", "proxyHost Value");
System.setProperty("http.proxyPort", "proxyPort Valure");
System.setProperty("https.proxyHost", "proxyHost HTTPS Value");
System.setProperty("https.proxyPort", ""proxyPort HTTPS Value"")

コマンドラインパラメーターを使用して JVMにオプションを指定するには、次の手順を実行します。

-Dhttp.useProxy=true
-Dhttps.proxyHost=<proxy_host>
-Dhttp.proxyHost=<proxy_host>
-Dhttps.proxyPort=<proxy_port>
-Dhttp.proxyPort=<proxy_port>

1つ以上の IP アドレスまたは URLsのプロキシをバイパスするには、場所を JVM オプションに追加します。各要素は縦棒で区切られています。要素には、ワイルドカード文字としてアスタリスク(「*」)を含めることができます。例:

-Dhttp.nonProxyHosts="*.my_company.com|localhost|xy12345.snowflakecomputing.com|192.168.91.*"

JDBC 接続文字列によるプロキシサーバーの指定

プロキシサーバーの IP アドレスとポート番号を JDBC 接続文字列で直接指定できます。

jdbc:snowflake://<account>.<region_id>.snowflakecomputing.com/?warehouse=<warehouse_name> &useProxy=true&proxyHost=<ip_address>&proxyPort=<port>&proxyUser=test&proxyPassword=test

例:

jdbc:snowflake://xy12345.us-east-1.snowflakecomputing.com/?warehouse=DemoWarehouse1 &useProxy=true&proxyHost=172.31.89.76&proxyPort=8888&proxyUser=test&proxyPassword=test

プロキシサーバーが認証を必要としない場合、proxyUserおよびproxyPassword情報を省略できます。

注釈

上記の例には、読みやすいように空白が含まれています。これらの例をコピーして貼り付ける場合は、余分な空白を削除してください。

注釈

URL の一部としてプロキシ情報を指定すると、プロキシ情報を指定する他の方法よりも安全性が低くなります。

ちなみに

Snowflakeのセキュリティモデルは、Secure Sockets Layer(SSL)プロキシを許可しません( HTTPS 証明書を使用)。プロキシサーバーは、公的に利用可能な認証機関(CA)を使用する必要があり、侵害されたプロキシを介した MITM (Man In The Middle)攻撃などの潜在的なセキュリティリスクを低減します。

SSL プロキシを使用する 必要 がある場合は、通信中に証明書が変更されないように、サーバーポリシーを更新してSnowflake証明書を渡すことを強くお勧めします。

オプションで NO_PROXY を使用して、特定の通信のプロキシをバイパスできます。たとえば、 NO_PROXY=".amazonaws.com" を指定すると、Amazon S3アクセスをバイパスできます。

OCSP

ドライバーが接続すると、Snowflakeは証明書を送信して、Snowflakeを偽装しているホストではなく、Snowflakeへの接続であることを確認します。ドライバーはその証明書を OCSP (オンライン証明書状態プロトコル)サーバーに送信し、証明書が失効していないことを確認します。

ドライバーが証明書を確認するために OCSP サーバーに到達できない場合、ドライバーは "fail open" or "fail closed" できます。

フェールオープンまたはフェールクローズモードの選択

JDBC 3.8.0より前のドライバーバージョンは、デフォルトでフェールクローズになります。バージョン3.8.0以降はデフォルトでフェールオープンになります。次のいずれかの方法でデフォルトの動作を上書きできます。

  • 接続プロパティ ocspFailOpentrue または false に設定します。例: . Properties connection_properties = new Properties(); . connection_properties.put("ocspFailOpen", "false"); . ... . connection = DriverManager.getConnection(connectionString, connection_properties);

  • システムプロパティ net.snowflake.jdbc.ocspFailOpentrue または false に設定します。例: . Properties p = new Properties(System.getProperties()); . p.put("net.snowflake.jdbc.ocspFailOpen", "false"); . System.setProperties(p);

OCSP コネクタ-またはドライバーバージョンの確認

ドライバーまたはコネクタのバージョン、構成、および OCSP の動作の詳細については、 OCSP 設定 をご参照ください。

OCSP 応答キャッシュサーバー

注釈

OCSP 応答キャッシュサーバーは現在、Snowflake JDBC ドライバー3.6.0以降でサポートされています。

Snowflakeクライアントは、実際にデータを転送する前に安全な接続を確立する「ハンドシェイク」を使用して、Snowflakeサービスエンドポイントへのすべての接続を開始します。ハンドシェイクの一部として、クライアントはサービスエンドポイントの TLS/SSL 証明書を認証します。証明書の失効ステータスは、 CA (認証機関)の OCSP (オンライン証明書ステータスプロトコル)サーバーの1つにクライアント証明書リクエストを送信することにより確認されます。

OCSP サーバーからの応答が妥当な時間を超えて遅延すると、接続エラーが発生します。次のキャッシュは失効ステータスを保持し、これらの問題の軽減に役立ちます。

  • プロセスの存続期間中保持されるメモリキャッシュ。

  • ファイルキャッシュ。キャッシュディレクトリ(例: ~/.cache/snowflake または ~/.snowsql/ocsp_response_cache)が削除されるまで保持します。

  • Snowflake OCSP 応答キャッシュサーバー。 CA の OCSP サーバーから OCSP 応答を1時間ごとに取得し、24時間保存します。クライアントは、このサーバーキャッシュから特定のSnowflake証明書の検証ステータスを要求できます。

    重要

    サーバーポリシーでほとんどまたはすべての外部 IP アドレスおよびウェブサイトへのアクセスが拒否された場合、通常のサービス操作を許可するには、キャッシュサーバーアドレスを 必ず ホワイトリストに登録する必要があります。キャッシュサーバーのホスト名は ocsp*.snowflakecomputing.com:80 です。

    何らかの理由でキャッシュサーバーを無効化する必要がある場合は、 SF_OCSP_RESPONSE_CACHE_SERVER_ENABLED 環境変数を false に設定します。値は大文字と小文字が区別され、小文字にする 必要がある ことに注意してください。

キャッシュレイヤーに OCSP 応答が含まれていない場合、クライアントは CAの OCSP サーバーから検証ステータスを直接取得しようとします。

ファイルキャッシュ

使いやすさを向上させるために、ドライバーは認証と OCSP 応答にファイルキャッシュを使用します。デフォルトでは、これらのファイルは次のディレクトリに保存されます。

Linux

~/.cache/snowflake

macOS

~/Library/Caches/Snowflake

Windows

%USERPROFILE%AppDataLocalSnowflakeCaches

JDBC アプリケーションユーザーのローカルオペレーティングシステムにユーザープロファイルがない場合、ドライバーはキャッシュファイルを一時ディレクトリに保存しようとします。次の環境変数を使用して、キャッシュファイルを別のディレクトリに書き込むようにドライバーを構成できます。

SF_TEMPORARY_CREDENTIAL_CACHE_DIR=文字列

ローカルディレクトリ内の一時的な認証情報キャッシュファイルの場所を指定します。これは、起動時に JVM オプション -Dnet.snowflake.jdbc.temporaryCredentialCacheDir=文字列 で構成することもできます。

SF_OCSP_RESPONSE_CACHE_DIR=文字列

ローカルディレクトリ内の OCSP 応答キャッシュファイルの場所を指定します。これは、起動時に JVM オプション -Dnet.snowflake.jdbc.ocspResponseCacheDir=文字列 で構成することもできます。

詳細については、このトピックの OCSP 応答キャッシュサーバー をご参照ください。

JVM オプションは、プログラムではなく( System.setProperty() を介して)起動時に設定する必要があります。環境変数と JVM オプションの両方が提供されている場合、 JVM オプションが使用されます。

JDBC ログ記録の構成

バージョン3.0.4以降、 JDBC ドライバーは2つのログ記録フレームワークをサポートしています。

  • Javaコアログ記録機能

  • Simple Logging Facade for Java

Javaコアログ記録機能(java.util.logging

このロガーを使用するには、 JVM に次のオプションを指定します。

-Dnet.snowflake.jdbc.loggerImpl=net.snowflake.client.log.JDK14Logger

次に、ロガーのアプリケーションプログラミングインターフェイス(API)を使用して、ログ記録の構成をカスタマイズできます。詳細については、 java.util.loggingパッケージのドキュメント をご参照ください。

たとえば、次の内容を含む logging.properties という名前のファイルを作成します。

###########################################################
#   Default Logging Configuration File
#
# You can use a different file by specifying a filename
# with the java.util.logging.config.file system property.
# For example java -Djava.util.logging.config.file=myfile
############################################################

############################################################
#   Global properties
############################################################

# "handlers" specifies a comma-separated list of log Handler
# classes.  These handlers will be installed during VM startup.
# Note that these classes must be on the system classpath.
# ConsoleHandler and FileHandler are configured here such that
# the logs are dumped into both a standard error and a file.
handlers = java.util.logging.ConsoleHandler, java.util.logging.FileHandler

# Default global logging level.
# This specifies which kinds of events are logged across
# all loggers.  For any given facility this global level
# can be overriden by a facility specific level.
# Note that the ConsoleHandler also has a separate level
# setting to limit messages printed to the console.
.level = INFO

############################################################
# Handler specific properties.
# Describes specific configuration information for Handlers.
############################################################

# default file output is in the tmp dir
java.util.logging.FileHandler.pattern = /tmp/snowflake_jdbc%u.log
java.util.logging.FileHandler.limit = 5000000000000000
java.util.logging.FileHandler.count = 10
java.util.logging.FileHandler.level = INFO
java.util.logging.FileHandler.formatter = net.snowflake.client.log.SFFormatter

# Limit the messages that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = net.snowflake.client.log.SFFormatter

# Example to customize the SimpleFormatter output format
# to print one-line log message like this:
#     <level>: <log message> [<date/time>]
#
# java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n

############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

# Snowflake JDBC logging level.
net.snowflake.level = INFO
net.snowflake.handler = java.util.logging.FileHandler

コマンドラインで JVM パラメーターを指定します。

java -jar application.jar -Dnet.snowflake.jdbc.loggerImpl=net.snowflake.client.log.JDK14Logger -Djava.util.logging.config.file=logging.properties

application.jar は JDBC ドライバーのアプリケーションコードを参照します。ログファイルは /tmp/snowflake_jdbc* にあります。

Simple Logging Facade for Java(org.slf4j

ロガー実装パッケージ(つまり、 org.sl4j:sl4j-jdk14 または org.sl4j:slf4j-log4j12)またはカスタムロガー(つまり独自の org.slf4j.impl.StaticLoggerBinder クラス)がクラスパスで定義されている場合、ドライバーはこのロガーを自動的に使用します。

次の JVM オプションを指定して、このロガーを使用することを明示的に選択することもできます。

-Dnet.snowflake.jdbc.loggerImpl=net.snowflake.client.log.SLF4JLogger

詳細については、 Simple Logging Facade for Java(SLF4J)のドキュメント をご参照ください。

注釈

上記の JVM オプションのいずれかを使用してドライバーのロガーを明示的に指定せず、クラスパスでカスタムロガーを定義していない場合(または3.0.4より前のドライバーバージョンを使用している場合)、ドライバーデフォルトで java.util.logging を使用します。ただし、次のデフォルトの動作が適用されます。

  • ログファイルの書き込まれる場所を指定することはできません。常に java.io.tmpDir システムプロパティで指定されたディレクトリに書き込まれます。

    • Linuxおよび macOS 環境では、デフォルトのディレクトリは通常、 /tmp または /var/tmp のいずれかです。

    • Windows環境では、デフォルトのディレクトリは通常、 C:\temp です。

  • ログレベルは、 tracing 接続パラメーターによって決定されます(上記を参照)。

トラブルシューティングのヒント

プロパティが正しく設定されていることを確認してください

DriverManager.getConnection() メソッドは、特定の事前定義された名前(「password」、「account」など)に一致するプロパティパラメーターの値のみを読み取ります。プロパティ名のスペルを間違えたり、余分なプロパティを含めたりすると、ドライバーはエラーまたは警告メッセージを出さずにそれらのプロパティを無視します。これにより、小さなスペルミスの検出が困難になる場合があります。

接続文字列とアカウントに正しい値を使用する

接続の問題の一般的な原因は、アカウント、アカウント名、または接続文字列を求められたときに、提供する情報が多すぎるか少なすぎることです。

通常、アカウント情報は、アカウントがホストされている地域とクラウドプラットフォームに応じて、次の構造を持ちます。

  • <アカウント>

  • <アカウント>.``<地域ID>``

  • <アカウント>.``<地域ID>``.``<プラットフォーム>``

例:

  • xy12345

  • xy12345.us-east-1

  • xy12345.east-us-2.azure

通常、 JDBC 接続文字列は次のようになります。

  • jdbc:snowflake://xy12345.east-us-2.azure.snowflakecomputing.com

アカウント情報が予想されるときに接続文字列を使用(またはその逆)すると、デバッグが困難な問題が発生する可能性があります。

アカウントを求められたときに接続を確立できない場合は、最小形式(例: xy12345)、および完全なアカウント名(例: jdbc:snowflake://、ただし xy12345.east-us-2.azure を含まない)、の両方を試して、 .snowflakecomputing.com 文字列を 含めない ようにしてください。

JDBC 接続文字列を要求されたときに接続を確立できない場合は、上記の接続文字列の完全な形式を使用します。

アカウント名の詳細については、 接続パラメーター をご参照ください。