Como conseguir me conectar à minha instância do Amazon RDS usando uma conexão SSL?

11 minuto de leitura
0

Quero me conectar à minha instância de banco de dados do Amazon Relational Database Service (Amazon RDS) usando uma conexão Secure Socket Layer (SSL).

Breve descrição

Você pode usar SSL ou Transport Layer Security (TLS) de sua aplicação para criptografar uma conexão com uma instância de banco de dados que está executando MySQL, MariaDB, Microsoft SQL Server, Oracle ou PostgreSQL. As conexões SSL/TLS fornecem uma camada de segurança na criptografia de dados transferidos entre o cliente e a instância de banco de dados. Um certificado de servidor fornece uma camada de segurança adicional ao validar se a conexão está sendo feita com uma instância de banco de dados do Amazon RDS.

Quando você provisiona uma instância de banco de dados, o Amazon RDS cria um certificado SSL e instala o certificado na instância. Esses certificados são assinados por uma autoridade de certificação. O certificado SSL contém o endpoint da instância de banco de dados como o nome comum do certificado SSL para proteger a instância de ataques de falsificação. Um certificado SSL criado pelo Amazon RDS é a entidade raiz confiável e funciona na maioria dos casos. Porém, se a aplicação não aceitar cadeias de certificados, o certificado poderá falhar. Nesses casos, talvez seja necessário usar um certificado intermediário para se conectar à sua região da AWS. Por exemplo, é necessário usar um certificado intermediário para se conectar às regiões AWS GovCloud (EUA) usando o SSL.

É possível baixar um pacote de certificados que contém os certificados intermediário e raiz para todas as regiões da AWS do AWS Trust Services. Se a aplicação estiver no Microsoft Windows e necessitar de um arquivo PKCS7, você poderá baixar o pacote de certificados PKCS7 do Amazon Trust Services. O pacote contém os certificados intermediário e raiz.

Resolução

Cada mecanismo de banco de dados tem seu próprio processo de implementação de SSL/TLS. Para implementar a conexão SSL/TLS no cluster de banco de dados, escolha uma das opções a seguir, de acordo com o mecanismo de banco de dados.

Amazon RDS for Oracle

Para instâncias do Amazon RDS for Oracle, é possível ativar o modo SSL adicionando a opção SSL a seu grupo de opções personalizadas.

O Amazon RDS for Oracle oferece suporte para Transport Layer Security (TLS) versão 1.0 e 1.2. Para usar a opção Oracle SSL, utilize a configuração da opção SQLNET.SSL_VERSION em seu grupo de opções. Para essa configuração de opção, são permitidos estes valores:

  • “1.0": os clientes poderão se conectar à instância de banco de dados usando apenas o TLS 1.0.
  • “1.2": os clientes poderão se conectar à instância de banco de dados usando apenas o TLS 1.2.
  • “1.2 ou 1.0": os clientes poderão se conectar à instância de banco de dados usando TLS 1.2 ou 1.0.

Para as opções existentes do Oracle SSL, o SQLNET.SSL_VERSION é definido como “1.0" automaticamente. É possível alterar a configuração, se necessário.

Você deve configurar o cliente SQL*Plus para usar SSL antes de se conectar a uma instância de banco de dados Oracle que usa a opção Oracle SSL. Para usar uma conexão SSL por JDBC, é necessário criar um armazenamento de chaves, confiar no certificado de autoridade de certificação raiz do Amazon RDS e configurar a conexão SSL.

Código de exemplo para configurar a conexão SSL usando 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 se conectar à sua instância do Amazon RDS for Oracle usando SSL, verifique se:

  • O certificado raiz do RDS foi baixado e adicionado a um arquivo de carteira. Esse arquivo está armazenado em um diretório especificado pelo parâmetro WALLET_LOCATION no arquivo sqlnet.ora.
  • Você tem o número de porta SSL correto em sua entrada TNS.
  • O grupo de segurança do Amazon RDS está configurado para permitir conexões de entrada de suas máquinas pela porta SSL.
  • O firewall ou as políticas de segurança estão devidamente configuradas para permitir o tráfego na porta SSL do Amazon RDS.

Amazon RDS for MariaDB

O Amazon RDS for MariaDB oferece suporte às versões de TLS 1.0, 1.1, 1.2 e 1.3. Em uma conexão TLS unidirecional, o TLS é usado sem um certificado de cliente, e somente o servidor pode ser autenticado. Portanto, só é possível fazer a autenticação em uma direção. Porém, ainda é possível realizar a criptografia nas duas direções. Com a verificação do certificado do servidor, o cliente verifica se o certificado pertence ao servidor.

Para iniciar o cliente MySQL 5.7 ou posterior com certificado RDS, execute um comando semelhante a este:

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 iniciar o cliente MariaDB com certificado RDS, execute um comando semelhante a este:

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 exigir conexões SSL para usuários ou contas específicos, execute a seguinte consulta, de acordo com a versão do MariaDB:

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

Se você estiver usando o RDS for MariaDB versão 10.5 e superior com o Performance Schema ativado e tiver aplicativos conectados à sua instância de banco de dados, poderá executar a seguinte consulta para verificar quais conexões estão usando SSL/TLS:

MariaDB> SELECT id, user, host, connection_type
FROM performance_schema.threads pst
INNER JOIN information_schema.processlist isp
ON pst.processlist_id = isp.id;

Amazon RDS para MySQL

O Amazon RDS para MySQL oferece suporte às versões de TLS 1.0, 1.1 e 1.2.

O Amazon RDS para MySQL usa o yaSSL para obter conexões seguras nas seguintes versões:

  • MySQL versão 5.7.19 e versões 5.7 anteriores
  • MySQL versão 5.6.37 e versões 5.6 anteriores

O MySQL usa o OpenSSL para obter conexões seguras nas seguintes versões:

  • MySQL versão 8.0
  • MySQL versão 5.7.21 e versões 5.7 posteriores
  • MySQL versão 5.6.39 e versões 5.6 posteriores

Por padrão, os programas cliente MySQL tentam estabelecer uma conexão criptografada quando o servidor oferece suporte a conexões criptografadas. Para aumentar a segurança em relação à fornecida pela criptografia padrão, use o parâmetro --ssl-ca para fazer referência ao certificado SSL que inclui o endpoint da instância de banco de dados como o nome comum. O certificado SSL protege a instância de ataques de falsificação.

Para iniciar o cliente usando o parâmetro --ssl-ca para o MySQL 5.7 e versões posteriores, execute um comando semelhante a este:

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 exigir conexões SSL para usuários ou contas específicos, execute uma consulta semelhante a esta, de acordo com a versão do 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 o MySQL 5.7 e posteriores:

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

Se você estiver usando o RDS for MySQL versão 5.7 ou 8.0 com o Performance Schema ativado e tiver aplicativos conectados à sua instância de banco de dados, poderá executar a seguinte consulta para verificar quais conexões estão usando SSL/TLS:

mysql> SELECT id, user, host, connection_type
FROM performance_schema.threads pst
INNER JOIN information_schema.processlist isp
ON pst.processlist_id = isp.id;

Amazon RDS para Microsoft SQL Server

Siga uma destas maneiras de usar o SSL para se conectar à instância de banco de dados do SQL Server:

  • Force SSL for all connections (Forçar SSL para todas as conexões): com esse método, as conexões acontecem de modo transparente ao cliente, e ele não precisará realizar nenhum trabalho para usar o SSL. Para usar essa opção, defina o parâmetro rds.force_ssl como 1 (on). Por padrão, o parâmetro rds.force_ssl é definido como 0 (off). O parâmetro rds.force_ssl é estático. Isso significa que depois de alterar o valor, é necessário reinicializar sua instância de banco de dados para que a alteração seja efetivada.
  • Encrypt specific connections (Criptografar conexões específicas): esse método configura uma conexão SSL de um computador cliente específico, e é necessário criptografar as conexões no cliente.

Para criptografar conexões de outros clientes SQL, anexe encrypt=true à string de conexão. Essa string pode estar disponível como uma opção ou como uma propriedade na página de conexão nas ferramentas da GUI.

Executando a seguinte consulta para confirmar se sua conexão está criptografada:

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

Verifique se a consulta retorna true para encrypt_option.

Observação: para ativar a criptografia SSL para clientes que se conectam usando JDBC, talvez seja necessário adicionar o certificado SQL do RDS ao armazenamento de certificados de autoridade de certificação do Java (cacerts). Você pode fazer isso usando o utilitário keytool.

Amazon RDS for PostgreSQL

O Amazon RDS oferece suporte à criptografia SSL para instâncias de banco de dados PostgreSQL. Com o SSL, é possível criptografar uma conexão PostgreSQL entre suas aplicações e sua instância de banco de dados PostgreSQL. Você também pode forçar todas as conexões com sua instância de banco de dados PostgreSQL a usar SSL. O Amazon RDS for PostgreSQL oferece suporte às versões de TLS 1.1 e 1.2.

Antes de se conectar a uma instância de banco de dados do RDS for PostgreSQL por SSL, faça o seguinte:

  1. Baixe o certificado.
  2. Importe o certificado para o sistema operacional.

Para obter mais informações, consulte Connecting to a PostgreSQL DB instance over SSL.

Use o parâmetro sslrootcert para fazer referência ao certificado. Por exemplo, 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"

Também é possível configurar as conexões para sua instância do RDS for PostgreSQL usar SSL, definindo rds.force_ssl como 1 (on) em seu grupo de parâmetros personalizado. Por padrão, esse valor é definido como 0 (off).

Quando você define rds.force_ssl como 1 (on), o arquivo pg_hba.conf da instância de banco de dados é modificado para oferecer suporte à nova configuração SSL. Use a visualização pg_hba_file_rules para visualizar o resumo do conteúdo do arquivo pg_hba.conf.

Quando você define rds.force_ssl como 0 (off), o arquivo pg_hba.conf é semelhante a este:

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)

Quando você define rds.force_ssl como 1 (on), o arquivo pg_hba.conf é semelhante a este:

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

Observe que o valor de type (tipo) para line_number (13) é atualizado para hostssl após rds.force_ssl ser definido como 1 (on).

Depois de ativar a conexão SSL na instância, você verá uma mensagem semelhante a esta ao iniciar uma conexão com a instância do 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.

Todas as conexões não SSL serão rejeitadas, e será exibida a seguinte mensagem:

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

Informações relacionadas

Using SSL/TLS to encrypt a connection to a DB instance

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos