SSL 接続を使用して Amazon RDS インスタンスに正常に接続するにはどうすればよいですか。

所要時間6分
0

Secure Sockets Layer (SSL) 接続を使用して、Amazon Relational Database Service (Amazon RDS) DB インスタンスまたはクラスターに接続したいと考えています。

簡単な説明

アプリケーションから SSL または Transport Layer Security (TLS) を使用して、MySQL、MariaDB、Microsoft SQL Server、Oracle、PostgreSQL を実行する DB インスタンスへの接続を暗号化できます。SSL/TLS 接続は、クライアントと DB インスタンス間で転送されるデータを暗号化することにより、セキュリティの 1 つのレイヤーを提供します。サーバー証明書は、Amazon RDS DB インスタンスへの接続が行われていることを検証することにより、追加のセキュリティレイヤーを提供します。

DB インスタンスをプロビジョニングすると、Amazon RDS は SSL 証明書を作成し、その証明書をインスタンスにインストールします。これらの証明書は、認証機関によって署名されています。SSL 証明書には、なりすまし攻撃からインスタンスを保護するために、SSL 証明書の共通名として DB インスタンスエンドポイントが含まれています。Amazon RDS によって作成された SSL 証明書は信頼されたルートエンティティであり、ほとんどの場合に機能します。ただし、アプリケーションが証明書チェーンを受け入れない場合、証明書が機能しない可能性があります。このような場合、AWS リージョンに接続するために中間証明書の使用が必要になる場合があります。たとえば、SSL を使用して AWS GovCloud (米国) リージョンに接続するには、中間証明書を使用する必要があります。

すべての AWS リージョンの中間証明書とルート証明書の両方を含む証明書バンドルを AWS Trust Services からダウンロードできます。アプリケーションが Microsoft Windows 上にあり、PKCS7 ファイルが必要な場合は、Amazon Trust Services から PKCS7 証明書バンドルをダウンロードできます。このバンドルには、中間証明書とルート証明書の両方が含まれています。

解決方法

各データベースエンジンには SSL/TLS を実装する独自のプロセスがあります。DB クラスターに SSL/TLS 接続を実装するには、データベースエンジンに基づいて次のいずれかのオプションを選択します。

Amazon RDS for Oracle

Amazon RDS for Oracle インスタンスの場合、カスタムオプショングループに SSL オプションを追加することで、SSL モードをオンにすることができます。

Amazon RDS for Oracle は、Transport Layer Security (TLS) バージョン 1.0 と 1.2 をサポートします。Oracle SSL オプションを使用するには、オプショングループの SQLNET.SSL_VERSION オプション設定を使用します。このオプション設定には、次の値を使用できます。

  • 「1.0」-クライアントは TLS 1.0 のみを使用して DB インスタンスに接続できます。
  • 「1.2」-クライアントは TLS 1.2 のみを使用して DB インスタンスに接続できます。
  • 「1.2 または 1.0」-クライアントは TLS 1.2 または 1.0 を使用して DB インスタンスに接続できます。

既存の Oracle SSL オプションの場合、SQLNET.SSL_VERSION は自動的に**「1.0」** に設定されます。必要に応じて、設定を変更できます。

Oracle SSL オプションを使用する Oracle DB インスタンスに接続する前に、SSL を使用するように SQL*Plus クライアントを設定する必要があります。JDBC 上で SSL 接続を使用するには、キーストアを作成し、Amazon RDS ルート CA 証明書を信頼し、SSL 接続をセットアップする必要があります。

JDBC を使用して SSL 接続をセットアップするコード例は以下の通りです。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
 
public class OracleSslConnectionTest {
    private static final String DB_SERVER_NAME = "example-dns";
    private static final Integer SSL_PORT = "example-ssl-option-port-in-option-group";
    private static final String DB_SID = "example-oracle-sid";
    private static final String DB_USER = "example-username";
    private static final String DB_PASSWORD = "example-password";
    // This key store has only the prod root ca.
    private static final String KEY_STORE_FILE_PATH = "example-file-path-to-keystore";
    private static final String KEY_STORE_PASS = "example-keystore-password";
    public static void main(String[] args) throws SQLException {
        final Properties properties = new Properties();
        final String connectionString = String.format(
                "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=%s)(PORT=%d))(CONNECT_DATA=(SID=%s)))",
                DB_SERVER_NAME, SSL_PORT, DB_SID);
        properties.put("example-username", DB_USER);
        properties.put("example-password", DB_PASSWORD);
        properties.put("oracle.jdbc.J2EE13Compliant", "true");
        properties.put("javax.net.ssl.trustStore", KEY_STORE_FILE_PATH);
        properties.put("javax.net.ssl.trustStoreType", "JKS");
        properties.put("javax.net.ssl.trustStorePassword", KEY_STORE_PASS);
        final Connection connection = DriverManager.getConnection(connectionString, properties);
        // If there is no exception, it means that an SSL connection can be opened
    }
}

SSL を使用して Amazon RDS for Oracle インスタンスに接続する前に、次の点を確認してください。

  • RDS ルート証明書がダウンロードされ、ウォレットファイルに追加されます。このファイルは、sqlnet.ora ファイルの WALLET_LOCATION パラメータで指定されたディレクトリに保存されます。
  • TNS エントリに正しい SSL ポート番号があります。
  • Amazon RDS セキュリティグループは、SSL ポートを介したマシンからのインバウンド接続を許可するように設定されています。
  • ファイアウォールまたはセキュリティポリシーは、Amazon RDS からの SSL ポート上のトラフィックを許可するように適切に設定されています。

Amazon RDS for MariaDB

Amazon RDS for MariaDB で TLS バージョン 1.0, 1.1、1.2、1.3 のサポートを開始一方向の TLS 接続では、クライアント証明書なしで TLS が使用され、サーバーのみが認証されます。そのため、認証は一方向にしか行えません。ただし、暗号化は双方向で可能です。サーバー証明書の検証では、クライアントは証明書がサーバーに属していることを確認します。

RDS 証明書を使用して MySQL 5.7 以降のクライアントを起動するには、次のようなコマンドを実行します。

mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-mode=VERIFY_IDENTITY

RDS 証明書を使用して MariaDB クライアントを起動するには、次のようなコマンドを実行します。

mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-verify-server-cert

特定のユーザーまたはアカウントに SSL 接続を要求するには、MariaDB のバージョンに応じて次のクエリを実行します。

ALTER USER 'test'@'%' REQUIRE SSL;

RDS for MariaDB バージョン 10.5 以上をパフォーマンススキーマをオンにして使用しており、データベースインスタンスにアプリケーションが接続されている場合、以下のクエリを実行して、どの接続が SSL/TLS を使用しているかを確認することができます。

MariaDB> SELECT id, user, host, connection_type
FROM performance_schema.threads pst
INNER JOIN information_schema.processlist isp
ON pst.processlist_id = isp.id;

Amazon RDS for MySQL

Amazon RDS for MySQL は TLS バージョン 1.0、1.1、1.2 をサポートしています。

Amazon RDS for MySQL は、次のバージョンで安全な接続のために yaSSL を使用します。

  • MySQL バージョン 5.7.19 およびそれ以前の 5.7 バージョン
  • MySQL バージョン 5.6.37 以前の 5.6 バージョン

MySQL は、次のバージョンで安全な接続に OpenSSL を使用します。

  • MySQL バージョン 8.0
  • MySQL バージョン 5.7.21 以降の 5.7 バージョン
  • MySQL バージョン 5.6.39 以降の 5.6 バージョン

デフォルトでは、MySQL クライアントプログラムは、サーバーが暗号化された接続をサポートしている場合、暗号化された接続の確立を試みます。デフォルトの暗号化で提供されるセキュリティに比べてセキュリティを強化するには、--ssl-ca パラメータを使用して、DB インスタンスエンドポイントを共通名として含む SSL 証明書を参照します。SSL 証明書は、なりすまし攻撃からインスタンスを保護します。

MySQL 5.7 以降で --ssl-ca パラメーターを使用してクライアントを起動するには、次のようなコマンドを実行します。

mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-mode=VERIFY_IDENTITY

特定のユーザーまたはアカウントに SSL 接続を要求するには、MySQL のバージョンに応じて次のようなクエリを実行します。

mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-verify-server-cert

MySQL 5.7 以降:

ALTER USER 'testuser'@'%' REQUIRE SSL;

RDS for MySQL バージョン 5.7 または 8.0 をパフォーマンススキーマをオンにして使用しており、データベースインスタンスにアプリケーションが接続している場合、以下のクエリを実行して、どの接続が SSL/TLS を使用しているかを確認することができます。

mysql> SELECT id, user, host, connection_type
FROM performance_schema.threads pst
INNER JOIN information_schema.processlist isp
ON pst.processlist_id = isp.id;

Amazon RDS for Microsoft SQL Server

SSL を使用して SQL Server DB インスタンスに接続するには、次のいずれかの方法を使用できます。

  • すべての接続に SSL を強制する: この方法では、接続はクライアントに対して透過的に行われるため、クライアントは SSL を使用するための作業を行う必要はありません。このオプションを使用するには、rds.force_ssl パラメータを 1 (オン) に設定します。デフォルトでは、rds.force_ssl パラメータは 0 (オフ) に設定されています。rds.force_ssl パラメータは静的です。したがって、値を変更した後、変更を有効にするには DB インスタンスを再起動する必要があります。
  • 特定の接続を暗号化する: この方法では、特定のクライアントコンピュータからの SSL 接続を設定します。クライアント上の接続を暗号化する必要があります。

他の SQL クライアントからの接続を暗号化するには、接続文字列に encrypt=true を追加します。この文字列は、GUI ツールの接続ページのオプションまたはプロパティとして使用できます。

次のクエリを実行して、接続が暗号化されていることを確認します。

SELECT ENCRYPT_OPTION FROM SYS.DM_EXEC_CONNECTIONS WHERE SESSION_ID = @@SPID;

encrypt_option に対してクエリが true を返すことを確認します。

: JDBC を使用して接続するクライアントの SSL 暗号化を有効にするには、Amazon RDS SQL 証明書を Java CA 証明書 (cacerts) ストアに追加する必要がある場合があります。そのためには、keytool ユーティリティを使用します。

Amazon RDS for PostgreSQL

Amazon RDS は、PostgreSQL DB インスタンスの SSL 暗号化をサポートしています。SSL を使用すると、アプリケーションと PostgreSQL DB インスタンス間の PostgreSQL 接続を暗号化できます。また、PostgreSQL DB インスタンスへのすべての接続で SSL の使用を強制することもできます。Amazon RDS for PostgreSQL は TLS バージョン 1.1 と 1.2 をサポートしています。

SSL 経由で Amazon RDS for PostgreSQL DB インスタンスに接続する前に、次の操作を行います。

  1. 証明書をダウンロードします。
  2. 証明書をオペレーティングシステムにインポートします。

詳細については、「SSL 経由で PostgreSQL DB インスタンスに接続する」を参照してください。

sslrootcert パラメータを使用して、証明書を参照します。例: sslrootcert=rds-ssl-ca-cert.pem。

$ psql "host=myinstance.123456789012.rds-us-east-1.amazonaws.com port=5432 user=testuser dbname=testpg sslmode=verify-full sslrootcert=global-bundle.pem"

また、カスタムパラメータグループrds.force_ssl1 (オン) に設定することで、RDS for PostgreSQL インスタンスへの接続を SSL を使用するように設定することもできます。デフォルトでは、この値は 0 (オフ) に設定されています。

rds.force_ssl を 1 (オン) に設定すると、新しい SSL 設定をサポートするために DB インスタンスの pg_hba.conf ファイルが変更されます。pg_hba_file_rules ビューを使用して、pg_hba.conf ファイルの内容の概要を表示できます。

rds.force_ssl を 0 (オフ) に設定すると、pg_hba.conf ファイルは次のようになります。

SELECT * FROM pg_hba_file_rules;

 line_number | type  |     database      | user_name  | address  | netmask | auth_method | options | error 
-------------+-------+-------------------+------------+----------+---------+-------------+---------+-------
           4 | local | {all}             | {all}      |          |         | md5         |         | 
          10 | host  | {all}             | {rdsadmin} | samehost |         | md5         |         | 
          11 | host  | {all}             | {rdsadmin} | all      |         | reject      |         | 
          12 | host  | {rdsadmin}        | {all}      | all      |         | reject      |         | 
          13 | host  | {all}             | {all}      | all      |         | md5         |         |
          14 | host  | {replication}     | {all}      | samehost |         | md5         |         | 
          15 | host  | {rds_replication} | {all}      | all      |         | md5         |         | 
(7 rows)

rds.force_ssl を 1 (オン) に設定すると、pg_hba.conf ファイルは次のようになります。

SELECT * FROM pg_hba_file_rules;

line_number |  type   |     database      | user_name  | address  | netmask | auth_method | options | error 
-------------+---------+-------------------+------------+----------+---------+-------------+---------+-------
          4 | local   | {all}             | {all}      |          |         | md5         |         |
         10 | host    | {all}             | {rdsadmin} | samehost |         | md5         |         |
         11 | host    | {all}             | {rdsadmin} | all      |         | reject      |         |
         12 | host    | {rdsadmin}        | {all}      | all      |         | reject      |         |
         13 | hostssl | {all}             | {all}      | all      |         | md5         |         |
         14 | host    | {replication}     | {all}      | samehost |         | md5         |         |
         15 | hostssl | {rds_replication} | {all}      | all      |         | md5         |         |

rds.force_ssl を 1 (オン) に設定すると、line_number (13) のタイプ値が hostssl に更新される場合があります。

インスタンスで SSL 接続をアクティブ化した後、RDS for PostgreSQL インスタンスへの接続を開始すると、次のようなメッセージが表示されます。

$ psql "host=myinstance.123456789012.rds-us-east-1.amazonaws.com port=5432 user=testuser dbname=testpg"
. . .
SL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

SSL 以外の接続はすべて拒否され、次のメッセージが表示されます。

$ psql "host=myinstance.123456789012.rds-us-east-1.amazonaws.com port=5432 user=testuser dbname=testpg sslmode=disable"
psql: FATAL: no pg_hba.conf entry for host "host.ip", user "testuser", database "testpg", SSL off
$

関連情報

SSL/TLS を使用した DB インスタンスへの接続の暗号化

AWS公式
AWS公式更新しました 2年前
コメントはありません

関連するコンテンツ