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

Capa de conexión segura de Oracle

Para activar el cifrado mediante Capa de conexión segura (SSL) para una instancia de base de datos Oracle, se añade la opción Oracle SSL al grupo de opciones asociado a la base de datos Oracle. Se debe especificar el puerto con el que se desea comunicar a través de SSL. SQL*Plus se debe configurar como se indica en la siguiente sección.

Para habilitar el cifrado mediante la capa de conexión segura (SSL) para una instancia de base de datos de Oracle, se agrega la opción Oracle SSL al grupo de opciones asociado a la base de datos de Oracle. 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

Es posible utilizar Secure Sockets Layer o Native Network Encryption, pero no ambas opciones. Para obtener más información, consulte Oracle Native Network Encryption.

El cifrado SSL puede utilizarse con las siguientes versiones y ediciones de Oracle Database:

  • Oracle Database 21c (21.0.0)

  • Oracle Database 19c (19.0.0)

  • Base de datos Oracle 12c versión 2 (12.2)

  • Base de datos Oracle 12c versión 1 (12.1)

nota

No es posible utilizar SSL y Oracle Native Network Encryption (NNE) en la misma instancia. Si se utiliza el cifrado SSL, se debe desactivar cualquier otro cifrado de conexión.

Versiones de TLS para la opción Oracle SSL

Amazon RDS for Oracle supports Transport Layer Security (TLS) versiones 1.0 y 1.2. Para utilizar la opción Oracle SSL, utilice la configuración de opciones SQLNET.SSL_VERSION: 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 1.0 solo.

  • "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.

Para utilizar la opción Oracle SSL, también es necesaria la configuración de opciones SQLNET.SSL_VERSION:

  • 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.

  • Cuando añade una nueva opción de Oracle SSL, debe establecer SQLNET.SSL_VERSION explícitamente en un valor válido.

La tabla siguiente muestra la configuración de opciones de TLS que se admiten para distintas versiones y ediciones del motor de Oracle.

Versión del motor de Oracle SQLNET.SSL_VERSION = "1.0" SQLNET.SSL_VERSION = "1.2" SQLNET.SSL_VERSION = "1.2 o 1.0"

21.0.0.0 (todas las ediciones)

Soportado

Soportado

Soportado

19.0.0.0 (todas las ediciones)

Soportado

Soportado

Soportado

12.2.0.1 (todas las ediciones)

Soportado

Soportado

Soportado

12.1.0.2 (todas las ediciones)

Soportado

Soportado

Soportado

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. A continuación se muestran los valores permitidos para esta configuración de opciones:

  • "SSL_RSA_WITH_AES_256_CBC_SHA": la configuración predeterminada, que es compatible con TLS 1.0 y TLS 1.2

  • "SSL_RSA_WITH_AES_256_CBC_SHA256": solo compatible con TLS 1.2

  • "SSL_RSA_WITH_AES_256_GCM_SHA384": solo compatible con TLS 1.2

Para las opciones de Oracle SSL existentes, SQLNET.CIPHER_SUITE se establece en "SSL_RSA_WITH_AES_256_CBC_SHA" automáticamente. Puede cambiar la configuración si es necesario.

La tabla siguiente muestra la configuración de opciones de opción de conjunto de cifrado que se admiten para distintas versiones y ediciones del motor de Oracle.

Versión del motor de Oracle SQLNET.CIPHER_SUITE = "SSL_RSA_WITH_AES_256_CBC_SHA" SQLNET.CIPHER_SUITE = "SSL_RSA_WITH_AES_256_CBC_SHA256" SQLNET.CIPHER_SUITE = "SSL_RSA_WITH_AES_256_GCM_SHA384"

19.0.0.0 (todas las ediciones)

Soportado

Soportado

Soportado

12.2.0.1 (todas las ediciones)

Soportado

Soportado

Soportado

12.1.0.2 (todas las ediciones)

Soportado

Soportado

Soportado

Compatibilidad FIPS

Amazon RDS for Oracle le permite usar el estándar federal de procesamiento de la información (FIPS) 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 habilitar el estándar FIPS, establezca el valor en FIPS.SSLFIPS_140 TRUE para la opción SSL de Oracle. Cuando FIPS 140-2 se configura para SSL, las bibliotecas criptográficas se diseñan para cifrar datos entre el cliente y la instancia de base de datos de Oracle.

Puede activar la configuración de FIPS con las siguientes versiones y ediciones de la base de datos Oracle:

  • 19.0.0.0: todas las versiones, todas las ediciones incluyendo Standard Edition Two

  • 12.2.0.1: todas las versiones, todas las ediciones incluyendo Standard Edition Two

  • 12.1.0.2: versión 2 y posterior, todas las ediciones incluyendo Standard Edition Two

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 Oracle negocian qué conjunto de cifrado utilizar al transmitir mensajes entre ellos. En la siguiente tabla se muestran los conjuntos de cifrado SSL compatibles con FIPS para cada versión de TLS.

SQLNET.SSL_VERSION Compatibilidad con los conjuntos de cifrado

1.0

SSL_RSA_WITH_AES_256_CBC_SHA

1.2

SSL_RSA_WITH_AES_256_CBC_SHA

SSL_RSA_WITH_AES_256_GCM_SHA384

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 Amazon RDS for 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 Oracle y asocie el grupo de opciones a ella, o bien modifíquela para asociarlo.

    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 más 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}]'

    Para 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 Oracle y asocie el grupo de opciones a ella, o bien modifíquela para asociarlo.

    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 más 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 Oracle

Debe configurar SQL*Plus antes de conectarse a una base de datos Oracle que utilice la opción Oracle SSL.

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 con objeto de usar SSL para conectarse a una base de datos 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/12.1.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 certificado raíz que funciona con todas las regiones de AWS y coloque el archivo en el directorio ssl_wallet.

    Para obtener información sobre la descarga del certificado raíz, consulte Uso de SSL/TLS para cifrar una conexión a una instancia.

  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 los siguientes comandos para crear el wallet de Oracle.

    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-2019-root.pem -auto_login_only

    Reemplace el nombre de archivo por el que ha descargado.

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

Después de configurar SQL*Plus para utilizar SSL como se describió anteriormente, puede conectarse a la instancia de base de datos 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 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, utilice el siguiente comando. Para obtener más información acerca de la creación del almacén de claves, consulte la documentación de Oracle.

keytool -keystore clientkeystore -genkey -alias client

A continuación, 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 certificado raíz que funciona con todas las regiones de AWS y coloque el archivo en el directorio ssl_wallet.

    Para obtener información sobre la descarga del certificado raíz, consulte Uso de SSL/TLS para cifrar una conexión a una instancia.

  2. Convierta el certificado al formato .der con el siguiente comando.

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

    Reemplace el nombre de archivo por el que ha descargado.

  3. Importe el certificado en el almacén de claves utilizando el siguiente comando.

    keytool -import -alias rds-root -keystore clientkeystore.jks -file rds-ca-2019-root.der
  4. 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 } }

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