Come posso utilizzare una connessione SSL per connettermi con successo alla mia istanza Amazon RDS?

10 minuti di lettura
0

Desidero utilizzare una connessione Secure Socket Layer (SSL) per connettermi alla mia istanza database Amazon Relational Database Service (Amazon RDS).

Breve descrizione

Per crittografare una connessione a un'istanza database che esegue MySQL, MariaDB, Microsoft SQL Server, Oracle o PostgreSQL, utilizza SSL o Transport Layer Security (TLS) dall'applicazione. Le connessioni SSL/TLS forniscono un livello di sicurezza, poiché le connessioni eseguono la crittografia dei dati trasferiti tra il client e l'istanza database. Il certificato server fornisce un ulteriore livello di sicurezza, in quanto convalida la connessione a un'istanza database Amazon RDS.

Quando si esegue il provisioning di un'istanza database, Amazon RDS crea un certificato SSL e lo installa sull'istanza. Questi certificati sono firmati da un'autorità di certificazione (CA). Il certificato SSL include l'endpoint dell'istanza database come il nome comune del certificato SSL per proteggere l'istanza da attacchi di spoofing. Un certificato SSL creato da Amazon RDS è l'entità root attendibile e funziona nella maggior parte dei casi. Tuttavia, se l'applicazione non accetta catene di certificati, il certificato potrebbe non riuscire. In questi casi, utilizza un certificato intermedio per connetterti alla Regione AWS. Ad esempio, quando utilizzi SSL per connetterti alle Regioni AWS GovCloud (Stati Uniti), utilizza un certificato intermedio.

È possibile scaricare un pacchetto di certificati contenente i certificati intermedi e root per tutte le regioni di AWS Trust Services. Se l'applicazione è in esecuzione su Microsoft Windows e richiede un file PKCS7, è possibile scaricare il pacchetto di certificati PKCS7 da Amazon Trust Services. Questo pacchetto contiene i certificati intermedi e principali.

Risoluzione

Ogni motore di database dispone del proprio processo per implementare SSL/TLS. Per implementare una connessione SSL/TLS per il cluster di database, utilizza uno dei seguenti metodi in base al motore di database.

Amazon RDS per Oracle

Per le istanze Amazon RDS per Oracle, per attivare la modalità SSL aggiungi l'opzione SSL nel gruppo di opzioni personalizzato.

RDS per Oracle supporta TLS versioni 1.0 e 1.2. Per utilizzare l'opzione Oracle SSL, utilizza l'impostazione dell'opzione SQLNET.SSL_VERSION nel gruppo di opzioni. Per questa impostazione dell'opzione sono consentiti i seguenti valori:

  • "1.0": i client possono connettersi all'istanza database utilizzando solo TLS 1.0.
  • "1.2": i client possono connettersi all'istanza database utilizzando solo TLS 1.2.
  • "1.2 o 1.0": i client possono connettersi all'istanza database utilizzando TLS 1.2 o 1.0.

Per le opzioni SSL Oracle esistenti, SQLNET.SSL\ _VERSION viene impostato automaticamente su "1.0". È possibile modificare l'impostazione, se necessario.

Prima di connettersi a un'istanza database Oracle che utilizza l'opzione Oracle SSL, è necessario configurare il client SQL*Plus per utilizzare SSL. Per utilizzare una connessione SSL su JDBC, è necessario creare un keystore, considerare attendibile il certificato CA root di Amazon RDS e quindi configurare la connessione SSL.

Codice di esempio che utilizza JDBC per configurare la connessione 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
    }
}

Prima di utilizzare SSL per connetterti all'istanza RDS per Oracle, verifica quanto segue:

  • Il certificato root RDS viene scaricato e aggiunto a un file wallet. Questo file è archiviato in una directory specificata dal parametro WALLET\ _LOCATION nel file sqlnet.ora.
  • Il numero della porta SSL è corretto nella voce TNS.
  • Il gruppo di sicurezza di Amazon RDS è configurato in modo da consentire le connessioni in entrata dai propri computer sulla porta SSL.
  • Il firewall o le policy di sicurezza sono configurati in modo appropriato per consentire il traffico sulla porta SSL da Amazon RDS.

Amazon RDS per MariaDB

Amazon RDS per MariaDB supporta TLS versioni 1.0, 1.1, 1.2 e 1.3. In una connessione TLS unidirezionale, TLS viene utilizzato senza un certificato client e solo il server può essere autenticato. Pertanto, l'autenticazione è possibile solo in una direzione. Tuttavia, la crittografia è ancora possibile in entrambe le direzioni. Per ulteriori informazioni, consulta Activating one-way TLS for MariaDB clients sul sito web di MariaDB.

Con la verifica del certificato server, il client verifica che il certificato appartenga al server. Per ulteriori informazioni, consulta Server certificate verification sul sito web di MariaDB.

Per avviare il client MySQL 5.7 o versioni successive con certificato RDS, esegui un comando simile al seguente:

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

Per avviare il client MariaDB con certificato RDS, esegui un comando simile al seguente:

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

Per richiedere connessioni SSL per utenti o account specifici, esegui la seguente query in base alla versione di MariaDB in uso:

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

Per RDS per MariaDB versione 10.5 e successive con lo schema delle prestazioni attivato e le applicazioni connesse a un'istanza database, controlla quali connessioni utilizzano 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;

Nota: per ulteriori informazioni sullo schema delle prestazioni, consulta Performance Schema sul sito web di MariaDB.

Amazon RDS per MySQL

MySQL utilizza OpenSSL per connessioni sicure. Per ulteriori informazioni, consulta SSL/TLS support for MySQL DB instances on Amazon RDS (Supporto SSL/TLS per le istanze database MySQL su Amazon RDS).

Per impostazione predefinita, i programmi client MySQL cercano di stabilire una connessione crittografata quando il server supporta le connessioni crittografate. Per maggiore sicurezza, utilizza il parametro --ssl-ca per fare riferimento al certificato SSL che include l'endpoint dell'istanza database come nome comune. Il certificato SSL protegge l'istanza da attacchi di spoofing.

Per utilizzare il parametro \ --ssl-ca per MySQL 5.7 e versioni successive per avviare il client, esegui un comando simile al seguente:

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

Per richiedere connessioni SSL per utenti o account specifici, esegui un comando simile al seguente, in base alla versione di MySQL in uso:

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

Per MySQL 5.7 e versioni successive, esegui il seguente comando:

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

Per RDS per MySQL versione 5.7 o 8.0 con lo schema delle prestazioni attivato e le applicazioni connesse a un'istanza database, controlla quali connessioni utilizzano 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;

Nota: per ulteriori informazioni sullo schema delle prestazioni, consulta Performance Schema sul sito web di MariaDB.

Amazon RDS per Microsoft SQL Server

Per utilizzare SSL per connettersi all'istanza database di RDS per Microsoft SQL Server, puoi forzare SSL per tutte le connessioni o crittografare connessioni specifiche.

Per crittografare le connessioni da altri client SQL, aggiungi encrypt=true alla stringa di connessione. Questa stringa potrebbe essere disponibile come opzione o come proprietà nella pagina di connessione negli strumenti della GUI.

Per confermare che la connessione è crittografata, esegui la seguente query:

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

Verifica che la query restituisca true per encrypt_option.

Nota: per attivare la crittografia SSL per i client che utilizzano JDBC per la connessione, potrebbe essere necessario aggiungere il certificato RDS SQL a Java CA Certificate Store (cacerts). A tale scopo, utilizza l'utilità keytool.

Amazon RDS per PostgreSQL

Amazon RDS supporta la crittografia SSL per le istanze database PostgreSQL. Per ulteriori informazioni, consulta Using SSL with a PostgreSQL DB instance (Utilizzo di SLL con un'istanza database PostgreSQL.

Prima di connetterti a un'istanza database RDS per PostgreSQL su SSL, completa i seguenti passaggi:

  1. Scarica il certificato.
  2. Importa il certificato nel sistema operativo.

Per ulteriori informazioni, consulta Connecting to a PostgreSQL DB instance over SSL.

Per fare riferimento al certificato, utilizza il parametro sslrootcert. Ad esempio, 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"

Per configurare le connessioni all'istanza RDS per PostgreSQL per utilizzare SSL, imposta rds.force_ssl su 1 (on) nel gruppo di parametri personalizzati. Per impostazione predefinita, questo valore è impostato su 0 (off).

Quando imposti rds.force_ssl su 1 (on), il file pg_hba.conf dell'istanza database viene modificato per supportare la nuova configurazione SSL. Per vedere il riepilogo del contenuto del file pg_hba.conf, utilizza la visualizzazione pg_hba_file_rules. Per ulteriori informazioni, consulta pg_hba_file_rules sul sito web di PostgreSQL.

Quando imposti rds.force_ssl su 0 (off), l'aspetto del file pg_hba.conf è simile al seguente:

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 imposti rds.force_ssl su 1 (on), l'aspetto del file pg_hba.conf è simile al seguente:

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

Nota: il valore type per line_number (13) potrebbe aggiornarsi a hostssl dopo aver impostato rds.force_ssl su 1 (on).

Dopo aver attivato la connessione SSL sull'istanza e aver avviato una connessione all'istanza RDS per PostgreSQL, viene visualizzato un messaggio simile al seguente:

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.

Tutte le connessioni non SSL vengono rifiutate con il seguente messaggio:

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

Informazioni correlate

Using SSL/TLS to encrypt a connection to a DB instance or cluster (Utilizzo di SSL/TLS per crittografare una connessione a un'istanza database o a un cluster)