Szyfrowanie SSL połączeń z bazą MySQL

Z Thomas-Krenn-Wiki
Przejdź do nawigacji Przejdź do wyszukiwania

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.