Как настроить безопасность сервера MySQL (часть 1)

Представим вполне практическую ситуацию — в нашей сети есть некий сервер с работающим инстансом СУБД MySQL, который требуется защитить от реальных и потенциальных угроз. С чего начать наш комплекс мер?
Верно — с защиты операционной системы.

  • Шифровка данных файловой системы выполняется, обычно, через встроенный механизм LUKS. Конечно, для многих проектов сервера с БД могут быть расположены в супер-безотказном облаке, осевшем на сверх-защищенных физических серверах в датацентрах — для многих, но не для всех.
  • ПО для мониторинга изменений системных файлов, такое как Tripwire, также не будет лишним — на случай подмены злоумышленником каких-то библиотек на зараженные/модифицированные версии
  • все сетевые порты сервера, которые не используются — должны быть закрыты через фаерволл
  • Конечно же, вы помните о том, что пароль root-а и других привилегированных пользователей должны быть действительно сильными? Напоминаем так, на всякий случай.
  • служебные и “отключенные” пользователи должны иметь nologin или /bin/false в качестве оболочки для входа в систему
  • сканер rootkit-ов, работающий по расписанию
  • настройка SELinux или AppArmor

Теперь переходим к собственно MySQL.

Надежный пароль для root-а — необходимость!

mysql> UPDATE mysql.users SET Password=password(‘my_strong_password’) WHERE User=’root’;

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

mysql> DELETE FROM mysql.users WHERE User='';

Суперпользователь MySQL-я не должен иметь доступа к серверу по сети:

mysql> DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');

Завершим операции обновлением пользовательских привелегий:

mysql> FLUSH PRIVILEGES;

Многие из этих действий выполняются скриптом mysql_secure_installation, будет не лишним запустить его еще разик для подстраховки:

sudo mysql_secure_installation

после чего дать осмысленные ответы на вопросы, задаваемые в процессе выполнения скрипта (практически на все ответ будет “yes”).

Переходим к настройкам в конфигурационном файле MySQL:

vim /etc/mysql/my.cnf

Запретим сетевые подключения к СУБД отовсюду, кроме локального сервера:

bind-address = 127.0.0.1

Если в дальнейшем доступ по сети таки понадобится, будем делать это через SSH-тоннель.

Рекомендуется также отключить возможность загрузки локальных файлов для всех пользователей, у кого нет прав для этого на уровне файловой системы (файлов базы данных):

local-infile=0

Проверим такую важную опцию, как местоположение лог-файла:

log=/var/log/mysql_log

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

symbolic-links = 0

Естественно, каталог с файлами логов и ошибок MySQL не должен быть доступен на чтение никому, кроме администратора MySQL. Проверим это:

ls -l /var/log/mysql*

(продолжение читать здесь)

 

Освоить все премудрости тюнинга MySQL (и других популярных СУБД) вы можете на курсе “L2-DB. Администрирование баз данных на Linux”, ну а досконально изучить защиту Ваших серверов и сети — на курсе «L2-Security. Безопасность в Linux«.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *