MySQL с настройками по умолчанию небезопасен. Открытый порт 3306, root без пароля, анонимные пользователи — всё это ворота для злоумышленников. Выполните эти шаги сразу после установки.
Базовая защита: mysql_secure_installation
sudo mysql_secure_installation
# Ответьте на вопросы:
# Set root password? YES → придумайте сложный пароль
# Remove anonymous users? YES
# Disallow root login remotely? YES
# Remove test database? YES
# Reload privilege tables? YES
Запретить прослушивание на внешнем интерфейсе
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
bind-address = 127.0.0.1 # Только localhost
# или для IPv6:
bind-address = ::1
sudo systemctl restart mysql
✅ После этой настройки к MySQL нельзя подключиться снаружи даже зная пароль — только с localhost или через SSH-туннель.
Создавать отдельного пользователя для каждого приложения
-- Создать пользователя только для одной БД
CREATE USER 'myapp'@'localhost' IDENTIFIED BY 'StrongPassword123!';
CREATE DATABASE myapp_db;
GRANT ALL PRIVILEGES ON myapp_db.* TO 'myapp'@'localhost';
FLUSH PRIVILEGES;
-- Никогда не давать GRANT OPTION приложениям:
-- GRANT ALL PRIVILEGES ON *.* TO ... -- ЗАПРЕЩЕНО!
SSH-туннель вместо открытого порта
# Подключиться к MySQL через SSH-туннель (без открытия 3306)
ssh -L 3306:127.0.0.1:3306 user@your-vps-ip -N -f
# Теперь можно подключаться локально:
mysql -u myapp -p -h 127.0.0.1 -P 3306
Мониторинг подозрительной активности
# Включить general log (кратковременно для диагностики!)
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/var/log/mysql/general.log';
# Найти медленные запросы
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
# Просмотр текущих подключений
SHOW PROCESSLIST;
⚠️ Не держите general_log включённым постоянно — он записывает КАЖДЫЙ запрос и быстро заполняет диск.
| Меры защиты | Приоритет |
|---|---|
| mysql_secure_installation | Критический |
| bind-address = 127.0.0.1 | Критический |
| Отдельные пользователи для БД | Высокий |
| SSH-туннель | Высокий |
| Регулярный бэкап | Средний |