Настройка SSL/TLS на MySQL. Использования зашифрованного соединения. Часть 1

Настройка SSL/TLS на MySQL. Использования зашифрованного соединения. Часть 1

Коллеги всем привет.

В сегодняшней статье мы поговорим о том как сделать так, чтобы наше соединения с базой данных Mysql было надежным. При незашифрованном соединении между клиентом и сервером есть опасность в том что кто-то сможет отслеживать весь ваш трафик и проверять данные, отправляемые или получаемые между клиентом и сервером. Mysql поддерживает зашифрованные соединения между клиентами и сервером с использованием протокола TLS (Transport Layer Security). TLS включает алгоритмы, обеспечивающие проверку подлинности с использованием стандарта X.509.

 

Содержимое статьи:

  1. Проверка, что SSL включен.
  2. Проверка поддерживаемых протоколов TLS.
  3. SSL сертификат по умолчанию.
  4. Описания ключей.
  5. Заставить пользователей подключатся по зашифрованному каналу.
  6. Авторизация по SSL сертификату.
  7. Как узнать что я подключился по зашифрованному каналу.
  8. Итоги.

 

1. Проверка что SSL включен.

Первым делом нам нужно проверить включен ли SSL на базе данных. Для проверки воспользуемся командой:

mysql> SHOW VARIABLES LIKE '%have_%';

mysql_enable_ssl

Переменные которые отвечают за включения ssl на базе данных называются:

  • have_openssl
  • have_ssl

Если значения YES значит включено. По умолчанию при установке СУБД уже SSL включен.


 

 2. Проверка поддерживаемых протоколов TLS.

СУБД Mysql может поддерживать множество протоколов шифрования. Например: TLSv1,TLSv1.1,TLSv1.2,TLSv1.3. Версия протокола шифрования будет зависеть от того какая версия пакета openssl установлена в системе. Версии протоколов TLSv1 и TLSv1.1 считаются устаревшие и не надежными, и в последних версиях баз данных они будут удалены. Чтобы была поддержка современных протоколов шифрования необходимо чтобы у вас пакет openssl был установлен не нижу версии openssl 1.1.1.

Чтобы проверить какие версии протокола шифрования на данный момент поддерживает моя СУБД воспользуюсь командой:

mysql> SHOW VARIABLES LIKE 'tls_version';

mysql_enable_ssl

Как видим моя СУБД версии 8.0.29 поддерживает протоколы шифрования TLSv1.2,TLSv1.3

 

Можно явно указать СУБД какую версию протокола шифрования нужно использовать, для этого нужно в конфигурационный файл добавить параметр:

[mysqld]
tls_version=TLSv1.2,TLSv1.3


 

3. SSL сертификат по умолчанию.

Когда вы только устанавливаете СУБД на сервер, то сама СУБД уже самостоятельно создаст первый сертификат и положит его в директорию где у вас лежат все файлы базы данных (datadir).

mysql_enable_ssl

 

Можно еще проверить через консоль базы данных как называются ваши ключи.

mysql> SHOW VARIABLES LIKE '%ssl%';

mysql_enable_ssl


 

4. Описания ключей.

  • ssl_ca - Путь к файлу сертификата центра сертификации.
  • ssl_cert - Путь к файлу сертификата открытого ключа.
  • ssl_key - Путь к файлу закрытого ключа.

Кстати открытый ключ можно кому-то передать чтобы у человека была возможность подключатся из клиентских приложений в базу данных.


 

5. Заставить пользователей подключатся по зашифрованному каналу.

Я уверен на 100% что никто из вас не знал что при соединении с базой данных сначала СУБД пытается соединиться с клиентом по зашифрованному каналу, а если не выходит подключиться то уже идет подключение по обычному каналу без шифрования. Так от чтобы, заставить клиентов подключатся всегда по зашифрованному каналу существует системная переменная под названием require_secure_transport. Давайте добавим её в конфигурационный файл.

[mysqld]
require_secure_transport = ON

Теперь нужно создать учетную запись у которой будет возможность подключатся только по зашифрованному соединении.

mysql> CREATE USER 'test_ssl'@'localhost' IDENTIFIED BY 'Jkjd#8sDF34' REQUIRE X509;

Как раз параметр REQUIRE X509 и указывает что при авторизации в базу данных требовать зашифрованное соединение и использование действительного сертификата X.509.

И теперь когда пользователь просто будет пытаться зайти в базу то он получит ошибку ERROR 1045 (28000).

Access denied for user 'test_ssl'@'localhost' (using password: YES)


 

6. Авторизация по SSL сертификату.

Всегда когда мы подключаемся к базе данных то мы используем команду mysql -u username -p после водим пароль от учетной записи и все, то теперь нужно указывать больше параметров.

$. mysql -u test_ssl -p --ssl-ca=/app/mysql/data/ca.pem --ssl-cert=/app/mysql/data/server-cert.pem --ssl-key=/app/mysql/data/server-key.pem

Описания ключей смотрите в 4 разделе.

Можно и обойтись без этим параметров при подключении к базе данных. Для этого нам нужно указать все параметры по ключам шифрованию в конфигурационный файл.

[mysqld]
ssl_ca=/app/mysql/data/ca.pem
ssl_cert=/app/mysql/data/server-cert.pem
ssl_key=/app/mysql/data/server-key.pem
require_secure_transport=ON

[client]
ssl_ca=/app/mysql/data/ca.pem
ssl_cert=/app/mysql/data/server-cert.pem
ssl_key=/app/mysql/data/server-key.pem

mysql_enable_ssl


 

7. Как узнать что я подключился по зашифрованному каналу.

У вас есть два варианта проверок того что вы действительно подключились по зашифрованному каналу.

Первый это когда вы только подключились к базе данных и у вас появится сообщение приветствия.

mysql_enable_ssl

 

Второй вариант это в той же сессии выполнить запрос:

mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher_list'\G;

или

mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher';

mysql_enable_ssl

Если значения переменной не пустое, то значит что вы подключились по зашифрованному каналу.


 

8. Итоги.

В итоги коллеги мы сегодня рассмотрели как настроить защищенное подключение к базе данных на основе SSL сертификатов. В следующей статье на эту тему я вам расскажу как создавать новые сертификаты и как узнать когда срок действия сертификата заканчивается.


 

Всем спасибо, я надеюсь что вам моя статья хоть чем-то помогла.

ПОХОЖИЕ СТАТЬИ

MySQL - Генерация тестовых данных
MySQL - Генерация тестовых данных
MYSQL
Читать далее
MySQL / MariaDB Как получить id последней вставленной записи в таблице - LAST_INSERT_ID
MySQL / MariaDB Как получить id последней вставленной записи в таблице - LAST_INSERT_ID
MYSQL
Читать далее
MySQL / MariaDB Как преобразовать регистр символов - Функции UPPER и LOWER
MySQL / MariaDB Как преобразовать регистр символов - Функции UPPER и LOWER
MYSQL
Читать далее