security.md•23.3 kB
# Архитектура безопасности
*[English](../../en/technical/security.md) | [中文](../../zh/technical/security.md) | [Français](../../fr/technical/security.md) | [Español](../../es/technical/security.md) | [العربية](../../ar/technical/security.md) | Русский*
Этот документ детализирует архитектуру безопасности MCP Database Utilities, объясняя механизмы и принципы, обеспечивающие безопасный доступ к базам данных для ИИ-ассистентов.
## Модель коммуникации и архитектура безопасности
MCP Database Utilities реализует безопасную модель коммуникации, разработанную для защиты ваших данных на каждом этапе. Следующая диаграмма иллюстрирует, как данные перемещаются между компонентами с сохранением безопасности:
```mermaid
flowchart LR
subgraph User["Среда пользователя"]
Client["ИИ-клиент<br>(Claude/Cursor)"]
ConfigFile["Конфигурационный файл<br>(YAML)"]
end
subgraph MCP["MCP Database Utilities"]
MCPService["MCP-сервис"]
ConnectionManager["Менеджер соединений"]
QueryProcessor["Процессор запросов<br>(Только чтение)"]
end
subgraph Databases["Слой баз данных"]
DB1["База данных 1"]
DB2["База данных 2"]
DBn["База данных n"]
end
%% Поток коммуникации
Client-- "Шаг 1:<br>Запрос данных<br>(Естественный язык)" -->MCPService
ConfigFile-. "Загружается при запуске<br>(Детали соединения)" .->MCPService
MCPService-- "Шаг 2:<br>Обработка запроса" -->ConnectionManager
ConnectionManager-- "Шаг 3:<br>Открытие соединения<br>(По требованию)" -->Databases
ConnectionManager-- "Шаг 4:<br>Отправка запроса<br>(Только SELECT)" -->QueryProcessor
QueryProcessor-- "Шаг 5:<br>Выполнение запроса" -->Databases
Databases-- "Шаг 6:<br>Возврат результатов" -->QueryProcessor
QueryProcessor-- "Шаг 7:<br>Форматирование результатов" -->MCPService
MCPService-- "Шаг 8:<br>Передача результатов" -->Client
ConnectionManager-- "Шаг 9:<br>Закрытие соединения<br>(После завершения)" -->Databases
%% Стили
classDef user fill:#e1f5fe,stroke:#01579b,stroke-width:2px,color:#01579b
classDef mcp fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#2e7d32
classDef db fill:#fff3e0,stroke:#e65100,stroke-width:2px,color:#e65100
class User user
class MCP mcp
class Databases db
%% Примечания по безопасности
style ConnectionManager stroke-dasharray: 5 5
style QueryProcessor stroke-dasharray: 5 5
```
## Принципы безопасности
MCP Database Utilities спроектирован с безопасностью в качестве высшего приоритета, следуя этим основным принципам:
1. **Многоуровневая защита**: Множественные слои безопасности для защиты данных
2. **Принцип наименьших привилегий**: Минимальный доступ, необходимый для функционирования
3. **Безопасность по дизайну**: Безопасность встроена с самого начала, а не добавлена позже
4. **Прозрачность**: Открытая и проверяемая архитектура
5. **Изоляция**: Строгое разделение сред и соединений
## Ключевые механизмы безопасности
### 1. Строго только чтение
Все взаимодействия с базами данных строго ограничены операциями только для чтения:
- **Полный синтаксический анализ**: Каждый SQL-запрос полностью анализируется, чтобы убедиться, что он только для чтения
- **Блокировка операций модификации**: Все команды, модифицирующие данные (INSERT, UPDATE, DELETE и т.д.), автоматически блокируются
- **Блокировка DDL-команд**: Команды, модифицирующие структуру базы данных (CREATE, ALTER, DROP и т.д.), блокируются
- **Многоуровневая проверка**: Запросы проверяются через SQL-парсер и проверки, специфичные для каждого типа базы данных
```python
# Пример валидации запроса (псевдокод)
def validate_query(query):
# Синтаксический анализ запроса
parsed_query = sql_parser.parse(query)
# Проверка типа запроса
if not parsed_query.is_select():
raise SecurityException("Разрешены только SELECT-запросы")
# Проверка опасных конструкций
if parsed_query.has_dangerous_clauses():
raise SecurityException("Обнаружены неразрешенные конструкции")
# Проверка, специфичная для базы данных
db_adapter.validate_read_only(query)
return parsed_query
```
### 2. Отсутствие прямого доступа к базе данных
Архитектура гарантирует, что ИИ никогда не имеет прямого доступа к базам данных:
- **Слой абстракции**: Все запросы проходят через несколько слоев абстракции
- **Валидация входных данных**: Все входные данные валидируются и очищаются
- **Параметризованные запросы**: Систематическое использование параметризованных запросов для предотвращения SQL-инъекций
- **Изоляция соединений**: Каждое соединение изолировано и управляется сервисом
### 3. Изолированные соединения
Соединения с базами данных строго изолированы:
- **Выделенный пул соединений**: Каждая конфигурация базы данных использует свой собственный пул соединений
- **Транзакции только для чтения**: Все транзакции явно настроены в режиме только для чтения
- **Автоматические таймауты**: Соединения имеют настраиваемые таймауты для предотвращения зависших соединений
- **Правильное закрытие**: Соединения правильно закрываются после использования
```yaml
# Пример конфигурации с параметрами безопасности
connections:
secure-postgres:
type: postgres
host: db.example.com
port: 5432
dbname: analytics
user: readonly_user
password: "********"
ssl:
mode: verify-full
cert: /path/to/cert.pem
key: /path/to/key.pem
root: /path/to/root.crt
pool:
max_size: 5
timeout: 30
```
### 4. Соединение по требованию
Соединения с базами данных создаются только при необходимости:
- **Ленивое соединение**: Соединения создаются только при фактическом выполнении запроса
- **Быстрое отключение**: Соединения возвращаются в пул как можно скорее
- **Ограничение соединений**: Максимальное количество одновременных соединений настраиваемо
- **Мониторинг соединений**: Все соединения отслеживаются для обнаружения аномалий
### 5. Автоматические таймауты
Таймауты применяются на нескольких уровнях для предотвращения злоупотреблений:
- **Таймаут запроса**: Временное ограничение для выполнения запроса
- **Таймаут соединения**: Временное ограничение для создания соединения
- **Таймаут простоя**: Закрытие неактивных соединений после настраиваемого периода
- **Глобальный таймаут**: Общее временное ограничение для сессии
### 6. Защита учетных данных
Учетные данные баз данных защищены:
- **Безопасное хранение**: Пароли никогда не хранятся в виде открытого текста в памяти
- **Маскирование в логах**: Чувствительная информация маскируется во всех логах
- **Поддержка менеджеров секретов**: Возможна интеграция с решениями типа HashiCorp Vault, AWS Secrets Manager и т.д.
- **Ротация учетных данных**: Поддержка периодической ротации учетных данных
### 7. Безопасность соединений
Соединения с базами данных защищены:
- **Поддержка SSL/TLS**: Зашифрованные соединения для всех поддерживаемых баз данных
- **Верификация сертификатов**: Опция для верификации сертификатов серверов баз данных
- **Продвинутые SSL-конфигурации**: Опции для тонкой настройки параметров SSL/TLS
- **Безопасные протоколы**: Использование современных и безопасных версий протоколов
```yaml
# Пример SSL-конфигурации для PostgreSQL
connections:
postgres-ssl:
type: postgres
host: secure-db.example.com
port: 5432
dbname: analytics
user: readonly_user
password: "********"
ssl:
mode: verify-full # Опции: disable, allow, prefer, require, verify-ca, verify-full
cert: /path/to/client-cert.pem
key: /path/to/client-key.pem
root: /path/to/root.crt
```
## Меры защиты приватности
### 1. Локальная обработка
Все операции выполняются локально:
- **Нет передачи данных**: Данные никогда не покидают локальную среду
- **Нет загрузки схемы**: Схемы баз данных не отправляются внешним сервисам
- **Нет телеметрии**: Никакие данные об использовании не собираются и не отправляются
### 2. Минимальное раскрытие данных
Сервис спроектирован для минимизации раскрытия данных:
- **Ограничение результатов**: Максимальное количество возвращаемых строк настраиваемо
- **Автоматическая пагинация**: Большие наборы результатов автоматически разбиваются на страницы
- **Фильтрация чувствительных столбцов**: Возможность настройки столбцов для исключения из результатов
- **Маскирование данных**: Опция для автоматического маскирования чувствительных данных (PII и т.д.)
### 3. Защита учетных данных
Учетные данные соединения защищены:
- **Нет раскрытия учетных данных**: Учетные данные никогда не раскрываются ИИ
- **Абстракция соединений**: ИИ использует логические имена соединений, а не фактические детали
- **Проверка разрешений**: Проверка, что используемые учетные записи имеют минимальные разрешения
### 4. Маскирование чувствительных данных
Чувствительные данные могут быть автоматически замаскированы:
- **Обнаружение PII**: Опция для автоматического обнаружения и маскирования персональной информации
- **Настраиваемые правила маскирования**: Возможность определения пользовательских правил маскирования
- **Безопасное логирование**: Чувствительные данные маскируются во всех логах
## Лучшие практики безопасности
### Безопасная конфигурация
Рекомендации для безопасной конфигурации:
1. **Используйте учетные записи только для чтения**:
```sql
-- Пример для PostgreSQL
CREATE ROLE readonly_user WITH LOGIN PASSWORD 'secure_password';
GRANT CONNECT ON DATABASE analytics TO readonly_user;
GRANT USAGE ON SCHEMA public TO readonly_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;
```
2. **Включите SSL/TLS**:
```yaml
connections:
secure-db:
# ...
ssl:
mode: verify-full
# ...
```
3. **Ограничьте доступ к таблицам**:
```yaml
connections:
limited-access:
# ...
allowed_tables:
- public.products
- public.categories
- analytics.sales
```
4. **Настройте подходящие таймауты**:
MCP Database Utilities предоставляет три настраиваемых параметра таймаута для обеспечения безопасности подключений к базе данных и эффективного использования ресурсов:
**Таймаут запроса (query_timeout)**:
- **Назначение**: Ограничивает максимальное время выполнения одного SQL-запроса. Запросы, превышающие это время, будут автоматически прерваны.
- **Единица измерения**: Секунды
- **Значение по умолчанию**: 60 секунд
- **Случаи использования**: Предотвращает потребление чрезмерных ресурсов сложными запросами или запросами к большим таблицам
- **Рекомендации**:
- Обычные запросы: 30-60 секунд
- Запросы для анализа данных: 300-600 секунд
- Генерация отчетов: До 1800 секунд
**Таймаут соединения (connection_timeout)**:
- **Назначение**: Ограничивает максимальное время ожидания установления соединения с базой данных. Если соединение не может быть установлено в течение этого времени, будут возвращены ошибки соединения.
- **Единица измерения**: Секунды
- **Значение по умолчанию**: 10 секунд
- **Случаи использования**: Полезно в нестабильных сетевых средах или при высокой нагрузке на базу данных
- **Рекомендации**:
- Локальные базы данных: 5-10 секунд
- Удаленные базы данных: 15-30 секунд
- Среды с высокой нагрузкой: До 60 секунд
**Таймаут простоя (idle_timeout)**:
- **Назначение**: Определяет, как долго соединение может оставаться неактивным перед автоматическим закрытием. Это помогает освободить неиспользуемые ресурсы соединения.
- **Единица измерения**: Секунды
- **Значение по умолчанию**: 300 секунд (5 минут)
- **Случаи использования**: Управляет неактивными соединениями в пуле соединений
- **Рекомендации**:
- Высокочастотное использование: 600-1200 секунд
- Общее использование: 300-600 секунд
- Низкочастотное использование: 60-180 секунд
**Взаимосвязь параметров**:
- Обычно idle_timeout > query_timeout > connection_timeout
- Если ваши запросы должны выполняться в течение длительного времени, убедитесь, что query_timeout достаточно длинный
- Если idle_timeout слишком короткий, это может вызвать частое создание и уничтожение соединений, влияя на производительность
**Пример конфигурации**:
```yaml
connections:
analytics-db:
type: postgres
host: analytics.example.com
port: 5432
dbname: analytics
user: analyst
password: secure_password
# Конфигурация таймаутов (все значения в секундах)
query_timeout: 300 # Позволяет выполнять длительные аналитические запросы
connection_timeout: 15 # Время ожидания для подключения к удаленной базе данных
idle_timeout: 600 # Поддерживает соединения активными для частых запросов
```
**Важные примечания**:
- Установка слишком коротких таймаутов может прервать легитимные запросы
- Установка слишком длинных таймаутов может привести к растрате ресурсов и создать потенциальные риски безопасности
- Настраивайте эти значения в зависимости от вашего конкретного случая использования и производительности базы данных
### Мониторинг и аудит
Рекомендации для мониторинга и аудита:
1. **Включите логирование**:
```yaml
logging:
level: INFO # Опции: DEBUG, INFO, WARNING, ERROR
file: /path/to/dbutils.log
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
```
2. **Мониторьте запросы**:
```yaml
monitoring:
log_queries: true
log_slow_queries: true
slow_query_threshold: 5 # секунды
```
3. **Настройте оповещения**:
```yaml
alerts:
failed_connections:
threshold: 5
period: 60 # секунды
action: "email:admin@example.com"
```
## Аудит безопасности
MCP Database Utilities регулярно подвергается аудитам безопасности:
1. **Статический анализ кода**: Код анализируется на предмет потенциальных уязвимостей
2. **Тесты на проникновение**: Проводятся тесты на проникновение для выявления слабых мест
3. **Обзор кода**: Код проверяется экспертами по безопасности
4. **Анализ зависимостей**: Зависимости анализируются на предмет известных уязвимостей
## Управление уязвимостями
Процесс управления уязвимостями:
1. **Отчетность**: Уязвимости могут быть сообщены через GitHub или электронную почту
2. **Оценка**: Каждая уязвимость оценивается для определения ее серьезности
3. **Исправление**: Уязвимости исправляются как можно скорее
4. **Коммуникация**: Пользователи информируются об уязвимостях и исправлениях
## Заключение
Безопасность является ядром MCP Database Utilities. Архитектура спроектирована для обеспечения того, чтобы ИИ-ассистенты могли получать доступ к данным баз данных безопасным способом, не компрометируя конфиденциальность или целостность данных. Множественные слои защиты, строгий режим только для чтения и механизмы изоляции гарантируют, что данные защищены в любое время.