Перейти к содержимому
davidka.net > 💻 🧠 Код 1001 > Базы данных > Миграция с MySQL на MariaDB > ГЛАВА 9: Настройка безопасности

ГЛАВА 9: Настройка безопасности

  • автор:

Цель главы: Защитить MariaDB от несанкционированного доступа

← Предыдущая глава | Назад к оглавлению | Следующая глава →



1. Базовая защита

1.1 mariadb-secure-installation

# Запуск интерактивной настройки
sudo mariadb-secure-installation

Выполняемые действия:

1. Установка пароля root
2. Удаление anonymous пользователей
3. Запрет удаленного root доступа
4. Удаление тестовой базы
5. Перезагрузка таблиц привилегий

1.2 Автоматическая настройка

#!/bin/bash
# secure_mariadb.sh

mysql -u root << EOF
# Удалить anonymous пользователей
DELETE FROM mysql.user WHERE User='';

# Удалить remote root
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');

# Удалить test базу
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';

# Применить изменения
FLUSH PRIVILEGES;
EOF

echo "✅ MariaDB secured"

2. Управление пользователями

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

-- ❌ Плохо
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%';

-- ✅ Хорошо
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'192.168.1.%';

2.2 Создание пользователей для разных целей

-- Приложение
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'AppPass123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'192.168.1.%';

-- Read-only для отчетов
CREATE USER 'reports'@'10.0.0.%' IDENTIFIED BY 'ReportsPass123!';
GRANT SELECT ON app_db.* TO 'reports'@'10.0.0.%';

-- Backup
CREATE USER 'backup'@'localhost' IDENTIFIED BY 'BackupPass123!';
GRANT SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup'@'localhost';

FLUSH PRIVILEGES;

2.3 Ограничение ресурсов

-- Ограничить подключения и запросы
ALTER USER 'app_user'@'192.168.1.%' 
    WITH MAX_USER_CONNECTIONS 50
         MAX_QUERIES_PER_HOUR 10000
         MAX_UPDATES_PER_HOUR 5000;

3. SSL/TLS шифрование

3.1 Генерация сертификатов

#!/bin/bash
# generate_ssl_certs.sh

CERT_DIR="/etc/mysql/certs"
sudo mkdir -p "$CERT_DIR"

# CA сертификат
sudo openssl genrsa 2048 > "$CERT_DIR/ca-key.pem"
sudo openssl req -new -x509 -nodes -days 3650 \
    -key "$CERT_DIR/ca-key.pem" \
    -out "$CERT_DIR/ca.pem" \
    -subj "/C=US/ST=State/L=City/O=Company/CN=MariaDB-CA"

# Серверный сертификат
sudo openssl req -newkey rsa:2048 -days 3650 -nodes \
    -keyout "$CERT_DIR/server-key.pem" \
    -out "$CERT_DIR/server-req.pem" \
    -subj "/C=US/ST=State/L=City/O=Company/CN=mariadb-server"

sudo openssl rsa -in "$CERT_DIR/server-key.pem" \
    -out "$CERT_DIR/server-key.pem"

sudo openssl x509 -req -in "$CERT_DIR/server-req.pem" \
    -days 3650 -CA "$CERT_DIR/ca.pem" \
    -CAkey "$CERT_DIR/ca-key.pem" -set_serial 01 \
    -out "$CERT_DIR/server-cert.pem"

# Клиентский сертификат
sudo openssl req -newkey rsa:2048 -days 3650 -nodes \
    -keyout "$CERT_DIR/client-key.pem" \
    -out "$CERT_DIR/client-req.pem" \
    -subj "/C=US/ST=State/L=City/O=Company/CN=mariadb-client"

sudo openssl rsa -in "$CERT_DIR/client-key.pem" \
    -out "$CERT_DIR/client-key.pem"

sudo openssl x509 -req -in "$CERT_DIR/client-req.pem" \
    -days 3650 -CA "$CERT_DIR/ca.pem" \
    -CAkey "$CERT_DIR/ca-key.pem" -set_serial 02 \
    -out "$CERT_DIR/client-cert.pem"

# Права
sudo chown -R mysql:mysql "$CERT_DIR"
sudo chmod 600 "$CERT_DIR"/*.pem

echo "✅ SSL certificates generated"

3.2 Настройка SSL в конфиге

[mysqld]
# SSL Configuration
ssl-ca   = /etc/mysql/certs/ca.pem
ssl-cert = /etc/mysql/certs/server-cert.pem
ssl-key  = /etc/mysql/certs/server-key.pem

# Требовать SSL для всех (опционально)
require_secure_transport = ON

3.3 Проверка SSL

# Перезапустить MariaDB
sudo systemctl restart mariadb

# Проверить SSL
mariadb -u root -p -e "SHOW VARIABLES LIKE '%ssl%';"

# Тест подключения с SSL
mariadb -u root -p \
    --ssl-ca=/etc/mysql/certs/ca.pem \
    --ssl-cert=/etc/mysql/certs/client-cert.pem \
    --ssl-key=/etc/mysql/certs/client-key.pem \
    -e "STATUS" | grep SSL

3.4 Требовать SSL для пользователей

-- Требовать SSL
ALTER USER 'app_user'@'%' REQUIRE SSL;

-- Требовать конкретный сертификат
ALTER USER 'admin'@'%' REQUIRE 
    SUBJECT '/C=US/ST=State/O=Company/CN=admin'
    AND ISSUER '/C=US/ST=State/O=Company/CN=MariaDB-CA';

FLUSH PRIVILEGES;

4. Audit logging

4.1 Установка Audit Plugin

# Установить плагин
sudo apt install mariadb-plugin-audit -y

# Включить
mariadb -u root -p -e "INSTALL SONAME 'server_audit';"

4.2 Конфигурация Audit

# /etc/mysql/mariadb.conf.d/50-server.cnf

[mysqld]

# Server Audit Plugin plugin-load-add = server_audit server_audit_logging = ON server_audit_events = CONNECT,QUERY_DDL,QUERY_DML server_audit_output_type = FILE server_audit_file_path = /var/log/mysql/audit.log server_audit_file_rotate_size = 1000000 server_audit_file_rotations = 9

4.3 Анализ audit логов

# Просмотр
sudo tail -f /var/log/mysql/audit.log

# Поиск failed logins
sudo grep "ACCESS DENIED" /var/log/mysql/audit.log

# Поиск DROP команд
sudo grep "DROP" /var/log/mysql/audit.log

5. Firewall и сеть

5.1 UFW правила

#!/bin/bash
# configure_firewall.sh

# Разрешить только с определенных сетей
sudo ufw allow from 192.168.1.0/24 to any port 3306 proto tcp

# Или конкретные хосты
sudo ufw allow from 192.168.1.100 to any port 3306 proto tcp
sudo ufw allow from 192.168.1.101 to any port 3306 proto tcp

# Проверить
sudo ufw status numbered

5.2 Ограничение bind-address

[mysqld]
# Слушать только на внутреннем интерфейсе
bind-address = 10.0.0.5

# Или только localhost
bind-address = 127.0.0.1

6. Best practices

6.1 Скрипт проверки безопасности

#!/bin/bash
# security_audit.sh

echo "=== MariaDB Security Audit ==="

# Пользователи без пароля
echo -e "\n1. Users without password:"
mariadb -u root -p -e "
SELECT User, Host FROM mysql.user 
WHERE authentication_string = '';"

# Пользователи с '%' host
echo -e "\n2. Users with '%' host:"
mariadb -u root -p -e "
SELECT User, Host FROM mysql.user 
WHERE Host = '%';"

# Старые плагины
echo -e "\n3. Users with old password plugins:"
mariadb -u root -p -e "
SELECT User, Host, plugin FROM mysql.user 
WHERE plugin = 'mysql_old_password';"

# SSL статус
echo -e "\n4. SSL Status:"
mariadb -u root -p -e "SHOW VARIABLES LIKE '%ssl%';"

echo -e "\n=== Audit Complete ==="

6.2 Регулярные проверки

# Добавить в cron для ежедневной проверки
0 2 * * * /usr/local/bin/security_audit.sh > /var/log/mariadb_security_audit.log

Чек-лист

✅ Обязательные действия

  • [ ] mariadb-secure-installation выполнен
  • [ ] Root пароль установлен
  • [ ] Anonymous пользователи удалены
  • [ ] Test база удалена
  • [ ] SSL/TLS настроен
  • [ ] Audit logging включен
  • [ ] Firewall настроен
  • [ ] Пользователи следуют принципу минимальных привилегий
  • [ ] Регулярный security audit настроен

🔒 Проверки безопасности

  • [ ] Нет пользователей без пароля
  • [ ] Нет пользователей с Host=’%’
  • [ ] SSL работает
  • [ ] Audit логи пишутся
  • [ ] Firewall блокирует нежелательный доступ

Следующий шаг

→ ГЛАВА 10: Репликация и кластеризация

В следующей главе:

  • Master-Slave репликация
  • Master-Master репликация
  • Galera Cluster
  • Мониторинг репликации

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

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