Come posso collegarmi correttamente alla mia istanza Amazon RDS utilizzando una connessione SSL?

10 minuti di lettura
0

Desidero connettermi all'istanza database Amazon Relational Database Service (Amazon RDS) utilizzando una connessione SSL.

Breve descrizione

Puoi utilizzare SSL o Transport Layer Security (TLS) dall'applicazione per crittografare una connessione a un'istanza database che esegue MySQL, MariaDB, Microsoft SQL Server, Oracle o PostgreSQL. Le connessioni SSL/TLS offrono un livello di sicurezza crittografando i dati trasferiti tra il client e l'istanza database. Un certificato del server fornisce un ulteriore livello di sicurezza verificando che la connessione venga effettuata a un'istanza database di Amazon RDS.

Quando esegui il provisioning di un'istanza database, Amazon RDS crea un certificato SSL e installa il certificato sull'istanza. Questi certificati sono firmati da un'autorità di certificazione. Il certificato SSL include l'endpoint dell'istanza database come nome comune per il certificato SSL per proteggere l'istanza dagli 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 avere esito positivo. In questi casi, potrebbe essere necessario utilizzare un certificato intermedio per connettersi alla Regione AWS. Ad esempio, devi utilizzare un certificato intermedio per connetterti alle Regioni AWS GovCloud (Stati Uniti) utilizzando SSL.

Puoi scaricare un bundle di certificati che contiene sia i certificati intermedi che quelli root per tutte le Regioni AWS da AWS Trust Services. Se l'applicazione è su Microsoft Windows e richiede un file PKCS7, puoi scaricare il bundle di certificati PKCS7 da Amazon Trust Services. Questo bundle contiene sia i certificati intermedi che i certificati root.

Risoluzione

Ogni motore di database ha il proprio processo per l'implementazione di SSL/TLS. Per implementare la connessione SSL/TLS per il cluster DB, scegli una delle seguenti opzioni in base al motore di database.

Amazon RDS for Oracle

Per le istanze Amazon RDS for Oracle, puoi attivare la modalità SSL aggiungendo l'opzione SSL nel tuo gruppo di opzioni personalizzato.

Amazon RDS for Oracle supporta Transport Layer Security (TLS) versioni 1.0 e 1.2. Per utilizzare l'opzione SSL Oracle, utilizza l'impostazione dell'opzione SQLNET.SSL_VERSION nel gruppo di opzioni. Per questa impostazione di 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 è impostato automaticamente su "1.0". Puoi modificare l'impostazione, se necessario.

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

Codice di esempio per configurare la connessione SSL utilizzando 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
    }
}

Prima di connetterti all'istanza Amazon RDS for Oracle utilizzando SSL, assicurati di quanto segue:

  • Il certificato root RDS viene scaricato e aggiunto a un file wallet. Questo file viene archiviato in una directory specificata dal parametro WALLET_LOCATION nel file sqlnet.ora.
  • Hai il numero di porta SSL corretto nella voce TNS.
  • Il gruppo di sicurezza di Amazon RDS è configurato per consentire le connessioni in entrata dai computer tramite la 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 for MariaDB

Amazon RDS for MariaDB supporta le versioni TLS 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. Per questo motivo, l'autenticazione è possibile in una sola direzione. Tuttavia, la crittografia è ancora possibile in entrambe le direzioni. Con la verifica del certificato del server, il client verifica che il certificato appartenga al server.

Per avviare il client MySQL 5.7 o versioni successive con certificato RDS, emetti 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, emetti 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 a seconda della versione di MariaDB in uso:

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

Se utilizzi RDS per MariaDB versione 10.5 e successive con lo schema delle prestazioni attivato e disponi di applicazioni connesse all'istanza del database, puoi emettere la seguente query per verificare 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;

Amazon RDS per MySQL

Amazon RDS per MySQL supporta le versioni TLS 1.0, 1.1 e 1.2.

Amazon RDS per MySQL utilizza yaSSL per connessioni sicure nelle seguenti versioni:

  • MySQL versione 5.7.19 e versioni precedenti alla 5.7
  • MySQL versione 5.6.37 e versioni precedenti alla 5.6

MySQL utilizza OpenSSL per connessioni sicure nelle seguenti versioni:

  • MySQL versione 8.0
  • MySQL versione 5.7.21 e versioni successive alla 5.7
  • MySQL versione 5.6.39 e versioni successive alla 5.6

Di default, i programmi client MySQL tentano di stabilire una connessione crittografata se il server supporta connessioni crittografate. Per una maggiore sicurezza rispetto a quella fornita dalla crittografia di default, 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 dagli attacchi di spoofing.

Per avviare il client utilizzando il parametro --ssl-ca per MySQL 5.7 e versioni successive, emetti 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 una query simile alla seguente a seconda della 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:

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

Se utilizzi RDS per MySQL versione 5.7 o 8.0 con lo schema delle prestazioni attivato e disponi di applicazioni connesse all'istanza del database, puoi emettere la seguente query per verificare 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;

Amazon RDS per Microsoft SQL Server

Per utilizzare SSL per connetterti all'istanza database di SQL Server puoi utilizzare uno dei seguenti modi:

  • Forzare SSL per tutte le connessioni: con questo metodo, le connessioni al client avvengono in modo trasparente e il client non deve compiere alcuna operazione per utilizzare SSL. Per utilizzare questa opzione, imposta il parametro rds.force_ssl su 1 (attivato). Di default, il parametro rds.force_ssl è impostato su 0 (disattivato). Il parametro rds.force_ssl è statico. Pertanto, dopo aver modificato il valore, affinché la modifica abbia effetto dovrai riavviare l'istanza database.
  • Crittografare connessioni specifiche: questo metodo imposta una connessione SSL da un computer client specifico ed è necessario crittografare le connessioni sul client.

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

Verifica che la connessione sia crittografata eseguendo 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 si connettono tramite JDBC, potrebbe essere necessario aggiungere il certificato SQL di RDS all'archivio Java CA Certificate (cacerts). Puoi farlo utilizzando l'utilità keytool.

Amazon RDS for PostgreSQL

Amazon RDS supporta la crittografia SSL per le istanze database PostgreSQL. Utilizzando SSL, puoi crittografare una connessione PostgreSQL tra le applicazioni e l'istanza database PostgreSQL. Inoltre, puoi forzare l'utilizzo di SSL per tutte le connessioni all'istanza database PostgreSQL. Amazon RDS per PostgreSQL supporta le versioni TLS 1.1 e 1.2.

Prima di connetterti a un'istanza database di RDS per PostgreSQL tramite SSL, completa le seguenti operazioni:

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

Per ulteriori informazioni, consulta Connessione a un'istanza database PostgreSQL tramite SSL.

Utilizza il parametro sslrootcert per fare riferimento al certificato. 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"

Inoltre, puoi configurare le connessioni all'istanza RDS for PostgreSQL utilizzando SSL, impostando rds.force_ssl su 1 (attivato) nel gruppo di parametri personalizzato. Di default, questo valore è impostato su 0 (disattivato).

Quando imposti rds.force_ssl su 1 (attivato), il file pg_hba.conf dell'istanza database viene modificato per supportare la nuova configurazione SSL. Puoi utilizzare la vista pg_hba_file_rules per visualizzare il riepilogo dei contenuti del file pg_hba.conf.

Quando imposti rds.force_ssl su 0 (disattivato), il file pg_hba.conf ha un aspetto 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 (attivato), il file pg_hba.conf ha un aspetto 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         |         |

Puoi notare che il valore del tipo per line_number (13) viene aggiornato a hostssl dopo che rds.force_ssl è impostato su 1 (attivato).

Dopo aver attivato la connessione SSL sull'istanza, viene visualizzato un messaggio simile al seguente quando avvii una connessione all'istanza RDS per 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.

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

Utilizzo di SSL/TLS per crittografare una connessione a un'istanza database

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa