MySQL Verbindungen mit SSL verschlüsseln

Aus Wiki Thomas-Krenn.AG
Wechseln zu: Navigation, Suche

Dieser Artikel erklärt wie ein MySQL Client eine verschlüsselte Verbindung zu einem MySQL Server aufbauen kann. In der Standardkonfiguration ist eine Clientverbindung unverschlüsselt, was z.B. bei einer Verbindung über das Internet unerwünscht ist, da Daten am Weg abgehört werden könnten.

Die MySQL Verschlüsselung kann pro Client Verbindung separat erfolgen, d.h. es können gleichzeitig sowohl verschlüsselte als auch unverschlüsselte Verbindungen verwendet werden. Es kann für einzelne Verbindungen jedoch SSL auch als zwingend konfiguriert werden.

Inhaltsverzeichnis

SSL Konfiguration aktivieren

In der MySQL Konfiguration (z.B. /etc/my.cnf) muss SSL mit den zugehörigen Zertifikaten aktiviert werden.

ssl=1
ssl-ca=/etc/mysql-certs/ca-cert.pem
ssl-cert=/etc/mysql-certs/server-cert.pem
ssl-key=/etc/mysql-certs/server-key.pem

SSL Zertifikate erstellen

Es werden Zertifikate mit 2048 Bits und einer Gültigkeit von 3650 Tagen erstellt. Nach diesem Zeitraum müssen die Zertifikate verlängert oder neu erstellt werden.

Wichtig bei der Erstellung ist, dass der Common Name (CN) vom Client und Server Zertifikat unterschiedlich ist. z.B. server.thomas-krenn.com und client.thomas-krenn.com

mkdir /etc/mysql-certs
cd /etc/mysql-certs

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem

openssl req -newkey rsa:2048 -days 3560 -nodes -keyout server-key.pem > server-req.pem
openssl x509 -req -in server-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem

openssl req -newkey rsa:2048 -days 3650 -nodes -keyout client-key.pem > client-req.pem
openssl x509 -req -in client-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem

chown -R mysql:mysql /etc/mysql-certs
chmod 500 /etc/mysql-certs
chmod -R 400 /etc/mysql-certs/*

Danach muss der Server neu gestartet werden, damit die Konfiguration aktiviert wird.

/etc/init.d/mysql restart

Jetzt kann überprüft werden, ob die Konfiguration richtig übernommen wurde.

mysql> show variables like '%ssl%';
+---------------+----------------------------------+
| Variable_name | Value                            |
+---------------+----------------------------------+
| have_openssl  | YES                              |
| have_ssl      | YES                              |
| ssl_ca        | /etc/mysql-certs/ca-cert.pem     |
| ssl_capath    |                                  |
| ssl_cert      | /etc/mysql-certs/server-cert.pem |
| ssl_cipher    |                                  |
| ssl_key       | /etc/mysql-certs/server-key.pem  |
+---------------+----------------------------------+

MySQL User mit aktivierter SSL Verschlüsselung erstellen

Im Folgenden wird der User "ssluser" erstellt der alle Rechte (ALL PRIVILEGES) auf alle Datenbanken (*.*) am "localhost" hat und ein gültiges SSL Client Zertifikat vorweisen muss.

GRANT ALL PRIVILEGES ON *.* TO 'ssluser'@'localhost' IDENTIFIED BY 'topsecret' REQUIRE X509;

Natürlich macht die Limitierung auf "localhost" in diesem Fall wenig Sinn, da eine Verschlüsselung am selben Server nicht notwendig ist. Stattdessen sollte man statt "localhost" in der Praxis die IP eintragen, von der aus der Zugriff verschlüsselt erfolgen soll.

Verschlüsselte MySQL Verbindung testen

cd /etc/mysql-certs/
mysql -u ssluser --ssl-ca=ca-cert.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem

Mittels dem Befehl SHOW STATUS LIKE 'Ssl_cipher'; kann sich der Verschlüsselungsstatus des verbundenen MySQL Clients angezeigt werden lassen.

mysql> SHOW STATUS LIKE 'Ssl_cipher';
+---------------+--------------------+
| Variable_name | Value              |
+---------------+--------------------+
| Ssl_cipher    | DHE-RSA-AES256-SHA | 
+---------------+--------------------+
1 row in set (0.00 sec)

Die SSL Keys müssen wenn der Zugriff von einem entfernten Host aus erfolgen soll natürlich vorher dorthin kopiert werden.


Share/Save/Bookmark  Feedback zu diesem Artikel geben
Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Kategorien
Drucken/exportieren
Werkzeuge