Szukaj…


Instalator dla systemów opartych na Debianie

(Zakłada się, że MySQL został zainstalowany i że używane jest sudo ).

Generowanie kluczy CA i SSL

Upewnij się, że OpenSSL i biblioteki są zainstalowane:

apt-get -y install openssl
apt-get -y install libssl-dev

Następnie zrób i wprowadź katalog dla plików SSL:

mkdir /home/ubuntu/mysqlcerts
cd /home/ubuntu/mysqlcerts

Aby wygenerować klucze, utwórz urząd certyfikacji (CA), aby podpisać klucze (samopodpisane):

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem

Wartości wprowadzone przy każdym monicie nie wpłyną na konfigurację. Następnie utwórz klucz dla serwera i podpisz za pomocą urzędu certyfikacji sprzed:

openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem

openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

Następnie utwórz klucz dla klienta:

openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

Aby upewnić się, że wszystko zostało poprawnie skonfigurowane, sprawdź klucze:

openssl verify -CAfile ca.pem server-cert.pem client-cert.pem

Dodanie kluczy do MySQL

Otwórz plik konfiguracyjny MySQL . Na przykład:

vim /etc/mysql/mysql.conf.d/mysqld.cnf

W sekcji [mysqld] dodaj następujące opcje:

ssl-ca = /home/ubuntu/mysqlcerts/ca.pem
ssl-cert = /home/ubuntu/mysqlcerts/server-cert.pem
ssl-key = /home/ubuntu/mysqlcerts/server-key.pem

Uruchom ponownie MySQL. Na przykład:

service mysql restart

Przetestuj połączenie SSL

Połącz się w ten sam sposób, przekazując dodatkowe opcje ssl-ca , ssl-cert i ssl-key , używając wygenerowanego klucza klienta. Na przykład zakładając cd /home/ubuntu/mysqlcerts :

mysql --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -h 127.0.0.1 -u superman -p

Po zalogowaniu sprawdź, czy połączenie jest rzeczywiście bezpieczne:

[email protected] [None]> SHOW VARIABLES LIKE '%ssl%';
+---------------+-----------------------------------------+
| Variable_name | Value                                   |
+---------------+-----------------------------------------+
| have_openssl  | YES                                     |
| have_ssl      | YES                                     |
| ssl_ca        | /home/ubuntu/mysqlcerts/ca.pem          |
| ssl_capath    |                                         |
| ssl_cert      | /home/ubuntu/mysqlcerts/server-cert.pem |
| ssl_cipher    |                                         |
| ssl_crl       |                                         |
| ssl_crlpath   |                                         |
| ssl_key       | /home/ubuntu/mysqlcerts/server-key.pem  |
+---------------+-----------------------------------------+

Możesz również sprawdzić:

[email protected] [None]> STATUS;
...
SSL:                    Cipher in use is DHE-RSA-AES256-SHA
...

Egzekwowanie protokołu SSL

Odbywa się to przez GRANT , przy użyciu REQUIRE SSL :

GRANT ALL PRIVILEGES ON *.* TO 'superman'@'127.0.0.1' IDENTIFIED BY 'pass' REQUIRE SSL;
FLUSH PRIVILEGES;

Teraz superman musi połączyć się przez SSL.

Jeśli nie chcesz zarządzać kluczami klienta, użyj wcześniejszego klucza klienta i automatycznie użyj go dla wszystkich klientów. Otwórz plik konfiguracyjny MySQL , na przykład:

vim /etc/mysql/mysql.conf.d/mysqld.cnf

W sekcji [client] dodaj następujące opcje:

ssl-ca = /home/ubuntu/mysqlcerts/ca.pem
ssl-cert = /home/ubuntu/mysqlcerts/client-cert.pem
ssl-key = /home/ubuntu/mysqlcerts/client-key.pem

Teraz superman musi tylko wpisać następujące dane, aby zalogować się przez SSL:

mysql -h 127.0.0.1 -u superman -p

Łączenie z innego programu, na przykład w Pythonie, zazwyczaj wymaga tylko dodatkowego parametru do funkcji connect. Przykład w języku Python:

import MySQLdb
ssl = {'cert': '/home/ubuntu/mysqlcerts/client-cert.pem', 'key': '/home/ubuntu/mysqlcerts/client-key.pem'}
conn = MySQLdb.connect(host='127.0.0.1', user='superman', passwd='imsoawesome', ssl=ssl)

Referencje i dalsza lektura:

Konfiguracja CentOS7 / RHEL7

W tym przykładzie założono dwa serwery:

  1. dbserver (gdzie mieszka nasza baza danych)
  2. appclient (gdzie mieszkają nasze aplikacje)

FWIW, oba serwery egzekwują SELinux.

Najpierw zaloguj się do dbserver

Utwórz katalog tymczasowy do tworzenia certyfikatów.

mkdir /root/certs/mysql/ && cd /root/certs/mysql/

Utwórz certyfikaty serwera

openssl genrsa 2048 > ca-key.pem
openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -sha1 -req -in server-req.pem -days 730  -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem

Przenieś certyfikaty serwera do / etc / pki / tls / certs / mysql /

Ścieżka katalogu zakłada CentOS lub RHEL (dostosuj odpowiednio do innych dystrybucji):

mkdir /etc/pki/tls/certs/mysql/

Pamiętaj, aby ustawić uprawnienia do folderu i plików. mysql potrzebuje pełnej własności i dostępu.

chown -R mysql:mysql /etc/pki/tls/certs/mysql

Teraz skonfiguruj MySQL / MariaDB

# vi /etc/my.cnf
# i
[mysqld]
bind-address=*
ssl-ca=/etc/pki/tls/certs/ca-cert.pem
ssl-cert=/etc/pki/tls/certs/server-cert.pem
ssl-key=/etc/pki/tls/certs/server-key.pem
# :wq 

Następnie

systemctl restart mariadb

Nie zapomnij otworzyć zapory sieciowej, aby zezwolić na połączenia od Appclient (przy użyciu IP 1.2.3.4)

firewall-cmd --zone=drop --permanent --add-rich-rule 'rule family="ipv4" source address="1.2.3.4" service name="mysql" accept'
# I force everything to the drop zone.  Season the above command to taste.

Teraz uruchom ponownie firewalld

service firewalld restart

Następnie zaloguj się do serwera mysql dbserver:

mysql -uroot -p 

Wykonaj następujące czynności, aby utworzyć użytkownika dla klienta. uwaga ZAPYTAJ SSL w instrukcji GRANT.

GRANT ALL PRIVILEGES ON *.* TO ‘iamsecure’@’appclient’ IDENTIFIED BY ‘dingdingding’ REQUIRE SSL;
FLUSH PRIVILEGES; 
# quit mysql

Nadal powinieneś znajdować się w katalogu / root / certs / mysql od pierwszego kroku. Jeśli nie, przejdź z powrotem do niego, aby uzyskać jedno z poniższych poleceń.

Utwórz certyfikaty klienta

openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem

Uwaga : Użyłem tej samej wspólnej nazwy dla certyfikatów serwera i klienta. YMMV.

Upewnij się, że nadal jesteś / root / certs / mysql / dla tego następnego polecenia

Połącz certyfikat serwera i klienta CA w jeden plik:

cat server-cert.pem client-cert.pem > ca.pem

Upewnij się, że widzisz dwa certyfikaty:

cat ca.pem 

KONIEC PRACY SERWERA NA TERAZ.

Otwórz inny terminal i

ssh appclient

Tak jak poprzednio, utwórz stały dom dla certyfikatów klienta

mkdir /etc/pki/tls/certs/mysql/

Teraz umieść certyfikaty klienta (utworzone na dbserver) na appclient. Możesz je zeskanować lub po prostu skopiować i wkleić pliki jeden po drugim.

scp dbserver
# copy files from dbserver to appclient
# exit scp

Ponownie pamiętaj o ustawieniu uprawnień do folderu i plików. mysql potrzebuje pełnej własności i dostępu.

chown -R mysql:mysql /etc/pki/tls/certs/mysql

Powinieneś mieć trzy pliki, każdy należący do użytkownika mysql:

/etc/pki/tls/certs/mysql/ca.pem
/etc/pki/tls/certs/mysql/client-cert.pem
/etc/pki/tls/certs/mysql/client-key.pem

Teraz edytuj konfigurację MariaDB / MySQL aplikacji w sekcji [client] .

vi /etc/my.cnf
# i
[client]
ssl-ca=/etc/pki/tls/certs/mysql/ca.pem
ssl-cert=/etc/pki/tls/certs/mysql/client-cert.pem
ssl-key=/etc/pki/tls/certs/mysql/client-key.pem
# :wq 

Uruchom ponownie usługę mariadb dla aplikacji:

systemctl restart mariadb

wciąż tutaj na kliencie

To powinno zwrócić: ssl TRUE

mysql --ssl --help

Teraz zaloguj się do instancji mysql appclient

mysql -uroot -p

Powinny zobaczyć TAK dla obu zmiennych poniżej

show variables LIKE '%ssl';
    have_openssl    YES
    have_ssl              YES

Początkowo widziałem

 have_openssl NO

Szybkie spojrzenie na mariadb.log ujawniło:

Błąd SSL: nie można uzyskać certyfikatu z „/etc/pki/tls/certs/mysql/client-cert.pem”

Problem polegał na tym, że klient root-cert.pem należący do roota i zawierający go folder. Rozwiązaniem było ustawienie własności / etc / pki / tls / certs / mysql / na mysql.

chown -R mysql:mysql /etc/pki/tls/certs/mysql

W razie potrzeby ponownie uruchom mariadb z kroku bezpośrednio powyżej

TERAZ JESTEŚMY GOTOWI DO SPRAWDZENIA BEZPIECZNEGO POŁĄCZENIA

Nadal jesteśmy tutaj w Appclient

Spróbuj połączyć się z instancją mysql dbserver przy użyciu konta utworzonego powyżej.

mysql -h dbserver -u iamsecure -p
# enter password dingdingding (hopefully you changed that to something else)

Przy odrobinie szczęścia powinieneś być zalogowany bez błędów.

Aby potwierdzić, że masz połączenie z włączoną obsługą SSL, wydaj następujące polecenie w wierszu polecenia MariaDB / MySQL:

\s 

To odwrotny ukośnik, aka status

To pokaże status twojego połączenia, które powinno wyglądać mniej więcej tak:

Connection id:        4
Current database:    
Current user:        iamsecure@appclient
SSL:            Cipher in use is DHE-RSA-AES256-GCM-SHA384
Current pager:        stdout
Using outfile:        ''
Using delimiter:    ;
Server:            MariaDB
Server version:        5.X.X-MariaDB MariaDB Server
Protocol version:    10
Connection:        dbserver via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:        3306
Uptime:            42 min 13 sec

Jeśli podczas próby połączenia wystąpią błędy odmowy uprawnień, sprawdź powyższą instrukcję GRANT, aby upewnić się, że nie ma żadnych zbłąkanych znaków lub znaków.

Jeśli masz błędy SSL, wróć do tego przewodnika, aby upewnić się, że kroki są uporządkowane.

To działało na RHEL7 i prawdopodobnie będzie działać również na CentOS7. Nie można potwierdzić, czy te dokładne kroki będą działać w innym miejscu.

Mam nadzieję, że pozwoli to zaoszczędzić komuś trochę czasu i pogorszenia.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow