メニュー
Amazon Relational Database Service
ユーザーガイド (API Version 2014-10-31)

Oracle SSL

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

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

注記

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

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

  • 11.2.0.2.v* (すべてのバージョン) - Enterprise Edition

  • 11.2.0.3.v* (すべてのバージョン) - Enterprise Edition

  • 11.2.0.4.v* (すべてのバージョン) - Enterprise Edition

  • 11.2.0.4.v6 以降 - Standard Edition、Standard Edition One、Enterprise Edition

  • 12.1.0.1.v* (すべてのバージョン) - すべてのエディション

  • 12.1.0.2.v* (すべてのバージョン) - Standard Edition Two を含むすべてのエディション

注記

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

Oracle DB インスタンスで SSL を使用する Oracle クライアントの設定

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

SSL を使用して Oracle DB インスタンスに接続するように Oracle クライアントを設定するには

  1. 以下のコマンドを実行して、ORACLE_HOME システム変数を dbhome_1 ディレクトリの場所に設定します。

    Copy
    prompt>export ORACLE_HOME=/home/user/app/user/product/12.1.0/dbhome_1
  2. LD_LIBRARY_PATH システム変数に $ORACLE_HOME/lib を追加します。

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

    Copy
    prompt>mkdir $ORACLE_HOME/ssl_wallet
  4. https://s3.amazonaws.com/rds-downloads/rds-ca-2015-root.pem から RDS CA 証明書ファイルをダウンロードして、ssl_wallet ディレクトリに置きます。

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

    Copy
    <database 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 ファイルを変更または作成して以下のパラメーターを含めます。

    Copy
    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
  7. 以下のコマンドを実行して Oracle Wallet を作成します。

    Copy
    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 インスタンスへの接続

前述のように Oracle クライアントで SSL を使用するように設定すると、SSL オプションを使用して Oracle DB インスタンスに接続できるようになります。たとえば、sqlplus を使用して DB インスタンスに接続するには、以下のコマンドを使用します。

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

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

Copy
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 のドキュメントを参照してください。

Copy
keytool -keystore clientkeystore -genkey -alias client

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

  1. 1. https://s3.amazonaws.com/rds-downloads/rds-ca-2015-root.pem から Amazon RDS のルート CA 証明書をダウンロードします。

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

    Copy
    openssl x509 -outform der -in rds-ca-2015-root.pem -out rds-ca-2015-root.der
  3. 次のコマンドを使用して、証明書をキーストアにインポートします。

    Copy
    keytool -import -alias rds-root -keystore clientkeystore -file rds-ca-2015-root.der

次のコードスニペットは、JDBC を使用する SSL 接続のセットアップ方法を示します。

Copy
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 マッチングを実施するには、このプロパティをクライアント接続に追加します。

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

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

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

関連トピック