Настройка SSL/TLS на MySQL. Использования зашифрованного соединения. Часть 1
Коллеги всем привет.
В сегодняшней статье мы поговорим о том как сделать так, чтобы наше соединения с базой данных Mysql было надежным. При незашифрованном соединении между клиентом и сервером есть опасность в том что кто-то сможет отслеживать весь ваш трафик и проверять данные, отправляемые или получаемые между клиентом и сервером. Mysql поддерживает зашифрованные соединения между клиентами и сервером с использованием протокола TLS (Transport Layer Security). TLS включает алгоритмы, обеспечивающие проверку подлинности с использованием стандарта X.509.
Содержимое статьи:
- Проверка, что SSL включен.
- Проверка поддерживаемых протоколов TLS.
- SSL сертификат по умолчанию.
- Описания ключей.
- Заставить пользователей подключатся по зашифрованному каналу.
- Авторизация по SSL сертификату.
- Как узнать что я подключился по зашифрованному каналу.
- Итоги.
1. Проверка что SSL включен.
Первым делом нам нужно проверить включен ли SSL на базе данных. Для проверки воспользуемся командой:
mysql> SHOW VARIABLES LIKE '%have_%';
Переменные которые отвечают за включения 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';
Как видим моя СУБД версии 8.0.29 поддерживает протоколы шифрования TLSv1.2,TLSv1.3
Можно явно указать СУБД какую версию протокола шифрования нужно использовать, для этого нужно в конфигурационный файл добавить параметр:
[mysqld]
tls_version=TLSv1.2,TLSv1.3
3. SSL сертификат по умолчанию.
Когда вы только устанавливаете СУБД на сервер, то сама СУБД уже самостоятельно создаст первый сертификат и положит его в директорию где у вас лежат все файлы базы данных (datadir).
Можно еще проверить через консоль базы данных как называются ваши ключи.
mysql> SHOW VARIABLES LIKE '%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
7. Как узнать что я подключился по зашифрованному каналу.
У вас есть два варианта проверок того что вы действительно подключились по зашифрованному каналу.
Первый это когда вы только подключились к базе данных и у вас появится сообщение приветствия.
Второй вариант это в той же сессии выполнить запрос:
mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher_list'\G;
или
mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher';
Если значения переменной не пустое, то значит что вы подключились по зашифрованному каналу.
8. Итоги.
В итоги коллеги мы сегодня рассмотрели как настроить защищенное подключение к базе данных на основе SSL сертификатов. В следующей статье на эту тему я вам расскажу как создавать новые сертификаты и как узнать когда срок действия сертификата заканчивается.
Всем спасибо, я надеюсь что вам моя статья хоть чем-то помогла.