Amazon Relational Database Service
ユーザーガイド (API バージョン 2014-10-31)

Oracle Secure Sockets Layer

Oracle DB インスタンスに関連付けられているオプショングループに Oracle SSL オプションを追加することで、Oracle DB インスタンスの Secure Sockets Layer (SSL) 暗号化を有効にします。SSL を使用した通信に使用するポートを指定します。この以下のセクションで示すように SQL*Plus を設定する必要があります。

DB インスタンスに関連付けられているオプショングループに Oracle SSL オプションを追加することで、Oracle DB インスタンスの SSL 暗号化を有効にします。Amazon RDS は、Oracle が必要とするように、SSL 接続に 2 番目のポートを使用します。この方法では、クリアテキストと SSL 暗号化の両方の通信を、DB インスタンスと SQL*Plus 間で同時に実行できます。たとえば、このポートで SSL 暗号化通信を使用して VPC 外部のリソースと通信する一方で、このポートでクリアテキスト通信を使用して VPC 内の他のリソースと通信できます。

注記

Secure Sockets Layer またはネイティブネットワーク暗号化を使用できますが、両方を使用することはできません。詳細については、「Oracle ネイティブネットワーク暗号化」を参照してください。

Oracle データベースの以下のバージョンおよびエディションで SSL 暗号化を使用できます。

  • 12.2.0.1: すべてのバージョン、すべてのエディション (Standard Edition Two を含む)

  • 12.1.0.2: すべてのバージョン、すべてのエディション (Standard Edition Two を含む)

  • 11.2.0.4: すべてのバージョン、Enterprise Edition

  • 11.2.0.4: バージョン 6 以降、Standard Edition、Standard Edition One、Enterprise Edition

注記

SSL と Oracle ネイティブネットワークの暗号化 (NNE) を同じインスタンスで両方使用することはできません。SSL 暗号化を使用する場合は、他のすべての接続の暗号化を無効にする必要があります。

Oracle SSL オプションの TLS バージョン

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 or 1.0" – クライアントは、TLS 1.2 または 1.0 のいずれかを使用して DB インスタンスに接続できます。

Oracle SSL オプションを使用するには、SQLNET.SSL_VERSION オプション設定も必要です。

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

  • 新しい SSL Oracle オプションを追加すると、SQLNET.SSL_VERSION を有効な値に明示的に設定する必要があります。

次の表は、さまざまな Oracle エンジンのバージョンおよびエディションでサポートされている TLS オプションの設定を示します。

Oracle エンジンのバージョン SQLNET.SSL_VERSION="1.0" SQLNET.SSL_VERSION="1.2" SQLNET.SSL_VERSION="1.2 または 1.0"

12.2.0.1 (すべてのエディション)

サポート対象

サポート対象

サポート対象

12.1.0.2 (すべてのエディション)

サポート対象

サポート対象

サポート対象

11.2.0.4 (Oracle EE)

サポート対象

11.2.0.4 .v8 以降をサポート

11.2.0.4 .v8 以降をサポート

11.2.0.4 (Oracle SE1)

サポート対象

サポート外

サポート外

11.2.0.4 (Oracle SE)

サポート対象

サポート外

サポート外

SSL オプションの追加

SSL を使用するには、Amazon RDS Oracle DB インスタンスが、SSL オプションを含むオプショングループに関連付けられている必要があります。

コンソール

SSL オプションをオプショングループに追加するには

  1. 新しいオプショングループを作成するか、SSL オプションを追加する既存のオプショングループを識別します。

    オプショングループの作成の詳細については、「オプショングループを作成する」を参照してください。

  2. オプショングループに [SSL] オプションを追加します。

    オプショングループへのオプションの追加の詳細については、「オプショングループにオプションを追加する」を参照してください。

  3. 新しい Oracle DB インスタンスを作成し、オプショングループをそのインスタンスに関連付けるか、オプショングループを関連付けるように Oracle DB インスタンスを変更します。

    Oracle DB インスタンスの作成方法については、「Oracle データベースエンジンを実行する DB インスタンスを作成する」を参照してください。

    Oracle DB インスタンスの変更方法については、「Oracle データベースエンジンを実行する DB インスタンスの変更」を参照してください。

AWS CLI

SSL オプションをオプショングループに追加するには

  1. 新しいオプショングループを作成するか、SSL オプションを追加する既存のオプショングループを識別します。

    オプショングループの作成の詳細については、「オプショングループを作成する」を参照してください。

  2. オプショングループに [SSL] オプションを追加します。

    以下のオプション設定を指定します。

    • Port – SSL ポート番号

    • VpcSecurityGroupMemberships – オプションが有効な VPC セキュリティグループ

    • SQLNET.SSL_VERSION – クライアントから DB インスタンスへの接続に使用できる TLS バージョン

    たとえば、以下の AWS CLI コマンドでは、SSL オプションを、ora-option-group という名前のオプショングループに追加します。

    Linux、OS X、Unix の場合:

    aws rds add-option-to-option-group --option-group-name ora-option-group \ --options 'OptionName=SSL,Port=2484,VpcSecurityGroupMemberships="sg-68184619",OptionSettings=[{Name=SQLNET.SSL_VERSION,Value=1.0}]'

    Windows の場合:

    aws rds add-option-to-option-group --option-group-name ora-option-group ^ --options 'OptionName=SSL,Port=2484,VpcSecurityGroupMemberships="sg-68184619",OptionSettings=[{Name=SQLNET.SSL_VERSION,Value=1.0}]'
  3. 新しい Oracle DB インスタンスを作成し、オプショングループをそのインスタンスに関連付けるか、オプショングループを関連付けるように Oracle DB インスタンスを変更します。

    Oracle DB インスタンスの作成方法については、「Oracle データベースエンジンを実行する DB インスタンスを作成する」を参照してください。

    Oracle DB インスタンスの変更方法については、「Oracle データベースエンジンを実行する DB インスタンスの変更」を参照してください。

Oracle DB インスタンスで SSL を使用するように SQL*Plus を設定する

Oracle SSL オプションを使用して Oracle DB インスタンスに接続する前に、SQL*Plus を設定する必要があります。

注記

適切なクライアントからの DB インスタンスへのアクセスを許可するには、セキュリティグループが適切に設定されていることを確認します。詳細については、「セキュリティグループによるアクセスの制御」を参照してください。さらに、この手順は、SQL*Plus および Oracle ホームを直接使用するその他のクライアント向けです。JDBC 接続については、「JDBC を介した SSL 接続のセットアップ」を参照してください。

SSL を使用して Oracle DB インスタンスに接続するように SQL*Plus を設定するには

  1. ORACLE_HOME 環境変数を Oracle ホームディレクトリの場所に設定します。

    Oracle ホームディレクトリへのパスは、インストールによって異なります。次の例では、ORACLE_HOME 環境変数を設定します。

    prompt>export ORACLE_HOME=/home/user/app/user/product/12.1.0/dbhome_1

    Oracle 環境変数の設定については、Oracle ドキュメントの「SQL*Plus 環境変数」、オペレーティングシステムについては Oracle インストールガイドを参照してください。

  2. $ORACLE_HOME/libLD_LIBRARY_PATH 環境変数に追加します。

    LD_LIBRARY_PATH 環境変数を設定する例を以下に示します。

    prompt>export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
  3. $ORACLE_HOME/ssl_wallet に Oracle Wallet のディレクトリを作成します。

    以下は、Oracle Wallet のディレクトリを作成する例です。

    prompt>mkdir $ORACLE_HOME/ssl_wallet
  4. すべてのリージョンで動作するルート証明書をダウンロードし、そのファイルを ssl_wallet ディレクトリに置きます。

    ルート証明書のダウンロードについては、SSL を使用した DB インスタンスへの接続の暗号化 を参照してください。

  5. $ORACLE_HOME/network/admin ディレクトリで、tnsnames.ora ファイルを変更または作成して以下のエントリを含めます。

    <net_service_name>= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCPS) (HOST = <endpoint>) (PORT = <ssl port number>)))(CONNECT_DATA = (SID = <database name>)) (SECURITY = (SSL_SERVER_CERT_DN = "C=US,ST=Washington,L=Seattle,O=Amazon.com,OU=RDS,CN=<endpoint>")))
  6. 同じディレクトリで、sqlnet.ora ファイルを変更または作成して以下のパラメータを含めます。

    注記

    TLS でセキュリティ保護された接続を介してエンティティと通信するために、Oracle は認証用の必要な証明書を持つウォレットを必要とします。ステップ 7 に示すように、Oracle の ORAPKI ユーティリティを使用して Oracle ウォレットを作成して管理できます。詳細については、Oracle ドキュメントで「ORAPKI を使用した Oracle ウォレットの設定」を参照してください。

    WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = $ORACLE_HOME/ssl_wallet))) SSL_CLIENT_AUTHENTICATION = FALSE SSL_VERSION = 1.0 SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA) SSL_SERVER_DN_MATCH = ON

    注記

    SSL_VERSION はより高い値に設定できます (DB インスタンスでサポートされている場合)。

  7. 以下のコマンドを実行して Oracle Wallet を作成します。

    prompt>orapki wallet create -wallet $ORACLE_HOME/ssl_wallet -auto_login_only   prompt>orapki wallet add -wallet $ORACLE_HOME/ssl_wallet -trusted_cert -cert $ORACLE_HOME/ssl_wallet/rds-ca-2015-root.pem -auto_login_only

    ファイル名を、ダウンロードしたファイル名に置き換えます。

SSL を使用した Oracle DB インスタンスへの接続

前述のように SQL*Plus で SSL を使用するように設定すると、SSL オプションを使用して Oracle DB インスタンスに接続できるようになります。オプションとして、最初に、tnsnames.ora ファイルと sqlnet.ora ファイルが含まれているディレクトリを指す TNS_ADMIN 値をエクスポートできます。これにより、これらのファイルを SQL*Plus は確実に見つけることができます。次の例では、TNS_ADMIN の値をエクスポートしています。

export TNS_ADMIN = ${ORACLE_HOME}/network/admin

DB インスタンスに接続します。たとえば、SQL *Plus と、tnsnames.ora ファイルの <net_service_name> を使用して接続できます。

sqlplus <mydbuser>@<net_service_name>

以下のコマンドを使用すると、tnsnames.ora ファイルを使用せずに SQL *Plus のみを使用して、DB インスタンスに接続することもできます。

sqlplus '<mydbuser>@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCPS)(HOST = <endpoint>) (PORT = <ssl port number>))(CONNECT_DATA = (SID = <database name>)))'

SSL を使用せずに Oracle DB インスタンスに接続することもできます。たとえば、以下のコマンドは SSL 暗号化を使用せずにクリアテキストポートを使用して DB インスタンスに接続します。

sqlplus '<mydbuser>@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = <endpoint>) (PORT = <port number>))(CONNECT_DATA = (SID = <database name>)))'

Transmission Control Protocol (TCP) ポートアクセスを閉じる場合は、IP アドレスの進入を許可しないセキュリティグループを作成して、インスタンスに追加します。これを追加することで、TCP ポートを使用した接続を閉じながら、SSL オプションのセキュリティグループで許可された範囲内の IP アドレスから指定された SSL ポートを使用して接続できます。

JDBC を介した SSL 接続のセットアップ

JDBC を介した SSL 接続を使用するには、キーストアを作成して、Amazon RDS のルート CA 証明書を信頼し、以下で指定されるコードスニペットを使用する必要があります。

JKS 形式でキーストアを作成するには、次のコマンドを使用します。キーストアの作成の詳細については、Oracle のドキュメントを参照してください。

keytool -keystore clientkeystore -genkey -alias client

次に、Amazon RDS のルート CA 証明書を信頼するよう、以下のステップを実行します。

Amazon RDS ルート CA 証明書を信頼するには

  1. すべてのリージョンで動作するルート証明書をダウンロードし、そのファイルを ssl_wallet ディレクトリに置きます。

    ルート証明書のダウンロードについては、SSL を使用した DB インスタンスへの接続の暗号化 を参照してください。

  2. 次のコマンドを使用して、証明書を .der 形式に変換します。

    openssl x509 -outform der -in rds-ca-2015-root.pem -out rds-ca-2015-root.der

    ファイル名を、ダウンロードしたファイル名に置き換えます。

  3. 次のコマンドを使用して、証明書をキーストアにインポートします。

    keytool -import -alias rds-root -keystore clientkeystore -file rds-ca-2015-root.der
  4. キーストアが正常に作成されたことを確認します。

    keytool -list -v -keystore clientkeystore.jks

    キーストアのパスワードを求められたら、これを入力します。

次のコード例は、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 = "<dns-name-provided-by-amazon-rds>"; private static final Integer SSL_PORT = "<ssl-option-port-configured-in-option-group>"; private static final String DB_SID = "<oracle-sid>"; private static final String DB_USER = "<user name>"; private static final String DB_PASSWORD = "<password>"; // This key store has only the prod root ca: https://s3.amazonaws.com/rds-downloads/rds-ca-2015-root.pem private static final String KEY_STORE_FILE_PATH = "<file-path-to-keystore>"; private static final String KEY_STORE_PASS = "<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("user", DB_USER); properties.put("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 no exception, that means handshake has passed, and an SSL connection can be opened } }

SSL 接続での DN マッチングの実施

データベースサーバーの識別子名 (DN) をそのサービス名と一致させるには、Oracle パラメーター SSL_SERVER_DN_MATCH を使用できます。マッチングの検証を実施する場合は、SSL により、証明書がサーバーから取得されたものであることが確認されます。マッチングの検証を実施しない場合、SSL によって確認が行われますが、一致しているかどうかにかかわらず接続が許可されます。マッチングを実施しない場合、サーバーで識別をモデリング偽造することを許可できます。

DN マッチングを実施するには、DN マッチングのプロパティを追加し、以下に示されている接続文字列を使用します。

DN マッチングを実施するには、このプロパティをクライアント接続に追加します。

properties.put("oracle.net.ssl_server_dn_match", "TRUE”);

SSL の使用時は、以下の接続文字列を使用して DN マッチングを実施します。

final String connectionString = String.format( "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=%s)(PORT=%d))" + "(CONNECT_DATA=(SID=%s))" + "(SECURITY = (SSL_SERVER_CERT_DN = \"C=US,ST=Washington,L=Seattle,O=Amazon.com,OU=RDS,CN=%s\")))", DB_SERVER_NAME, SSL_PORT, DB_SID, DB_SERVER_NAME);