Szyfrowanie SSL połączeń z bazą MySQL
Artykuł ten opisuje jak klient MySQL może utworzyć szyfrowane połączenie z bazą MzSQL. W domyślnej konfiguracji połączenie klienta nie jest szyfrowane, co w przypadku połączeń przez internet było niepożądane.
Szyfrowanie połączenia z bazą MySQL może być przeprowadzane w zależności od klienta, oznacza to, że możliwe są równocześnie połączenia szyfrowane jaki i nieszyfrowane. Szyfrowanie może zostać w poszczególnych połączeniach skonfigurowane jako obowiązkowe.
Aktywacja konfiguracji SSL
W konfiguracji MySQL (np. /etc/my.cnf
) musi zostać aktywowane SSL z przynależnymi certyfikatami.
ssl=1 ssl-ca=/etc/mysql/ca-cert.pem ssl-cert=/etc/mysql/server-cert.pem ssl-key=/etc/mysql/server-key.pem
Utworzenie certyfikatu SSL
Utworzone zostaną certyfikaty z 2048 bitami i ważnością 3650 dni. Po tym okresie certyfikaty muszą zostać przedłużone lub na nowo utworzone.
Ważnym podczas tworzenia jest, żeby Common Name (CN) certyfikatu klienta i serwera były różne. Np. server.thomas-krenn.com i client.thomas-krenn.com
cd /etc/mysql/ 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 rsa -in server-key.pem -out server-key.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 rsa -in client-key.pem -out client-key.pem openssl x509 -req -in client-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem chmod 400 /etc/mysql/*.pem
Następnie serwer musi zostać zrestartowany, aby konfiguracja stała się aktywna.
/etc/init.d/mysql restart
Teraz może zostać skontrolowane czy konfiguracja została przyjęta poprawnie.
mysql> show variables like '%ssl%'; +---------------+----------------------------------+ | Variable_name | Value | +---------------+----------------------------------+ | have_openssl | YES | | have_ssl | YES | | ssl_ca | /etc/mysql/ca-cert.pem | | ssl_capath | | | ssl_cert | /etc/mysql/server-cert.pem | | ssl_cipher | | | ssl_key | /etc/mysql/server-key.pem | +---------------+----------------------------------+
Utworzenie MySQL User z aktywnym szyfrowaniem SSL
Następnie zostaje utworzony user "ssluser", który posiada wszystkie uprawnienia (ALL PRIVILEGES) do wszystkich baz (*.*) na "localhost" i musi przedstawiać ważny certyfikat SSL klienta.
GRANT ALL PRIVILEGES ON *.* TO 'ssluser'@'localhost' IDENTIFIED BY 'topsecret' REQUIRE X509;
Oczywiście ograniczenie "localhost" nie ma w tym przypadku zbytnio sensu, gdyż szyfrowanie na tym samym serwerze nie jest konieczne. Zamiast "localhost" w praktyce podawany jest adres IP, z którego ma zostać utworzone szyfrowane połączenie.
Test połączenia SSL z MySQL
cd /etc/mysql/ mysql -u ssluser --ssl-ca=ca-cert.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem
Za pośrednictwem komendy SHOW STATUS LIKE 'Ssl_cipher';
może zostać wyświetlony status szyfrowania połączonych klientów MySQL.
mysql> SHOW STATUS LIKE 'Ssl_cipher'; +---------------+--------------------+ | Variable_name | Value | +---------------+--------------------+ | Ssl_cipher | DHE-RSA-AES256-SHA | +---------------+--------------------+ 1 row in set (0.00 sec)
Klucze SSL w przypadku połączenia z oddalonym hostem muszą najpierw zostać na niego skopiowane.