Защита и администрирование баз данных: практическое руководство по безопасности на 2026 год | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

Защита и администрирование баз данных: практическое руководство по безопасности на 2026 год

19 апреля 2026 12 мин. чтения
Содержание статьи

Это пошаговое руководство для системных администраторов и DevOps инженеров по комплексной настройке безопасности промышленных СУБД. Мы разберем практические шаги по управлению доступом (роли, привилегии), шифрованию данных на диске и в сети, настройке детального аудита действий пользователей и защите от распространенных уязвимостей, включая SQL-инъекции. Материал охватывает встроенные механизмы и инструменты для PostgreSQL, MySQL и Microsoft SQL Server, позволяя провести аудит текущей конфигурации и привести её в соответствие с актуальными на 2026 год лучшими практиками. Руководство поможет вам системно повысить уровень защищенности ваших баз данных, минимизировав риски компрометации критически важной информации.

Подготовка к безопасным изменениям: как не сломать продакшн

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

  1. Создание полной резервной копии (конкретные команды и инструменты для каждой СУБД).
  2. Проведение аудита текущего состояния безопасности (чтобы понимать, что именно нужно менять).
  3. Тестирование всех изменений на изолированной копии (стенде).
  4. Внедрение в продакшн по утвержденному плану с заранее определенными точками отката.

Создание надежной точки восстановления: резервные копии и снапшоты

Перед любыми изменениями убедитесь, что у вас есть рабочая точка отката. Вот проверенные команды для каждой СУБД.

PostgreSQL:

  • Логический бэкап одной базы: pg_dump -U postgres -Fc mydb > mydb_backup.dump
  • Физический бэкап всего кластера с поддержкой PITR: pg_basebackup -D /backup/pg -Ft -z -P
  • Обязательно архивируйте WAL-логи, включив в postgresql.conf: archive_mode = on и archive_command = 'gzip < %p > /wal_archive/%f'

MySQL / MariaDB:

  • Логический бэкап: mysqldump --single-transaction --routines --triggers --all-databases > full_backup.sql
  • Для InnoDB используйте клонирование через транспортные табличные пространства (MySQL 8.0+) или физический бэкап с помощью Percona XtraBackup.
  • Проверьте, что бинарные логи включены для point-in-time recovery: log_bin = /var/log/mysql/mysql-bin.log

Microsoft SQL Server:

  • Полное резервное копиение базы данных:
    BACKUP DATABASE [MyDatabase] TO DISK = N'C:\Backup\MyDatabase_Full.bak' WITH COMPRESSION, STATS=10
  • Разностный бэкап для ускорения последующих операций:
    BACKUP DATABASE [MyDatabase] TO DISK = N'C:\Backup\MyDatabase_Diff.bak' WITH DIFFERENTIAL, COMPRESSION
  • Резервное копиение журналов транзакций (при использовании модели полного восстановления) обязательно для минимизации потерь данных.

Аудит текущей конфигурации безопасности: с чего начать

Перед внесением изменений оцените текущее состояние. Используйте эти скрипты для быстрого аудита.

PostgreSQL (запустите в psql):

-- Пользователи и их привилегии
\du+
-- Проверка методов аутентификации в pg_hba.conf
SHOW hba_file;
-- Проверка сетевых настроек
SHOW listen_addresses;
-- Проверка статуса SSL
SHOW ssl;
SELECT * FROM pg_stat_ssl WHERE pid IN (SELECT pid FROM pg_stat_activity);

MySQL:

-- Привилегии пользователей
SHOW GRANTS FOR CURRENT_USER();
-- Или для всех пользователей
SELECT user, host, authentication_string FROM mysql.user;
-- Проверка требований к паролям
SHOW VARIABLES LIKE 'validate_password%';
-- Проверка настроек SSL
SHOW VARIABLES LIKE '%ssl%';
SHOW STATUS LIKE 'Ssl_cipher';

Microsoft SQL Server (T-SQL):

-- Логины с правами sysadmin (критично!)
SELECT name, type_desc, is_disabled 
FROM sys.server_principals 
WHERE IS_SRVROLEMEMBER ('sysadmin', name) = 1;
-- Пользователи базы данных и их роли
USE [YourDatabase];
SELECT 
    princ.name AS UserName, 
    princ.type_desc AS UserType, 
    roleprinc.name AS RoleName
FROM sys.database_principals princ
LEFT JOIN sys.database_role_members members ON members.member_principal_id = princ.principal_id
LEFT JOIN sys.database_principals roleprinc ON roleprinc.principal_id = members.role_principal_id
WHERE princ.type IN ('S', 'U');

Управление доступом: тонкая настройка ролей и привилегий в PostgreSQL, MySQL и MS SQL

Принцип наименьших привилегий - фундамент безопасности данных. Реализуйте его через пошаговые инструкции.

  1. Создайте отдельные учетные записи для приложений и людей (никогда не используйте 'sa', 'root' или 'postgres' для повседневных задач).
  2. Создайте ролевые группы по функциям (например, 'read_only', 'app_user', 'analyst', 'dba_limited').
  3. Назначайте привилегии на уровне объектов (таблицы, процедуры, схемы) этим ролям, а не напрямую пользователям.
  4. Регулярно пересматривайте и очищайте список привилегий.

PostgreSQL: работа с ролями, GRANT и наследованием привилегий

Создайте базовые роли и назначьте привилегии.

-- Создание роли только для чтения
CREATE ROLE read_only NOLOGIN;
GRANT CONNECT ON DATABASE mydb TO read_only;
GRANT USAGE ON SCHEMA public TO read_only;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only;
-- Эта привилегия автоматически распространится на новые таблицы
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO read_only;

-- Создание роли приложения с правами на чтение/запись в конкретной таблице
CREATE ROLE app_user NOLOGIN;
GRANT CONNECT ON DATABASE mydb TO app_user;
GRANT USAGE ON SCHEMA app_schema TO app_user;
GRANT SELECT, INSERT, UPDATE ON app_schema.transactions TO app_user;

-- Назначение роли конкретному пользователю
CREATE USER analyst_user WITH PASSWORD 'StrongPass123!';
GRANT read_only TO analyst_user;

Проверьте эффективные привилегии: \du+ analyst_user. Для безопасного использования функций с SECURITY DEFINER явно задавайте SET search_path внутри функции, чтобы избежать подмены схемы.

MySQL и MariaDB: от простых GRANT к ролям в MySQL 8+

Для MySQL 5.7 и MariaDB управление основано на прямых привилегиях.

-- Классический GRANT (MySQL 5.7 / MariaDB)
CREATE USER 'app_user'@'10.0.1.%' IDENTIFIED BY 'ComplexPassword!2026';
GRANT SELECT, INSERT, UPDATE ON mydb.orders TO 'app_user'@'10.0.1.%';
GRANT EXECUTE ON PROCEDURE mydb.CalculateReport TO 'app_user'@'10.0.1.%';
FLUSH PRIVILEGES;

В MySQL 8.0+ используйте роли для лучшего управления.

-- Создание и назначение ролей (MySQL 8+)
CREATE ROLE 'read_only_role';
GRANT SELECT ON mydb.* TO 'read_only_role';

CREATE USER 'reports_user'@'%' IDENTIFIED BY 'SecurePass456!';
GRANT 'read_only_role' TO 'reports_user'@'%';
-- Активация роли по умолчанию для сессии
SET DEFAULT ROLE 'read_only_role' TO 'reports_user'@'%';

Проверьте привилегии: SHOW GRANTS FOR 'reports_user'@'%'; и SHOW GRANTS FOR 'reports_user'@'%' USING 'read_only_role'; (чтобы увидеть итоговые права).

Microsoft SQL Server: серверные и базы данных роли, принцип наименьших привилегий

Используйте двухуровневую модель: логины (уровень сервера) и пользователи (уровень базы данных).

-- 1. Создайте логин без прав sysadmin
CREATE LOGIN [app_login] WITH PASSWORD = 'N7&sv!2pQ9*2026', CHECK_POLICY = ON, CHECK_EXPIRATION = ON;

-- 2. В целевой базе данных создайте пользователя, связанного с логином
USE [MyAppDB];
CREATE USER [app_user] FOR LOGIN [app_login];

-- 3. Добавьте пользователя во встроенную роль базы данных или создайте свою
ALTER ROLE [db_datareader] ADD MEMBER [app_user];
ALTER ROLE [db_datawriter] ADD MEMBER [app_user];

-- 4. Для более тонкого контроля создайте пользовательскую роль и задайте явные разрешения
CREATE ROLE [role_table_updater];
GRANT SELECT, UPDATE ON [dbo].[Products] TO [role_table_updater];
DENY DELETE ON [dbo].[Products] TO [role_table_updater];
ALTER ROLE [role_table_updater] ADD MEMBER [app_user];

Регулярно аудируйте членство в роли sysadmin скриптом из первого раздела. Для автоматизации рутинных задач администрирования, таких как массовое назначение прав или создание пользователей, обратитесь к нашему практическому руководству по автоматизации инфраструктуры.

Шифрование данных: защита на диске и в сети. Сравнение подходов

Выбор метода шифрования зависит от угрозы, которую нужно парировать, и требований к производительности.

Метод Что защищает Влияние на производительность Сложность администрирования Лучший сценарий
TLS/SSL для сети Данные в пути между клиентом и сервером Низкое (современные CPU) Низкая Обязательно для всех внешних и межсервисных соединений
TDE (Transparent Data Encryption) Файлы данных на диске и бэкапы Среднее (5-15%) Средняя (управление ключами) Защита от утечки через файлы СУБД или кражу бэкапов
Шифрование на уровне столбцов (pgcrypto) Отдельные конфиденциальные поля (ПИН, номера) Высокое (на операцию) Высокая (логика приложения) Защита конкретных данных даже от DBA
Шифрование диска (LUKS, BitLocker) Весь диск/раздел Низкое Низкая (на уровне ОС) Базовая защита от физического доступа к серверу

Шифрование трафика: настройка TLS/SSL для защищенного подключения

Это обязательный минимум. Настройте принудительное шифрование всех соединений.

PostgreSQL: В postgresql.conf установите ssl = on. Разместите сертификаты (серверный и CA) в папке, указанной в ssl_cert_file и ssl_key_file. В pg_hba.conf для критичных хостов укажите hostssl вместо host.

MySQL: В my.cnf задайте:

[mysqld]
ssl-ca=/etc/mysql/ca.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem
require_secure_transport=ON  -- Критичная опция для продакшена

Microsoft SQL Server: Используйте SQL Server Configuration Manager. В свойствах протокола для экземпляра на вкладке «Сертификат» выберите сертификат, а на вкладке «Флаги» установите «Принудительное шифрование» в значение «Да».

Проверьте соединение. Для PostgreSQL: SELECT * FROM pg_stat_ssl WHERE ssl;. Для MySQL: SHOW STATUS LIKE 'Ssl_cipher'; (должна быть непустая строка).

Шифрование данных на диске: TDE в MS SQL и MySQL, альтернативы в PostgreSQL

Microsoft SQL Server (TDE):

USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'VeryStrongMasterKeyPass!2026';
CREATE CERTIFICATE MyServerCert WITH SUBJECT = 'My DEK Certificate';

USE [MyDatabase];
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER CERTIFICATE MyServerCert;

ALTER DATABASE [MyDatabase] SET ENCRYPTION ON;
-- Проверка статуса
SELECT name, is_encrypted FROM sys.databases;

MySQL Enterprise (TDE): Требуется коммерческая лицензия. Активация через INSTALL COMPONENT "file://component_encryption"; и настройка ключей в keyring_file.

PostgreSQL: Встроенного TDE нет. Используйте комбинацию методов:

  • Шифрование диска ОС (LUKS): Надежно защищает все данные, включая WAL-логи и временные файлы.
  • Расширение pgcrypto для выборочного шифрования: INSERT INTO users (secret) VALUES (pgp_sym_encrypt('my_data', 'aes_key')); Требует изменения логики приложений и безопасного хранения ключей.
  • Сторонние расширения: Например, pg_tde (в разработке) или использование провайдеров сквозного шифрования облачных дисков.

Для комплексной защиты NoSQL-систем, таких как MongoDB, где также критично шифрование трафика и настройка ролевой модели, изучите отдельное практическое руководство по безопасности MongoDB.

Детальный аудит и мониторинг действий: кто, что и когда сделал

Непрерывный аудит - ключевой процесс для анализа инцидентов и соответствия требованиям по защите конфиденциальной информации (GDPR, 152-ФЗ, PCI DSS). Настройте логирование критичных событий.

PostgreSQL: Используйте расширение pgAudit. Установите его и настройте в postgresql.conf:

shared_preload_libraries = 'pgaudit'
pgaudit.log = 'read, write, ddl, role'
pgaudit.log_relation = on

MySQL Enterprise: Включите Audit Plugin. В MariaDB используйте встроенный сервер аудита.

INSTALL PLUGIN audit_log SONAME 'audit_log.so';
SET GLOBAL audit_log_format=JSON;
SET GLOBAL audit_log_policy=ALL;

Microsoft SQL Server: Создайте и включите аудит сервера и спецификацию аудита базы данных через SQL Server Management Studio или T-SQL.

USE master;
CREATE SERVER AUDIT [ServerAudit] TO FILE (FILEPATH = N'C:\Audits\');
ALTER SERVER AUDIT [ServerAudit] WITH (STATE = ON);

CREATE SERVER AUDIT SPECIFICATION [ServerAuditSpec]
FOR SERVER AUDIT [ServerAudit]
ADD (FAILED_LOGIN_GROUP),
ADD (SERVER_ROLE_MEMBER_CHANGE_GROUP);
ALTER SERVER AUDIT SPECIFICATION [ServerAuditSpec] WITH (STATE = ON);

Настройка аудита для соответствия требованиям (GDPR, 152-ФЗ, PCI DSS)

Свяжите технические настройки с бизнес-требованиями. Примеры политик:

  • Аудит доступа к таблицам с персональными данными: В pgAudit: pgaudit.log = 'role, read, write' и pgaudit.role = 'auditor'. Создайте триггеры или правила аудита для таблиц users, customers, payments.
  • Логирование всех запросов на изменение (INSERT, UPDATE, DELETE) и удаление объектов (DROP): Базовая настройка для отслеживания изменений данных и схемы.
  • Отслеживание изменений в правах доступа (GRANT, REVOKE, CREATE/DROP ROLE): Критично для расследования инцидентов.
  • Неудачные попытки входа: Включите группу FAILED_LOGIN_GROUP в MS SQL или настройте логирование в pg_hba.conf с log_connections=on и log_disconnections=on в PostgreSQL.

Настройте ротацию логов (например, logrotate) и интеграцию с SIEM-системой (ELK Stack, Splunk, Grafana Loki) для централизованного анализа. Для построения полноценной системы мониторинга инфраструктуры, включая метрики СУБД, используйте подходы из руководства по системному администрированию Linux.

Защита от распространенных уязвимостей: SQL-инъекции и не только

Примените эти меры на уровне СУБД для немедленного повышения уровня защиты, даже без глубокого рефакторинга приложения.

  1. Использование подготовленных выражений (prepared statements): Это главный метод. Заставляйте разработчиков использовать параметризованные запросы (PREPARE, EXECUTE в SQL или интерфейсы в языках программирования).
  2. Минимизация привилегий учетных записей приложений: Учетная запись, от имени которой работает приложение, не должна иметь прав на выполнение DDL (CREATE, DROP) или доступ к другим базам. Следуйте инструкциям из раздела по управлению доступом.
  3. Экранирование входных данных: Используйте встроенные функции, например, mysqli_real_escape_string() в PHP (как временная мера, подготовленные выражения предпочтительнее).
  4. Настройка Web Application Firewall (WAF) на уровне БД: Для PostgreSQL можно использовать mod_security через postgresql_anonymizer или внешние прокси.
  5. Регулярное обновление СУБД: Подписывайтесь на рассылки безопасности (CVE) для вашей версии ПО и планируйте регулярные окна обслуживания для установки патчей.

Быстрые проверки и исправления: чек-лист на 15 минут

Если у вас есть только 15 минут, выполните эти проверки для быстрого усиления защиты.

Для всех СУБД:

  1. Проверьте и обновите СУБД до последней стабильной минорной версии. Запрос для проверки: SELECT version(); (PostgreSQL/MySQL), SELECT @@VERSION; (MS SQL).
  2. Отключите устаревшие версии протоколов и шифров. В настройках SSL/TLS отключите SSLv2, SSLv3, TLS 1.0, TLS 1.1. Оставьте только TLS 1.2 и 1.3.
  3. Найдите и отключите или задайте сложные пароли для учетных записей с пустыми или стандартными паролями (например, 'sa', 'root', 'postgres').
  4. Отзовите привилегии PUBLIC с критичных системных объектов (каталогов, функций). В PostgreSQL: REVOKE ALL ON SCHEMA public FROM PUBLIC; (оставьте только USAGE и CREATE для нужных ролей).
  5. Ограничьте сетевой доступ в конфигурационных файлах (pg_hba.conf, bind-address в MySQL, брандмауэр Windows). Разрешайте подключения только с доверенных подсетей приложений и админ-хостов.

Для глубокой проработки защиты конкретно MySQL, включая тонкую настройку плагина аутентификации и встроенного аудита, изучите наше полное руководство по безопасности MySQL на 2026 год.

План регулярного аудита безопасности БД: чек-лист на 2026 год

Превратите разовое усиление безопасности в постоянный процесс. Запускайте этот чек-лист ежеквартально и после любых значительных изменений в инфраструктуре или приложениях.

Ежеквартальный чек-лист аудита безопасности СУБД:

  1. Пользователи и права:
    • Выведите список всех пользователей/логинов и их привилегий (скрипты из раздела 1).
    • Удалите неиспользуемые учетные записи.
    • Проверьте, нет ли у прикладных учетных записей избыточных привилегий (например, CREATE TABLE, DROP).
    • Подтвердите, что принцип наименьших привилегий соблюдается.
  2. Шифрование и сеть:
    • Убедитесь, что require_secure_transport=ON (MySQL) или используются hostssl записи (PostgreSQL).
    • Проверьте актуальность SSL/TLS сертификатов (дата истечения).
    • Протестируйте подключение с обязательным шифрованием.
    • Если используется TDE, проверьте статус шифрования и наличие резервной копии ключей/сертификатов в безопасном месте.
  3. Аудит и мониторинг:
    • Убедитесь, что механизмы аудита (pgAudit, Audit Plugin, SQL Server Audit) включены и работают.
    • Проверьте, не переполняются ли диски логами аудита, работает ли ротация.
    • Просмотрите выборку логов за последнюю неделю на предмет подозрительной активности (множественные неудачные логины, запросы в нерабочее время).
  4. Защита от уязвимостей:
    • Проверьте наличие обновлений безопасности для вашей версии СУБД, подпишитесь на CVE.
    • Запустите сканер уязвимостей (например, mysql_secure_installation для MySQL, скрипты для проверки конфигурации).
    • Проверьте, что параметры, связанные с безопасностью (например, local_infile в MySQL), отключены, если не используются.
  5. Резервное копирование и восстановление:
    • Проверьте, что резервные копии создаются по расписанию и успешно завершаются.
    • Раз в полгода выполняйте тестовое восстановление из бэкапа на изолированном стенде.
    • Проверьте, что бэкапы, содержащие конфиденциальные данные, также зашифрованы.

Результаты каждого аудита документируйте. На основе найденных отклонений планируйте работы по улучшению. Для сложных сред, где базы данных работают в Kubernetes, процесс аудита и выбора инструментов имеет свою специфику. В этом поможет практическое сравнение операторов Kubernetes для баз данных.

Поделиться:
Сохранить гайд? В закладки браузера