Como faço para usar uma conexão SSL para me conectar com sucesso à minha instância do Amazon RDS?
Quero usar uma conexão Secure Socket Layer (SSL) para me conectar à minha instância de banco de dados do Amazon Relational Database Service (Amazon RDS).
Breve descrição
Para criptografar uma conexão com uma instância de banco de dados que executa MySQL, MariaDB, Microsoft SQL Server, Oracle ou PostgreSQL, use SSL ou Transport Layer Security (TLS) na sua aplicação. As conexões SSL/TLS fornecem uma camada de segurança porque criptografam os dados que são transferidos entre seu cliente e a instância de banco de dados. Um certificado de servidor fornece uma camada extra de segurança porque valida que 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 (CA — Certificate Authority). O certificado SSL inclui o endpoint da instância de banco de dados como nome comum do certificado SSL para proteger a instância contra ataques de falsificação. Um certificado SSL criado pelo Amazon RDS é a entidade raiz confiável e funciona na maioria dos casos. No entanto, se sua aplicação não aceitar cadeias de certificados, o certificado poderá falhar. Nesses casos, use um certificado intermediário para se conectar à sua região AWS. Por exemplo, ao usar SSL para se conectar às regiões AWS GovCloud (EUA), você deve usar um certificado intermediário.
É possível baixar um pacote de certificados que contém os certificados intermediários e raiz para todas as regiões do AWS Trust Services. Se sua aplicação estiver no Microsoft Windows e exigir um arquivo PKCS7, será possível baixar o pacote de certificados PKCS7 do Amazon Trust Services. Esse pacote contém os certificados intermediários e raiz.
Resolução
Cada mecanismo de banco de dados tem seu próprio processo para implementar SSL/TLS. Para implementar uma conexão SSL/TLS para seu cluster de banco de dados, use um dos seguintes métodos com base no seu mecanismo de banco de dados.
Amazon RDS para Oracle
Para instâncias do Amazon RDS para Oracle, para ativar o modo SSL, adicione a opção SSL em seu grupo de opções personalizado.
O RDS para Oracle oferece suporte às versões 1.0 e 1.2 do TLS. Para usar a opção Oracle SSL, use a configuração de opção SQLNET.SSL_VERSION em seu grupo de opções. Os seguintes valores são permitidos para essa configuração de opção:
- “1.0” — Os clientes podem se conectar à instância de banco de dados usando somente TLS 1.0.
- “1.2” — Os clientes podem se conectar à instância de banco de dados usando somente TLS 1.2.
- “1.2 ou 1.0” — Os clientes podem se conectar à instância de banco de dados usando TLS 1.2 ou 1.0.
Para as opções existentes do Oracle SSL, SQLNET.SSL_VERSION é automaticamente definido como “1.0”. É 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 via JDBC, você deve criar um armazenamento de chaves, confiar no certificado CA raiz do Amazon RDS e, em seguida, configurar a conexão SSL.
Exemplo de código que usa JDBC para configurar a conexão SSL:
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 usar o SSL para se conectar à sua instância do RDS para Oracle, verifique o seguinte:
- O certificado raiz do RDS é baixado e adicionado a um arquivo de carteira. Esse arquivo é armazenado em um diretório especificado pelo parâmetro WALLET_LOCATION no arquivo sqlnet.ora.
- Você tem o número correto da porta SSL na 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 são configurados adequadamente para permitir o tráfego na porta SSL do Amazon RDS.
Amazon RDS para MariaDB
O Amazon RDS para MariaDB oferece suporte às versões 1.0, 1.1, 1.2 e 1.3 do TLS. Em uma conexão TLS unidirecional, o TLS é usado sem um certificado de cliente e somente o servidor pode ser autenticado. Portanto, a autenticação só é possível em uma direção. No entanto, a criptografia ainda é possível em ambas as direções. Para obter mais informações, consulte Ativando o TLS unidirecional para clientes MariaDB no site do MariaDB.
Com a verificação do certificado do servidor, o cliente verifica se o certificado pertence ao servidor. Para obter mais informações, consulte Verificação do certificado do servidor no site do MariaDB.
Para iniciar o cliente MySQL 5.7 ou posterior com certificado RDS, execute um comando semelhante ao seguinte:
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 ao seguinte:
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 com base na sua versão do MariaDB:
ALTER USER 'test'@'%' REQUIRE SSL;
Para o RDS para MariaDB versão 10.5 e posterior com o Esquema de Desempenho ativado e aplicações conectadas a uma instância de banco de dados, verifique quais conexões usam 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;
Observação: Para obter mais informações sobre o Esquema de Desempenho, consulte Esquema de Desempenho no site do MariaDB.
Amazon RDS para MySQL
O MySQL usa o OpenSSL para conexões seguras. Para obter mais informações, consulte Suporte SSL/TLS para instâncias de banco de dados MySQL no Amazon RDS.
Por padrão, os programas cliente MySQL tentam estabelecer uma conexão criptografada quando o servidor suporta conexões criptografadas. Para maior segurança, use o parâmetro --ssl-ca para referenciar o certificado SSL que inclui o endpoint da instância de banco de dados como o nome comum. O certificado SSL protege a instância contra ataques de falsificação.
Para usar o parâmetro --ssl-ca para o MySQL 5.7 e versões posteriores para iniciar o cliente, execute um comando semelhante ao seguinte:
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 um comando semelhante ao seguinte, com base na sua 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 versões posteriores, execute o seguinte comando:
ALTER USER 'testuser'@'%' REQUIRE SSL;
Para o RDS para MySQL versão 5.7 ou 8.0 com o Esquema de Desempenho ativado e aplicações conectadas a uma instância de banco de dados, verifique quais conexões usam 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;
Observação: Para obter mais informações sobre o Esquema de Desempenho, consulte Esquema de Desempenho no site do MariaDB.
Amazon RDS para Microsoft SQL Server
Para usar o SSL para se conectar à sua instância de banco de dados do RDS para Microsoft SQL Server, é possível forçar o SSL para todas as conexões ou criptografar conexões específicas.
Para criptografar conexões de outros clientes SQL, acrescente encrypt=true à string da sua 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.
Para confirmar que sua conexão está criptografada, execute a seguinte consulta:
SELECT ENCRYPT_OPTION FROM SYS.DM_EXEC_CONNECTIONS WHERE SESSION_ID = @@SPID;
Verifique se a consulta retorna verdadeiro para encrypt_option.
Observação: Para ativar a criptografia SSL para clientes que usam o JDBC para se conectar, talvez seja necessário adicionar o certificado SQL do RDS ao repositório de certificados Java CA (cacerts). Para fazer isso, use o utilitário keytool.
Amazon RDS para PostgreSQL
O Amazon RDS oferece suporte à criptografia SSL para instâncias de banco de dados PostgreSQL. Para obter mais informações, consulte Como usar SSL com uma instância de banco de dados PostgreSQL.
Antes de se conectar a uma instância de banco de dados RDS para PostgreSQL via SSL, conclua as seguintes etapas:
- Baixe o certificado.
- Importe o certificado no sistema operacional.
Para obter mais informações, consulte Conectando-se a uma instância de banco de dados PostgreSQL via SSL.
Para referenciar o certificado, use o parâmetro sslrootcert. 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"
Para configurar as conexões com sua instância do RDS para PostgreSQL para usar SSL, defina rds.force_ssl como 1 (ativado) em seu grupo de parâmetros personalizados. Por padrão, o valor definido é para 0 (desativado).
Quando você define rds.force_ssl como 1 (ativado), o arquivo pg_hba.conf da instância de banco de dados é modificado para oferecer suporte à nova configuração SSL. Para ver o resumo do conteúdo do arquivo pg_hba.conf, use a exibição pg_hba_file_rules. Para obter mais informações, consulte pg_hba_file_rules no site do PostgreSQL.
Quando você define rds.force_ssl como 0 (desativado), o arquivo pg_hba.conf se parece com o seguinte:
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 (ativado), o arquivo pg_hba.conf se parece com o seguinte:
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 | |
Observação: O valor de tipo para line_number (13) pode ser atualizado para hostssl após rds.force_ssl ser definido como 1 (ativado).
Depois de ativar a conexão SSL em sua instância e iniciar uma conexão com sua instância do RDS para PostgreSQL, você verá uma mensagem semelhante à seguinte:
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 são rejeitadas com 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
Usar SSL/TLS para criptografar uma conexão com uma instância de banco de dados ou cluster
- Idioma
- Português
Vídeos relacionados


Conteúdo relevante
- feita há um mês
- feita há 3 meses
- feita há 3 meses