¿Cómo puedo conectarme correctamente a mi instancia de Amazon RDS mediante una conexión SSL?

Última actualización: 25 de octubre de 2021

Quiero conectarme a mi instancia de base de datos de Amazon Relational Database Service (Amazon RDS) utilizando una conexión de capa de sockets seguros (SSL).

Descripción corta

Puede utilizar SSL o Transport Layer Security (TLS) desde su aplicación para cifrar una conexión a una instancia de base de datos que ejecute MySQL, MariaDB, Microsoft SQL Server, Oracle o PostgreSQL. Las conexiones SSL/TLS proporcionan una capa de seguridad al cifrar los datos que se transfieren entre el cliente y la instancia de base de datos. Un certificado de servidor proporciona una capa adicional de seguridad al validar que la conexión se está realizando a una instancia de base de datos de Amazon RDS.

Al aprovisionar una instancia de base de datos, Amazon RDS crea un certificado SSL e instala el certificado en la instancia. Estos certificados están firmados por una autoridad de certificación. El certificado SSL incluye el punto de enlace de la instancia de base de datos como nombre común del certificado SSL para proteger la instancia contra ataques de suplantación de identidad. Un certificado SSL creado por Amazon RDS es la entidad raíz de confianza y es válido en la mayoría de los casos. No obstante, si la aplicación no acepta cadenas de certificados, es posible que el certificado falle. En estos casos, es posible que tenga que utilizar un certificado intermedio para conectarse a su región de AWS. Por ejemplo, debe utilizar un certificado intermedio para conectarse a las regiones AWS GovCloud (EE. UU.) utilizando SSL.

Desde AWS Trust Services puede descargar un paquete de certificados que contiene los certificados intermedios y raíz para todas las regiones de AWS. En caso de que su aplicación esté en Microsoft Windows y requiera un archivo PKCS7, puede descargar el paquete de certificados PKCS7 desde Amazon. Este paquete contiene los certificados intermedio y raíz.

Resolución

Cada motor de base de datos tiene su propio proceso de implementación de SSL/TLS. Para implementar una conexión SSL/TLS para su clúster de base de datos, elija una de las siguientes opciones en función del motor de base de datos.

Amazon RDS for Oracle

Para las instancias de Amazon RDS for Oracle, puede activar el modo SSL agregando la opción SSL en el grupo de opciones personalizado.

Amazon RDS for Oracle es compatible con las versiones 1.0 y 1.2 de Transport Layer Security (TLS). Para utilizar la opción Oracle SSL, utilice la configuración de la opción SQLNET.SSL_VERSION en su grupo de opciones. Los siguientes valores están permitidos para esta opción:

  • “1.0”: los clientes pueden conectarse a la instancia de base de datos utilizando únicamente TLS 1.0.
  • “1.2”: los clientes pueden conectarse a la instancia de base de datos utilizando únicamente TLS 1.2.
  • “1.2 o 1.0”: los clientes pueden conectarse a la instancia de base de datos utilizando TLS 1.2 o 1.0.

Para las opciones existentes de Oracle SSL, SQLNET.SSL_VERSION se establece automáticamente en “1.0”. Si es necesario, puede cambiar la configuración.

Debe configurar el cliente de SQL*Plus para que utilice SSL antes de conectarse a una instancia de base de datos Oracle que utilice la opción de Oracle SSL. 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, a continuación, configurar la conexión SSL.

Código de muestra para 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 = "example-dns";
    private static final Integer SSL_PORT = "example-ssl-option-port-in-option-group";
    private static final String DB_SID = "example-oracle-sid";
    private static final String DB_USER = "example-username";
    private static final String DB_PASSWORD = "example-password";
    // This key store has only the prod root ca.
    private static final String KEY_STORE_FILE_PATH = "example-file-path-to-keystore";
    private static final String KEY_STORE_PASS = "example-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("example-username", DB_USER);
        properties.put("example-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 there is no exception, it means that an SSL connection can be opened
    }
}

Antes de conectarse a la instancia de Amazon RDS for Oracle mediante SSL, verifique lo siguiente:

  • El certificado raíz de RDS se descarga y se agrega a un archivo wallet. Este archivo se almacena en un directorio especificado por el parámetro WALLET_LOCATION del archivo sqlnet.ora.
  • Tiene el número de puerto SSL correcto en su entrada TNS.
  • El grupo de seguridad de Amazon RDS está configurado para permitir conexiones entrantes desde sus máquinas a través del puerto SSL.
  • El firewall o las políticas de seguridad están configurados adecuadamente para permitir el tráfico en el puerto SSL de Amazon RDS.

Amazon RDS for MariaDB

Amazon RDS for MariaDB es compatible con las versiones 1.0, 1.1, 1.2 y 1.3 de TLS. En una conexión TLS unidireccional, TLS se utiliza sin certificado de cliente y solo se puede autenticar el servidor. En consecuencia, la autenticación solo es posible en una dirección. Sin embargo, el cifrado sigue siendo posible en ambas direcciones. Con la verificación del certificado del servidor, el cliente verifica que el certificado pertenece al servidor.

Para lanzar el cliente MySQL 5.7 o posterior con un certificado RDS, ejecute un comando similar al siguiente:

mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-mode=VERIFY_IDENTITY

Para lanzar el cliente MariaDB con certificado RDS, ejecute un comando similar al siguiente:

mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-verify-server-cert

Para solicitar conexiones SSL para usuarios o cuentas específicas, ejecute la siguiente consulta en función de la versión de MariaDB:

ALTER USER 'test'@'%' REQUIRE SSL;

Para confirmar que su conexión está cifrada, ejecute cualquiera de las siguientes consultas:

MariaDB > status;
MariaDB > SHOW VARIABLES LIKE 'have_ssl';

Amazon RDS for MySQL

Amazon RDS for MySQL es compatible con las versiones 1.0, 1.1 y 1.2 de TLS.

Amazon RDS for MySQL utiliza yaSSL para las conexiones seguras en las siguientes versiones:

  • MySQL versión 5.7.19 y versiones anteriores a la 5.7
  • MySQL versión 5.6.37 y versiones anteriores a la 5.6

MySQL utiliza OpenSSL para las conexiones seguras en las siguientes versiones:

  • MySQL versión 8.0
  • MySQL versión 5.7.21 y versiones posteriores a la 5.7
  • MySQL versión 5.6.39 y versiones posteriores a la 5.6

Si el servidor admite conexiones cifradas, los programas cliente de MySQL intentan establecer una conexión cifrada de forma predeterminada. Para conseguir seguridad adicional a la proporcionada por el cifrado predeterminado, utilice el parámetro --ssl-ca para hacer referencia al certificado SSL que incluye el punto de enlace de la instancia de base de datos como nombre común. El certificado SSL protege la instancia contra ataques de suplantación de identidad.

Para lanzar el cliente utilizando el parámetro --ssl-ca para MySQL 5.7 y versiones posteriores, ejecute un comando similar al siguiente:

mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-mode=VERIFY_IDENTITY

Para solicitar conexiones SSL para usuarios o cuentas específicas, ejecute una consulta similar a la siguiente en función de la versión de MySQL:

mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-verify-server-cert

Para MySQL 5.7 y versiones posteriores:

ALTER USER 'testuser'@'%' REQUIRE SSL;

Para MySQL 5.6 y versiones anteriores:

GRANT USAGE ON *.* TO 'testuser'@'%' REQUIRE SSL;

Para confirmar que su conexión está cifrada, ejecute cualquiera de las siguientes consultas:

mysql> status;
mysql> SHOW VARIABLES LIKE 'have_ssl';

Amazon RDS for Microsoft SQL Server

Para conectarse a su instancia de base de datos de SQL Server, puede utilizar una de las siguientes formas de utilizar SSL:

  • Forzar el uso de SSL para todas las conexiones: con este método, las conexiones se producen de forma transparente para el cliente, y éste no tiene que hacer absolutamente nada para usar SSL. Para utilizar esta opción, establezca el parámetro rds.force_ssl en 1 (activado). De forma predeterminada, el parámetro rds.force_ssl está establecido en 0 (desactivado). El parámetro rds.force_ssl es estático. Por lo tanto, después de cambiar el valor, debe reiniciar la instancia de base de datos para que la modificación se haga efectiva.
  • Cifrar conexiones específicas: este método establece una conexión SSL desde un ordenador cliente específico, y debe cifrar las conexiones en el cliente.

Para cifrar conexiones de otros clientes SQL, añada encrypt=true a la cadena de conexión. Esta cadena puede estar disponible como una opción o como una propiedad en la página de conexión de las herramientas GUI.

Confirme que la conexión está cifrada ejecutando la siguiente consulta:

SELECT ENCRYPT_OPTION FROM SYS.DM_EXEC_CONNECTIONS WHERE SESSION_ID = @@SPID;

Verifique que la consulta devuelve true para encrypt_option.

Nota: para activar el cifrado SSL para los clientes que se conectan mediante JDBC, es posible que tenga que agregar el certificado SQL de Amazon RDS al almacén de certificados de CA de Java (cacerts). Puede hacerlo mediante la utilidad keytool.

Amazon RDS for PostgreSQL

Amazon RDS es compatible con el cifrado SSL para las instancias de base de datos PostgreSQL. Al usar SSL, puede cifrar una conexión PostgreSQL entre las aplicaciones y la instancia de base de datos PostgreSQL. También puede forzar que todas las conexiones a la instancia de base de datos PostgreSQL utilicen SSL. Amazon RDS for PostgreSQL es compatible con las versiones TLS 1.1 y 1.2.

Antes de conectarse a una instancia de base de datos de Amazon RDS for PostgreSQL mediante SSL, haga lo siguiente:

  1. Descargue el certificado.
  2. Importe el certificado a su sistema operativo.

Para obtener más información, consulte Conexión a una instancia de base de datos PostgreSQL mediante SSL.

Utilice el parámetro sslrootcert para hacer referencia al certificado. Por ejemplo, sslrootcert=rds-ssl-ca-cert.pem.

$ psql "host=myinstance.123456789012.rds-us-east-1.amazonaws.com port=5432 user=testuser dbname=testpg sslmode=verify-full sslrootcert=global-bundle.pem"

También puede configurar las conexiones a la instancia de RDS for PostgreSQL utilizando SSL estableciendo rds.force_ssl en 1 (activado) en el grupo de parámetros personalizado. De forma predeterminada, este valor se establece en 0 (desactivado).

Al establecer rds.force_ssl en 1 (activado), el archivo pg_hba.conf de la instancia de base de datos se modifica para ser compatible con la nueva configuración SSL. Puede utilizar la vista pg_hba_file_rules para ver el resumen del contenido del archivo pg_hba.conf.

Cuando se establece rds.force_ssl en 0 (desactivado), el archivo pg_hba.conf tiene un aspecto similar al siguiente:

SELECT * FROM pg_hba_file_rules;

 line_number | type  |     database      | user_name  | address  | netmask | auth_method | options | error 
-------------+-------+-------------------+------------+----------+---------+-------------+---------+-------
           4 | local | {all}             | {all}      |          |         | md5         |         | 
          10 | host  | {all}             | {rdsadmin} | samehost |         | md5         |         | 
          11 | host  | {all}             | {rdsadmin} | all      |         | reject      |         | 
          12 | host  | {rdsadmin}        | {all}      | all      |         | reject      |         | 
          13 | host  | {all}             | {all}      | all      |         | md5         |         |
          14 | host  | {replication}     | {all}      | samehost |         | md5         |         | 
          15 | host  | {rds_replication} | {all}      | all      |         | md5         |         | 
(7 rows)

Cuando se establece rds.force_ssl en 1 (activado), el archivo pg_hba.conf tiene un aspecto similar al siguiente:

SELECT * FROM pg_hba_file_rules;

line_number |  type   |     database      | user_name  | address  | netmask | auth_method | options | error 
-------------+---------+-------------------+------------+----------+---------+-------------+---------+-------
          4 | local   | {all}             | {all}      |          |         | md5         |         |
         10 | host    | {all}             | {rdsadmin} | samehost |         | md5         |         |
         11 | host    | {all}             | {rdsadmin} | all      |         | reject      |         |
         12 | host    | {rdsadmin}        | {all}      | all      |         | reject      |         |
         13 | hostssl | {all}             | {all}      | all      |         | md5         |         |
         14 | host    | {replication}     | {all}      | samehost |         | md5         |         |
         15 | hostssl | {rds_replication} | {all}      | all      |         | md5         |         |

Es posible que observe que el valor del tipo de line_number (13) se actualiza a hostssl después de que rds.force_ssl se haya establecido en 1 (activado).

Después de activar la conexión SSL en la instancia, verá un mensaje similar al siguiente al iniciar una conexión a la instancia RDS for PostgreSQL:

$ psql "host=myinstance.123456789012.rds-us-east-1.amazonaws.com port=5432 user=testuser dbname=testpg"
. . .
SL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

Se rechazan todas las conexiones no SSL con el siguiente mensaje:

$ psql "host=myinstance.123456789012.rds-us-east-1.amazonaws.com port=5432 user=testuser dbname=testpg sslmode=disable"
psql: FATAL: no pg_hba.conf entry for host "host.ip", user "testuser", database "testpg", SSL off
$

¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?