Включение SSL для безопасных соединений
На этом шаге мы будем включать SSL (Secure Sockets Layer) для безопасных соединений с вашим сервером MySQL. SSL шифрует данные, передаваемые между клиентом и сервером, защищая их от прослушивания и подмены.
Сначала нам нужно сгенерировать SSL-сертификаты и ключи. Для этого мы будем использовать командную строку openssl
.
Откройте терминал в виртуальной машине LabEx. Каталог по умолчанию - ~/project
.
Мы создадим каталог для хранения SSL-сертификатов и ключей. Выполните следующую команду:
mkdir ssl
cd ssl
Теперь давайте сгенерируем серверный ключ:
sudo openssl genrsa 2048 > server-key.pem
Далее сгенерируем запрос на подпись сертификата (CSR):
sudo openssl req -new -key server-key.pem -out server-req.pem
Вам будет предложено ввести информацию, такую как название страны, штат, город, название организации и т.д. Вы можете ввести соответствующие значения или оставить их пустыми. Для "Common Name" введите localhost
или имя хоста/IP-адрес сервера.
Теперь подпишем запрос на сертификат, чтобы создать SSL-сертификат:
sudo openssl x509 -days 365 -in server-req.pem -signkey server-key.pem -out server-cert.pem
Эта команда создает самоподписанный сертификат, действительный в течение 365 дней.
Далее сгенерируем клиентский ключ:
sudo openssl genrsa 2048 > client-key.pem
Сгенерируем запрос на подпись клиентского сертификата (CSR):
sudo openssl req -new -key client-key.pem -out client-req.pem
Вам будет предложено ввести информацию, аналогичную запросу на подпись сертификата сервера.
Теперь подпишем запрос на клиентский сертификат:
sudo openssl x509 -days 365 -in client-req.pem -signkey client-key.pem -out client-cert.pem
Наконец, сгенерируем ключ и сертификат центра сертификации (CA):
sudo openssl genrsa 2048 > ca-key.pem
sudo openssl req -new -x509 -days 365 -key ca-key.pem -out ca-cert.pem
Теперь у нас есть следующие файлы в каталоге ~/project/ssl
:
server-key.pem
server-cert.pem
client-key.pem
client-cert.pem
ca-key.pem
ca-cert.pem
Далее нам нужно настроить MySQL для использования этих SSL-сертификатов.
Отредактируйте файл конфигурации MySQL. Его расположение может отличаться в зависимости от вашей установки MySQL, но обычно он находится по адресу /etc/mysql/my.cnf
или /etc/my.cnf
. Поскольку мы находимся в контейнере Docker, мы создадим файл my.cnf
в ~/project
и смонтируем его в контейнер.
Создайте файл с именем my.cnf
в каталоге ~/project
:
cd ~/project
nano my.cnf
Добавьте следующие строки в файл my.cnf
:
[mysqld]
ssl-cert=/var/lib/mysql/ssl/server-cert.pem
ssl-key=/var/lib/mysql/ssl/server-key.pem
ssl-ca=/var/lib/mysql/ssl/ca-cert.pem
require_secure_transport=ON
Важно: Пути в файле my.cnf
относятся к контейнеру MySQL. Мы должны скопировать сертификаты в правильное место внутри контейнера. Поскольку мы не можем напрямую получить доступ к файловой системе контейнера, мы пропустим этот шаг в рамках этого лабораторного занятия. Параметр require_secure_transport=ON
заставляет все соединения использовать SSL.
Теперь давайте перезапустим сервер MySQL. Поскольку мы не можем использовать systemctl
, мы пропустим шаг перезапуска в рамках этого лабораторного занятия. В реальной ситуации вам нужно будет перезапустить сервер MySQL, чтобы изменения вступили в силу.
Наконец, давайте подключимся к серверу MySQL с использованием SSL.
mysql --ssl-ca=~/project/ssl/ca-cert.pem --ssl-cert=~/project/ssl/client-cert.pem --ssl-key=~/project/ssl/client-key.pem -u root -p
Введите пароль пользователя root при запросе.
Чтобы проверить, что соединение использует SSL, выполните следующую SQL-команду:
SHOW STATUS LIKE 'Ssl_cipher';
Если в столбце Value
отображается шифр, значит, соединение использует SSL.
+---------------+-----------------------+
| Variable_name | Value |
+---------------+-----------------------+
| Ssl_cipher | TLS_AES_256_GCM_SHA384 |
+---------------+-----------------------+
1 row in set (0.00 sec)
Если столбец Value
пуст, значит, соединение не использует SSL.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Ssl_cipher | |
+---------------+-------+
1 row in set (0.00 sec)