База данных — самый ценный актив большинства веб-приложений. Её компрометация означает утечку пользовательских данных, паролей и коммерческой информации. Правильная конфигурация MySQL/MariaDB критически важна.
Первичная защита: mysql_secure_installation
mysql_secure_installation
# Отвечаем:
# Validate password: Y (включить проверку сложности)
# Remove anonymous users: Y
# Disallow root login remotely: Y
# Remove test database: Y
# Reload privilege tables: Y
Создание пользователей с минимальными правами
mysql -u root -p
-- Создать пользователя только для одной БД
CREATE USER 'webapp'@'localhost' IDENTIFIED BY 'StrongPass123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'webapp'@'localhost';
-- Только для чтения (для аналитики)
CREATE USER 'analytics'@'localhost' IDENTIFIED BY 'ReadOnlyPass!';
GRANT SELECT ON myapp.* TO 'analytics'@'localhost';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'webapp'@'localhost';
Настройка my.cnf для безопасности
# /etc/mysql/mariadb.conf.d/99-security.cnf
[mysqld]
# Привязать только к localhost (запретить внешние подключения)
bind-address = 127.0.0.1
# Отключить LOCAL INFILE (защита от LFI-атак)
local-infile = 0
# Скрыть версию MariaDB
skip-show-database
# Максимальное количество ошибочных подключений
max_connect_errors = 100
# Логировать медленные запросы
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
Шифрование соединений (SSL/TLS)
# Проверить поддержку SSL
mysql -u root -p -e "SHOW VARIABLES LIKE '%ssl%';"
# Требовать SSL для пользователя
ALTER USER 'webapp'@'%' REQUIRE SSL;
# В my.cnf включить SSL
ssl-ca = /etc/mysql/ssl/ca-cert.pem
ssl-cert = /etc/mysql/ssl/server-cert.pem
ssl-key = /etc/mysql/ssl/server-key.pem
Автоматические бэкапы с шифрованием
cat > /etc/cron.daily/mysql-backup << 'SCRIPT'
#!/bin/bash
DATE=$(date +%Y%m%d)
mysqldump -u root -p'RootPass' --all-databases --single-transaction | gzip | gpg --batch --passphrase "BackupKey123" -c > /backup/mysql-$DATE.sql.gz.gpg
find /backup/ -name "mysql-*.sql.gz.gpg" -mtime +30 -delete
SCRIPT
chmod +x /etc/cron.daily/mysql-backup
Принцип минимальных привилегий для БД: Каждое приложение должно иметь своего пользователя БД только с теми правами, которые необходимы. Никогда не используйте root-пользователя для веб-приложений.
Проверьте bind-address! По умолчанию MariaDB в некоторых дистрибутивах слушает все интерфейсы (
0.0.0.0). Это открывает доступ из интернета. Установите bind-address = 127.0.0.1 если внешний доступ не нужен.