Кафедра ИТКафедра ИТ
Блог
Обучение
  • О кафедре
  • Направления подготовки
  • Друзья и партнеры
  • Структура кафедры
  • Обращение к студентам
  • Официальный сайт «ВШП»
GitHub
Блог
Обучение
  • О кафедре
  • Направления подготовки
  • Друзья и партнеры
  • Структура кафедры
  • Обращение к студентам
  • Официальный сайт «ВШП»
  • МДК.11.01 - 26 - Обеспечение безопасности БД

  1. Главная
  2. Учебные материалы
  3. МДК.11.01 - Технология р...
  4. Обеспечение безопасности...

МДК.11.01 - 26 - Обеспечение безопасности БД

Введение

Обеспечение безопасности баз данных является одним из ключевых аспектов работы администратора MySQL. Безопасность включает в себя защиту данных от несанкционированного доступа, предотвращение атак и обеспечение целостности информации. В этой лекции мы рассмотрим основные методы и инструменты для обеспечения безопасности баз данных, включая шифрование данных, защиту от SQL-инъекций, безопасное управление паролями и настройку SSL/TLS.


Основные аспекты обеспечения безопасности

1. Шифрование данных

Шифрование данных — это процесс преобразования информации в зашифрованный формат, который может быть расшифрован только с использованием специального ключа. MySQL поддерживает несколько уровней шифрования:

  • Шифрование на уровне соединения:
    • Использование SSL/TLS для защиты данных при передаче между клиентом и сервером.

    • Настройка SSL/TLS в MySQL:

      [mysqld]
      ssl-ca=/path/to/ca-cert.pem
      ssl-cert=/path/to/server-cert.pem
      ssl-key=/path/to/server-key.pem
      

      После настройки SSL/TLS можно требовать его использование для определённых пользователей:

      ALTER USER 'user'@'host' REQUIRE SSL;
      

Совет

Для Windows-пользователей: если возникают сложности с генерацией сертификатов, рекомендуется использовать готовые сертификаты или обратиться к системному администратору для их создания.

  • Шифрование на уровне хранения:
    • MySQL предоставляет возможность шифровать данные на уровне таблиц или даже отдельных столбцов с использованием функций AES_ENCRYPT и AES_DECRYPT.

    • Пример использования:

      INSERT INTO users (username, password) VALUES ('new_user', AES_ENCRYPT('new_password', 'encryption_key'));
      SELECT username, AES_DECRYPT(password, 'encryption_key') AS decrypted_password FROM users;
      

Инфо

Шифрование на уровне хранения особенно полезно для защиты конфиденциальных данных, таких как пароли или персональная информация пользователей.


2. Защита от SQL-инъекций

Что такое SQL-инъекции?

SQL-инъекция — это уязвимость, которая позволяет злоумышленнику внедрить вредоносный SQL-код в запрос через пользовательский ввод. Это может привести к несанкционированному доступу к данным, их изменению или удалению.

Как работает SQL-инъекция?

Пример уязвимого кода:

query = f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"

Если пользователь введёт в поле username значение ' OR '1'='1, запрос станет:

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = ''

Это всегда вернёт TRUE, что позволит злоумышленнику войти без пароля.

Как защититься от SQL-инъекций?

  1. Использование подготовленных выражений (prepared statements):
    Подготовленные выражения отделяют SQL-код от пользовательских данных, что делает невозможным внедрение вредоносных запросов.
  2. Экранирование входных данных:
    Если использование подготовленных выражений невозможно, следует экранировать все входные данные с помощью функции mysql_real_escape_string или аналогичных методов.
  3. Проверка и валидация входных данных:
    • Убедитесь, что входные данные соответствуют ожидаемому формату (например, email должен быть валидным).
    • Ограничьте длину вводимых данных и/или их формат.

3. Безопасное управление паролями

Управление паролями пользователей — это важный аспект безопасности. MySQL предоставляет несколько механизмов для безопасного управления паролями:

  • Политика паролей:
    • MySQL позволяет настраивать политику паролей с использованием параметра validate_password.policy. Возможные значения:

      • LOW: Только минимальной длины пароля.
      • MEDIUM: Длина, цифры, буквы верхнего и нижнего регистра, специальные символы.
      • STRONG: Все вышеперечисленные требования плюс проверка на словарные слова (чтобы пароль не содержал включенных туда часто используемых слов).

      Инфо

      Словарь для проверки паролей в режиме STRONG берется из стандартного словаря MySQL. Его можно настроить в файле конфигурации.

    • Пример настройки:

      validate_password.policy = MEDIUM
      validate_password.length = 8
      

Совет

Рекомендуется использовать политику MEDIUM или выше для обеспечения достаточной сложности паролей.

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

      ALTER USER 'user'@'host' PASSWORD EXPIRE INTERVAL 90 DAY;
      

Инфо

Срок действия паролей помогает минимизировать риски, связанные с использованием устаревших или скомпрометированных учётных данных.


4. Ограничение прав доступа

Ограничение прав доступа — это один из ключевых способов минимизации рисков несанкционированного доступа.

Рекомендуется использовать:

  • Принцип наименьших привилегий:

    • Пользователям следует предоставлять только те права, которые необходимы для выполнения их задач. Например:

      GRANT SELECT, INSERT ON database.table TO 'user'@'host';
      

      Примечание

      Избегайте предоставления избыточных прав пользователям, особенно в производственной среде.

  • Ограничение доступа по IP-адресам:

    • Можно ограничить доступ к базе данных только с определённых IP-адресов:

      CREATE USER 'user'@'192.168.1.100' IDENTIFIED BY 'password';
      

5. Аудит действий пользователей

Аудит действий пользователей помогает отслеживать подозрительную активность и выявлять потенциальные угрозы. MySQL предоставляет несколько инструментов для аудита:

  • Логирование запросов:
    • Включение логирования всех запросов:

      general_log = 1
      general_log_file = /var/log/mysql/general.log  # Для Linux
      general_log_file = C:/path/to/general.log      # Для Windows
      

Совет

Логирование запросов полезно для анализа действий пользователей, но может создавать большие объёмы данных. Рекомендуется использовать его только для отладки или временного мониторинга.


Структура базы данных для практических задач

Для демонстрации практических примеров создадим базу данных security_demo с таблицей users. Эта таблица будет использоваться в примерах для защиты от SQL-инъекций и шифрования данных.

CREATE DATABASE security_demo;
USE security_demo;

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50),
    password VARCHAR(255) -- Используем VARCHAR(255) для хранения зашифрованных паролей
);

INSERT INTO users (username, password) VALUES
('admin', AES_ENCRYPT('secure_password', 'encryption_key')),
('user1', AES_ENCRYPT('weak_password', 'encryption_key'));

Инфо

Мы используем функцию AES_ENCRYPT для шифрования паролей при их сохранении. Это обеспечивает защиту данных на уровне хранения.


Практическая часть: Настройка и тестирование параметров безопасности

1. Защита от SQL-инъекций

Описание: Использование подготовленных выражений для защиты от SQL-инъекций.

Шаги тестирования:

  1. Уязвимый код:

    import mysql.connector
    
    conn = mysql.connector.connect(
        host="localhost",
        user="root",
        password="your_password",
        database="security_demo"
    )
    cursor = conn.cursor()
    
    username = input("Введите имя пользователя: ")
    password = input("Введите пароль: ")
    query = f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"
    cursor.execute(query)
    result = cursor.fetchall()
    
    if result:
        print("Успешный вход!")
    else:
        print("Неверное имя пользователя или пароль.")
    

    Если ввести username = ' OR '1'='1 и любой пароль, запрос будет выполнен успешно, что демонстрирует уязвимость.

  2. Безопасный код:

    import mysql.connector
    
    conn = mysql.connector.connect(
        host="localhost",
        user="root",
        password="your_password",
        database="security_demo"
    )
    cursor = conn.cursor(prepared=True)
    
    username = input("Введите имя пользователя: ")
    password = input("Введите пароль: ")
    query = "SELECT * FROM users WHERE username = %s AND password = %s"
    cursor.execute(query, (username, password))
    result = cursor.fetchall()
    
    if result:
        print("Успешный вход!")
    else:
        print("Неверное имя пользователя или пароль.")
    

    В этом случае попытка SQL-инъекции не сработает, так как подготовленные выражения автоматически экранируют входные данные.

Примечание

Никогда не используйте прямую подстановку данных в SQL-запросы без экранирования или подготовленных выражений. Это может привести к серьёзным уязвимостям.


2. Настройка политики паролей

Описание: Установка минимальных требований к паролям.

Шаги настройки:

  1. Откройте файл конфигурации MySQL и добавьте:

    validate_password.policy = MEDIUM
    validate_password.length = 8
    
  2. Перезапустите сервер MySQL:

    • Windows:

      net stop mysql && net start mysql
      
    • Linux:

      sudo systemctl restart mysql
      
  3. Проверьте текущие настройки:

    SHOW VARIABLES LIKE 'validate_password%';
    
  4. Создайте нового пользователя с паролем, соответствующим политике:

    CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'StrongPass1!';
    

3. Логирование запросов

Описание: Включение логирования всех запросов для анализа действий пользователей.

Шаги настройки:

  1. Откройте файл конфигурации MySQL и добавьте:

    general_log = 1
    general_log_file = /var/log/mysql/general.log
    
  2. Перезапустите сервер MySQL:

    • Windows:

      net stop mysql && net start mysql
      
    • Linux:

      sudo systemctl restart mysql
      
  3. Выполните несколько запросов:

    SELECT * FROM users;
    
  4. Проверьте файл лога:

    • Linux:

      cat /var/log/mysql/general.log
      
    • Windows:
      Откройте файл C:/path/to/general.log в текстовом редакторе.


Заключение

В этой лекции мы рассмотрели основные методы и инструменты для обеспечения безопасности баз данных MySQL. Мы изучили шифрование данных, защиту от SQL-инъекций, безопасное управление паролями и настройку SSL/TLS. Эти навыки помогут вам защитить ваши базы данных от несанкционированного доступа и атак.

Следующая лекция будет посвящена резервному копированию и восстановлению данных.

Последнее обновление: 18.11.2025, 18:13
Предыдущая
МДК.11.01 - 25 - Основы администрирования БД
Следующая
МДК.11.01 - 27 - Резервное копирование и восстановление
© Кафедра информационных технологий ЧУВО «ВШП», 2025. Версия: 0.28.3
Материалы доступны в соответствии с лицензией: