MySQL Verbindungen mit SSL verschlüsseln
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.
