Гид по технологиям

MySQL 5.7: безопасная настройка SSL для удалённых подключений на CentOS 7

• 8 min read • Базы данных • Обновлено 25 Nov 2025
MySQL 5.7: безопасная настройка SSL на CentOS 7
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), серверных и клиентских сертификатов. Опишу также альтернативы, рекомендации по безопасности, проверку и типичные сценарии отладки.

Что будет сделано

  1. Установка MySQL 5.7
  2. Настройка пароля root
  3. Генерация самоподписанных SSL-сертификатов (CA, сервер, клиент)
  4. Включение SSL в MySQL
  5. Включение удалённых подключений с требованием X509
  6. Тестирование подключений, отладка и рекомендации по безопасности

Требования

  • Сервер с 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 5.7 на CentOS 7

Комментарий: 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;

Настройка пароля root в MySQL на CentOS 7

Подключитесь снова, чтобы убедиться, что новый пароль работает:

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

Генерация сертификата CA для MySQL

Далее создайте серверный ключ и сертификат, удалив 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

Генерация серверного сертификата для MySQL

Создайте клиентские ключ и сертификат аналогично:

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

Генерация клиентского сертификата для MySQL

Примечание: при создании запросов (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 при подключении локально.

SSL включён в MySQL и локальное подключение root с SSL

Важно: установка секции [client] влияет на все локальные клиенты, читающие /etc/my.cnf. Клиенты на других хостах должны указывать параметры –ssl-* явно или использовать свой my.cnf.

Шаг 5 — Разрешение удалённых подключений по SSL

В /etc/my.cnf в секции [mysqld] добавьте:

bind-address = *
require_secure_transport = ON

bind-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.

Создание пользователя для удалённого подключения MySQL

Если вы видите предупреждение о “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 -p

10.0.15.11 — IP сервера MySQL. После успешного подключения выполните:

STATUS;

Вы увидите, что соединение установлено по TCP/IP на порту 3306 с использованием SSL.

Удалённое подключение к MySQL серверу по SSL

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

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

Настройка соединения в MySQL Workbench

SSL конфигурация в MySQL Workbench

MySQL Workbench подключён по SSL

Результат: удалённый пользователь 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 :3306 -CAfile ca.pem — это покажет, проходит ли TLS-рукопожатие.


Альтернативный подход и когда не подходит

Альтернатива: 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

Критерии приёмки

Система считается корректно настроенной, если выполняются все пункты:

  1. MySQL слушает на нужном IP и порту (например, 3306).
  2. SHOW VARIABLES LIKE ‘%ssl%’; показывает параметры, указывающие на наличие серверного сертификата.
  3. Пользователь с REQUIRE X509 успешно подключается с корректными client-cert.pem/client-key.pem/ca.pem.
  4. Попытка подключения без сертификатов отклоняется.
  5. Логи не содержат ошибок TLS/SSL при старте mysqld.

Тестовые сценарии и приёмочные тесты

  1. Локальное подключение root с сертификатами: должно завершиться успешно и STATUS показывать SSL.
  2. Удалённое подключение с client-cert.pem: должно успешно аутентифицироваться.
  3. Попытка удалённого подключения без сертификатов: должна завершиться ошибкой.
  4. Попытка подключения с неправильным client-cert.pem: отклонение.
  5. После перезапуска сервиса 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)

  1. Подготовка: резервное копирование /etc/my.cnf и данных.
  2. Установка MySQL и начальная конфигурация.
  3. Генерация CA/сервер/клиент сертификатов и проверка.
  4. Настройка my.cnf на сервере и рестарт.
  5. Создание пользователя с REQUIRE X509.
  6. Тестирование с разных клиентских машин.
  7. Документирование и план ротации сертификатов.

Словарь терминов (одно предложение)

  • 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-туннель для упрощения управления доступом при большом количестве клиентов.

Ключевые рекомендации: защищайте приватные ключи, минимизируйте привилегии, планируйте ротацию сертификатов и тестируйте обновления в тестовом окружении.

Источники и ссылки

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро