Usar o SSL com uma instância de banco de dados PostgreSQL - Amazon Relational Database Service

Usar o SSL com uma instância de banco de dados PostgreSQL

O Amazon RDS oferece suporte à criptografia de Secure Socket Layer (SSL) para instâncias de banco de dados PostgreSQL. Por meio do SSL, você pode criptografar uma conexão do PostgreSQL entre seus aplicativos e suas instâncias de banco de dados PostgreSQL. Por padrão, o RDS para PostgreSQL usa e espera que todos os clientes se conectem usando SSL/TLS, mas você também pode exigir isso. O RDS para PostgreSQL é compatível com o Transport Layer Security (TLS) versões 1.1, 1.2 e 1.3.

Para obter informações gerais sobre o suporte para SSL e bancos de dados PostgreSQL, consulte Suporte para SSL na documentação do PostgreSQL. Para obter informações sobre como usar uma conexão SSL via JDBC, consulte Configurar o cliente na documentação do PostgreSQL.

O suporte a SSL está disponível em todas as regiões da AWS para o PostgreSQL. O Amazon RDS cria um certificado SSL para sua instância de banco de dados do PostgreSQL quando essa instância é criada. Se você habilitar a verificação de certificado SSL, o certificado SSL incluirá o endpoint da instância de banco de dados como o nome comum (CN) do certificado SSL para se proteger contra ataques de falsificação.

Conectar-se à instância de banco de dados PostgreSQL via SSL

Para se conectar à instância de banco de dados PostgreSQL via SSL
  1. Baixe o certificado.

    Para obter informações sobre como baixar certificados, consulte Usar SSL/TLS para criptografar uma conexão com uma instância ou um cluster de banco de dados.

  2. Conecte-se à sua instância de banco de dados PostgreSQL via SSL.

    Quando você se conecta usando SSL, seu cliente pode escolher se deseja verificar a cadeia de certificados. Se os seus parâmetros de conexão especificarem sslmode=verify-ca ou sslmode=verify-full, seu cliente exigirá que os certificados de CA do RDS estejam no armazenamento confiável ou sejam referenciados no URL da conexão. Esse requisito tem o objetivo de verificar a cadeia de certificados que assina o seu certificado de banco de dados.

    Quando um cliente, como psql ou JDBC, é configurado com suporte para SSL, primeiro ele tenta se conectar ao banco de dados via SSL por padrão. Se esse cliente não puder se conectar via SSL, ele voltará a se conectar sem SSL. O modo sslmode padrão utilizado é diferente entre os clientes baseados em libpq (como o psql) e o JDBC. Os clientes JDBC e baseados em libpq usam prefer como padrão.

    Use o parâmetro sslrootcert para fazer referência ao certificado, por exemplo sslrootcert=rds-ssl-ca-cert.pem.

Veja a seguir um exemplo de uso do psql para se conectar a uma instância de banco de dados do PostgreSQL usando SSL com verificação de certificado.

$ 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"

Exigir uma conexão SSL para uma instância de banco de dados PostgreSQL

Você pode exigir que conexões estabelecidas a sua instância de banco de dados PostgreSQL usem SSL por meio do parâmetro rds.force_ssl. O valor padrão do parâmetro rds.force_ssl é 1 (ativado) para o RDS para PostgreSQL versão 15 e posterior. Para todas as outras versões principais do RDS para PostgreSQL 14 e posterior, o valor padrão desse parâmetro é 0 (desativado). Você pode definir o parâmetro rds.force_ssl como 1 (ativado) para exigir SSL/TLS para conexões com o seu cluster de banco de dados. Você pode definir o parâmetro rds.force_ssl como 1 (ativado) para exigir o SSL para conexões a sua instância de banco de dados.

Para alterar o valor desse parâmetro, você precisa criar um grupo de parâmetros de banco de dados personalizado. Depois precisará alterar o valor de rds.force_ssl em seu grupo de parâmetros de banco de dados personalizado para 1 para ativar esse recurso. Se você preparar o grupo de parâmetros de banco de dados personalizado antes de criar sua instância de banco de dados do RDS para PostgreSQL, poderá escolhê-lo (em vez de um grupo de parâmetros padrão) durante o processo de criação. Se você fizer isso depois que a instância de banco de dados do RDS para PostgreSQL já estiver em execução, será necessário reinicializar a instância para que ela use o grupo de parâmetros personalizado. Para obter mais informações, consulte Grupos de parâmetros para Amazon RDS.

Quando o recurso rds.force_ssl está ativo em sua instância de banco de dados, as tentativas de conexão que não estão usando SSL são rejeitadas com a seguinte mensagem:

$ 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 o status de conexão SSL

O status criptografado da conexão é mostrado no banner de login ao se conectar à instância de banco de dados:

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

Você também pode carregar a extensão sslinfo e chamar a função ssl_is_used() para determinar se o SSL está sendo usado. A função retornará t se a conexão estiver usando o SSL, caso contrário, retornará f.

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

Para obter informações mais detalhadas, use a seguinte consulta para obter informações 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)

Você também pode coletar todas as informações sobre o uso de SSL da instância de banco de dados do RDS para PostgreSQL por processo, cliente e aplicação usando a seguinte 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 a criptografia usada para sua conexão SSL, você pode consultar da seguinte forma:

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

Para saber mais sobre a opção sslmode, consulte Funções de controle de conexão com o banco de dados na documentação do PostgreSQL.

Suítes de cifras SSL no RDS para PostgreSQL

O parâmetro de configuração do PostgreSQL, ssl_ciphers, especifica as categorias de conjuntos de cifras permitidas para conexões SSL. A tabela a seguir lista os conjuntos de cifras padrão usados no RDS para PostgreSQL.

Versão do mecanismo PostgreSQL Pacotes de criptografia
16 HIGH:!aNULL:!3DES
15 HIGH:!aNULL:!3DES
14 HIGH:!aNULL:!3DES
13 HIGH:!aNULL:!3DES
12 HIGH:!aNULL:!3DES
11.4 e versões secundárias posteriores HIGH:MEDIUM:+3DES:!aNULL:!RC4
11.1, 11.2 HIGH:MEDIUM:+3DES:!aNULL
10.9 e versões secundárias posteriores HIGH:MEDIUM:+3DES:!aNULL:!RC4
10.7 e versões secundárias anteriores HIGH:MEDIUM:+3DES:!aNULL