Oracle Secure Sockets Layer - Amazon Relational Database Service

Oracle Secure Sockets Layer

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

注記

同じ RDS for Oracle DB インスタンスで SSL またはネイティブネットワークの暗号化 (NNE) のいずれかを使用できますが、両方使用することはできません。SSL 暗号化を使用する場合は、他のすべての接続の暗号化を無効にする必要があります。詳細については、「Oracle ネイティブネットワーク暗号化」を参照してください。

SSL/TLS と NNE は、Oracle Advanced Security の一部ではなくなりました。RDS for Oracle では、以下のデータベースバージョンのすべてのライセンスされたエディションで、SSL 暗号化を使用できます。

  • Oracle Database 21c (21.0.0)

  • Oracle Database 19c (19.0.0)

  • Oracle Database 12c Release 2 (12.2) — サポートされなくなりました

  • Oracle Database 12c Release 2 (12.2) — サポートされなくなりました

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 インスタンスに接続できます。既存の Oracle SSL オプションで、SQLNET.SSL_VERSION は自動的に "1.0" に設定されます。必要に応じて設定を変更できます。

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

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

Oracle SSL オプションの暗号スイート

Amazon RDS for Oracle は、複数の SSL 暗号スイートをサポートしています。デフォルトでは、Oracle SSL オプションは SSL_RSA_WITH_AES_256_CBC_SHA 暗号スイートを使用するように設定されています。SSL 接続で使用する別の暗号スイートを指定するには、SQLNET.CIPHER_SUITE オプション設定を使用します。

次の表に、RDS for Oracle の SSL サポートの要約を示します。指定されている Oracle Database リリースは、すべてのエディションをサポートします。

暗号スイート (SQLNET.CIPHER_SUITE) TLS バージョン (SQLNET.SSL_VERSION) サポートされている Oracle Database のリリース FIPS のサポート FedRAMP 準拠
SSL_RSA_WITH_AES_256_CBC_SHA (デフォルト) 1.0 および 1.2 12c、19c、21c はい いいえ
SSL_RSA_WITH_AES_256_CBC_SHA256 1.2 12c、19c、21c はい いいえ
SSL_RSA_WITH_AES_256_GCM_SHA384 1.2 12c、19c、21c はい いいえ
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 1.2 19c、21c はい はい
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 1.2 19c、21c はい はい
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 1.2 19c、21c はい はい
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 1.2 19c、21c はい はい
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 1.2 19c、21c はい はい
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 1.2 19c、21c はい はい

FIPS のサポート

RDS for Oracle では、連邦情報処理規格 (FIPS) 140-2 標準を使用できます。FIPS 140-2 は、暗号化モジュールのセキュリティ要件を規定する米国政府のスタンダード規格です。FIPS 標準は、Oracle SSL オプションの FIPS.SSLFIPS_140TRUE に設定することでオンにします。SSL に FIPS 140-2 を設定した場合、暗号化ライブラリはクライアントと RDS for Oracle DB インスタンスの間のデータを暗号化します。

クライアントは、FIPS 準拠の暗号スイートを使用する必要があります。接続を確立する際、クライアントと RDS for Oracle DB インスタンスはメッセージの送受信に使用する暗号スイートをネゴシエートします。Oracle SSL オプションの暗号スイート の表に、各 TLS バージョンについて FIPS 準拠の SSL 暗号スイートを示します。詳細については、Oracle データベースドキュメントの「Oracle データベース FIPS 140-2 設定」を参照してください。

SSL オプションの追加

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

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

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

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

    SSL 接続に FIPS で検証された暗号スイートのみを使用する場合は、FIPS.SSLFIPS_140 オプションを TRUE に設定します。FIPS スタンダードの詳細については、「FIPS のサポート」を参照してください。

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

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

    DB インスタンスの作成については、「Amazon RDS DB インスタンスの作成」を参照してください。

    DB インスタンスの変更については、「Amazon RDS DB インスタンスを変更する」を参照してください。

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

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

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

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

    • Port - SSL ポート番号

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

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

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

    Linux、macOS、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. 新しい RDS for Oracle DB インスタンスを作成し、オプショングループをそのインスタンスに関連付けるか、オプショングループを関連付けるように RDS for Oracle DB インスタンスを変更します。

    DB インスタンスの作成については、「Amazon RDS DB インスタンスの作成」を参照してください。

    DB インスタンスの変更については、「Amazon RDS DB インスタンスを変更する」を参照してください。

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

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

注記

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

SSL を使用して RDS for 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. すべての AWS リージョン で動作する証明書バンドルをダウンロードし、そのファイルを ssl_wallet ディレクトリに置きます。詳細については、「SSL/TLS を使用した 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
  8. OS ユーティリティを使用して、.pem バンドルファイル内の各証明書を個別の .pem ファイルに抽出します。

  9. 個別の orapki コマンドを使用して各証明書をウォレットに追加し、certificate-pem-file を.pem ファイルの絶対ファイル名に置き換えます。

    prompt>orapki wallet add -wallet $ORACLE_HOME/ssl_wallet -trusted_cert -cert certificate-pem-file -auto_login_only

    詳細については、「SSL/TLS 証明書のローテーション」を参照してください。

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

前述のように SQL*Plus で SSL を使用するように設定すると、SSL オプションを使用して RDS for 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 を使用せずに RDS for 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 のドキュメントの「キーストアの作成」を参照してください。リファレンス情報については、「Java プラットフォーム、標準エディションツールリファレンス」の「keytool」を参照してください。

keytool -genkey -alias client -validity 365 -keyalg RSA -keystore clientkeystore

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

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

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

  2. OS ユーティリティを使用して、.pem ファイル内の各証明書を個別のファイルに抽出します。

  3. certificate-pem-file を証明書 .pem ファイルの名前 (.pem 拡張子なし) に置き換えて、個別の openssl コマンドを使用して各証明書を .der 形式に変換します。

    openssl x509 -outform der -in certificate-pem-file.pem -out certificate-pem-file.der
  4. 次のコマンドを使用して、各証明書をキーストアにインポートします。

    keytool -import -alias rds-root -keystore clientkeystore.jks -file certificate-pem-file.der

    詳細については、「SSL/TLS 証明書のローテーション」を参照してください。

  5. キーストアが正常に作成されたことを確認します。

    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. 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);

SSL 接続のトラブルシューティング

データベースにクエリを実行すると、ORA-28860 エラーが表示されることがあります。

ORA-28860: Fatal SSL error 28860. 00000 - "Fatal SSL error" *Cause: An error occurred during the SSL connection to the peer. It is likely that this side sent data which the peer rejected. *Action: Enable tracing to determine the exact cause of this error.

このエラーは、サーバーがサポートしていないバージョンの TLS を使用してクライアントが接続しようとしたときに発生します。このエラーを回避するには、sqlnet.ora を編集して、SSL_VERSION を正しい TLS バージョンに設定します。詳細については、My Oracle Support の「Oracle Support ドキュメント 2748438.1」を参照してください。