Atualizar aplicações para conexão com instâncias de banco de dados MySQL usando novos certificados SSL/TLS - Amazon Relational Database Service

Atualizar aplicações para conexão com instâncias de banco de dados MySQL usando novos certificados SSL/TLS

Em 19 de setembro de 2019, o Amazon RDS publicou novos certificados de autoridade de certificação (CA) para conectar-se às suas instâncias de banco de dados do RDS via SSL (Secure Socket Layer) ou TLS (Transport Layer Security). A seguir, você pode encontrar informações sobre como atualizar seus aplicativos para usar os novos certificados.

Este tópico pode ajudá-lo a determinar se algum aplicativo cliente usa SSL/TLS para conectar-se às suas instâncias de banco de dados. Em caso positivo, examine mais a fundo se esse aplicativo exige verificação de certificado para se conectar.

nota

Alguns aplicativos são configurados para se conectar a instâncias de banco de dados MySQL apenas quando podem verificar com sucesso o certificado no servidor. Para esses aplicativos, você deve atualizar os repositórios confiáveis de aplicativos cliente para incluir os novos certificados de CA.

É possível especificar os seguintes modos SSL: disabled, preferred e required. Quando você usa o modo SSL preferred e o certificado CA não existe ou não está atualizado, o seguinte comportamento se aplica:

  • Para versões secundárias do MySQL mais recentes, a conexão volta a não usar o SSL e ainda se conectará com êxito.

    Como essas versões posteriores usam o protocolo OpenSSL, um certificado de servidor expirado não impede conexões bem-sucedidas, a menos que o modo SSL required seja especificado.

    As seguintes versões secundárias do MySQL usam o protocolo OpenSSL:

    • Todas as versões do MySQL 8.0

    • MySQL 5.7.21 e versões posteriores do MySQL 5.7

    • MySQL 5.6.39 e versões posteriores do MySQL 5.6

    • MySQL 5.5.59 e versões posteriores do MySQL 5.5

  • Para versões secundárias do MySQL mais antigas, é retornado um erro.

    Como essas versões mais antigas usam o protocolo yaSSL, a verificação de certificado é estritamente aplicada e a conexão não tem êxito.

    As seguintes versões secundárias do MySQL usam o protocolo yaSSL:

    • MySQL 5.7.19 e versões anteriores do MySQL 5.7

    • MySQL 5.6.37 e versões anteriores do MySQL 5.6

    • MySQL 5.5.57 e versões anteriores do MySQL 5.5

Depois de atualizar seus certificados de CA nos armazenamentos confiáveis do aplicativo cliente, você pode fazer o rodízio dos certificados nas suas instâncias de banco de dados. É altamente recomendável testar esses procedimentos em um ambiente de desenvolvimento ou teste antes de implementá-los em seus ambientes de produção.

Para obter mais informações sobre a mudança de certificados, consulte Alternar o certificado SSL/TLS. Para obter mais informações sobre como fazer download de certificados, consulte Usar o SSL/TLS para criptografar uma conexão com uma instância de banco de dados. Para obter informações sobre o uso de SSL/TLS com instâncias de bancos de dados MySQL, consulte Uso do SSL com uma instância de banco de dados MySQL.

Determinar se alguma aplicação está se conectando à instância de banco de dados MySQL usando SSL

Se você estiver usando o Amazon RDS for MySQL versão 5.7 ou 8.0 e o Esquema de desempenho estiver habilitado, execute a seguinte consulta para verificar se as conexões estão usando SSL/TLS. Para obter informações sobre como habilitar o Esquema de performance, consulte Performance Schema quick start na documentação do MySQL.

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

Nesta saída de exemplo, é possível ver que a sua própria sessão (admin) e um aplicativo conectado como webapp1 estão usando SSL.

+----+-----------------+------------------+-----------------+ | id | user | host | connection_type | +----+-----------------+------------------+-----------------+ | 8 | admin | 10.0.4.249:42590 | SSL/TLS | | 4 | event_scheduler | localhost | NULL | | 10 | webapp1 | 159.28.1.1:42189 | SSL/TLS | +----+-----------------+------------------+-----------------+ 3 rows in set (0.00 sec)

Se você estiver usando o Amazon RDS for MySQL versão 5.5 ou 5.6, não poderá determinar no lado do servidor se os aplicativos estão se conectando com ou sem SSL. Para essas versões, é possível examinar o método de conexão do aplicativo para determinar se o SSL é usado ou não. Na seção a seguir, você pode encontrar mais informações sobre como examinar a configuração da conexão do cliente.

Determinar se um cliente requer verificação de certificado para se conectar

É possível verificar se os clientes JDBC e MySQL exigem verificação de certificado para se conectarem.

JDBC

O exemplo a seguir com o MySQL Connector/J 8.0 mostra uma maneira de verificar as propriedades da conexão JDBC de um aplicativo para determinar se conexões bem-sucedidas exigem um certificado válido. Para obter mais informações sobre todas as opções de conexão JDBC para MySQL, consulte Propriedades da configuração na documentação do MySQL.

Ao usar o MySQL Connector/J 8.0, uma conexão SSL exigirá verificação com base no certificado de CA de servidor se as propriedades da sua conexão tiverem sslMode definido como VERIFY_CA ou VERIFY_IDENTITY, como no exemplo a seguir.

Properties properties = new Properties(); properties.setProperty("sslMode", "VERIFY_IDENTITY"); properties.put("user", DB_USER); properties.put("password", DB_PASSWORD);
nota

Se você usar o MySQL Java Connector v5.1.38 ou posterior, ou o MySQL Java Connector v8.0.9 ou posterior para se conectar a seus bancos de dados, mesmo que você não tenha configurado explicitamente seus aplicativos para usar SSL/TLS ao se conectar a seus bancos de dados, esses drivers cliente usam SSL/TLS como padrão. Além disso, ao usar SSL/TLS, eles executam a verificação parcial do certificado e haverá falha na conexão se o certificado do servidor de banco de dados tiver expirado.

MySQL

Os exemplos a seguir com o cliente MySQL mostram duas maneiras de verificar a conexão MySQL de um script para determinar se conexões bem-sucedidas exigem um certificado válido. Para obter mais informações sobre todas as opções de conexão com o cliente MySQL, consulte Configuração no lado do cliente para conexões criptografadas na documentação do MySQL.

Ao usar o Cliente MySQL 5.7 ou MySQL 8.0, uma conexão SSL requer verificação com base no certificado de CA de servidor se, para a opção --ssl-mode, você especificar VERIFY_CA ou VERIFY_IDENTITY, como no exemplo a seguir.

mysql -h mysql-database.rds.amazonaws.com -uadmin -ppassword --ssl-ca=/tmp/ssl-cert.pem --ssl-mode=VERIFY_CA

Ao usar o Cliente MySQL 5.6, uma conexão SSL exigirá verificação com base no certificado de CA de servidor se você especificar a opção --ssl-verify-server-cert, como no exemplo a seguir.

mysql -h mysql-database.rds.amazonaws.com -uadmin -ppassword --ssl-ca=/tmp/ssl-cert.pem --ssl-verify-server-cert

Atualizar o armazenamento confiável de aplicações

Para obter informações sobre como atualizar o armazenamento confiável para aplicações MySQL, consulte Installing SSL certificates na documentação do MySQL.

nota

Ao atualizar o armazenamento confiável, é possível reter certificados mais antigos, além de adicionar os novos certificados.

Atualizar o armazenamento confiável de aplicações para JDBC

Você pode atualizar o armazenamento confiável para aplicativos que usam conexões JDBC para SSL/TLS.

Como atualizar o armazenamento confiável para aplicativos JDBC

  1. Faça download do certificado raiz de 2019 que funcione para todas as regiões da AWS e coloque o arquivo no diretório do armazenamento confiável.

    Para obter informações sobre como fazer download do certificado raiz, consulte Usar o SSL/TLS para criptografar uma conexão com uma instância de banco de dados.

  2. Converta o certificado para o formato .der usando o seguinte comando.

    openssl x509 -outform der -in rds-ca-2019-root.pem -out rds-ca-2019-root.der

    Substitua o nome do arquivo pelo arquivo obtido por download.

  3. Importe o certificado para o repositório de chaves usando o seguinte comando.

    keytool -import -alias rds-root -keystore clientkeystore -file rds-ca-2019-root.der
  4. Confirme se o armazenamento de chaves foi atualizado com êxito.

    keytool -list -v -keystore clientkeystore.jks

    Insira a senha do repositório de chaves quando solicitado.

    Sua saída deve conter o seguinte.

    rds-root,date, trustedCertEntry, Certificate fingerprint (SHA1): D4:0D:DB:29:E3:75:0D:FF:A6:71:C3:14:0B:BF:5F:47:8D:1C:80:96 # This fingerprint should match the output from the below command openssl x509 -fingerprint -in rds-ca-2019-root.pem -noout

Se você estiver usando o driver JDBC mysql em um aplicativo, defina as seguintes propriedades nesse aplicativo.

System.setProperty("javax.net.ssl.trustStore", certs); System.setProperty("javax.net.ssl.trustStorePassword", "password");

Ao iniciar o aplicativo, defina as seguintes propriedades.

java -Djavax.net.ssl.trustStore=/path_to_truststore/MyTruststore.jks -Djavax.net.ssl.trustStorePassword=my_truststore_password com.companyName.MyApplication

Exemplo de código Java para estabelecer conexões SSL

O exemplo de código a seguir mostra como configurar a conexão SSL que valida o certificado de servidor usando JDBC.

public class MySQLSSLTest { private static final String DB_USER = "username"; private static final String DB_PASSWORD = "password"; // This key store has only the prod root ca. private static final String KEY_STORE_FILE_PATH = "file-path-to-keystore"; private static final String KEY_STORE_PASS = "keystore-password"; public static void test(String[] args) throws Exception { Class.forName("com.mysql.jdbc.Driver"); System.setProperty("javax.net.ssl.trustStore", KEY_STORE_FILE_PATH); System.setProperty("javax.net.ssl.trustStorePassword", KEY_STORE_PASS); Properties properties = new Properties(); properties.setProperty("sslMode", "VERIFY_IDENTITY"); properties.put("user", DB_USER); properties.put("password", DB_PASSWORD); Connection connection = null; Statement stmt = null; ResultSet rs = null; try { connection = DriverManager.getConnection("jdbc:mysql://mydatabase.123456789012.us-east-1.rds.amazonaws.com:3306",properties); stmt = connection.createStatement(); rs=stmt.executeQuery("SELECT 1 from dual"); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { } } if (stmt != null) { try { stmt.close(); } catch (SQLException e) { } } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } return; } }
Importante

Depois de determinar que as suas conexões com o banco de dados usam SSL/TLS e ter atualizado o armazenamento confiável de aplicativos, você poderá atualizar seu banco de dados para usar os certificados rds-ca-2019. Para obter instruções, consulte a etapa 3 em Atualizar o certificado CA modificando sua instância de banco de dados.