- Home »

Настройка 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, но нюансы есть).
- Генерируем сертификаты — можно через
openssl
или встроенные утилиты MySQL. - Настраиваем сервер — прописываем пути к сертификатам в
my.cnf
. - Перезапускаем MySQL — проверяем, что SSL работает.
- Настраиваем клиентов — указываем параметры подключения с SSL.
- Тестируем — убеждаемся, что соединение реально защищено.
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.
- Для серьёзных задач — выделенный сервер.
Официальные ресурсы для погружения:
Если остались вопросы — пиши в комменты, делись своими кейсами и не забывай делать бэкапы!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.