OSEN-НИЙ SAAALEСкидка 50% на виртуальный хостинг и VDS
до 30.11.2025 Подробнее
Выберите продукт

MySQL 8: caching_sha2_password и TLS — безопасная аутентификация без сюрпризов

В MySQL 8 по умолчанию используется caching_sha2_password. Это повысило безопасность, но ломает старые клиенты без TLS. В статье — схема аутентификации, включение и проверка TLS, генерация ключей и разбор типичных ошибок.
MySQL 8: caching_sha2_password и TLS — безопасная аутентификация без сюрпризов

С выходом MySQL 8.0 Oracle по умолчанию включила новый плагин аутентификации caching_sha2_password. Он призван улучшить безопасность и ускорить повторные подключения благодаря механизму кэширования. Но на практике многие админы сталкиваются с двумя классическими проблемами: несовместимостью старых клиентов и неполной или неверной настройкой TLS. В результате — ошибки «Public Key Retrieval is not allowed», «Client does not support authentication protocol requested by server», неожиданные отказанные подключения и отключённые шифры.

В этой статье разложим по полочкам, как устроен caching_sha2_password, почему он эффективен только в связке с TLS, как правильно включить шифрование транспорта в mysqld, создать пользователей и мигрировать с mysql_native_password с минимальными рисками. Разберём типовые ошибки и чеклист для продакшена.

Зачем MySQL 8 перешёл на caching_sha2_password

Исторически большинство инсталляций MySQL использовали mysql_native_password — достаточно старый алгоритм со специфичным хешированием пароля. Его главный плюс — совместимость. Минусы — устаревшие криптографические практики и отсутствие механизмов, оптимизирующих повторные подключения.

Плагин caching_sha2_password решает две задачи:

  • Использует современные примитивы (SHA-256) для хранения и проверки паролей.
  • Ускоряет повторную аутентификацию: сервер кэширует ключ для недавнего клиента и может подтвердить пользователя без передачи всего протокола «с нуля» (меньше RTT при высоконагруженных пулах соединений).

Важно: безопасность caching_sha2_password предполагает защищённый транспорт. Наилучший вариант — обязательный TLS. Без TLS плагин может прибегать к шифрованию пароля RSA-ключом сервера, но это компромиссный режим, которого лучше избегать.

Как работает аутентификация: с TLS и без

Высокоуровнево процесс выглядит так:

  • Если клиент подключается по TLS, пароль пользователя защищён транспортным шифрованием; плагин выполняет обмен с контрольными суммами и возможным использованием кэша на сервере.
  • Если TLS нет, сервер может запросить шифрование пароля своей публичной RSA-частью. Клиент должен получить публичный ключ сервера и зашифровать пароль, чтобы он не ушёл в сеть открытым текстом.

Режим без TLS влечёт дополнительные риски и сложности совместимости: не все драйверы готовы автоматически получать публичный ключ, некоторые по умолчанию запрещают его загрузку по соображениям безопасности. Поэтому правильный путь — включать TLS на стороне сервера и заставлять клиентов его использовать.

Совместимость клиентов с caching_sha2_password

Для успешной работы вам понадобятся обновлённые клиенты и коннекторы. Практически безболезненно работают:

  • Официальный клиент mysql версии 8.x и библиотека libmysqlclient 8.x.
  • MySQL Connector/J 8.0.11+ (Java).
  • MySQL Connector/Python 8.x.
  • PHP с mysqlnd 8.x: поддерживает caching_sha2_password при наличии TLS.
  • Современные драйверы Go (go-sql-driver/mysql с поддержкой), Node.js (mysql2) — уточняйте в документации версии драйвера.

Если у вас исторические клиенты (PHP 7.0–7.1, старые JDBC/ODBC), они могут не знать о caching_sha2_password. В этом случае используйте один из безопасных сценариев миграции (см. ниже) или обновляйте коннекторы.

Схема включения TLS в MySQL 8

Включаем TLS в MySQL 8: базовая схема

Чтобы плагин аутентификации был действительно безопасен, включите TLS и запретите нешифрованные подключения. Минимальный набор шагов:

  1. Сгенерируйте собственный центр сертификации (CA) и от него — серверный сертификат для mysqld. Если нет своего PKI, используйте корпоративный CA или приобретите публичные SSL-сертификаты.
  2. Укажите пути к ключам/сертификатам в конфигурации mysqld.
  3. Ограничьте версии TLS и при необходимости задайте перечень шифров.
  4. Включите требование защищённого транспорта глобально и/или на уровне пользователей.

Пример фрагмента 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

tls_version=TLSv1.2,TLSv1.3

require_secure_transport=ON

После перезапуска сервера проверьте, что TLS активен:

mysql -u root -p --ssl-mode=REQUIRED -e "SHOW VARIABLES LIKE 'have_ssl';"
mysql -u root -p --ssl-mode=REQUIRED -e "SHOW STATUS LIKE 'Ssl_version';"

В статусе вы должны увидеть версию TLS (например, TLSv1.3). Команда mysql --ssl-mode=VERIFY_IDENTITY дополнительно проверяет имя хоста в сертификате, что актуально для удалённых подключений.

Тонкая настройка TLS

Рекомендуется:

  • Оставлять только TLSv1.2 и TLSv1.3 в tls_version.
  • Использовать сертификат с корректным CN и SAN (имена хостов), если клиенты применяют VERIFY_IDENTITY.
  • Поддерживать автоматическую ротацию: в MySQL 8 доступна команда ALTER INSTANCE RELOAD TLS для подхвата новых сертификатов без остановки.
FastFox SSL
Надежные SSL-сертификаты
Мы предлагаем широкий спектр SSL-сертификатов от GlobalSign по самым низким ценам. Поможем с покупкой и установкой SSL бесплатно!

Создание пользователей с caching_sha2_password

В MySQL 8 плагин caching_sha2_password используется по умолчанию. Вы можете задать его явно и одновременно потребовать TLS для этого пользователя:

CREATE USER 'app'@'10.%' IDENTIFIED WITH caching_sha2_password BY 'StrongP@ssw0rd' REQUIRE SSL;
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'app'@'10.%';

Если вы используете клиентские сертификаты (mTLS), ужесточите политику:

CREATE USER 'svc'@'%' IDENTIFIED WITH caching_sha2_password BY 'AnotherStr0ng!' REQUIRE X509;

Также доступны точечные ограничения по полям сертификата (например, REQUIRE SUBJECT, REQUIRE ISSUER), что полезно при централизованной PKI.

Глобальные политики безопасности

Две опции помогают сделать шифрование нормой:

  • require_secure_transport=ON — запрет на незащищённые подключения вообще (клиенты должны использовать TLS или сокеты ОС).
  • На уровне пользователей — REQUIRE SSL или REQUIRE X509, чтобы даже при ослаблении глобальной настройки конкретные учётки оставались защищёнными.

Даже если вы доверяете внутренней сети, включённый TLS спасает от ARP‑spoofing, атак уровней L2/L3, MITM на промежуточных участках и «временных» туннелях, которые порой делают интеграторы.

Когда всё-таки нужен mysql_native_password

Иногда обновление клиентов невозможно быстро. Тогда временно оставляют старый плагин на части пользователей или в качестве дефолта. Оптимальная стратегия — точечно и со сроком, параллельно готовя обновление драйверов.

Перевод конкретного пользователя

ALTER USER 'legacy'@'%' IDENTIFIED WITH mysql_native_password BY 'TmpStrongPass1!';

Временное изменение дефолта (не рекомендуется как постоянная мера)

[mysqld]
default_authentication_plugin=mysql_native_password

После миграции клиентов верните дефолт к caching_sha2_password и перевыпустите пароли унаследованных учёток. Помните, что mysql_native_password — решение ради совместимости, а не ради безопасности.

Типичные ошибки и их устранение

1) Client does not support authentication protocol requested by server

Причина: старый коннектор не поддерживает caching_sha2_password. Решение: обновить драйвер или перевести конкретного пользователя на mysql_native_password временно.

2) Public Key Retrieval is not allowed

Причина: клиент подключается без TLS, сервер требует зашифровать пароль публичным ключом, но драйвер запрещает автоматическую загрузку ключа. Решения:

  • Включить TLS и подключаться с --ssl-mode=REQUIRED или сильнее (рекомендуется).
  • Либо задать путь к публичному ключу сервера на клиенте и разрешить его использование (меняется опциями драйвера). Но это временная мера, лучше перейти на TLS.

3) Authentication plugin 'caching_sha2_password' reported error

Часто связано с отсутствием TLS, неверным временем на серверах, битым кэшем или failover, после которого кэш недействителен. Проверьте синхронизацию времени (NTP), включён ли TLS, и попробуйте переподключение.

4) TLS ругается на имя хоста

При использовании --ssl-mode=VERIFY_IDENTITY CN/SAN в сертификате сервера должен соответствовать тому имени, к которому обращается клиент. Решение: перевыпустить сертификат с корректными SAN, либо использовать имя, вписанное в сертификат.

Проверка состояния TLS и аутентификации

Полезные команды для диагностики:

SHOW VARIABLES LIKE 'have_ssl';
SHOW VARIABLES LIKE 'tls_version';
SHOW STATUS LIKE 'Ssl_cipher';
SHOW SESSION STATUS LIKE 'Ssl_version';
SHOW PLUGINS;

На стороне клиента проверьте фактический режим:

mysql -u app -p --ssl-mode=VERIFY_IDENTITY -h db.example.internal -e "\s"

В выводе \s будет строка про SSL. Если пусто — клиент не установил защищённое соединение.

Репликация и TLS

Для репликации в 8.0 используйте новую форму команды и включайте TLS для канала:

CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='db-master.internal',
  SOURCE_USER='repl',
  SOURCE_PASSWORD='S3cureRepl!1',
  SOURCE_SSL=1,
  SOURCE_SSL_CA='/etc/mysql/ssl/ca.pem';
START REPLICA;

Пользователя репликации создавайте с REQUIRE SSL и современным плагином аутентификации. Для построения отказоустойчивости и фейловера пригодится наш материал: GTID, полусинхронная репликация и failover.

Репликация MySQL 8 по TLS

RSA-ключи caching_sha2_password: стоит ли трогать

Плагин поддерживает RSA-ключи для сценариев без TLS. Управляющие переменные:

  • caching_sha2_password_auto_generate_rsa_keys — автогенерация ключей сервером.
  • caching_sha2_password_private_key_path, caching_sha2_password_public_key_path — явные пути к ключам.

Рекомендация проста: не полагайтесь на этот путь. Если вы можете включить TLS, включайте. RSA остаётся лишь «подпоркой» для старых клиентов и изолированных лабораторных стендов.

Производительность: кэш аутентификации

caching_sha2_password хранит кэш аутентификационных данных для недавних клиентов. Это сокращает число раундов при повторном подключении и уменьшает латентность, особенно в микросервисах и пулах соединений. На больших инсталляциях это даёт измеримый выигрыш по CPU и времени ответа, при условии стабильности сети и корректного TTL кэша. Переход на caching_sha2_password вкупе с TLS обычно улучшает метрики handshake по сравнению с mysql_native_password.

FastFox VDS
Облачный VDS-сервер в России
Аренда виртуальных серверов с моментальным развертыванием инфраструктуры от 195₽ / мес

Ротация и обслуживание сертификатов

Регулярно ротируйте серверный сертификат и, при использовании mTLS, клиентские. В MySQL 8 можно подхватить новые файлы без даунтайма:

ALTER INSTANCE RELOAD TLS;

Подготовьте процедуру аварийной откатной замены и мониторинг истечения сроков: собирайте метрики или парсите SHOW STATUS, добавьте алертинг по валидности сертификатов базы и приложений. Приватные ключи храните с ограниченными правами и аудитом. Для резервных копий инфраструктуры и ключей посмотрите наш практический обзор инструментов: Бэкапы с restic/borg и S3.

Миграция с mysql_native_password: практический план

  1. Инвентаризируйте клиентов и драйверы, зафиксируйте версии.
  2. Включите TLS в MySQL и проверьте режимы REQUIRED и VERIFY_IDENTITY на тестовом стенде.
  3. Создайте параллельного пользователя с caching_sha2_password, протестируйте авторизацию с каждого приложения.
  4. Переведите продакшн‑приложения на нового пользователя или смените плагин существующего пользователя через ALTER USER.
  5. Только если часть клиентов осталась «в каменном веке», временно оставьте им mysql_native_password, но под жёстким сроком обновления и с REQUIRE SSL.
  6. Удалите или переведите остатки на современный плагин, верните дефолт caching_sha2_password, проведите ревизию прав и ротацию паролей.

Чеклист настройки продакшена

  • TLS включён, tls_version=TLSv1.2,TLSv1.3.
  • require_secure_transport=ON глобально.
  • Пользователи с REQUIRE SSL или REQUIRE X509.
  • Сертификаты с корректными SAN, от доверенного CA, расписание ротации + мониторинг.
  • Драйверы обновлены; для Java — Connector/J 8+, для PHP — mysqlnd 8+.
  • Нет пользователей на mysql_native_password без строгой причины и сроков миграции.
  • Репликация по TLS, аккаунт репликации с ограниченными правами.
  • Бэкапы и утилиты управления (dump/import) тоже подключаются по TLS.

FAQ: коротко о важном

Нужно ли включать TLS, если база только внутри VPC/VLAN?

Да. Сетевые границы часто размыты, а внутренние компрометации — реальны. TLS минимизирует последствия и закрывает MITM.

Что важнее: обновить клиентов или включить TLS?

Начните с TLS. Это даст защиту уже сегодня, а затем планово обновляйте драйверы для полной поддержки caching_sha2_password.

Сломается ли производительность от TLS?

Современные CPU с AES‑NI и TLSv1.3 дают минимальные накладные расходы; выигрыш от кэша аутентификации часто перекрывает этот оверхед. Если уводите базу в отдельную среду, поднимайте её на VDS с гарантированными ресурсами.

Итоги

caching_sha2_password — стандарт для MySQL 8, сочетающий современную криптографию и ускоренное повторное рукопожатие. Его истинная сила раскрывается только в паре с грамотно настроенным TLS. Включите шифрование транспорта, задайте строгие политики на уровне пользователей, обновите клиенты — и аутентификация в MySQL станет и быстрее, и безопаснее. Если же совместимость пока мешает, ограничьте применение mysql_native_password только теми сценариями, где обновление критично задерживается, и обозначьте дедлайны. Контроль версий драйверов, ротация сертификатов и регулярные проверки — ваши лучшие друзья в поддержке устойчивой и безопасной базы данных.

Поделиться статьей

Вам будет интересно

Apache mod_cache: CacheQuickHandler, cache_disk vs cache_socache OpenAI Статья написана AI (GPT 5)

Apache mod_cache: CacheQuickHandler, cache_disk vs cache_socache

Если Apache — фронтенд или бэкенд для PHP/FCGI/прокси, mod_cache заметно разгружает приложение. Разбираем CacheQuickHandler, выбор ...
Docker BuildKit registry cache в CI: быстрые сборки на любом раннере OpenAI Статья написана AI (GPT 5)

Docker BuildKit registry cache в CI: быстрые сборки на любом раннере

Долгие Docker‑сборки в CI — классическая боль: свежие раннеры, мало диска и кэш каждый раз с нуля. Registry‑backed cache в BuildKi ...
CSP на практике: nonce и hash, безопасный старт с Report-Only OpenAI Статья написана AI (GPT 5)

CSP на практике: nonce и hash, безопасный старт с Report-Only

Пошаговое внедрение Content Security Policy для защиты от XSS: чем отличаются nonce и hash, как безопасно запустить режим Report-O ...