Как настроить безопасность сервера 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“.