MySQL на CentOS 8: Установка и настройка

Практический курс по развертыванию сервера баз данных MySQL в среде Linux CentOS 8. Вы изучите все этапы от подготовки системы и работы с репозиториями до обеспечения безопасности и базового администрирования.

1. Подготовка окружения CentOS 8 и управление репозиториями AppStream

Подготовка окружения CentOS 8 и управление репозиториями AppStream

Добро пожаловать в курс MySQL на CentOS 8: Установка и настройка. Это первая статья нашего цикла, в которой мы заложим фундамент для успешной работы с базой данных. Прежде чем вводить команду установки MySQL, необходимо правильно подготовить операционную систему и разобраться с особенностями управления пакетами в CentOS 8 (и его производных, таких как AlmaLinux или Rocky Linux).

Многие новички совершают ошибку, сразу пытаясь установить пакеты, не обновив систему или не проверив конфликты версий. Это может привести к нестабильной работе или сложностям при обновлении в будущем. Сегодня мы научимся делать всё правильно.

Введение в экосистему CentOS 8

CentOS 8 привнесла значительные изменения в то, как управляется программное обеспечение в мире RHEL-подобных систем. Главным нововведением стало разделение репозиториев и появление технологии AppStream.

Раньше, во времена CentOS 7, всё было проще, но менее гибко: была одна версия пакета в репозитории. Если вам нужна была более новая версия PHP или MySQL, приходилось подключать сторонние репозитории, что часто ломало зависимости. В 8-й версии эта проблема решена архитектурно.

Структура репозиториев

В CentOS 8 контент разделен на два основных репозитория:

  • BaseOS: Здесь находится минимальный набор пакетов, необходимых для работы операционной системы (ядро, systemd, базовые утилиты). Это фундамент, который меняется редко.
  • AppStream: Здесь находятся приложения (userspace applications), языки программирования и базы данных. Именно здесь живут MySQL, PostgreSQL, Python, Node.js и другие инструменты.
  • !Схема разделения BaseOS и AppStream с демонстрацией потоков версий.

    Пакетный менеджер DNF

    На смену старому доброму yum пришел DNF (Dandified YUM). Хотя yum всё ещё доступен как символическая ссылка, под капотом работает именно dnf. Он быстрее, лучше разрешает зависимости и умеет работать с модулями.

    Первое, что мы должны сделать на чистом сервере — обновить список пакетов и саму систему.

    Подключитесь к вашему серверу по SSH и выполните:

    Эта команда обновит все установленные пакеты до последних версий в рамках текущего релиза.

    Работа с AppStream и модулями

    Самая важная концепция, которую нужно понять перед установкой MySQL — это Модули (Modules) и Потоки (Streams).

    В репозитории AppStream одно и то же приложение может быть представлено в нескольких версиях одновременно. Каждая версия находится в своем потоке.

    Проверка доступных модулей

    Давайте посмотрим, какие версии MySQL доступны в стандартном репозитории AppStream. Для этого используем команду:

    Вывод будет выглядеть примерно так:

    Здесь мы видим: * Name: Имя пакета (mysql). Stream: Версия потока (например, 8.0). Метка [d] означает default* (по умолчанию). * Profiles: Профили установки (клиент или сервер).

    Почему это важно для нашего курса?

    В этом курсе мы будем рассматривать установку MySQL не только из стандартного репозитория AppStream, но и из официального репозитория разработчиков (Oracle). Часто официальный репозиторий содержит более свежие минорные версии и исправления, чем стандартный репозиторий CentOS.

    Если вы планируете использовать официальный репозиторий MySQL Community, вам необходимо отключить стандартный модуль MySQL в AppStream, чтобы избежать конфликтов. DNF должен знать, что мы не хотим использовать встроенную версию.

    Управление модулями

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

  • Показать информацию о модуле:
  • Включить конкретный поток:
  • Если бы там была версия 5.7 и 8.0, и мы хотели бы именно 8.0 из AppStream:

  • Отключить модуль (Критически важно для следующего урока):
  • Чтобы система «забыла» о встроенном MySQL и позволила нам установить его из внешнего источника:

  • Сброс состояния модуля:
  • Если вы напутали с настройками:

    > Важное правило: Никогда не смешивайте установку пакетов из разных репозиториев без явного управления приоритетами или модулями. Это прямой путь к «dependency hell» (аду зависимостей).

    Установка необходимых утилит

    Для комфортной работы нам понадобится набор базовых инструментов. Часто в минимальных образах CentOS (Minimal Install) отсутствуют даже простые текстовые редакторы или утилиты для скачивания файлов.

    Установим их:

    Разберем, зачем они нужны: * nano: Простой консольный текстовый редактор. Если вы умеете пользоваться vim, можете использовать его, но для новичков nano проще. * wget / curl: Утилиты для скачивания файлов (понадобятся для загрузки RPM-пакетов репозитория). * net-tools: Содержит утилиту netstat (или ifconfig), которая поможет нам проверять, на каком порту запустился MySQL. * policycoreutils-python-utils: Инструменты для управления SELinux (понадобятся, если мы решим перенести файлы данных MySQL в нестандартное место).

    Подготовка Firewall (Брандмауэра)

    По умолчанию в CentOS 8 используется firewalld. Если вы планируете подключаться к базе данных удаленно (не с самого сервера), вам нужно будет открыть порт.

    Проверим статус брандмауэра:

    Если он активен (Active: active (running)), то все входящие соединения, кроме SSH, скорее всего заблокированы. Мы пока не будем открывать порт 3306 (стандартный для MySQL), так как сервис еще не установлен, но запомните команду, которая нам понадобится в будущем:

    Проверка SELinux

    Security-Enhanced Linux (SELinux) — это система принудительного контроля доступа. В CentOS 8 она включена по умолчанию в режиме Enforcing.

    Многие руководства в интернете советуют сразу отключать SELinux. Мы настоятельно не рекомендуем этого делать. Отключение систем безопасности — плохая привычка. MySQL отлично работает с включенным SELinux, если использовать стандартные пути (/var/lib/mysql).

    Проверим текущий статус:

    Вы должны увидеть: Current mode: enforcing

    Если вы видите permissive или disabled, это значит, что защита ослаблена или выключена.

    Заключение

    Мы подготовили наш сервер к установке базы данных. Теперь у нас есть:

  • Обновленная система.
  • Понимание того, как работает DNF и AppStream.
  • Необходимый набор утилит.
  • Знание о том, как управлять модулями, чтобы избежать конфликтов версий.
  • В следующей статье мы перейдем непосредственно к добавлению репозитория и установке MySQL сервера.

    > Документация по DNF и AppStream доступна на официальном сайте: CentOS Docs

    2. Установка пакетов MySQL, управление службой systemd и автозагрузка

    Установка пакетов MySQL, управление службой systemd и автозагрузка

    В предыдущей статье мы подготовили операционную систему CentOS 8: обновили пакеты, настроили DNF и разобрались с модулями AppStream. Теперь наш фундамент готов, и мы можем приступить к возведению стен — непосредственной установке сервера баз данных MySQL.

    В этой статье мы пройдем путь от добавления репозитория до первого успешного запуска службы и её базовой настройки безопасности.

    Выбор источника установки

    Как мы обсуждали ранее, у нас есть два пути:

  • Установить MySQL из стандартного репозитория AppStream (версия фиксируется Red Hat/CentOS).
  • Установить MySQL из официального репозитория разработчика (Oracle).
  • Мы выбираем второй путь, так как он обеспечивает доступ к самым свежим минорным обновлениям и исправлениям ошибок напрямую от вендора. Напомним, что в прошлой статье мы отключили стандартный модуль командой sudo dnf module disable mysql, чтобы избежать конфликтов.

    Шаг 1: Добавление репозитория MySQL Community

    Чтобы DNF «увидел» пакеты от Oracle, нам нужно установить специальный RPM-пакет, который добавит конфигурационные файлы репозитория в систему.

    Выполните следующую команду для загрузки и установки репозитория:

    Разберем, что делает эта команда: * Она скачивает файл .rpm с официального сайта dev.mysql.com. * Устанавливает его, создавая файлы в директории /etc/yum.repos.d/.

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

    Вы должны увидеть в списке mysql80-community.

    Шаг 2: Установка сервера MySQL

    Теперь, когда DNF знает, где искать пакеты, мы можем установить сам сервер. Пакет называется mysql-community-server.

    Во время этого процесса DNF сделает следующее:

  • Скачает пакет сервера.
  • Автоматически подтянет зависимости (например, mysql-community-client, mysql-community-common, mysql-community-libs).
  • Попросит подтвердить импорт GPG-ключа (GnuPG key). Это цифровая подпись, гарантирующая, что пакет действительно создан командой MySQL и не был подделан. Убедитесь, что отпечаток ключа совпадает с официальным, и согласитесь.
  • После завершения установки вы увидите сообщение Complete!.

    Шаг 3: Архитектура Systemd и управление службой

    В CentOS 8 (как и в большинстве современных Linux-дистрибутивов) за запуск и управление фоновыми процессами отвечает система инициализации systemd. MySQL работает как «демон» (daemon) — фоновая служба, ожидающая подключений.

    !Схема взаимодействия Systemd, демона mysqld и системных ресурсов.

    Имя службы в системе — mysqld (буква d на конце означает daemon).

    Запуск службы

    Сразу после установки служба MySQL не запускается автоматически. Нам нужно сделать это вручную:

    Эта команда обычно ничего не выводит, если всё прошло успешно. Чтобы убедиться в том, что сервер работает, проверим его статус:

    В выводе ищите строку: Active: active (running) зелёного цвета.

    Если вы видите Active: inactive (dead) или failed, значит, сервер не запустился, и нужно смотреть логи (об этом ниже).

    Шаг 4: Настройка автозагрузки

    Важно понимать разницу между запуском (start) и включением автозагрузки (enable).

    * Start: Запускает процесс прямо сейчас, в текущей сессии работы сервера. Если вы перезагрузите сервер, MySQL не запустится сам. * Enable: Добавляет службу в список автозагрузки. При старте операционной системы systemd автоматически поднимет MySQL.

    Для производственного сервера (production) нам обязательно нужна автозагрузка:

    Вывод команды покажет, что была создана символическая ссылка (symlink), связывающая службу с целью запуска системы (multi-user.target).

    > Совет: Можно объединить запуск и добавление в автозагрузку одной командой: > sudo systemctl enable --now mysqld

    Шаг 5: Получение временного пароля

    В старых версиях MySQL (до 5.7) после установки пароль администратора (root) часто был пустым. В MySQL 8.0 это изменено ради безопасности.

    При первой инициализации (которая происходит во время первого запуска systemctl start) сервер:

  • Инициализирует директорию данных (/var/lib/mysql).
  • Создает суперпользователя root@localhost.
  • Генерирует для него случайный временный пароль.
  • Записывает этот пароль в лог-файл ошибок.
  • Нам нужно найти этот пароль, чтобы войти в систему первый раз. Лог по умолчанию находится в /var/log/mysqld.log.

    Используем утилиту grep для поиска:

    Вы увидите строку вида: [Entry] [MY-010454] [Server] A temporary password is generated for root@localhost: XyZ123!@#abc

    Скопируйте набор символов после двоеточия (в примере это XyZ123!@#abc).

    Шаг 6: Скрипт mysql_secure_installation

    Теперь у нас есть работающий сервер и временный пароль. Однако конфигурация по умолчанию всё ещё не идеальна для безопасной работы. В комплекте с сервером идет специальный скрипт, который помогает закрыть известные дыры в безопасности.

    Запустите его:

    Скрипт задаст вам ряд вопросов. Давайте пройдем по ним:

  • Enter password for user root: Вставьте тот временный пароль, который вы нашли в логе на предыдущем шаге.
  • New password: Система потребует сменить временный пароль на постоянный. Введите новый сложный пароль дважды.
  • > Внимание: В MySQL 8.0 по умолчанию включен плагин валидации паролей. Пароль должен содержать заглавные и строчные буквы, цифры и спецсимволы.

  • Remove anonymous users? (Удалить анонимных пользователей?): Нажимайте y (Yes). Анонимные пользователи позволяют входить в базу без логина, что допустимо только для тестов.
  • Disallow root login remotely? (Запретить удаленный вход для root?): Нажимайте y. Входить под суперпользователем root следует только локально. Для удаленной работы мы позже создадим отдельного пользователя.
  • Remove test database and access to it? (Удалить тестовую базу данных?): Нажимайте y. По умолчанию создается база test, доступная всем. На боевом сервере она не нужна.
  • Reload privilege tables now? (Перезагрузить таблицы привилегий?): Нажимайте y. Это применит все изменения немедленно.
  • Если вы видите сообщение All done!, поздравляем — базовая установка и настройка завершены.

    Проверка входа

    Давайте проверим, что мы можем подключиться к базе данных с новым паролем.

    * -u root: указываем имя пользователя. * -p: флаг говорит клиенту, что нужно спросить пароль.

    Введите ваш новый пароль. Если вы увидели приглашение командной строки MySQL, значит всё работает:

    Чтобы выйти из консоли MySQL, введите команду exit.

    Заключение

    В этой статье мы: * Подключили официальный репозиторий Oracle. * Установили пакет mysql-community-server. * Научились управлять службой через systemd (старт, статус, автозагрузка). * Нашли временный пароль в логах. * Провели укрепление безопасности сервера с помощью mysql_secure_installation.

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

    3. Первичная настройка безопасности и использование mysql_secure_installation

    Первичная настройка безопасности и использование mysql_secure_installation

    В предыдущих модулях мы успешно установили MySQL 8.0 на CentOS 8 и выполнили первый запуск службы. В конце прошлой лекции мы кратко коснулись скрипта mysql_secure_installation. Однако безопасность базы данных — это не просто однократный запуск скрипта, а комплексное понимание того, от каких угроз мы защищаемся.

    В этой статье мы подробно разберем, что именно делает этот скрипт «под капотом», как настроить политики паролей и, самое главное, как создать правильного административного пользователя для удаленной работы, так как вход под root извне мы (надеюсь) отключили.

    Анатомия скрипта mysql_secure_installation

    Скрипт mysql_secure_installation — это, по сути, оболочка (wrapper), написанная на Shell или Perl, которая автоматизирует выполнение ряда SQL-команд. Давайте разберем каждый шаг, который этот инструмент предлагает выполнить, чтобы вы понимали физику процесса.

    !Визуализация эшелонированной защиты: от сети до прав доступа.

    1. Плагин валидации паролей (Validate Password Component)

    MySQL 8.0 уделяет огромное внимание сложности паролей. При запуске скрипта вас спрашивают, хотите ли вы настроить VALIDATE PASSWORD COMPONENT.

    Если вы соглашаетесь, MySQL активирует специальный плагин, который проверяет все новые пароли на соответствие политикам. Существует три уровня политики:

    * LOW (0): Пароль проверяется только на длину (минимум 8 символов). * MEDIUM (1): Проверка на длину, наличие цифр, букв разного регистра и специальных символов. Это настройка по умолчанию. * STRONG (2): Всё вышеперечисленное плюс проверка по файлу словаря (чтобы исключить пароли вроде password, qwerty и т.д.).

    > Совет: Для производственных серверов (production) всегда используйте уровень MEDIUM или STRONG. Слабые пароли — самый простой вектор атаки через перебор (brute-force).

    2. Удаление анонимных пользователей

    По умолчанию MySQL создает пользователя с пустым именем. Это позволяет входить в консоль базы данных без логина и пароля (просто набрав mysql), но с минимальными правами.

    В таблице системных привилегий mysql.user это выглядит так:

    Наличие таких пользователей — дыра в безопасности. Злоумышленник, получивший доступ к оболочке сервера, может использовать этот вход для разведки версии базы данных и других параметров. Скрипт удаляет эти записи.

    3. Запрет удаленного входа для root

    Это одно из самых важных правил безопасности. Суперпользователь root должен иметь право подключаться только через локальный сокет (localhost).

    Почему это важно?

  • Имя пользователя root известно всем. Хакеру остается подобрать только пароль.
  • Если root скомпрометирован, злоумышленник получает полный контроль над всем сервером БД.
  • Когда вы отвечаете «Yes» на этот вопрос, скрипт выполняет SQL-команду, удаляющую право входа для root с любых хостов, кроме localhost, 127.0.0.1 и ::1.

    4. Удаление тестовой базы данных

    MySQL по умолчанию создает базу с именем test. Особенность конфигурации прав доступа в MySQL такова, что любой пользователь (даже с минимальными правами) часто имеет полные права на любые базы данных, чье имя начинается с test_ или test.

    Удаление этой базы и правил доступа к ней исключает возможность использования этого пространства для хранения вредоносных данных или скриптов.

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

    Поскольку мы отключили удаленный вход для root, нам необходимо создать нового пользователя, под которым мы будем администрировать сервер удаленно (например, через MySQL Workbench или DBeaver).

    Войдите в консоль MySQL локально:

    Шаг 1: Создание пользователя

    Создадим пользователя (назовем его, например, db_admin), который сможет подключаться с любого IP-адреса. В SQL символ % означает «любой хост».

    Если вы хотите разрешить доступ только с конкретного IP (например, вашего офисного VPN), замените % на IP-адрес:

    Шаг 2: Выдача привилегий

    Теперь дадим этому пользователю полные права. Так как это наш администратор, мы используем GRANT ALL PRIVILEGES.

    .* означает «все базы данных» . «все таблицы». * WITH GRANT OPTION позволяет этому пользователю выдавать права другим пользователям.

    Шаг 3: Применение изменений

    Хотя современные версии MySQL часто применяют права сразу, хорошей практикой считается выполнение команды:

    Теперь можно выйти из консоли:

    Настройка Firewall в CentOS 8

    Даже если мы создали пользователя, мы не сможем подключиться к серверу удаленно, пока брандмауэр CentOS (firewalld) блокирует порт 3306. В первой статье мы лишь проверили статус, теперь пришло время открыть порт.

    Проверка текущих зон

    Убедимся, что firewalld запущен:

    Открытие порта MySQL

    Мы можем открыть порт вручную или использовать предопределенный сервис. Использование сервиса предпочтительнее.

    Флаг --permanent означает, что правило сохранится после перезагрузки сервера. Без этого флага правило сбросится при рестарте.

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

    Проверка результата

    Убедимся, что сервис добавлен в список разрешенных:

    В строке services вы должны увидеть mysql рядом с ssh и другими разрешенными службами.

    Проблема аутентификации в MySQL 8 (caching_sha2_password)

    В MySQL 8.0 изменился механизм аутентификации по умолчанию. Вместо старого mysql_native_password теперь используется более безопасный caching_sha2_password.

    Это отлично для безопасности, но некоторые старые клиенты (старые версии PHP, старые драйверы Java или старые версии MySQL Workbench) могут не поддерживать этот метод и выдавать ошибку при подключении:

    Authentication plugin 'caching_sha2_password' cannot be loaded

    Если вы столкнулись с такой проблемой, у вас есть два пути:

  • Обновить клиентское ПО (рекомендуемый путь).
  • Изменить метод аутентификации для пользователя на старый (легаси).
  • Если вам нужно использовать старый метод для совместимости, выполните в консоли MySQL:

    Заключение

    Мы завершили базовую настройку безопасности. Теперь ваш сервер:

  • Защищен от простых атак (удалены анонимы и тестовые базы).
  • Имеет строгую политику паролей.
  • Не позволяет входить под root из интернета.
  • Имеет отдельного администратора для удаленной работы.
  • Доступен через сетевой экран CentOS.
  • В следующей статье мы погрузимся в конфигурационные файлы MySQL (my.cnf), чтобы научиться настраивать производительность и пути хранения данных.

    4. Конфигурация my.cnf, настройка FirewallD и удаленного доступа

    Конфигурация my.cnf, настройка FirewallD и удаленного доступа

    Добро пожаловать в четвертую часть нашего курса MySQL на CentOS 8: Установка и настройка. В предыдущих статьях мы проделали большой путь: подготовили операционную систему, установили сервер базы данных из официального репозитория Oracle и провели первичную настройку безопасности, создав административного пользователя.

    Однако, если вы попытаетесь подключиться к вашему серверу прямо сейчас с другого компьютера (например, через MySQL Workbench), скорее всего, вы получите ошибку соединения. Это происходит потому, что настройки по умолчанию оптимизированы для локальной разработки, а сетевой экран (Firewall) блокирует внешние запросы.

    В этой статье мы разберем главный конфигурационный файл MySQL, научимся управлять сетевыми интерфейсами службы и настроим FirewallD так, чтобы пропускать только легитимный трафик.

    Главный конфигурационный файл my.cnf

    В мире Linux конфигурация сервисов обычно хранится в текстовых файлах в директории /etc. Для MySQL таким «сердцем» является файл my.cnf.

    Структура конфигурации

    В CentOS 8 (и RHEL-подобных системах) конфигурация MySQL имеет иерархическую структуру. Главный файл находится по пути /etc/my.cnf. Однако, чтобы не загромождать один файл сотнями строк, используется директива !includedir, которая подключает дополнительные файлы из папки /etc/my.cnf.d/.

    !Иерархия конфигурационных файлов MySQL в CentOS 8.

    Давайте откроем главный файл для редактирования:

    Внутри файла вы увидите разделы, обозначенные квадратными скобками, например [mysqld], [client], [mysqldump]. Нас интересует секция [mysqld], так как именно она отвечает за настройки серверной части (демона).

    Настройка сетевого доступа (Bind Address)

    Самая частая причина, по которой администраторы не могут подключиться к базе удаленно — это параметр bind-address.

    По умолчанию MySQL может быть настроен так, чтобы «слушать» входящие соединения только на локальном интерфейсе (127.0.0.1). Это означает, что сервер физически игнорирует любые пакеты, приходящие из внешней сети, даже если Firewall отключен.

    Чтобы разрешить подключение с любых IP-адресов, найдите или добавьте в секцию [mysqld] следующую строку:

    * 127.0.0.1 — сервер доступен только изнутри самого сервера. * 0.0.0.0 — сервер слушает все доступные сетевые интерфейсы (Wi-Fi, Ethernet, VPN).

    > Важно: Установка значения 0.0.0.0 делает ваш сервер потенциально доступным для всего интернета. Безопасность в этом случае должна обеспечиваться надежными паролями и настройкой Firewall (о чем мы поговорим ниже).

    Базовая оптимизация производительности

    Хотя глубокая оптимизация MySQL — тема для отдельного курса, есть один параметр, который стоит настроить сразу, особенно если ваш сервер имеет достаточный объем оперативной памяти. Это innodb_buffer_pool_size.

    InnoDB — это основной движок хранения данных в MySQL 8.0. Буферный пул (Buffer Pool) — это область памяти, где кэшируются данные таблиц и индексы. Чем больше данных находится в оперативной памяти, тем меньше сервер обращается к медленному жесткому диску.

    Добавьте или измените эту строку в секции [mysqld]:

    Как выбрать значение? * Если сервер выделен только под MySQL: установите значение в размере 50-70% от всей доступной оперативной памяти. * Если на сервере работают и другие службы (веб-сервер, PHP): будьте осторожны, чтобы не занять всю память, иначе система уйдет в swap (файл подкачки), что резко снизит производительность.

    Пример расчета для сервера с 4 ГБ RAM:

    где — размер пула в ГБ, — общий объем памяти, — коэффициент 60%.

    После внесения любых изменений в my.cnf необходимо перезагрузить службу, чтобы они вступили в силу:

    Настройка FirewallD в CentOS 8

    Теперь, когда MySQL готов принимать соединения, нам нужно разрешить их на уровне операционной системы. В CentOS 8 используется FirewallD — динамический менеджер управления брандмауэром.

    FirewallD работает с концепцией зон. По умолчанию активна зона public. Мы должны добавить правило, разрешающее трафик на порт 3306 (стандартный порт MySQL).

    Способ 1: Простой (Разрешить всем)

    Если вы хотите открыть доступ для всего мира (например, на тестовом сервере или если защита осуществляется внешним аппаратным фаерволом), используйте сервис mysql.

  • Добавляем правило:
  • Флаг --permanent означает, что правило сохранится после перезагрузки.

  • Применяем изменения:
  • Способ 2: Продвинутый (Rich Rules)

    Для производственных серверов (production) открывать порт 3306 для всего интернета — плохая практика. Лучше разрешить доступ только с IP-адреса вашего офиса, дома или сервера приложений.

    Для этого в FirewallD используются «богатые правила» (Rich Rules).

    Допустим, ваш IP-адрес — 192.168.1.50. Разрешим доступ только ему:

    Разберем эту команду: * rule family="ipv4": правило для протокола IPv4. * source address="...": источник подключения (кто стучится). * port port="3306": целевой порт. * accept: действие (разрешить).

    Не забудьте перезагрузить правила:

    Проверка настроек

    Чтобы убедиться, что правила применились, выполните:

    В выводе вы должны увидеть либо строку services: ... mysql ..., либо блок rich rules с вашим правилом.

    !Путь сетевого запроса от клиента к базе данных через слои защиты.

    SELinux и нестандартные порты

    В первой статье мы упоминали SELinux. Если вы используете стандартный порт 3306, SELinux не будет мешать работе. Однако, если в целях безопасности вы решите сменить порт в my.cnf (например, на 3307), MySQL не запустится.

    SELinux строго контролирует, какие порты разрешено слушать процессу mysqld. Чтобы разрешить нестандартный порт, потребуется утилита semanage (которую мы устанавливали в первой лекции в пакете policycoreutils-python-utils).

    Пример добавления порта 3307 (выполнять только если вы сменили порт в конфиге!):

    Диагностика проблем подключения

    Если после всех настроек вы все еще не можете подключиться, пройдите по этому чек-листу:

  • Служба запущена?
  • systemctl status mysqld
  • Порт слушается?
  • sudo netstat -tulpn | grep 3306 Вы должны увидеть 0.0.0.0:3306 или :::3306.
  • Firewall пропускает?
  • Попробуйте временно отключить его: sudo systemctl stop firewalld. Если подключение прошло — проблема в правилах.
  • Пользователь имеет права?
  • Убедитесь, что пользователь создан с хостом % (как мы делали в прошлой статье), а не localhost.

    Заключение

    Сегодня мы превратили наш локальный сервер MySQL в полноценный сетевой ресурс. Мы:

  • Разобрали структуру my.cnf.
  • Настроили bind-address для приема внешних соединений.
  • Оптимизировали использование памяти через innodb_buffer_pool_size.
  • Настроили FirewallD, используя как простые, так и продвинутые правила ограничения доступа.
  • Теперь ваш сервер готов к работе. В следующей, заключительной статье цикла, мы рассмотрим вопросы резервного копирования (backup) и восстановления данных, чтобы обезопасить результаты вашего труда.

    > Официальная документация по настройке сервера: MySQL Reference Manual

    5. Управление пользователями, правами доступа и основы резервного копирования

    Управление пользователями, правами доступа и основы резервного копирования

    Добро пожаловать в заключительную статью нашего курса MySQL на CentOS 8: Установка и настройка. Мы проделали огромный путь: от «чистого» сервера CentOS до полностью настроенной, оптимизированной и защищенной базы данных, доступной по сети.

    Однако работа администратора базы данных (DBA) не заканчивается на настройке my.cnf и открытии портов в FirewallD. Теперь перед нами стоят две критически важные задачи:

  • Организация доступа: Как дать разработчикам и приложениям доступ к данным, не выдавая пароль от root?
  • Сохранность данных: Что делать, если сервер выйдет из строя или кто-то случайно удалит важную таблицу?
  • В этой статье мы разберем принцип наименьших привилегий, научимся виртуозно управлять правами пользователей и настроим систему резервного копирования с помощью утилиты mysqldump.

    Управление пользователями в MySQL 8.0

    В старых версиях MySQL (5.7 и ниже) можно было создать пользователя и наделить его правами одной командой GRANT. В MySQL 8.0 синтаксис стал строже: создание учетной записи и выдача прав — это два разных процесса.

    Концепция «Пользователь @ Хост»

    В MySQL учетная запись определяется не только именем (login), но и тем, откуда этот пользователь подключается. Это позволяет создавать гибкие правила безопасности.

    Учетная запись состоит из двух частей: 'username'@'host'.

    * 'app'@'localhost' — пользователь app, который может подключиться только находясь на самом сервере (через SSH или локальный сокет). * 'app'@'192.168.1.50' — пользователь app, который может подключиться только с конкретного IP-адреса (например, с сервера приложений). * 'app'@'%' — пользователь app, который может подключиться с любого IP-адреса.

    Создание пользователя

    Для создания пользователя используется команда CREATE USER. Подключитесь к MySQL под суперпользователем:

    Создадим пользователя для веб-приложения:

    Обратите внимание на 192.168.1.%. Знак процента здесь работает как маска подсети: мы разрешаем подключение с любого IP, начинающегося на 192.168.1.. Это удобно для локальных сетей.

    Система привилегий (GRANT и REVOKE)

    После создания пользователь не имеет никаких прав. Он может войти в систему (login), но не может видеть базы данных или выполнять запросы. Нам нужно выдать ему разрешения.

    !Иерархия уровней доступа в MySQL: от глобальных прав администратора до доступа к конкретным колонкам.

    Принцип наименьших привилегий

    Золотое правило безопасности: выдавайте только те права, которые необходимы для выполнения задачи, и ни битом больше.

    Если приложению нужно только читать и писать данные в базу shop, не давайте ему права ALL PRIVILEGES на ..

    Выдача прав (GRANT)

    Синтаксис команды:

    Пример 1: Полный доступ к конкретной базе

    Дадим нашему пользователю полные права на базу данных shop_db:

    Здесь shop_db.* означает «все таблицы в базе shop_db».

    Пример 2: Только чтение и запись

    Часто приложению не нужно создавать или удалять таблицы (DROP, ALTER), а нужно только работать с данными (SELECT, INSERT, UPDATE, DELETE).

    Пример 3: Права на чтение конкретной таблицы

    Для аналитика можно открыть доступ только на чтение и только к таблице заказов:

    Отзыв прав (REVOKE)

    Если вы выдали лишнее или сотрудник уволился, права нужно отозвать. Синтаксис зеркален команде GRANT:

    После этой команды пользователь сможет только читать данные (SELECT), но не изменять их.

    Просмотр прав

    Чтобы узнать, какие права есть у пользователя, используйте команду:

    > Важно: В MySQL 8.0 изменения прав вступают в силу немедленно. Команда FLUSH PRIVILEGES требуется только если вы правили системные таблицы (mysql.user) вручную через INSERT/UPDATE, чего делать не рекомендуется.

    Основы резервного копирования (Backup)

    Даже самый надежный сервер на CentOS 8 не застрахован от сбоев диска, ошибок файловой системы или человеческого фактора (случайный DROP DATABASE). Резервное копирование — это ваша страховка.

    Мы рассмотрим логическое резервное копирование с помощью утилиты mysqldump. Она создает текстовый файл с набором SQL-команд, необходимых для воссоздания базы данных с нуля.

    Создание бэкапа с помощью mysqldump

    Утилита mysqldump запускается из командной строки Linux (bash), а не из консоли MySQL.

    Синтаксис:

    Пример 1: Бэкап одной базы данных

    Сделаем копию базы shop_db:

    Символ > — это перенаправление потока вывода. mysqldump генерирует текст, а оболочка Linux записывает его в файл.

    Пример 2: Бэкап всех баз данных

    Для полного резервного копирования сервера (включая пользователей и права) используйте флаг --all-databases:

    Важные флаги для mysqldump

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

    * --single-transaction: Запускает бэкап внутри транзакции. Это гарантирует, что вы получите согласованный снимок данных на момент начала операции, не блокируя таблицы InnoDB для записи. * --quick: Заставляет утилиту выгружать данные построчно, а не буферизировать весь результат в оперативной памяти. Это критично для больших баз данных.

    Восстановление данных (Restore)

    Восстановление происходит с помощью стандартного клиента mysql. Мы просто «скармливаем» ему файл с SQL-командами.

    Синтаксис:

    Обратите внимание на знак < (направление потока ввода).

    Пример восстановления:

    Предположим, база shop_db была удалена. Сначала создадим пустую базу, а затем зальем туда данные:

    Автоматизация бэкапов в CentOS 8

    Делать бэкапы вручную — плохая стратегия. Люди забывают. Роботы — нет. В Linux для этого есть планировщик cron.

    Создадим простую задачу для ежедневного бэкапа в 3 часа ночи.

  • Откройте редактор заданий cron:
  • Добавьте следующую строку:
  • ``text 0 3 * mysqldump -u root -p'ВашПароль' --single-transaction shop_db > /var/backups/shop_db_(date +\%F): Эта конструкция подставит текущую дату (например, 2023-10-25) в имя файла, чтобы бэкапы не перезаписывали друг друга.

    > Совет по безопасности: Для автоматических бэкапов лучше создать отдельного пользователя MySQL с правами LOCK TABLES и SELECT, вместо использования root.

    Заключение курса

    Поздравляем! Вы завершили курс MySQL на CentOS 8: Установка и настройка.

    Давайте вспомним, чему мы научились:

  • Подготовка: Мы настроили DNF, AppStream и базовые утилиты CentOS.
  • Установка: Развернули последнюю версию MySQL 8.0 из официального репозитория.
  • Безопасность: Защитили сервер, удалили тестовые данные и настроили политики паролей.
  • Сеть: Сконфигурировали my.cnf и FirewallD для удаленного доступа.
  • Управление: Научились создавать пользователей, разграничивать права и делать резервные копии.
  • Теперь у вас есть надежный фундамент для разработки и эксплуатации баз данных. Следующим шагом в вашем обучении может стать изучение репликации (Master-Slave), оптимизация производительности запросов (EXPLAIN) или настройка мониторинга.

    Удачи в администрировании!

    > Документация по mysqldump: MySQL Backup and Recovery