Comment puis-je me connecter à mon instance Amazon RDS à l'aide d'une connexion SSL ?

Lecture de 12 minute(s)
0

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

Brève description

Vous pouvez utiliser SSL ou le protocole TLS (Transport Layer Security) depuis votre application afin de chiffrer une connexion à une instance de base de données exécutant MySQL, MariaDB, Microsoft SQL Server, Oracle ou PostgreSQL. Les connexions SSL/TLS fournissent une couche de sécurité en chiffrant 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 en validant que la connexion est établie à une instance de base de données Amazon RDS.

Lorsque vous allouez une instance de base de données, Amazon RDS crée un certificat SSL et installe le certificat sur l'instance. Ces certificats sont signés par une autorité de certification. Le certificat SSL inclut le point de terminaison de l'instance de base de données en tant que nom commun du certificat SSL afin de protéger l'instance contre les attaques d'usurpation d'identité. Un certificat SSL créé par Amazon RDS est l'entité racine de confiance et fonctionne dans la plupart des cas. Cependant, le certificat peut échouer si votre application n'accepte pas les chaînes de certificats. Dans ce cas, vous devrez peut-être utiliser un certificat intermédiaire afin de vous connecter à votre Région AWS. Par exemple, vous devez utiliser un certificat intermédiaire pour vous connecter aux Régions AWS GovCloud (US) à l'aide de SSL.

Vous pouvez télécharger une solution groupée de certificats contenant les certificats intermédiaires et racines pour toutes les Régions AWS à partir d'AWS Trust Services. Si votre application est sur Microsoft Windows et nécessite un fichier PKCS7, vous pouvez télécharger la solution groupée de certificats PKCS7 à partir d'Amazon Trust Services. Cette solution groupée contient à la fois les certificats intermédiaires et racines.

Solution

Chaque moteur de base de données dispose de son propre processus d'implémentation SSL/TLS. Afin d'implémenter une connexion SSL/TLS pour votre cluster de bases de données, choisissez l'une des options suivantes en fonction de votre moteur de base de données.

Amazon RDS for Oracle

Pour les instances Amazon RDS for Oracle, vous pouvez activer le mode SSL en ajoutant l'option SSL dans votre groupe d'options personnalisé.

Amazon RDS for Oracle prend en charge le protocole TLS (Transport Layer Security) versions 1.0 et 1.2. Pour utiliser l'option Oracle SSL, utilisez le paramètre d'option SQLNET.SSL_VERSION dans votre groupe d'options. Pour ce paramètre d'option, les valeurs suivantes sont autorisées :

  • « 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 automatiquement défini sur « 1.0 ». Vous pouvez modifier le paramètre, si nécessaire.

Vous devez configurer le client SQL*Plus de façon à utiliser 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 magasin de clés, approuver le certificat de l'autorité de certification racine Amazon RDS, puis configurer la connexion SSL.

Exemple de code pour configurer la connexion SSL à l'aide de 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
    }
}

Avant de vous connecter à votre instance Amazon RDS for Oracle à l'aide du protocole SSL, vérifiez les points suivants :

  • Le certificat racine RDS est téléchargé et ajouté à un fichier wallet. Ce fichier est stocké dans un répertoire spécifié par le paramètre WALLET_LOCATION dans le fichier sqlnet.ora.
  • Vous disposez du numéro de port SSL correct dans votre entrée TNS.
  • Le 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é. Par conséquent, l'authentification n'est possible que dans un seul sens. Cependant, le chiffrement reste possible dans les deux sens. Avec la vérification de certificat de serveur, le client vérifie que le certificat appartient au serveur.

Pour lancer le client MySQL 5.7 ou version ultérieure avec un certificat RDS, 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 lancer le client MariaDB avec un certificat RDS, 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-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 votre version de MariaDB :

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

Si vous utilisez RDS pour MariaDB version 10.5 et ultérieure avec le schéma de performance activé et que des applications sont connectées à votre instance de base de données, vous pouvez exécuter la requête suivante pour vérifier quelles connexions utilisent 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 for MySQL

Amazon RDS for MySQL prend en charge les versions TLS 1.0, 1.1 et 1.2.

Amazon RDS for MySQL utilise yaSSL pour les connexions sécurisées dans les versions suivantes :

  • MySQL version 5.7.19 et versions antérieures à 5.7
  • MySQL version 5.6.37 et versions antérieures à 5.6

MySQL utilise OpenSSL pour les connexions sécurisées dans les versions suivantes :

  • MySQL version 8.0
  • MySQL version 5.7.21 et versions ultérieures à 5.7
  • MySQL version 5.6.39 et versions ultérieures à 5.6

Par défaut, les programmes clients MySQL tentent d'établir une connexion chiffrée si le serveur prend en charge ce type de connexion. Afin de bénéficier d'une sécurité supplémentaire à celle fournie par le chiffrement par défaut, 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 en tant que nom commun. Le certificat SSL protège l'instance contre les attaques d'usurpation d'identité.

Afin de lancer le client à l'aide du paramètre --ssl-ca pour MySQL 5.7 et versions ultérieures, 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

Afin d'exiger des connexions SSL pour des utilisateurs ou des comptes spécifiques, exécutez une requête similaire à la suivante en fonction de votre version 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 :

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

Si vous utilisez RDS pour MySQL version 5.7 ou 8.0 avec le schéma de performance activé et que des applications sont connectées à votre instance de base de données, vous pouvez exécuter la requête suivante pour vérifier 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;

Amazon RDS for Microsoft SQL Server

Vous pouvez utiliser l'une des méthodes suivantes pour utiliser SSL afin de vous connecter à votre instance de base de données SQL Server :

  • Forcer SSL pour toutes les connexions : avec cette méthode, les connexions se font de manière transparente avec le client, et celui-ci peut utiliser SSL sans effort. Pour utiliser cette option, définissez le paramètre rds.force_ssl sur 1 (activé). Par défaut, le paramètre rds.force_ssl est défini sur 0 (désactivé). Le paramètre rds.force_ssl est statique. Cela signifie qu’après avoir modifié la valeur, vous devez redémarrer votre instance de base de données afin que la modification prenne effet.
  • Chiffrer des connexions spécifiques : cette méthode configure une connexion SSL à partir d'un ordinateur client spécifique. Vous devez chiffrer les connexions sur le client.

Afin de chiffrer les connexions provenant d'autres clients SQL, ajoutez encrypt=true à votre chaîne de connexion. Cette chaîne peut être disponible sous forme d'option ou de propriété sur la page de connexion dans les outils de l'interface graphique.

Vérifiez que votre connexion est chiffrée en exécutant la requête suivante :

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

Vérifiez que la requête renvoie la valeur true (vrai) pour encrypt_option.

Remarque : afin d'activer le chiffrement SSL pour les clients qui se connectent à l'aide de JDBC, vous devrez peut-être ajouter le certificat SQL RDS au magasin de certificats d'autorité de certification 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. En utilisant SSL, vous pouvez chiffrer une connexion PostgreSQL entre vos applications et votre instance de base de données PostgreSQL. Vous pouvez également forcer toutes les connexions à votre instance de base de données PostgreSQL à utiliser SSL. Amazon RDS for PostgreSQL prend en charge les versions TLS 1.1 et 1.2.

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.

Utilisez le paramètre sslrootcert pour référencer le certificat. 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"

Vous pouvez également configurer les connexions à votre instance RDS for PostgreSQL utilisant SSL en définissant 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é afin de prendre en charge la nouvelle configuration SSL. Vous pouvez utiliser pg_hba_file_rules afin d'afficher le résumé du contenu du fichier pg_hba.conf.

Lorsque vous définissez rds.force_ssl sur 0 (désactivé), le fichier pg_hba.conf ressemble à ce qui 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 ressemble à ce qui 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         |         |

Vous pouvez remarquer que la valeur type de line_number (13) est mise à jour sur hostssl après que rds.force_ssl soit défini sur 1 (activé).

Après avoir activé la connexion SSL sur votre instance, un message similaire au suivant s'affiche lorsque vous initiez une connexion à votre instance 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.

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 de SSL/TLS pour chiffrer une connexion à une instance de base de données

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 2 ans