Przewodnik po szyfrowaniu MySQL w przepisach tranzytowych i obowiązkowych szyfrowania

Przewodnik po szyfrowaniu MySQL w przepisach tranzytowych i obowiązkowych szyfrowania
Domyślnie transmisja danych MySQL między klientem a serwerem odbywa się bez szyfrowania. Niezasifrowana transmisja danych jest dopuszczalna tylko wtedy, gdy klient i serwer znajdują się w tej samej sieci, która zapewnia bezpieczeństwo. Jednak dane są narażone na potencjalne ryzyko, jeśli obie strony są w osobnej sieci. Brak szyfrowania wprowadza poważne ryzyko przechwytywania danych przez atak Man-in-the-Middle (MITM).

Aby przezwyciężyć to ryzyko, MySQL obsługuje szyfrowanie w tranzycie między klientem a serwerem za pośrednictwem protokołu TLS/SSL. Artykuł koncentruje się na ręcznej generowaniu certyfikatów SSL i plików kluczy w MySQL, aby skonfigurować SSL. Później artykuł koncentruje się również na umożliwieniu obowiązkowych wymogów szyfrowania od klientów.

Rozpoczęcie pracy

Wersje Mysql 5.7.28+ zapewnia poręczne narzędzie znane jako MySQL_SSL_RSA_SETUP, które polega na binariach OpenSSL w celu automatycznego generowania wymaganych certyfikatów i kluczy SSL do obsługi bezpiecznego połączenia.

Dlatego przed rozpoczęciem sprawdź domyślny status połączenia SSL serwera MySQL. Wpisz następujące polecenie, aby zweryfikować wartość sesji SSL:

MySQL> Pokaż globalne zmienne, takie jak „%SSL%”;
+---------------+-----------------+
|. Zmienna_nazwa | Wartość |
+---------------+-----------------+
|. have_openssl | Niepełnosprawne |
|. have_ssl | Niepełnosprawne |
|. SSL_CA | |
|. SSL_CAPATH | |
|. SSL_CERT | |
|. ssl_cipher | |
|. SSL_CRL | |
|. ssl_crlpath | |
|. ssl_key | |
+---------------+-----------------+
9 wierszy w zestawie (0.53 sekundy)

Powyższe wyjście pokazuje, że MySQL nie obsługuje szyfrowania w tranzycie dla bieżącej sesji.

Użyj OpenSSL, aby utworzyć certyfikat SSL i klucze

Aby zapewnić szyfrowanie w tranzycie, MySQL wymaga certyfikatów po stronie klienta i serwera X509 podpisanych przez Urząd Świadectwa, aby potwierdzić własność domeny. Będziemy wygenerować samowystarczalne certyfikaty, a także certyfikaty serwera i klienta za pośrednictwem użyteczności linii poleceń OpenSSL. Jest to narzędzie biblioteki OpenSSL, które generuje prywatne klucze, tworzy żądania certyfikatu x509, podpisuje je jako CA i weryfikuje je.

Przed rozpoczęciem utwórz katalog do przechowywania wszystkich plików:

Ubuntu@ubuntu: ~ $ mkdir/var/lib/mysql/tranzyt
ubuntu@ubuntu: ~ $ cd/var/lib/mysql/tranzyt

Poniższy zestaw poleceń wygeneruje kilka monitów, które muszą mieć nieudczone odpowiedzi.

Urząd certyfikacyjny klucz i generowanie certyfikatów

Utworzenie certyfikatu samowystarczalnego wymaga certyfikatu certyfikatu (CA) za pośrednictwem pliku klucza prywatnego. Użyj polecenia OpenSSL, aby wygenerować klucz prywatny BITS RSA 2048 dla CA.

Ubuntu@ubuntu: ~ $ openssl genrsa 2048> ca-key.pem

Użyj powyższego klawisza z poleceniem OpenSSL REQ, aby wygenerować certyfikat dla własnego CA z wygaśnięciem 3000 dni.

Ubuntu@ubuntu: ~ $ openssl req -new -x509 -nodes -Days 3000 -key ca -key.pem -out ca.pem

Powyższe polecenia tworzą nowe pliki Ca-key.PEM i CA.PEM, aby podpisać się z certyfikatami X509 MySQL Server i klienta.

Wygeneruj klucz prywatny i certyfikat samozagłady dla MySQL Server

Użyj OpenSSL, aby wygenerować MySQL Server RSA i żądanie podpisywania certyfikatu (CSR):

Ubuntu@ubuntu: ~ $ openssl genrsa 2048> Key-key.pem
Ubuntu@ubuntu: ~ $ openssl req -new -key -key -key.pem -out server -req.pem

Teraz usuń hasło z klucza serwera:

Ubuntu@ubuntu: ~ $ openssl RSA -in Server -key.pem -out serwer -key.pem

Wygeneruj samowystarczalny certyfikat MySQL Server z żądania certyfikatu za pomocą klucza prywatnego i certyfikatu CA.

Ubuntu@ubuntu: ~ $ openssl x509 -req -in server -req.PEM -DAYS 3600 -CA CA.pem -cakey ca -key.PEM -SET_SERIAL 01 -OUT SERWER -CERT.pem

Teraz konfiguracja SSL dla MySQL nie wymaga CSR.

Wygeneruj klucz klienta i samowystarczalny certyfikat

Podobnie wygeneruj żądanie klucza i certyfikatu dla klienta.

Ubuntu@ubuntu: ~ $ openssl req -newkey rsa: 2048 -Days 3600 -nodes -keyout klienta.PEM -out klient -req.pem

Usuń hasło z klucza i wygeneruj certyfikat klienta z żądania certyfikatu za pomocą plików CA.

Ubuntu@ubuntu: ~ $ openssl rsa -in klient.pem -out klient.pem
Ubuntu@ubuntu: ~ $ openssl x509 -req -in klient -req.PEM -DAYS 365000 -CA CA.pem -cakey ca -key.PEM -SET_SERIAL 01 -OUT -CORT -CERT.pem

Serwer będzie akceptować tylko zdalne połączenia od klientów z tymi plikami.

Wreszcie, zweryfikuj certyfikaty klienta i serwera pod względem certyfikatu CA.

Ubuntu@ubuntu: ~ $ openSsl Verify -Cafile ca.PEM Server-CERT.PEM Client-CERT.pem
CERT SERWER.PEM: OK
CERT-CERT.PEM: OK

Wartość OK wskazuje, że certyfikaty zostały poprawnie wygenerowane i są gotowe do użycia.

Konfigurowanie serwera MySQL

Aby włączyć usługę TLS/SSL dla MySQL Server wymaga ustawienia wielu zmiennych systemowych w głównym pliku konfiguracyjnym MySQL Mysqld.conf, Jak na przykład:

  • Używać SSL_CERT I SSL_KEY Aby ustawić ścieżkę do certyfikatu serwera i klucza prywatnego.
  • Użyj SSL_CA zmienna do ustawienia ścieżki na certyfikat CA po stronie serwera.

Użyj swojego ulubionego edytora, aby edytować plik konfiguracyjny znajdujący się w środku /etc/mysql/mysql.conf.D informator.

Ubuntu@ubuntu: ~ $ vim/etc/mysql/mysql.conf.D/Mysqld.CNF
[Mysqld]
ssl_ca =/var/lib/mysql/new_certs/ca.pem
SSL_CERT =/var/lib/mysql/new_certs/Server-Cert.pem
ssl_key =/var/lib/mysql/new_certs/server-key.pem

Wreszcie, zmień klucze SSL i własność certyfikatów oraz uprawnienia.

Ubuntu@ubuntu: ~ $ chown -r mysql: mysql/var/lib/mysql/new_certs/
Ubuntu@ubuntu: ~ $ chmod 600 Key-Key.Key serwera PEM.pem ca-key.pem

Uruchom ponownie bazę danych, aby załadować ostatnie zmiany.

Ubuntu@ubuntu: ~ $ sudo service mysql restart

Zaloguj się do serwera po ponownym uruchomieniu i sprawdź bieżący status sesji MySQL SSL.

Konfiguracja po stronie klienta

Ustanowienie bezpiecznego zdalnego połączenia od klienta wymaga przeniesienia wynikających wynikających z wyżej plików certyfikatu OpenSSL po stronie klienta. Utwórz nowy katalog i użyj narzędzia SCP do bezpiecznego przesyłania plików.

Ubuntu@ubuntu: ~ $ mkdir ~/client-cert
Ubuntu@ubuntu: ~ $ scp użytkownik@[ip_address]:/var/lib/mysql/tranzyt/ca-cert.PEM ~/Client-CERT/
Ubuntu@ubuntu: ~ $ scp użytkownik@[ip_address]:/var/lib/mysql/tranzyt/client-cert.PEM ~/Client-CERT/
ubuntu@ubuntu: ~ $ scp użytkownik@[ip_address]:/var/lib/mysql/tranzyt/client-key.PEM ~/Client-CERT/

Podczas ustanawiania zaszyfrowanego zdalnego połączenia klient wymaga teraz dodania opcji po stronie klienta, które weryfikują klucze i certyfikaty po stronie klienta. Dołączone opcje są podobne do zmiennych systemowych po stronie serwera, ale, -Key SSL I -SSL-CERT Opcje identyfikują ścieżki do klucza prywatnego klienta i certyfikatu. Użyj -SSL-CA Opcja dodania ścieżki do certyfikatu CA. Ten plik musi być taki sam jak certyfikat CA po stronie serwera.

Użyj poniższego polecenia ze wszystkimi wymaganymi opcjami, aby ustalić bezpieczne zdalne połączenie z serwerem bazy danych MySQL.

Ubuntu@ubuntu: ~ $ mysql -u użytkownik -p -h --SSL-CA = ~/Client-Cert/Ca.PEM--SSL-CERT = ~/Client-Cert/Client-CERT.PEM--SSL-key = pod ~/klienta-CERT/KLEY.pem

Skonfiguruj obowiązkowe zaszyfrowane połączenia

W przypadku niektórych serwerów MySQL klient nie jest wymagany, aby klient łączył się z serwerem za pomocą zaszyfrowanego połączenia, ale jest obowiązkowe. MySQL pozwala administratorowi serwera skonfigurować obowiązkowe połączenia zaszyfrowane. Jest to możliwe, umieszczając trzy różne poziomy kontroli:

  • Skonfiguruj MySQL, który wymaga od klienta dostępu do bazy danych tylko za pomocą zaszyfrowanego połączenia.
  • Wywołuj programy klientów, aby potrzebować zaszyfrowanego połączenia, nawet jeśli MySQL pozwala, ale niekoniecznie wymaga tego.
  • Skonfiguruj określone konta użytkowników, aby uzyskać dostęp do bazy danych tylko nad szyfrowanym kanałem.

Podajmy każdy z nich:

wymaga_secure_transport

Aby zapewnić klientom za pomocą zaszyfrowanego połączenia, włącz wymaga_secure_transport Zmienna w pliku konfiguracyjnym MySQL znajdującej się w/etc/mysql/mysql.CNF.Direkt D:

Ubuntu@ubuntu: ~ $ sudo vim/etc/mysql/mysql.conf.D/Mysqld.CNF
[Mysqld]
wymaga_secure_transport = ON

Powyższa zmienna systemowa zapewnia, że ​​klient używa bezpiecznego transportu do łączenia się z serwerem, a serwer pozwala tylko na połączenia TCP za pośrednictwem SSL. Stąd serwer odrzuca każde żądanie połączenia klienta bez bezpiecznego transportu i zwraca błąd wyjściowy ER_Secure_Transport_Requed do programu klienta.

Ponadto powyższa konfiguracja serwera wyłącza również zdalne połączenie klienta z serwerem -SSL-Mode = wyłączony strunowy.

Wywołujący program klienta

Ten poziom kontroli umożliwia wywołanie programu klienta w celu skonfigurowania bezpiecznej zaszyfrowanej komunikacji, niezależnie od ustawień serwera. To znaczy, nawet jeśli serwer nie jest skonfigurowany do obowiązkowego ustanowienia transportu SSL/TLS, jest w stanie utrzymać bezpieczne połączenie z pragnieniem klienta.

Jest to możliwe dzięki użyciu -tryb SSL Opcja dostępna w MySQL 5.7.11 wraz z różnymi wartościami. Pomocne jest określenie pożądanego stanu bezpieczeństwa połączenia klienta z serwerem. Wartości opcji są stosowane w zależności od rosnącego poziomu surowości.

  • WYŁĄCZONY: wartość ustaliła niepewne połączenie.
  • Preferowane: Tryb jest podobny do tego, gdy nie jest określona taka opcja -SSL -tryb. Ustanawia szyfrowanie tylko wtedy, gdy serwer obsługuje go inaczej, spada do domyślnego połączenia niezaszyfrowanego.
  • WYMAGANY: Wartość zapewnia zaszyfrowaną komunikację, jeśli serwer jest włączony do obsługi. Klient nie udaje próby połączenia, jeśli MySQL nie obsługuje TLS/SSL.
  • Verify_ca: wartość funkcjonuje podobna do WYMAGANY, Ale ponadto weryfikuje również certyfikat CA serwera. Klient nie łączy się w przypadku żadnych ważnych certyfikatów pasujących.
  • Verify_Identity: podobny do Verify_ca, Ale w przypadku wersji 1 Openssl 1.0.2+, klienci mogą również zweryfikować nazwę hosta, której używają do łączenia z tożsamością w certyfikatie serwera. Połączenie pęknie w przypadku niedopasowania.

Należy jednak zauważyć, że weryfikacja nazwy hosta nie działa w przypadku certyfikatów z podpisem własnym. Obejmują one automatycznie wygenerowane certyfikaty przez serwer lub ręcznie utworzone za pomocą narzędzia MySQL_SSL_RSA_SETUP.

Oprócz domyślnego szyfrowania, MySQL pozwala klientowi podać dodatkowe ustawienia zabezpieczeń poprzez dostarczanie certyfikatu CA, tak samo jak serwer, i włączając weryfikację tożsamości nazwy hosta. Ustawienia te pozwalają obu stronom zaufać wspólnej jednostce, a klient może sprawdzić, czy łączy się on z właściwym hostem.

Rozumiemy teraz, w jaki sposób powyższy tryb oddziałuje z opcjami certyfikatu CA:

  • Podaj certyfikat CA z opcją -ssl -CA z -ssl -mode = Verify_CA.
  • Włącz weryfikację tożsamości nazwy hosta za pomocą -ssl -mode = verify_identity
  • Wartość w trybie -SSL inna niż Verify_Identity lub Verify_CA z -ssl-CA wygeneruje ostrzeżenie stwierdzające nieprzekraczanie certyfikatu serwera.

Skonfiguruj konta użytkowników

Aby włączyć zaszyfrowaną komunikację przez klienta, skonfiguruj konkretne konto użytkownika, aby uzyskać dostęp do serwera MySQL przez SSL. Utwórz konto użytkownika STWÓRZ UŻYTKOWNIKA z WYMAGAĆ Oświadczenie o klauzuli. Lub użyj Zmień użytkownika Instrukcja, aby dodać klauzulę wymagań. Ta kontrola kończy próby połączenia klienta do serwera, jeśli nie obsługuje zaszyfrowanego połączenia.

Klauzula wymaga pomocy w wykonaniu konfiguracji związanej z szyfrowaniem, która wymusza ścisłe wymagania bezpieczeństwa. Umożliwia określenie jednego lub więcej niż jednego tls_option wartość.

Przejdźmy do szczegółów wymaganych opcji poleceń od klientów skonfigurowanych z różnymi wartościami wymagającymi:

NIC: nie wymaga połączenia SSL
SSL: Serwer zezwala tylko na zaszyfrowane połączenie z kont z obsługą SSL.
X509: wymaga od klienta przedstawienia klucza prywatnego i certyfikatu. Ta wartość nie wymaga potrzeby pokazania certyfikatu CA, przedmiotu i emitenta.

Klauzula określa wymagane charakterystyki szyfrowania, tak że nie ma potrzeby uwzględnienia opcji SSL.

mysql> Utwórz użytkownika „użytkownik”@„localHost” wymaga x509;

Teraz klient musi określić opcje -ssl -key i -ssl -certy, a -SSL -CA nie jest konieczne (dotyczy to również dla emitent I temat wartości).

Ubuntu@ubuntu: ~ $ mysql -u użytkownik -p -h --SSL-CERT = Client-CERT.PEM--SSL-KEY = KLEY CLIENT.pem

EMITENT: Konto utworzone z instrukcją wymagającej emitenta wymaga, aby klient określi opcje -ssl -key i -ssl -cert z ważnym certyfikatem wydanym przez emitenta CA „emitenta”. Utwórz konto użytkownika w następujący sposób:

mysql> Utwórz użytkownika „użytkownik”@„localHost” wymagają emitenta ”/c = se/st = sztokholm/l = sztokholm/o = mysql/cn = ca/e -mailAddress = ca@przykład.com ';

Jeśli certyfikat jest ważny w przypadku innego emitenta, próba połączenia się nie powiedzie.

TEMAT: wymagać od klienta przedstawienia certyfikatu temat Wartość podana podczas tworzenia konta. Połączenie z prawidłowym certyfikatem, ale inny przedmiot wynika z rozwiązania połączeń.

MySQL> Utwórz użytkownika „użytkownik”@„localHost” wymaga tematu ”/c = se/st = sztokholm/l = sztokholm/o = mysql demo certyfikat klienta/cn = client/e -mailAddress = klient@przykł[email protected] ';

SZYFR: Konto utworzone z instrukcją wymaga, aby klient uwzględnił metodę szyfru używaną do szyfrowania komunikacji. Konieczne jest upewnienie się, czy szyfry i kluczowe długości są wystarczająco silne.

MySQL> Utwórz użytkownika „użytkownik”@„localHost” wymagają szyfru ”EDH-RSA-DES-CBC3-SHA ';

Wniosek

Artykuł ilustruje, jak zabezpieczyć komunikację między MySQL Server a klientami, włączając protokół SSL. Uczymy się tworzyć ręczny certyfikat z podpisem, gdy ufamy hosta w sieci. Stosujemy również szyfrowanie w tranzycie do komunikacji MySQL Server poza siecią i uczymy się, jak konfigurować serwer dla obowiązkowych wymagań dotyczących szyfrowania.