Wie stelle ich über eine SSL-Verbindung erfolgreich eine Verbindung zu meiner Amazon-RDS-Instance her?

Letzte Aktualisierung: 25.10.2021

Ich möchte über eine Secure Socket Layer (SSL)-Verbindung eine Verbindung zu meiner Amazon-Relational-Database-Service (Amazon RDS)-DB-Instance herstellen.

Kurzbeschreibung

Sie können SSL oder Transport Layer Security (TLS) aus Ihrer Anwendung verwenden, um eine Verbindung zu einer DB-Instance zu verschlüsseln, auf der MySQL, MariaDB, Microsoft SQL Server, Oracle oder PostgreSQL ausgeführt wird. SSL/TLS-Verbindungen bieten eine Sicherheitsebene, indem sie Daten verschlüsseln, die zwischen Ihrem Client und der DB-Instance übertragen werden. Ein Serverzertifikat bietet eine zusätzliche Sicherheitsebene, indem bestätigt wird, dass die Verbindung zu einer Amazon-RDS-DB-Instance hergestellt wird.

Wenn Sie eine DB-Instance bereitstellen, erstellt Amazon RDS ein SSL-Zertifikat und installiert das Zertifikat auf der Instance. Diese Zertifikate werden von einer Zertifizierungsstelle signiert. Das SSL-Zertifikat enthält den DB-Instance-Endpunkt als den Allgemeinen Namen für das SSL-Zertifikat, um die Instance vor Spoofing-Angriffen zu schützen. Ein von Amazon RDS erstelltes SSL-Zertifikat ist die vertrauenswürdige Root-Entität und funktioniert in den meisten Fällen. Wenn Ihre Anwendung jedoch keine Zertifikatsketten akzeptiert, schlägt das Zertifikat möglicherweise fehl. In solchen Fällen müssen Sie möglicherweise ein Zwischenzertifikat verwenden, um eine Verbindung zu Ihrer AWS-Region herzustellen. Beispielsweise müssen Sie ein Zwischenzertifikat verwenden, um mithilfe von SSL eine Verbindung zu den AWS GovCloud (USA) -Regionen herzustellen.

Sie können ein Zertifikatsbündel, das sowohl das Zwischen- als auch das Stammzertifikat für alle AWS-Regionen enthält, von AWS Trust Services herunterladen. Wenn sich Ihre Anwendung auf Microsoft Windows befindet und eine PKCS7-Datei benötigt, können Sie das PKCS7-Zertifikatsbündel von Amazon Trust Services herunterladen. Dieses Bündel enthält sowohl das Zwischen- als auch das Stammzertifikat.

Auflösung

Jede Datenbank-Engine hat einen eigenen Prozess zur Implementierung von SSL/TLS. Um eine SSL/TLS-Verbindung für Ihren DB-Cluster zu implementieren, wählen Sie basierend auf Ihrer Datenbank-Engine eine der folgenden Optionen aus.

Amazon RDS for Oracle

Für Amazon RDS-for-Oracle-Instances können Sie den SSL-Modus aktivieren, indem Sie die SSL-Option in Ihrer benutzerdefinierten Optionsgruppe hinzufügen.

Amazon RDS for Oracle unterstützt Transport Layer Security (TLS) Version 1.0 und 1.2. Um die Oracle-SSL-Option zu nutzen, verwenden Sie die Optionseinstellung SQLNET.SSL_VERSION in Ihrer Optionsgruppe. Die folgenden Werte sind für diese Optionseinstellung zulässig:

  • „1.0“ – Clients können nur mit TLS 1.0 eine Verbindung zur DB-Instance herstellen.
  • „1.2“ – Clients können nur mit TLS 1.2 eine Verbindung zur DB-Instance herstellen.
  • „1.2 oder 1.0“ – Clients können entweder mit TLS 1.2 oder 1.0 eine Verbindung zur DB-Instance herstellen.

Für bestehende Oracle-SSL-Optionen wird SQLNET.SSL_VERSION automatisch auf „1.0“ eingestellt. Sie können die Einstellung bei Bedarf ändern.

Sie müssen den SQL*Plus-Client für die Verwendung von SSL konfigurieren, bevor Sie eine Verbindung zu einer Oracle-DB-Instance herstellen, die die Oracle-SSL-Option verwendet. Um eine SSL-Verbindung über JDBC zu verwenden, müssen Sie einen Schlüsselspeicher erstellen, dem Amazon-RDS-CA-Stammzertifikat vertrauen und dann die SSL-Verbindung einrichten.

Beispielcode zum Einrichten der SSL-Verbindung mit 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
    }
}

Bevor Sie mithilfe von SSL eine Verbindung zu Ihrer Amazon-RDS-for-Oracle-Instance herstellen, sollten Sie Folgendes beachten:

  • Das RDS-Stammzertifikat wird heruntergeladen und einer Wallet-Datei hinzugefügt. Diese Datei wird in einem Verzeichnis gespeichert, das durch den Parameter WALLET_LOCATION in der Datei sqlnet.ora angegeben ist.
  • Sie haben die richtige SSL-Portnummer in Ihrem TNS-Eintrag.
  • Die Amazon-RDS-Sicherheitsgruppe ist so konfiguriert, dass sie eingehende Verbindungen von Ihren Computern über den SSL-Port zulässt.
  • Die Firewall oder Sicherheitsrichtlinien sind entsprechend konfiguriert, um Datenverkehr auf dem SSL-Port von Amazon RDS zuzulassen.

Amazon RDS for MariaDB

Amazon RDS for MariaDB unterstützt die TLS-Versionen 1.0, 1.1, 1.2 und 1.3. In einer Einweg-TLS-Verbindung wird TLS ohne Clientzertifikat verwendet, und nur der Server kann authentifiziert werden. Daher ist eine Authentifizierung nur in eine Richtung möglich. Eine Verschlüsselung ist jedoch weiterhin in beide Richtungen möglich. Bei der Überprüfung des Serverzertifikats überprüft der Client, ob das Zertifikat zum Server gehört.

Um den MySQL-5.7-Client oder höher mit einem RDS-Zertifikat zu starten, führen Sie einen Befehl ähnlich dem folgenden aus:

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

Um den MariaDB-Client mit RDS-Zertifikat zu starten, führen Sie einen Befehl ähnlich dem folgenden aus:

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

Führen Sie abhängig von Ihrer MariaDB-Version die folgende Abfrage aus, um SSL-Verbindungen für bestimmte Benutzer oder Konten anzufordern:

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

Führen Sie eine der folgenden Abfragen aus, um zu bestätigen, dass Ihre Verbindung verschlüsselt ist:

MariaDB > status;
MariaDB > SHOW VARIABLES LIKE 'have_ssl';

Amazon RDS for MySQL

Amazon RDS for MySQL unterstützt die TLS-Versionen 1.0, 1.1 und 1.2.

Amazon RDS for MySQL verwendet YaSSL für sichere Verbindungen in den folgenden Versionen:

  • MySQL Version 5.7.19 und frühere 5.7 Versionen
  • MySQL Version 5.6.37 und frühere 5.6-Versionen

MySQL verwendet OpenSSL für sichere Verbindungen in den folgenden Versionen:

  • MySQL Version 8.0
  • MySQL Version 5.7.21 und höhere 5.7 Versionen
  • MySQL Version 5.6.39 und höhere 5.6 Versionen

Standardmäßig versuchen MySQL-Clientprogramme, eine verschlüsselte Verbindung herzustellen, wenn der Server verschlüsselte Verbindungen unterstützt. Verwenden Sie für zusätzliche Sicherheit in Bezug auf die Standardverschlüsselung den Parameter --ssl-ca, um auf das SSL-Zertifikat zu verweisen, das den DB-Instance-Endpunkt als Allgemeinen Namen enthält. Das SSL-Zertifikat schützt die Instance vor Spoofing-Angriffen.

Um den Client mit dem Parameter --ssl-ca für MySQL 5.7 und höher zu starten, führen Sie einen Befehl ähnlich dem folgenden aus:

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

Um SSL-Verbindungen für bestimmte Benutzer oder Konten anzufordern, führen Sie abhängig von Ihrer MySQL-Version eine Abfrage ähnlich der folgenden aus:

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

Für MySQL 5.7 und höher:

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

Für MySQL 5.6 und früher:

GRANT USAGE ON *.* TO 'testuser'@'%' REQUIRE SSL;

Führen Sie eine der folgenden Abfragen aus, um zu bestätigen, dass Ihre Verbindung verschlüsselt ist:

mysql> status;
mysql> SHOW VARIABLES LIKE 'have_ssl';

Amazon RDS for Microsoft SQL Server

Sie können eine der folgenden Möglichkeiten verwenden, um SSL zu verwenden, um eine Verbindung zu Ihrer SQL-Server-DB-Instance herzustellen:

  • SSL für alle Verbindungen erzwingen: Bei dieser Methode werden die Verbindungen transparent für den Client hergestellt, und der Client muss keine Arbeit leisten, um SSL zu verwenden. Um diese Option zu verwenden, setzen Sie den Parameter rds.force_ssl auf 1 (ein). Standardmäßig ist der Parameter rds.force_ssl auf 0 (aus) festgelegt. Der Parameter rds.force_ssl ist statisch. Nachdem Sie den Wert geändert haben, müssen Sie daher Ihre DB-Instance neu starten, damit die Änderung wirksam wird.
  • Verschlüsseln Sie bestimmte Verbindungen: Diese Methode richtet eine SSL-Verbindung von einem bestimmten Clientcomputer aus ein, und Sie müssen Verbindungen auf dem Client verschlüsseln.

Um Verbindungen von anderen SQL-Clients zu verschlüsseln, hängen Sie encrypt=true an Ihre Verbindungszeichenfolge an. Diese Zeichenfolge ist möglicherweise als Option oder als Eigenschaft auf der Verbindungsseite in den GUI-Tools verfügbar.

Bestätigen Sie, dass Ihre Verbindung verschlüsselt ist, indem Sie die folgende Abfrage ausführen:

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

Stellen Sie sicher, dass die Abfrage für encrypt_option true zurückgibt.

Hinweis: Um die SSL-Verschlüsselung für Clients zu aktivieren, die sich über JDBC verbinden, müssen Sie möglicherweise das Amazon-RDS-SQL-Zertifikat zum Java CA Certificate (cacerts) Store hinzufügen. Sie können dies tun, indem Sie das Keytool-Dienstprogramm verwenden.

Amazon RDS for PostgreSQL

Amazon RDS unterstützt SSL-Verschlüsselung für PostgreSQL-DB-Instances. Mit SSL können Sie eine PostgreSQL-Verbindung zwischen Ihren Anwendungen und Ihrer PostgreSQL-DB-Instance verschlüsseln. Sie können auch alle Verbindungen zu Ihrer PostgreSQL-DB-Instance zwingen, SSL zu verwenden. Amazon RDS for PostgreSQL unterstützt die TLS-Versionen 1.1 und 1.2.

Gehen Sie folgendermaßen vor, bevor Sie über SSL eine Verbindung zu einer Amazon-RDS-for-PostgreSQL-DB-Instance herstellen:

  1. Laden Sie das Zertifikat herunter.
  2. Importieren Sie das Zertifikat in Ihr Betriebssystem.

Weitere Informationen finden Sie unter Verbinden mit einer PostgreSQL-DB-Instance über SSL.

Verwenden Sie den Parameter sslrootcert, um auf das Zertifikat zu verweisen. Zum Beispiel 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"

Sie können auch die Verbindungen zu Ihrer RDS-for-PostgreSQL-Instance mithilfe von SSL konfigurieren, indem Sie rds.force_ssl in Ihrer benutzerdefinierten Parametergruppe auf 1 (ein) setzen. Standardmäßig ist dieser Wert auf 0 (aus) eingestellt.

Wenn Sie rds.force_ssl auf 1 (ein) setzen, wird die Datei pg_hba.conf Ihrer DB-Instance geändert, um die neue SSL-Konfiguration zu unterstützen. Sie können die Ansicht pg_hba_file_rules verwenden, um die Inhaltsübersicht der Datei pg_hba.conf anzuzeigen.

Wenn Sie rds.force_ssl auf 0 (aus) setzen, sieht die Datei pg_hba.conf wie folgt aus:

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)

Wenn Sie rds.force_ssl auf 1 (ein) setzen, sieht die Datei pg_hba.conf wie folgt aus:

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

Möglicherweise stellen Sie fest, dass der Typ-Wert für line_number (13) auf hostssl aktualisiert wird, nachdem rds.force_ssl auf 1 (ein) gesetzt wurde.

Nachdem Sie die SSL-Verbindung auf Ihrer Instance aktiviert haben, wird eine Meldung ähnlich der folgenden angezeigt, wenn Sie eine Verbindung zu Ihrer RDS-for-PostgreSQL-Instance herstellen:

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

Alle Nicht-SSL-Verbindungen werden mit der folgenden Meldung abgelehnt:

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

War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?