Capa de conexión segura de Oracle - Amazon Relational Database Service

Capa de conexión segura de Oracle

Para habilitar el cifrado mediante la capa de conexión segura (SSL) para una instancia de base de datos de RDS para Oracle, se agrega la opción Oracle SSL al grupo de opciones asociado a la base de datose. Amazon RDS utiliza un segundo puerto, según lo requiera Oracle, para las conexiones SSL. Este enfoque permite que se produzca la comunicación cifrada de SSL y de texto sin cifrar al mismo tiempo entre una instancia de base de datos y SQL*Plus. Por ejemplo, es posible utilizar el puerto con la comunicación de texto sin cifrar para ponerse en contacto con otros recursos dentro de una VPC mientras se utiliza el puerto con comunicación cifrada SSL para ponerse en contacto con recursos situados fuera de la VPC.

nota

Se puede utilizar SSL o Native Network Encryption (NNE) en la misma instancia de base de datos de RDS para Oracle, pero no ambos. Si se utiliza el cifrado SSL, se debe desactivar cualquier otro cifrado de conexión. Para obtener más información, consulte Oracle Native Network Encryption.

SSL/TLS y NNE ya no forman parte de Oracle Advanced Security. En RDS para Oracle, el cifrado SSL puede utilizarse con las ediciones con licencia de las siguientes versiones:

  • Oracle Database 21c (21.0.0)

  • Oracle Database 19c (19.0.0)

Versiones de TLS para la opción Oracle SSL

Amazon RDS for Oracle supports Transport Layer Security (TLS) versiones 1.0 y 1.2. Cuando añada una nueva opción Oracle SSL, establezca SQLNET.SSL_VERSION explícitamente en un valor válido. Los siguientes valores están permitidos para esta continuación de opciones:

  • "1.0": los clientes pueden conectarse a la instancia de base de datos utilizando TLS versión 1.0 solo. Para las opciones de Oracle SSL existentes, SQLNET.SSL_VERSION se establece en "1.0" automáticamente. Puede cambiar la configuración si es necesario.

  • "1.2": los clientes pueden conectarse a la instancia de base de datos utilizando TLS 1.2 solo.

  • "1.2 or 1.0": los clientes pueden conectarse a la instancia de base de datos utilizando TLS 1.2 o 1.0.

Conjuntos de cifrado para la opción Oracle SSL

Amazon RDS for Oracle es compatible con múltiples conjuntos de cifrado SSL. De manera predeterminada, la opción Oracle SSL está configurada para utilizar el conjunto de cifrado SSL_RSA_WITH_AES_256_CBC_SHA. Para especificar un conjunto de cifrado diferente para utilizarlo en las conexiones SSL, utilice la configuración de opciones SQLNET.CIPHER_SUITE.

En la siguiente tabla se resume la compatibilidad de SSL para RDS para Oracle en todas las ediciones de Oracle Database 19c y 21c.

Conjunto de cifrado (SQLNET.CIPHER_SUITE) Compatibilidad de la versión de TLS (SQLNET.SSL_VERSION) Compatibilidad FIPS Conforme con FedRAMP
SSL_RSA_WITH_AES_256_CBC_SHA (predeterminado) 1.0 y 1.2 No
SSL_RSA_WITH_AES_256_CBC_SHA256 1.2 No
SSL_RSA_WITH_AES_256_GCM_SHA384 1.2 No
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 1.2
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 1.2
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 1.2
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 1.2
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 1.2
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 1.2

Compatibilidad FIPS

RDS para Oracle le permite usar el estándar federal de procesamiento de la información (FIPS) para 140-2. FIPS 140-2 es un estándar del gobierno estadounidense que define los requisitos de seguridad de los módulos criptográficos. Para activar el estándar FIPS, establezca el valor FIPS.SSLFIPS_140 en TRUE para la opción SSL de Oracle. Cuando FIPS 140-2 se configura para SSL, las bibliotecas criptográficas cifran los datos entre el cliente y la instancia de base de datos de RDS para Oracle.

Los clientes deben usar el conjunto de cifrado compatible con FIPS. Al establecer una conexión, el cliente y la instancia de base de datos de RDS para Oracle negocian qué conjunto de cifrado utilizar al transmitir mensajes entre ellos. La tabla en Conjuntos de cifrado para la opción Oracle SSL muestra los conjuntos de cifrado SSL compatibles con FIPS para cada versión de TLS. Para obtener más información, consulte Oracle Database FIPS 140-2 Settings en la documentación de Oracle.

Adición de la opción SSL

Para usar SSL, su instancia de base de datos de RDS para Oracle debe estar asociada a un grupo de opciones que incluya la opción SSL.

Para agregar la opción SSL a un grupo de opciones, realice el siguiente procedimiento:
  1. Cree un nuevo grupo de opciones o identifique uno ya existente al que pueda añadir la opción SSL.

    Para obtener información acerca de cómo crear un grupo de opciones, consulte Creación de un grupo de opciones.

  2. Agregue la opción SSL al grupo de opciones.

    Si solo desea utilizar conjuntos de cifrado verificados por FIPS para las conexiones SSL, establezca la opción FIPS.SSLFIPS_140 en TRUE. Para obtener información sobre el estándar FIPS, consulte Compatibilidad FIPS.

    Para obtener información acerca de cómo añadir una opción a un grupo de opciones, consulte Agregar una opción a un grupo de opciones.

  3. Cree una nueva instancia de base de datos de RDS para Oracle y asocie el grupo de opciones a ella, o bien modifique una instancia de base de datos de RDS para Oracle para asociarla al grupo de opciones.

    Para obtener información acerca de la creación de una instancia de base de datos, consulte Creación de una instancia de base de datos de Amazon RDS.

    Para obtener información acerca de la modificación de una instancia de base de datos, consulte Modificación de una instancia de base de datos de Amazon RDS.

Para agregar la opción SSL a un grupo de opciones, realice el siguiente procedimiento:
  1. Cree un nuevo grupo de opciones o identifique uno ya existente al que pueda añadir la opción SSL.

    Para obtener información acerca de cómo crear un grupo de opciones, consulte Creación de un grupo de opciones.

  2. Añada la opción SSL al grupo de opciones.

    Especifique las siguientes opciones de configuración:

    • Port: el número de puerto SSL.

    • VpcSecurityGroupMemberships: el grupo de seguridad de VPC para el que se ha habilitado la opción.

    • SQLNET.SSL_VERSION: la versión TLS que el cliente puede utilizar para conectarse a la instancia de base de datos.

    Por ejemplo, el siguiente comando de la AWS CLI añade la opción SSL a un grupo de opciones denominado ora-option-group.

    ejemplo

    Para Linux, macOS o 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}]'

    En 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. Cree una nueva instancia de base de datos de RDS para Oracle y asocie el grupo de opciones a ella, o bien modifique una instancia de base de datos de RDS para Oracle para asociarla al grupo de opciones.

    Para obtener información acerca de la creación de una instancia de base de datos, consulte Creación de una instancia de base de datos de Amazon RDS.

    Para obtener información acerca de la modificación de una instancia de base de datos, consulte Modificación de una instancia de base de datos de Amazon RDS.

Configuración de SQL*Plus para utilizar SSL con una instancia de base de datos de RDS para Oracle

Para poder conectarse a una instancia de base de datos de RDS para Oracle que utilice la opción Oracle SSL, deberá configurar SQL*Plus antes de conectarse.

nota

Para permitir el acceso a la instancia de base de los clientes adecuados, asegúrese de que configuren los grupos de seguridad correctamente. Para obtener más información, consulte Control de acceso con grupos de seguridad. Estas instrucciones también son para SQL*Plus y otros clientes que usan directamente un sistema interno de Oracle. Para las conexiones JDBC, consulte Configuración de una conexión SSL a través de JDBC.

Para configurar SQL*Plus para que use SSL para conectarse a una instancia de base de datos de RDS para Oracle
  1. Establezca la variable de entorno ORACLE_HOME en la ubicación del directorio principal de Oracle.

    La ruta al directorio principal de Oracle depende de cada instalación. En el ejemplo siguiente, se establece la variable de entorno ORACLE_HOME.

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

    Para obtener más información sobre cómo establecer variables de entorno de Oracle, consulte SQL*Plus Environment Variables en la documentación de Oracle y vea además la guía de instalación de Oracle correspondiente a su sistema operativo.

  2. Agregue $ORACLE_HOME/lib a la variable de entorno LD_LIBRARY_PATH.

    En el ejemplo siguiente, se establece la variable de entorno LD_LIBRARY_PATH.

    prompt>export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
  3. Cree un directorio para el wallet de Oracle en $ORACLE_HOME/ssl_wallet.

    En el ejemplo siguiente, se crea el directorio del wallet de Oracle.

    prompt>mkdir $ORACLE_HOME/ssl_wallet
  4. Descargue el archivo de paquete de certificados .pem que funciona con todas las Regiones de AWS y coloque el archivo en el directorio ssl_wallet. Para obtener más información, consulte Uso de SSL/TLS para cifrar una conexión a una instancia o clúster de base de datos.

  5. En el directorio $ORACLE_HOME/network/admin, modifique o cree el archivo tnsnames.ora e incluya la siguiente entrada.

    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. En el mismo directorio, modifique o cree el archivo sqlnet.ora e incluya los siguientes parámetros.

    nota

    Para comunicarse con entidades a través de una conexión segura TLS, Oracle requiere un wallet con los certificados necesarios para la autenticación. Puede usar la utilidad ORAPKI de Oracle para crear y mantener los wallets de Oracle, tal y como se muestra en el paso 7. Para obtener más información, consulte Setting Up Oracle Wallet Using ORAPKI (Configuración de wallet de Oracle mediante ORAPKI) en la documentación de 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
    nota

    Puede establecer SSL_VERSION en un valor superior si su instancia de base de datos es compatible.

  7. Ejecute el siguiente comando para crear el wallet de Oracle.

    prompt>orapki wallet create -wallet $ORACLE_HOME/ssl_wallet -auto_login_only
  8. Extraiga cada certificado del archivo de paquete .pem en un archivo .pem independiente mediante una utilidad del sistema operativo.

  9. Agregue cada certificado a su wallet mediante comandos orapki independientes y sustituya certificate-pem-file por el nombre absoluto del archivo .pem.

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

    Para obtener más información, consulte Rotar certificados SSL/TLS.

Conexión a una instancia de base de datos de RDS para Oracle mediante SSL

Después de configurar SQL*Plus para utilizar SSL tal como se ha descrito anteriormente, puede conectarse a la instancia de base de datos de RDS para Oracle con la opción SSL. Opcionalmente, puede primero exportar el valor TNS_ADMIN que apunta al directorio que contiene los archivos tnsnames.ora y sqlnet.ora. Si realiza este procedimiento, se asegurará de que SQL*Plus puede detectar estos archivos sistemáticamente. En el siguiente ejemplo se exporta el valor TNS_ADMIN.

export TNS_ADMIN = ${ORACLE_HOME}/network/admin

Conéctese a la instancia de base de datos. Por ejemplo, puede conectarse utilizando SQL*Plus y un <net_service_name> en un archivo tnsnames.ora.

sqlplus mydbuser@net_service_name

También puede conectar a la instancia de base de datos mediante SQL*Plus sin utilizar un archivo tnsnames.ora utilizando el siguiente comando.

sqlplus 'mydbuser@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCPS)(HOST = endpoint) (PORT = ssl_port_number))(CONNECT_DATA = (SID = database_name)))'

También puede conectarse a la instancia de base de datos de RDS para Oracle sin utilizar SSL. Por ejemplo, el siguiente comando se conecta a la instancia de base de datos a través del puerto de texto sin cifrar que no utiliza el cifrado SSL.

sqlplus 'mydbuser@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = endpoint) (PORT = port_number))(CONNECT_DATA = (SID = database_name)))'

Si desea cerrar el acceso al puerto TCP (Protocolo de control de transmisión), cree un grupo de seguridad sin entradas de dirección IP y añádalo a la instancia. Esta adición cierra las conexiones a través del puerto TCP, pero permite las conexiones a través del puerto SSL que se realizan desde las direcciones IP incluidas en el rango permitido por el grupo de seguridad de la opción SSL.

Configuración de una conexión SSL a través de JDBC

Para utilizar una conexión SSL a través de JDBC, debe crear un almacén de claves, confiar en el certificado de CA raíz de Amazon RDS y utilizar el siguiente fragmento de código especificado.

Para crear el almacén de claves con formato JKS, puede utilizar el siguiente comando. Para obtener más información acerca de la creación del almacén de claves, consulte Creating a keystore en la documentación de Oracle. Para obtener información de referencia, consulte keytool en la Referencia de herramientas de la plataforma Java, edición estándar.

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

Siga estos pasos para confiar en el certificado de CA raíz de Amazon RDS.

Para confiar en el certificado de CA raíz de Amazon RDS
  1. Descargue el archivo de paquete de certificados .pem que funciona con todas las Regiones de AWS y coloque el archivo en el directorio ssl_wallet.

    Para obtener más información acerca de cómo descargar certificados, consulte Uso de SSL/TLS para cifrar una conexión a una instancia o clúster de base de datos.

  2. Extraiga cada certificado del archivo .pem en un archivo independiente mediante una utilidad del sistema operativo.

  3. Convierta cada certificado al formato .der mediante un comando openssl independiente y sustituya certificate-pem-file por el nombre del archivo .pem del certificado (sin la extensión .pem).

    openssl x509 -outform der -in certificate-pem-file.pem -out certificate-pem-file.der
  4. Importe cada certificado al almacén de claves utilizando el siguiente comando.

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

    Para obtener más información, consulte Rotar certificados SSL/TLS.

  5. Confirme que el almacén de claves se haya creado correctamente.

    keytool -list -v -keystore clientkeystore.jks

    Especifique la contraseña del almacén de claves cuando se le solicite.

El siguiente ejemplo de código muestra cómo configurar la conexión SSL mediante JDBC.

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 } }
nota

Especifique una contraseña distinta de la que se muestra aquí como práctica recomendada de seguridad.

Obligatoriedad de la coincidencia del DN con una conexión SSL

Puede utilizar el parámetro de Oracle SSL_SERVER_DN_MATCH para hacer que sea obligatorio que el nombre distinguido (DN) del servidor de bases de datos coincida con su nombre de servicio. Si la verificación de coincidencia es obligatoria, SSL se asegura de que el certificado sea el del servidor. Si la verificación de coincidencia no es obligatoria, SSL realiza la comprobación, pero permite la conexión, independientemente de que haya o no una coincidencia. Si no se hace obligatoria la coincidencia, el servidor podría falsificar su identidad.

Para hacer obligatoria la coincidencia del DN, añada la propiedad de coincidencia del DN y utilice la cadena de conexión especificada a continuación.

Añada la propiedad a la conexión del cliente para hacer obligatoria la coincidencia del DN.

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

Utilice la siguiente cadena de conexión para hacer obligatoria la coincidencia del DN al utilizar SSL.

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

Solución de problemas de las conexiones SSL

Puede consultar la base de datos y recibir el error 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.

Este error se produce cuando el cliente intenta conectarse mediante una versión de TLS que el servidor no admite. Para evitar este error, edite sqlnet.ora y establezca SSL_VERSION en la versión de TLS correcta. Para obtener más información, consulte el documento de soporte de Oracle 2748438.1 en My Oracle Support.