Home » Настройка SSL/TLS для MySQL на Ubuntu 24.04
Настройка SSL/TLS для MySQL на Ubuntu 24.04

Настройка SSL/TLS для MySQL на Ubuntu 24.04

В этой статье разберёмся, как настроить SSL/TLS для MySQL на Ubuntu 24.04 — быстро, понятно и с примерами из жизни. Если ты когда-нибудь задумывался, почему твои данные между приложением и базой должны быть защищены, или просто хочешь перестать видеть ворнинги про небезопасное соединение, ты по адресу. SSL/TLS — это не только про галочку в чек-листе безопасности, но и про реальную защиту от перехвата данных, MITM-атак и прочих радостей жизни админа. Здесь будет всё: как это работает, как не сломать себе мозг при настройке, какие грабли встречаются, и как их обойти. Погнали!

Как это работает? Простыми словами о SSL/TLS в MySQL

Когда ты подключаешься к MySQL, по умолчанию все данные летят в открытом виде. Это ок, если у тебя всё на одном сервере и никто не шарится по внутренней сети. Но если база и приложение на разных машинах, или ты работаешь в облаке — привет, sniffing, MITM и прочие ужасы. SSL/TLS — это тот самый криптококтейль, который шифрует трафик между клиентом и сервером. Сервер MySQL может быть настроен так, чтобы принимать только защищённые соединения, а клиент — чтобы проверять подлинность сервера (и даже себя, если надо).

  • SSL (Secure Sockets Layer) — старый стандарт, ныне вытеснен TLS.
  • TLS (Transport Layer Security) — современный протокол, который реально используется.
  • В MySQL всё это называется просто “SSL”, но под капотом — TLS.

Вся магия строится на сертификатах: серверу нужен свой сертификат и приватный ключ, а клиенту — корневой сертификат (или свой, если нужна двухсторонняя аутентификация). Сертификаты можно выпустить самому (self-signed) или получить у CA (Certificate Authority). Для тестов и внутренней кухни обычно хватает самоподписанных.

Как быстро и просто всё настроить?

Давай по шагам, без воды. Всё покажу на Ubuntu 24.04 и MySQL 8.0+ (актуально и для MariaDB, но нюансы есть).

  1. Генерируем сертификаты — можно через openssl или встроенные утилиты MySQL.
  2. Настраиваем сервер — прописываем пути к сертификатам в my.cnf.
  3. Перезапускаем MySQL — проверяем, что SSL работает.
  4. Настраиваем клиентов — указываем параметры подключения с SSL.
  5. Тестируем — убеждаемся, что соединение реально защищено.

1. Генерация сертификатов

MySQL умеет сам генерировать тестовые сертификаты командой:


sudo mysql_ssl_rsa_setup --uid=mysql

Но если хочется кастомизации или доверия, лучше использовать openssl:


# Создаём CA (корневой сертификат)
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca.pem

# Сертификат сервера
openssl req -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem -out server-req.pem
openssl x509 -req -in server-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

# Сертификат клиента (по желанию)
openssl req -newkey rsa:2048 -days 3650 -nodes -keyout client-key.pem -out client-req.pem
openssl x509 -req -in client-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

Права на ключи должны быть строгими:


chown mysql:mysql *.pem
chmod 600 *-key.pem

2. Настройка MySQL

Открываем /etc/mysql/mysql.conf.d/mysqld.cnf (или /etc/mysql/my.cnf — зависит от сборки) и добавляем:


[mysqld]
ssl-ca=/etc/mysql/ssl/ca.pem
ssl-cert=/etc/mysql/ssl/server-cert.pem
ssl-key=/etc/mysql/ssl/server-key.pem
# Можно добавить:
require_secure_transport = ON

Перемещаем сертификаты в /etc/mysql/ssl/ (создай папку, если нет):


sudo mkdir /etc/mysql/ssl
sudo cp *.pem /etc/mysql/ssl/
sudo chown mysql:mysql /etc/mysql/ssl/*.pem
sudo chmod 600 /etc/mysql/ssl/*-key.pem

Перезапускаем MySQL:


sudo systemctl restart mysql

3. Проверка статуса SSL

Заходим в MySQL:


mysql -u root -p

И смотрим:


SHOW VARIABLES LIKE '%ssl%';
SHOW STATUS LIKE 'Ssl_cipher';

Если всё ок, увидишь, что SSL включён, а Ssl_cipher не пустой при подключении с SSL.

4. Настройка клиента

Для подключения с SSL (например, с другого сервера):


mysql -h your.mysql.host -u user -p \
--ssl-ca=/etc/mysql/ssl/ca.pem \
--ssl-cert=/etc/mysql/ssl/client-cert.pem \
--ssl-key=/etc/mysql/ssl/client-key.pem

Если клиенту не нужен свой сертификат, достаточно --ssl-ca.

5. Принудительное использование SSL для пользователей

Можно заставить MySQL принимать только SSL-подключения для определённых пользователей:


ALTER USER 'user'@'%' REQUIRE SSL;

Или даже REQUIRE X509 — если хочешь, чтобы клиент предъявлял свой сертификат.

Примеры, схемы, практические советы

Кейс Что будет Рекомендация
Всё на одном сервере, SSL не включён Данные не шифруются, но риск минимален Можно не париться, но для параноиков — включить SSL
База и приложение на разных VPS, без SSL Данные могут быть перехвачены в сети Обязательно включить SSL/TLS
Используешь публичный CA (Let’s Encrypt) Клиенты доверяют сертификату “из коробки” Хорошо для продакшена, но обновлять сертификаты придётся чаще
Самоподписанные сертификаты Безопасно, но клиенты должны явно доверять CA Ок для внутренней инфраструктуры
Забыл прописать ssl-key или ssl-cert MySQL стартует без SSL, соединения не защищены Проверяй SHOW VARIABLES LIKE '%ssl%' после запуска

Похожие решения, программы и утилиты

  • MariaDB — почти идентичная настройка, но свои нюансы в конфиге (официальная дока).
  • Percona Server — расширенные опции для безопасности, поддержка новых алгоритмов (официальная дока).
  • ProxySQL — умеет проксировать MySQL с SSL и без, можно гибко рулить политиками (официальная дока).
  • MySQL Workbench — графический клиент, поддерживает SSL-подключения.
  • Vault, HashiCorp — автоматизация выдачи и ротации сертификатов (официальный сайт).

Статистика и сравнение с другими решениями

  • По данным MySQL, с версии 5.7 SSL включён по умолчанию, но не всегда с реальными сертификатами.
  • В MariaDB SSL/TLS работает аналогично, но есть поддержка ed25519 сертификатов.
  • В PostgreSQL SSL/TLS включается похожим образом, но требует отдельной настройки (официальная дока).
  • MongoDB требует SSL для production, иначе ругается на старте.
СУБД SSL/TLS по умолчанию Генерация сертификатов Особенности
MySQL Да (с 5.7+) mysql_ssl_rsa_setup, openssl Требует явной настройки для production
MariaDB Да mariadb-install-db, openssl Поддержка новых алгоритмов
PostgreSQL Нет openssl Требует ручной настройки
MongoDB Нет openssl Без SSL не стартует в production

Интересные факты и нестандартные способы использования

  • Можно использовать сертификаты Let’s Encrypt для MySQL, если база доступна по домену. Просто автоматизируй обновление (certbot + cron).
  • Скрипты на bash/python легко автоматизируют ротацию сертификатов и перезапуск MySQL.
  • Можно настроить двухфакторную аутентификацию: пароль + клиентский сертификат (REQUIRE X509).
  • С помощью ProxySQL можно принимать соединения без SSL и проксировать их на MySQL с SSL — удобно для миграций.
  • В MySQL 8.0+ можно использовать переменные tls_version для ограничения только на TLS 1.2/1.3.

Новые возможности и автоматизация

  • Скрипты для автоматической генерации и обновления сертификатов (bash, ansible, puppet, chef).
  • Мониторинг SSL-соединений через SHOW STATUS и алерты при попытках незащищённых подключений.
  • CI/CD пайплайны, которые автоматически деплоят новые сертификаты на все базы.
  • Интеграция с Vault для динамической выдачи сертификатов клиентам и серверам.
  • Возможность быстро масштабировать инфраструктуру без страха, что кто-то перехватит данные между нодами.

Выводы и рекомендации

Настройка SSL/TLS для MySQL на Ubuntu 24.04 — это не только про безопасность, но и про уверенность в завтрашнем дне. Даже если у тебя всё на одной машине, лучше привыкать делать всё по уму — пригодится, когда придёт время масштабироваться или мигрировать в облако. Не забывай про автоматизацию: скрипты, ansible, certbot — твои лучшие друзья. Если хочешь не только безопасную, но и гибкую инфраструктуру — используй ProxySQL, интегрируйся с Vault, следи за обновлениями TLS. И помни: лучше потратить час на настройку, чем потом неделями разбираться с утечкой данных.

  • Для тестов и внутренней кухни — самоподписанные сертификаты, строгие права на ключи.
  • Для продакшена — публичный CA или автоматизация через Let’s Encrypt.
  • Обязательно проверяй статус SSL после запуска и не ленись читать логи.
  • Автоматизируй всё, что можно автоматизировать.
  • Если нужен VPS для экспериментов — заказать VPS.
  • Для серьёзных задач — выделенный сервер.

Официальные ресурсы для погружения:

Если остались вопросы — пиши в комменты, делись своими кейсами и не забывай делать бэкапы!


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

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

Leave a reply

Your email address will not be published. Required fields are marked