メニュー
Amazon Redshift
管理ガイド (API Version 2012-12-01)

接続のセキュリティオプションを設定する

Amazon Redshift では Secure Sockets Layer (SSL) 接続がサポートされているため、データとサーバー証明書を暗号化でき、クライアントが接続するサーバー証明書を検証できます。

SSL を使用して接続する

SSL 接続をサポートするには、Amazon Redshift でクラスターごとに自己署名 SSL 証明書を作成してインストールします。パブリックキーは https://s3.amazonaws.com/redshift-downloads/redshift-ssl-ca-cert.pem に保存されています。

予想される MD5 チェックサムの数値は 1314113b03bf3e6c49ea0b1d2dc03121 です。Md5sum プログラム (Linux オペレーティングシステムの場合) またはその他のツール (Windows および Mac OS X オペレーティングシステムの場合) を使用して、ダウンロードした証明書がこの予想される MD5 チェックサムの数値と一致することを確認できます。

重要

厳密には、Amazon Redshift での SSL サポートは、クライアントとクラスター間の接続を暗号化することが目的であり、サーバーの認証に使用されるべきではありません。サーバーを認証するには、SSL 証明書のパブリックキー (.pem ファイル) をクライアントにインストールし、このキーを使ってクラスターに接続します。

デフォルトでは、クラスターデータベースは SSL の使用の有無にかかわらず接続を受け入れます。クラスターが SSL 接続を要求するように設定するには、クラスターに関連付けられているパラメーターグループで require_SSL パラメーターを true に設定します。パラメーターグループの変更については、「パラメーターグループを変更する」を参照してください。

Amazon Redshift では、Elliptic Curve Diffie—Hellman Ephemeral (ECDHE) 鍵契約プロトコルがサポートされます。ECDHE を使用すると、クライアントとサーバーはそれぞれ、安全でないチャネルを介して共有シークレットを確立するために使用される楕円曲線パブリック/プライベートキーペアを持ちます。ECDHE を有効にするために、Amazon Redshift で設定を行う必要はありません。ECDHE を使用してクライアント/サーバー間の通信を暗号化する SQL クライアントツールから接続する場合、Amazon Redshift は提供された暗号リストを使用して適切な接続を行います。詳細については、Wikipedia の「Elliptic Curve Diffie—Hellman」と OpenSSL ウェブサイトの「Ciphers」を参照してください。

ODBC で SSL サーバー証明書を使用する

ODBC DSN には、クライアント接続の暗号化処理方法とサーバー証明書の検証を決定する sslmode 設定が含まれます。Amazon Redshift は、クライアント接続の次の sslmode 値をサポートします。

  • disable

    SSL は無効となり、接続は暗号化されません。

  • allow

    SSL は、サーバーで必要な場合に使用されます。

  • prefer

    SSL は、サーバーでサポートされる場合に使用されます。Amazon Redshift では SSL がサポートされるため、sslmodeprefer に設定すると SSL が使用されます。

  • require

    SSL が必要です。

  • verify-ca

    SSL を使用する必要があり、サーバー証明書を検証する必要があります。

  • verify-full

    SSL を使用する必要があります。サーバー証明書を検証し、サーバーのホスト名が証明書上のホスト名属性と一致する必要があります。

sslmode オプションの詳細については、PostgreSQL ドキュメントの「SSL Support」を参照してください。

クライアントとサーバーの間の接続で SSL が使用されるかどうかとサーバー証明書が検証されるかどうかを確認するには、クライアントで ODBC DSN の sslmode 設定を確認し、サーバーで Amazon Redshift クラスターの require_SSL 設定を確認する必要があります。次の表は、クライアントとサーバーのさまざまな設定の組み合わせの暗号化の結果を示しています。

sslmode (クライアント) require_SSL (サーバー) 結果
disable false 接続は暗号化されません。
disable true サーバーにより SSL が要求されていますが、クライアントの接続では SSL が無効になっているため、接続を行うことはできません。
allow true 接続は暗号化されます。
allow false 接続は暗号化されません。
prefer または require true 接続は暗号化されます。
prefer または require false 接続は暗号化されます。
verify-ca true 接続は暗号化され、サーバー証明書が検証されます。
verify-ca false 接続は暗号化され、サーバー証明書が検証されます。
verify-full true 接続は暗号化され、サーバー証明書とホスト名が検証されます。
verify-full false 接続は暗号化され、サーバー証明書とホスト名が検証されます。

Microsoft Windows で ODBC によりサーバー証明書を使用して接続する

SSL とサーバー証明書を使用してクラスターに接続する場合、クライアントコンピューターか Amazon EC2 インスタンスに証明書をダウンロードし、ODBC DSN を設定する必要があります。

  1. Amazon Redshift サーバー証明書をクライアントコンピュータにダウンロードし、ドライバーのインストールディレクトリにある lib フォルダーに root.crt として保存します。

  2. [ODBC Data Source Administrator] を開き、ODBC 接続のシステム DSN エントリを追加または編集します。[SSL Mode] で、verify-ca を選択して [Save] をクリックします。

    ODBC DSN の設定方法の詳細については、「ODBC 接続を設定する」を参照してください。

ODBC でサーバー証明書を使わずに接続する

Amazon Redshift サーバー証明書を使わずにクラスターに接続する場合、[allow]、[prefer]、[require] のうち 1 つを使用するように ODBC DSN を設定できます。これらの設定では、接続に SSL が使用されますが、サーバー証明書は検証されません。

Java で SSL をサーバー証明書を使用する

SSL は、クライアントとクラスター間を移動するデータを暗号化することによりセキュリティを強化します。サーバー証明書の使用により、クラスターが Amazon Redshift クラスターであることが確認され、セキュリティがさらに強化されます。これを行うには、プロビジョニングしたすべてのクラスターに自動インストールされたサーバー証明書をチェックします。JDBC でサーバー証明書を使用する方法の詳細については、PostgreSQL ドキュメントの「Configuring the Client」を参照してください。

Java でサーバー証明書を使って接続する

このセクションでは、Amazon Redshift 証明書を Java キーストアに追加する方法を説明します。この手順では、JAVA_HOME 環境変数によって示される Java インストールが、クラスターへの接続に使用するクライアントで使用されていることを前提としています。また、root ユーザーとしてタスク内のコマンドを実行することをお勧めします。

サーバー証明書を使って接続するには

keytool プログラムを使用して、クライアントコンピューターまたは Amazon EC2 インスタンスの Java システム信頼ストアに Amazon Redshift 証明書を追加します。コマンドプロンプトで次のコマンドを使用します。

Copy
${JAVA_HOME}/bin/keytool -keystore ${JAVA_HOME}/lib/security/cacerts -import -alias <alias> -file <certificate_filename>
ここで、<エイリアス> はユーザーが指定した任意の文字列値であり、<証明書ファイル名>https://s3.amazonaws.com/redshift-downloads/redshift-ssl-ca-cert.pem からダウンロードした証明書ファイルへの完全パスです。

キーストアの操作に使用するパスワードの入力と再入力が求められます。cacerts キーストアのデフォルトパスワードは changeit ですが、変更した場合はキーストアに属する使用する任意のパスワードを使用してください。

上のコマンドで cacerts キーストアにアクセスできない場合は、次のコマンドを使用して独自の信頼ストアを作成できます。

Copy
${JAVA_HOME}/bin/keytool -keystore <keystore_name> -alias <alias> -import -file <certificate_filename>

ここで、<keystore_name> はクライアントアプリケーションが使用するキーストアで、<alias><certificate_filename> は前述の説明に対応します。キーストアの操作に使用するパスワードの入力と再入力が求められます。このパスワードは後で使用するので、書き留めておきます。

その場合、Java アプリケーションを起動するとき、使用するキーストアとパスワードを指定する必要があります。

Copy
java -Djavax.net.ssl.trustStore=keystore_name -Djavax.net.ssl.trustStorePassword=password com.mycompany.MyApp

信頼ストアに証明書を追加する際に問題が発生した場合は、ログ情報にエラーがないかどうかを確認してください。Amazon Redshift 入門ガイド および Amazon Redshift ドキュメントのその他の関連する演習で SQL Workbench/J を使用している場合、SQL Workbench/J ドキュメントの「Configuration Directory」に移動して、ログが保存されている場所を見つけます。別のクライアントツールを使用している場合、ツールに付随するドキュメントを参照して、ログの保存場所を見つけてください。

接続文字列に次のプロパティを指定します。

  • プロパティ名: ssl

  • プロパティ値: true

たとえば、SQL Workbench/J では、JDBC URL で ssl=true パラメーターを使用して接続文字列を指定できます。

Copy
jdbc:redshift://examplecluster.abc123xyz789.us-west-2.redshift.amazonaws.com:5439/dev?ssl=true

JDBC 接続の詳細については、「JDBC URL を取得する」を参照してください。

Java コードの場合は、次のように接続文字列を指定します。

Copy
Connection conn = null; Properties props = new Properties(); props.setProperty("ssl", "true"); conn = DriverManager.getConnection(<jdbc-connection-string>, props);

SSL を使用する Java の完全なサンプルについては、「Java の使用によるクラスターへの接続」を参照してください。

Java でサーバー証明書を使わずに接続する

サーバー証明書を使用しなくても Amazon Redshift クラスターに接続できます。ただし、Amazon Redshift クラスターに接続していることをクライアント側では確認できなくなります。証明書を使用しなくても SSL を使って接続できます。

サーバー証明書を使わずに接続するには

接続文字列に次のプロパティを指定します。

  • プロパティ名: sslfactory

  • プロパティ値: com.amazon.redshift.ssl.NonValidatingFactory

SQL Workbench/J のサンプル接続文字列を次に示します。

Copy
jdbc:redshift://examplecluster.abc123xyz789.us-west-2.redshift.amazonaws.com:5439/dev?ssl=true&sslfactory=com.amazon.redshift.ssl.NonValidatingFactory

JDBC 接続の詳細については、「JDBC URL を取得する」を参照してください。

Java コードの場合は、次のように接続文字列を指定します。

Copy
Connection conn = null; Properties props = new Properties(); props.setProperty("ssl", "true"); props.setProperty("sslfactory", "com.amazon.redshift.ssl.NonValidatingFactory"); conn = DriverManager.getConnection(<jdbc-connection-string>, props);