Comment utiliser une connexion SSL pour me connecter avec succès à mon instance Amazon RDS ?

Lecture de 11 minute(s)
0

Je souhaite utiliser une connexion SSL (Secure Socket Layer) pour me connecter à mon instance de base de données Amazon Relational Database Service (Amazon RDS).

Brève description

Pour chiffrer une connexion à une instance de base de données qui exécute MySQL, MariaDB, Microsoft SQL Server, Oracle ou PostgreSQL, utilisez le protocole SSL ou le protocole TLS (Transport Layer Security) à partir de votre application. Les connexions SSL/TLS fournissent une couche de sécurité car elles chiffrent les données transférées entre votre client et l'instance de base de données. Un certificat de serveur fournit une couche de sécurité supplémentaire car il confirme que la connexion est établie à une instance de base de données Amazon RDS.

Lorsque vous provisionnez une instance de base de données, Amazon RDS crée un certificat SSL, puis installe le certificat sur l'instance. Ces certificats sont signés par une autorité de certification (CA). Le certificat SSL inclut le point de terminaison d'instance de base de données comme nom commun du certificat SSL afin de protéger l'instance contre les attaques par usurpation d’identité. Le certificat SSL créé par Amazon RDS est l'entité racine approuvée et fonctionne pour les cas d'utilisation les plus courants. Toutefois, si votre application n'accepte pas les chaînes de certificats, le certificat risque d'échouer. Dans ce cas, utilisez un certificat intermédiaire pour vous connecter à votre région AWS. Par exemple, lorsque vous utilisez le protocole SSL pour vous connecter aux régions AWS GovCloud (États-Unis), vous devez utiliser un certificat intermédiaire.

Vous pouvez télécharger un bundle de certificats contenant à la fois les certificats intermédiaires et les certificats racine pour toutes les régions auprès d'AWS Trust Services. Si votre application est exécutée sous Microsoft Windows et requiert un fichier PKCS7, vous pouvez télécharger le bundle de certificats PKCS7 sur Amazon Trust Services. Ce bundle contient à la fois les certificats intermédiaires et racine.

Résolution

Chaque moteur de base de données possède son propre processus pour implémenter le protocole SSL/TLS. Pour implémenter une connexion SSL/TLS pour votre cluster de bases de données, utilisez l'une des méthodes suivantes en fonction de votre moteur de base de données.

Amazon RDS for Oracle

Pour les instances Amazon RDS for Oracle, pour activer le mode SSL, ajoutez l'option SSL dans votre groupe d'options personnalisées.

RDS for Oracle prend en charge les versions 1.0 et 1.2 du protocole TLS. Pour utiliser l'option Oracle SSL, utilisez le paramètre d'option SQLNET.SSL_VERSION de votre groupe d'options. Les valeurs suivantes sont autorisées pour ce paramètre d'option :

  • « 1.0 » : les clients peuvent se connecter à l'instance de base de données à l'aide de TLS 1.0 uniquement.
  • « 1.2 » : les clients peuvent se connecter à l'instance de base de données à l'aide de TLS 1.2 uniquement.
  • « 1.2 ou 1.0 » : les clients peuvent se connecter à l'instance de base de données à l'aide de TLS 1.2 ou 1.0.

Pour les options SSL Oracle existantes, SQLNET.SSL_VERSION est défini sur « 1.0 » par défaut. Vous pouvez modifier ce paramètre si nécessaire.

Vous devez configurer le client SQL*Plus pour utiliser le protocole SSL avant de vous connecter à une instance de base de données Oracle qui utilise l'option Oracle SSL. Pour utiliser une connexion SSL via JDBC, vous devez créer un keystore, approuver le certificat CA racine Amazon RDS, puis configurer la connexion SSL.

Exemple de code utilisant JDBC pour configurer la connexion 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
    }
}

Avant d'utiliser le protocole SSL pour vous connecter à votre instance RDS for Oracle, vérifiez les points suivants :

  • Le certificat racine RDS est téléchargé et ajouté à un fichier de portefeuille. Ce fichier est stocké dans un répertoire spécifié par le paramètre WALLET_LOCATION du fichier sqlnet.ora.
  • Votre entrée TNS contient le numéro de port SSL approprié.
  • Votre groupe de sécurité Amazon RDS est configuré pour autoriser les connexions entrantes depuis vos machines via le port SSL.
  • Le pare-feu ou les politiques de sécurité sont configurés de manière appropriée pour autoriser le trafic sur le port SSL depuis Amazon RDS.

Amazon RDS for MariaDB

Amazon RDS for MariaDB prend en charge les versions TLS 1.0, 1.1, 1.2 et 1.3. Dans une connexion TLS unidirectionnelle, le protocole TLS est utilisé sans certificat client et seul le serveur peut être authentifié. L'authentification n'est donc possible que dans une seule direction. Cependant, le chiffrement est toujours possible dans les deux directions. Pour plus d'informations, consultez la section Activation du protocole TLS unidirectionnel pour les clients MariaDB sur le site Web de MariaDB.

Avec la vérification des certificats de serveur, le client vérifie que le certificat appartient au serveur. Pour plus d'informations, consultez la section Vérification des certificats de serveur sur le site Web de MariaDB.

Pour lancer le client MySQL 5.7 ou une version ultérieure avec un certificat RDS, exécutez une commande similaire à la commande suivante :

mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-mode=VERIFY_IDENTITY

Pour lancer le client MariaDB avec un certificat RDS, exécutez une commande similaire à la commande suivante :

mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-verify-server-cert

Pour exiger des connexions SSL pour des utilisateurs ou des comptes spécifiques, exécutez la requête suivante en fonction de la version de MariaDB :

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

Pour les versions 10.5 et ultérieures de RDS for MariaDB avec le schéma de performance activé et les applications connectées à une instance de base de données, vérifiez quelles connexions utilisent le protocole 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;

Remarque : Pour plus d'informations sur le schéma de performance, consultez la section Schéma de performance sur le site Web de MariaDB.

Amazon RDS for MySQL

MySQL utilise OpenSSL pour sécuriser les connexions. Pour plus d'informations, consultez la section Prise en charge du protocole SSL/TLS pour les instances de bases de données MySQL sur Amazon RDS.

Par défaut, les programmes client MySQL tentent d'établir une connexion chiffrée lorsque le serveur prend en charge les connexions chiffrées. Pour plus de sécurité, utilisez le paramètre --ssl-ca pour référencer le certificat SSL qui inclut le point de terminaison de l'instance de base de données comme nom commun. Le certificat SSL protège l'instance contre les attaques par usurpation d'identité.

Pour utiliser le paramètre --ssl-ca pour MySQL 5.7 et versions ultérieures afin de lancer le client, exécutez une commande similaire à la suivante :

mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-mode=VERIFY_IDENTITY

Pour exiger des connexions SSL pour des utilisateurs ou des comptes spécifiques, exécutez une commande similaire à la commande suivante, en fonction de la version de 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

Pour MySQL 5.7 et versions ultérieures, exécutez la commande suivante :

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

Pour RDS for MySQL version 5.7 ou 8.0 avec le schéma de performance activé et les applications connectées à une instance de base de données, vérifiez quelles connexions utilisent 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;

Remarque : Pour plus d'informations sur le schéma de performance, consultez la section Schéma de performance sur le site Web de MariaDB.

Amazon RDS for Microsoft SQL Server

Pour utiliser le protocole SSL afin de vous connecter à votre instance de base de données RDS pour Microsoft SQL Server, vous pouvez forcer le protocole SSL pour toutes les connexions ou chiffrer des connexions spécifiques.

Pour chiffrer les connexions provenant d'autres clients SQL, ajoutez encrypt=true à votre chaîne de connexion. Cette chaîne peut être disponible en tant qu'option ou en tant que propriété sur la page de connexion des outils de l'interface graphique.

Pour vérifier que votre connexion est chiffrée, exécutez la requête suivante :

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

Vérifiez que la requête renvoie vrai pour encrypt_option.

Remarque : Pour activer le chiffrement SSL pour les clients qui utilisent JDBC pour se connecter, vous devrez peut-être ajouter le certificat SQL RDS au magasin de certificats Java CA (cacerts). Pour ce faire, utilisez l'utilitaire keytool.

Amazon RDS for PostgreSQL

Amazon RDS prend en charge le chiffrement SSL pour les instances de bases de données PostgreSQL. Pour plus d'informations, consultez la section Utilisation du protocole SSL avec une instance de base de données PostgreSQL.

Avant de vous connecter à une instance de base de données RDS for PostgreSQL via SSL, procédez comme suit :

  1. Téléchargez le certificat.
  2. Importez le certificat dans votre système d'exploitation.

Pour plus d'informations, consultez la section Connexion à une instance de base de données PostgreSQL via SSL.

Pour référencer le certificat, utilisez le paramètre sslrootcert. Par exemple, 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"

Pour configurer les connexions à votre instance RDS for PostgreSQL afin qu'elles utilisent le protocole SSL, définissez rds.force_ssl sur 1 (activé) dans votre groupe de paramètres personnalisés. Par défaut, cette valeur est définie sur 0 (désactivé).

Lorsque vous définissez rds.force_ssl sur 1 (activé), le fichier pg_hba.conf de votre instance de base de données est modifié pour prendre en charge la nouvelle configuration SSL. Pour voir le résumé du contenu du fichier pg_hba.conf, utilisez la vue pg_hba_file_rules. Pour plus d'informations, consultez la page pg_hba_file_rules sur le site Web de PostgreSQL.

Lorsque vous définissez rds.force_ssl sur 0 (désactivé), le fichier pg_hba.conf se présente comme suit :

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)

Lorsque vous définissez rds.force_ssl sur 1 (activé), le fichier pg_hba.conf se présente comme suit :

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

Remarque : La valeur type de line_number (13) peut être mise à jour vers hostssl une fois que rds.force_ssl est défini sur 1 (activé).

Après avoir activé la connexion SSL sur votre instance et initié une connexion à votre instance RDS for PostgreSQL, un message similaire au message suivant s'affiche :

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.

Toutes les connexions non SSL sont rejetées avec le message suivant :

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

Informations connexes

Utilisation du protocole SSL/TLS pour chiffrer une connexion à une instance ou un cluster de base de données