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%”;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ż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:
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.
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:
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.