Uso de SSL con una instancia de base de datos PostgreSQL - Amazon Relational Database Service

Uso de SSL con una instancia de base de datos PostgreSQL

Amazon RDS admite el cifrado de la Capa de conexión segura (SSL) para las instancias de base de datos de PostgreSQL. Con SSL, puede cifrar una conexión de PostgreSQL entre sus aplicaciones y sus instancias de base de datos de PostgreSQL. De forma predeterminada, RDS for PostgreSQL utiliza y espera que todos los clientes se conecten mediante SSL/TLS, pero también puede hacer que sea obligatorio. RDS para PostgreSQL admite las versiones 1.1, 1.2 y 1.3 de la seguridad de la capa de transporte (TLS).

Para obtener la información general acerca de la compatibilidad con SSL y las bases de datos de PostgreSQL, consulte Compatibilidad con SSL en la documentación de PostgreSQL. Para obtener información sobre el uso de una conexión SSL a través de JDBC, consulte Configuración del cliente en la documentación de PostgreSQL.

La compatibilidad con SSL está disponible en todas las regiones de AWS para PostgreSQL. Amazon RDS crea un certificado SSL para su instancia de base de datos de PostgreSQL cuando se crea la instancia. Si se habilita la verificación con certificado SSL, el certificado incluye el punto de enlace de la instancia de base de datos como nombre común (CN) que el certificado de SSL debe proteger frente a los ataques de suplantación.

Conectar con una instancia de base de datos PostgreSQL a través de SSL

Para conectar con una instancia de base de datos PostgreSQL a través de SSL
  1. Descargue el certificado.

    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. Conecte su instancia de base de datos de PostgreSQL a través de SSL.

    Cuando se conecte utilizando SSL, su cliente podrá elegir si verifica la cadena de certificados. Si sus parámetros de conexión especifican sslmode=verify-ca o sslmode=verify-full, su cliente precisa que los certificados de CA de RDS estén en su almacén de confianza o se haga referencia a ellos en la URL de conexión. Este requisito es para verificar la cadena de certificados que firma su certificado de base de datos.

    Cuando un cliente, como psql o JDBC, está configurado con soporte de SSL, primero el cliente intenta conectarse a la base de datos con SSL de manera predeterminada. SI el cliente no puede conectarse con SSL, vuelve a la conexión sin SSL. El modo sslmode predeterminado utilizado es diferente entre los clientes basados en libpq (como psql) y JDBC. Los clientes basados en libpq y JDBC utilizan de manera predeterminada prefer.

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

A continuación, se muestra un ejemplo de cómo se utiliza psql para conectarse a una instancia de base de datos de PostgreSQL mediante SSL con verificación de certificados.

$ psql "host=db-name.555555555555.ap-southeast-1.rds.amazonaws.com port=5432 dbname=testDB user=testuser sslrootcert=rds-ca-rsa2048-g1.pem sslmode=verify-full"

Requerir una conexión SSL a una instancia de base de datos PostgreSQL

Puede exigir que las conexiones a la instancia de base de datos PostgreSQL usen SSL por medio del parámetro rds.force_ssl. El valor predeterminado del valor rds.force_ssl es 1 (activado) para RDS para PostgreSQL versión 15 y posteriores. Para todas las demás versiones principales de RDS para PostgreSQL 14 y anteriores, el valor predeterminado de este parámetro es 0 (desactivado). Puede definir el parámetro rds.force_ssl en 1 (activado) fin de imponer SSL/TLS para las conexiones al clúster de base de datos. Puede definir el parámetro rds.force_ssl en 1 (activado) para imponer SSL para las conexiones a la instancia de base de datos.

Para cambiar el valor de este parámetro, debe crear un grupo de parámetros de base de datos personalizado. A continuación, cambie el valor de rds.force_ssl en el grupo de parámetros de base de datos personalizado a 1 para activar esta característica. Si prepara el grupo de parámetros de base de datos personalizado antes de crear la instancia de base de datos de RDS for PostgreSQL, puede elegirlo (en lugar de un grupo de parámetros predeterminado) durante el proceso de creación. Si lo hace después de que la instancia de base de datos de RDS for PostgreSQL ya se esté ejecutando, debe reiniciar la instancia para que utilice el grupo de parámetros personalizado. Para obtener más información, consulte Grupos de parámetros para Amazon RDS.

Cuando la característica rds.force_ssl está activa en la instancia de base de datos, los intentos de conexión que no utilizan SSL se rechazan con el siguiente mensaje:

$ psql -h db-name.555555555555.ap-southeast-1.rds.amazonaws.com port=5432 dbname=testDB user=testuser psql: error: FATAL: no pg_hba.conf entry for host "w.x.y.z", user "testuser", database "testDB", SSL off

Determinar el estado de la conexión SSL

El estado cifrado de su conexión se muestra en el banner de inicio de sesión al establecer conexión con la instancia de base de datos:

Password for user master: psql (10.3) SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256) Type "help" for help. postgres=>

También puede cargar la extensión sslinfo y llamar después a la función ssl_is_used() para determinar si se está usando SSL. La función devuelve t si la conexión usa SSL; de lo contrario, devuelve f.

postgres=> CREATE EXTENSION sslinfo; CREATE EXTENSION postgres=> SELECT ssl_is_used(); ssl_is_used --------- t (1 row)

Para obtener información más detallada, puede usar la siguiente consulta para obtener información de pg_settings:

SELECT name as "Parameter name", setting as value, short_desc FROM pg_settings WHERE name LIKE '%ssl%'; Parameter name | value | short_desc ----------------------------------------+-----------------------------------------+------------------------------------------------------- ssl | on | Enables SSL connections. ssl_ca_file | /rdsdbdata/rds-metadata/ca-cert.pem | Location of the SSL certificate authority file. ssl_cert_file | /rdsdbdata/rds-metadata/server-cert.pem | Location of the SSL server certificate file. ssl_ciphers | HIGH:!aNULL:!3DES | Sets the list of allowed SSL ciphers. ssl_crl_file | | Location of the SSL certificate revocation list file. ssl_dh_params_file | | Location of the SSL DH parameters file. ssl_ecdh_curve | prime256v1 | Sets the curve to use for ECDH. ssl_key_file | /rdsdbdata/rds-metadata/server-key.pem | Location of the SSL server private key file. ssl_library | OpenSSL | Name of the SSL library. ssl_max_protocol_version | | Sets the maximum SSL/TLS protocol version to use. ssl_min_protocol_version | TLSv1.2 | Sets the minimum SSL/TLS protocol version to use. ssl_passphrase_command | | Command to obtain passphrases for SSL. ssl_passphrase_command_supports_reload | off | Also use ssl_passphrase_command during server reload. ssl_prefer_server_ciphers | on | Give priority to server ciphersuite order. (14 rows)

También puede recopilar toda la información sobre el uso de SSL de la instancia de base de datos de RDS for PostgreSQL por proceso, cliente y aplicación mediante la siguiente consulta:

SELECT datname as "Database name", usename as "User name", ssl, client_addr, application_name, backend_type FROM pg_stat_ssl JOIN pg_stat_activity ON pg_stat_ssl.pid = pg_stat_activity.pid ORDER BY ssl; Database name | User name | ssl | client_addr | application_name | backend_type ---------------+-----------+-----+----------------+------------------------+------------------------------ | | f | | | autovacuum launcher | rdsadmin | f | | | logical replication launcher | | f | | | background writer | | f | | | checkpointer | | f | | | walwriter rdsadmin | rdsadmin | t | 127.0.0.1 | | client backend rdsadmin | rdsadmin | t | 127.0.0.1 | PostgreSQL JDBC Driver | client backend postgres | postgres | t | 204.246.162.36 | psql | client backend (8 rows)

Para identificar el cifrado utilizado para la conexión SSL, puede realizar la consulta de la siguiente manera:

postgres=> SELECT ssl_cipher(); ssl_cipher -------------------- DHE-RSA-AES256-SHA (1 row)

Para obtener información acerca de la opción sslmode, consulte Funciones de control de conexión de la base de datos en la documentación de PostgreSQL.

Conjuntos de cifrado SSL en RDS for PostgreSQL

El parámetro de configuración de PostgreSQL ssl_ciphers especifica las categorías de conjuntos de cifrado permitidos para las conexiones SSL a la base de datos al usar TLS 1.2 y anteriores.

En RDS para PostgreSQL 16 y versiones posteriores, puede modificar el parámetro ssl_ciphers para usar valores específicos de los conjuntos de cifrado de la lista de permitidos. Este es un parámetro dinámico que no requiere el reinicio de la instancia de base de datos. Para ver los conjuntos de cifrado de la lista de permitidos, utilice la consola de Amazon RDS o el siguiente comando de la CLI de AWS:

aws rds describe-db-parameters --db-parameter-group-name <your-parameter-group> --region <region> --endpoint-url <endpoint-url> --output json | jq '.Parameters[] | select(.ParameterName == "ssl_ciphers")'

La siguiente tabla muestra los conjuntos de cifrado predeterminados y los conjuntos de cifrado permitidos para las versiones que admiten configuraciones personalizadas.

Versión del motor de PostgreSQL Valores predeterminados del conjunto ssl_cipher Valores personalizados del conjunto ssl_cipher de la lista de permitidos
17 HIGH:!aNULL:!3DES

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

16 HIGH:!aNULL:!3DES

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

15 HIGH:!aNULL:!3DES

No se admite ssl_ciphers personalizado

14 HIGH:!aNULL:!3DES

No se admite ssl_ciphers personalizado

13 HIGH:!aNULL:!3DES

No se admite ssl_ciphers personalizado

12 HIGH:!aNULL:!3DES

No se admite ssl_ciphers personalizado

11.4 y versiones secundarias posteriores HIGH:MEDIUM:+3DES:!aNULL:!RC4

No se admite ssl_ciphers personalizado

11.1, 11.2 HIGH:MEDIUM:+3DES:!aNULL

No se admite ssl_ciphers personalizado

10.9 y versiones secundarias posteriores HIGH:MEDIUM:+3DES:!aNULL:!RC4

No se admite ssl_ciphers personalizado

10.7 y versiones menores inferiores HIGH:MEDIUM:+3DES:!aNULL

No se admite ssl_ciphers personalizado

Para configurar todas las conexiones de instancias para que usen el conjunto de cifrado TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, modifiq‎ue el grupo de parámetros como se muestra en el siguiente ejemplo:

aws rds modify-db-parameter-group --db-parameter-group-name <your-parameter-group> --parameters "ParameterName='ssl_ciphers',ParameterValue='TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384',ApplyMethod=immediate"

Este ejemplo utiliza un cifrado ECDSA, que requiere que la instancia use una autoridad de certificación con criptografía de curva elíptica (ECC) para establecer una conexión. Para obtener información sobre las autoridades de certificación proporcionadas por Amazon RDS, consulte Autoridades de certificación.

Puede verificar los cifrados en uso mediante los métodos descritos en Determinación del estado de la conexión SSL.

Los cifrados pueden tener diferentes nombres en función del contexto:

  • Los cifrados de la lista de permitidos que puede configurar en el grupo de parámetros se denominan con sus nombres de IANA.

  • Los banners de inicio de sesión sslinfo y psql hacen referencia a los cifrados mediante los nombres de OpenSSL.

De forma predeterminada, el valor de ssl_max_protocol_version en RDS para PostgreSQL 16 y versiones posteriores es TLS v1.3. Debe establecer el valor de este parámetro en TLS v1.2, ya que TLS v1.3 no utiliza las configuraciones de cifrado especificadas en el parámetro ssl_ciphers. Cuando establece el valor como TLS v1.2, las conexiones utilizan solo los cifrados que usted defina en ssl_ciphers.

aws rds modify-db-parameter-group --db-parameter-group-name <your-parameter-group> --parameters "ParameterName='ssl_max_protocol_version',ParameterValue='TLSv1.2',ApplyMethod=immediate"

Para garantizar que las conexiones a la base de datos utilicen SSL, establezca rds.force_ssl parameter en 1 en el grupo de parámetros. Para obtener más información acerca de los parámetros y grupos de parámetros, consulte Grupos de parámetros para Amazon RDS.