MySQL 5.7: безопасная настройка SSL для удалённых подключений на CentOS 7
TL;DR
Кратко: установите MySQL 5.7 на CentOS 7, сгенерируйте собственные сертификаты CA/сервер/клиент через OpenSSL, укажите пути к ним в /etc/my.cnf, включите require_secure_transport и bind-address, создайте пользователя с REQUIRE X509 и протестируйте подключение по SSL. При необходимости используйте VPN или SSH-туннель как альтернативу.
Важно: сертификаты и приватные ключи должны храниться с правильными правами доступа (владелец mysql, права 600) и защищаться от доступа по сети и резервных копий.
MySQL — это свободная реляционная система управления базами данных, работающая под Windows, Linux, macOS и FreeBSD. Она широко используется в LAMP/LEMP стеках и поддерживает такие приложения, как WordPress, Joomla, TYPO3 и phpBB.
В этом подробном руководстве шаг за шагом показано, как настроить MySQL 5.7 на CentOS 7 для безопасных удалённых подключений через SSL, с использованием самоподписанного центра сертификации (CA), серверных и клиентских сертификатов. Опишу также альтернативы, рекомендации по безопасности, проверку и типичные сценарии отладки.
Что будет сделано
- Установка MySQL 5.7
- Настройка пароля root
- Генерация самоподписанных SSL-сертификатов (CA, сервер, клиент)
- Включение SSL в MySQL
- Включение удалённых подключений с требованием X509
- Тестирование подключений, отладка и рекомендации по безопасности
Требования
- Сервер с CentOS 7
- Права root
- Доступ к сети для установки пакетов (yum)
Пояснения и термины
- CA — центр сертификации, подписывает сертификаты клиента и сервера.
- Сертификат и ключ сервера — используются mysqld для шифрования входящих подключений.
- Сертификат и ключ клиента — предъявляются клиентом для аутентификации на сервере.
Шаг 1 — Установка MySQL
Мы будем использовать MySQL 5.7, устанавливая пакет из официального репозитория MySQL. Сначала добавьте репозиторий:
yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpmПодтвердите установку введением y и нажатием Enter. Затем установите сервер MySQL:
yum -y install mysql-community-serverЗапустите сервис и включите автостартап:
systemctl start mysqld
systemctl enable mysqldПроверьте, что MySQL слушает порт 3306 (пример):
netstat -plntu
Комментарий: MySQL создаёт временный пароль для root при первом старте — мы настроим постоянный пароль в следующем шаге.
Шаг 2 — Настройка пароля root
При первом запуске MySQL 5.7 генерирует временный пароль и записывает его в лог /var/log/mysqld.log. Найдите его командой:
grep 'temporary' /var/log/mysqld.logТипичный вывод будет содержать строку вида “A temporary password is generated for root@localhost: <пароль>”. Подключитесь к mysql с этим временным паролем:
mysql -u root -p
# Введите временный парольЗатем замените пароль root на более сложный и уникальный. В примере используется Hakase-labs123@:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Hakase-labs123@';
FLUSH PRIVILEGES;
EXIT;
Подключитесь снова, чтобы убедиться, что новый пароль работает:
mysql -u root -p
# Введите Hakase-labs123@Важно: используйте надёжный генератор паролей и храните пароли в защищённом менеджере.
Шаг 3 — Генерация самоподписанных сертификатов
MySQL уже содержит сертификаты по умолчанию в /var/lib/mysql, но для контроля и безопасности лучше создать собственные. Мы создадим три пары: CA, сервер (сертификат+ключ) и клиент (сертификат+ключ).
Создайте директорию для сертификатов и перейдите в неё:
mkdir -p /etc/certs
cd /etc/certsСоздайте CA (ca-key.pem и ca.pem):
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
Далее создайте серверный ключ и сертификат, удалив passphrase и подписав запрос CA:
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
Создайте клиентские ключ и сертификат аналогично:
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
Примечание: при создании запросов (CSR) указывайте отличающиеся поля Common Name (CN) для CA, сервера и клиента.
Проверьте сертификаты:
openssl verify -CAfile ca.pem server-cert.pem client-cert.pemЕсли ошибок нет, смените владельца директории и установите права на приватные ключи:
chown -R mysql:mysql /etc/certs/
chmod 600 client-key.pem server-key.pem ca-key.pemБезопасность: приватные ключи должны быть недоступны для других пользователей на системе. Резервные копии приватных ключей должны храниться отдельно и шифроваться.
Шаг 4 — Включение SSL в MySQL
Сначала сделаем резервную копию стандартных сертификатов MySQL в домашнюю папку:
mkdir -p ~/mysql-certs/
cd /var/lib/mysql/
mv ca.pem ca-key.pem ~/mysql-certs/
mv server-key.pem server-cert.pem ~/mysql-certs/
mv client-key.pem client-cert.pem ~/mysql-certs/
mv private_key.pem public_key.pem ~/mysql-certs/Перезапустите сервис mysqld:
systemctl restart mysqldПроверьте текущее состояние SSL из mysql-shell:
mysql -u root -p
# Введите Hakase-labs123@
SHOW GLOBAL VARIABLES LIKE '%ssl%';
STATUS;Вы увидите, что SSL может быть DISABLED или не используется текущим подключением. Чтобы включить ваши сертификаты, отредактируйте /etc/my.cnf и добавьте в секцию [mysqld]:
# Type your own certificates directory
ssl-ca=/etc/certs/ca.pem
ssl-cert=/etc/certs/server-cert.pem
ssl-key=/etc/certs/server-key.pemСохраните, затем перезапустите MySQL:
systemctl restart mysqldПроверьте снова SHOW VARIABLES LIKE ‘%ssl%’; и STATUS; — значения должны показывать, что SSL включён. Однако это не принудит пользователей автоматически использовать SSL.
Чтобы клиента по умолчанию использовал ваши клиентские сертификаты при локальных подключениях, добавьте секцию [client] в /etc/my.cnf:
[client]
ssl-ca=/etc/certs/ca.pem
ssl-cert=/etc/certs/client-cert.pem
ssl-key=/etc/certs/client-key.pemПерезапустите mysqld и проверьте подключение — root должен уже использовать SSL при подключении локально.

Важно: установка секции [client] влияет на все локальные клиенты, читающие /etc/my.cnf. Клиенты на других хостах должны указывать параметры –ssl-* явно или использовать свой my.cnf.
Шаг 5 — Разрешение удалённых подключений по SSL
В /etc/my.cnf в секции [mysqld] добавьте:
bind-address = *
require_secure_transport = ONbind-address = * позволяет слушать на всех интерфейсах. require_secure_transport = ON заставляет сервер отклонять незашифрованные соединения (поначалу может привести к проблемам с клиентами без SSL).
Перезапустите MySQL:
systemctl restart mysqldСоздайте нового пользователя для удалённого доступа, ограничив подключение требованием X509. В примере имя пользователя hakase:
mysql -u root -p
# Введите Hakase-labs123@
CREATE USER 'hakase'@'%' IDENTIFIED BY 'Hakase-labs123@' REQUIRE X509;
GRANT ALL PRIVILEGES ON *.* TO 'hakase'@'%' REQUIRE X509;
FLUSH PRIVILEGES;Примечание: вы можете ограничить привилегии строго по нуждам (SELECT, INSERT и т. п.) вместо полного grant all.

Если вы видите предупреждение о “1 warning”, это связано с рекомендацией использовать ALTER USER вместо GRANT для задания аутентификационных методов — это не влияет на работоспособность сейчас.
Шаг 6 — Тестирование подключений
Скачайте три файла на клиентскую машину: ca.pem, client-cert.pem, client-key.pem. В примере клиент подключается с другой Linux-машины, где установлен mysql-client.
mysql -h 10.0.15.11 -u hakase \
--ssl-ca=ca.pem \
--ssl-cert=client-cert.pem \
--ssl-key=client-key.pem -p10.0.15.11 — IP сервера MySQL. После успешного подключения выполните:
STATUS;Вы увидите, что соединение установлено по TCP/IP на порту 3306 с использованием SSL.

Если попытаться подключиться без сертификатов, соединение будет отклонено.
Также можно подключиться через GUI-клиенты, такие как MySQL Workbench: укажите хост, порт, имя пользователя и в настройках SSL укажите ca.pem, client-cert.pem и client-key.pem.



Результат: удалённый пользователь hakase подключается только при наличии корректно подписанных клиентских сертификатов.
Отладка и типичные ошибки
- Ошибка: “SSL connection error” — проверьте права на ключи, корректность путей в /etc/my.cnf и отсутствие пароля у приватных ключей.
- Ошибка: “Client does not have X509 certificate” — убедитесь, что пользователь создан с REQUIRE X509 и что клиент использует соответствующий сертификат.
- Сервер не запускается после изменений — проверьте синтаксис my.cnf и логи /var/log/mysqld.log.
- Подключения отклоняются с require_secure_transport = ON — убедитесь, что все клиенты поддерживают SSL и указали сертификаты.
Советы по диагностике: смотрите логи mysqld, используйте openssl s_client для проверки SSL-сокета: openssl s_client -connect
Альтернативный подход и когда не подходит
Альтернатива: VPN или SSH-туннель. Если вы не хотите управлять сертификатами или сервер/клиент находятся в приватной сети, туннель (OpenVPN, WireGuard, SSH) упростит задачу и обеспечит шифрование транспортного канала.
Когда SSL на уровне MySQL не подходит:
- Централизованное управление сертификатами предпочтительней с использованием PKI, если большое количество клиентов.
- Если клиенты — сторонние сервисы с ограниченной поддержкой SSL-параметров MySQL, рассмотрите VPN.
Рекомендации по безопасности и hardening
- Храните приватные ключи вне общедоступных директорий, владелец mysql и права 600.
- Ограничьте bind-address до конкретного интерфейса, если сервер должен быть доступен только на одном IP.
- Минимизируйте привилегии пользователей, избегайте GRANT ALL в продакшене.
- Регулярно обновляйте MySQL и OpenSSL, применяйте патчи.
- Включайте логирование аутентификаций и следите за попытками неуспешного доступа.
- Планируйте ротацию сертификатов и ключей по расписанию (например, за 30 дней до истечения срока).
Быстрый чеклист по ролям
Администратору системы:
- Установить пакет mysql-community-server
- Настроить /etc/my.cnf и права на /etc/certs
- Настроить firewall (открыть 3306 только для нужных IP)
DBA:
- Создать пользователей с минимальными привилегиями
- Настроить REQUIRE X509 для нужных аккаунтов
- Планировать ротацию сертификатов
Разработчику/оператору клиента:
- Установить mysql-client
- Сохранить ca.pem, client-cert.pem, client-key.pem локально с правами 600
- Тестировать подключение через CLI и GUI
Критерии приёмки
Система считается корректно настроенной, если выполняются все пункты:
- MySQL слушает на нужном IP и порту (например, 3306).
- SHOW VARIABLES LIKE ‘%ssl%’; показывает параметры, указывающие на наличие серверного сертификата.
- Пользователь с REQUIRE X509 успешно подключается с корректными client-cert.pem/client-key.pem/ca.pem.
- Попытка подключения без сертификатов отклоняется.
- Логи не содержат ошибок TLS/SSL при старте mysqld.
Тестовые сценарии и приёмочные тесты
- Локальное подключение root с сертификатами: должно завершиться успешно и STATUS показывать SSL.
- Удалённое подключение с client-cert.pem: должно успешно аутентифицироваться.
- Попытка удалённого подключения без сертификатов: должна завершиться ошибкой.
- Попытка подключения с неправильным client-cert.pem: отклонение.
- После перезапуска сервиса SSL всё ещё должно работать.
Модель принятия решения (Mermaid)
flowchart TD
A[Начало: нужен удалённый доступ к MySQL?] --> B{Должно ли шифрование быть на транспортном уровне?}
B -->|Да| C{Управлять сертификатами?
'малое число клиентов'}
C -->|Да| D[Настроить SSL в MySQL по инструкции]
C -->|Нет| E[Использовать VPN/SSH-туннель]
B -->|Нет| F[Оставить локальные подключения]
D --> G[Тесты и приёмка]
E --> G
F --> GКраткая методология внедрения (SOP)
- Подготовка: резервное копирование /etc/my.cnf и данных.
- Установка MySQL и начальная конфигурация.
- Генерация CA/сервер/клиент сертификатов и проверка.
- Настройка my.cnf на сервере и рестарт.
- Создание пользователя с REQUIRE X509.
- Тестирование с разных клиентских машин.
- Документирование и план ротации сертификатов.
Словарь терминов (одно предложение)
- CA: центр сертификации, подписывает сертификаты для доверия между клиентом и сервером.
- CSR: запрос на подпись сертификата, который создаётся для получения сертификата от CA.
- X509: стандарт формата цифровых сертификатов.
- require_secure_transport: настройка MySQL, требующая защищённый транспорт (TLS/SSL).
Совместимость и заметки миграции
- Инструкции ориентированы на MySQL 5.7 и CentOS 7; в MySQL 8 и новых версиях конфигурация и политики аутентификации могут отличаться.
- При миграции проверьте, какие опции my.cnf были заменены или устарели, и протестируйте на промежуточном окружении.
Заключение
Мы установили MySQL 5.7, сгенерировали CA/сертификаты, настроили MySQL для работы по SSL, создали пользователя для удалённых подключений с REQUIRE X509 и протестировали соединения как через CLI, так и через MySQL Workbench. Варианты альтернатив включают VPN/SSH-туннель для упрощения управления доступом при большом количестве клиентов.
Ключевые рекомендации: защищайте приватные ключи, минимизируйте привилегии, планируйте ротацию сертификатов и тестируйте обновления в тестовом окружении.
Источники и ссылки
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента