mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-04-25 16:36:21 +02:00
224 lines
14 KiB
Markdown
224 lines
14 KiB
Markdown
|
|
---
|
|||
|
|
layout: default
|
|||
|
|
title: "Поддержка изоляции пользователя/коллекции в Neo4j"
|
|||
|
|
parent: "Russian (Beta)"
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Поддержка изоляции пользователя/коллекции в Neo4j
|
|||
|
|
|
|||
|
|
> **Beta Translation:** This document was translated via Machine Learning and as such may not be 100% accurate. All non-English languages are currently classified as Beta.
|
|||
|
|
|
|||
|
|
## Формулировка проблемы
|
|||
|
|
|
|||
|
|
Текущая реализация хранения и запросов в Neo4j не обеспечивает изоляцию пользователя/коллекции, что создает проблему безопасности многопользовательской среды. Все тройки хранятся в одном графе без каких-либо механизмов для предотвращения доступа пользователей к данным других пользователей или смешения коллекций.
|
|||
|
|
|
|||
|
|
В отличие от других бэкендов хранения в TrustGraph:
|
|||
|
|
- **Cassandra**: использует отдельные пространства ключей для каждого пользователя и таблицы для каждой коллекции.
|
|||
|
|
- **Vector-хранилища** (Milvus, Qdrant, Pinecone): используют пространства имен, специфичные для коллекции.
|
|||
|
|
- **Neo4j**: в настоящее время все данные хранятся в одном графе (уязвимость для безопасности).
|
|||
|
|
|
|||
|
|
## Текущая архитектура
|
|||
|
|
|
|||
|
|
### Модель данных
|
|||
|
|
- **Узлы**: метка `:Node` с свойством `uri`, метка `:Literal` с свойством `value`
|
|||
|
|
- **Отношения**: метка `:Rel` с свойством `uri`
|
|||
|
|
- **Индексы**: `Node.uri`, `Literal.value`, `Rel.uri`
|
|||
|
|
|
|||
|
|
### Поток сообщений
|
|||
|
|
- Сообщения `Triples` содержат поля `metadata.user` и `metadata.collection`
|
|||
|
|
- Сервис хранения получает информацию о пользователе/коллекции, но игнорирует ее
|
|||
|
|
- Сервис запросов ожидает `user` и `collection` в `TriplesQueryRequest`, но игнорирует их
|
|||
|
|
|
|||
|
|
### Текущая проблема безопасности
|
|||
|
|
```cypher
|
|||
|
|
# Любой пользователь может запросить любые данные - нет изоляции
|
|||
|
|
MATCH (src:Node)-[rel:Rel]->(dest:Node)
|
|||
|
|
RETURN src.uri, rel.uri, dest.uri
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Предлагаемое решение: Фильтрация на основе свойств (Рекомендуется)
|
|||
|
|
|
|||
|
|
### Обзор
|
|||
|
|
Добавьте свойства `user` и `collection` ко всем узлам и отношениям, а затем фильтруйте все операции по этим свойствам. Этот подход обеспечивает надежную изоляцию, сохраняя при этом гибкость запросов и обратную совместимость.
|
|||
|
|
|
|||
|
|
### Изменения в модели данных
|
|||
|
|
|
|||
|
|
#### Улучшенная структура узла
|
|||
|
|
```cypher
|
|||
|
|
// Узел
|
|||
|
|
CREATE (n:Node {
|
|||
|
|
uri: "http://example.com/entity1",
|
|||
|
|
user: "john_doe",
|
|||
|
|
collection: "production_v1"
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// Литеральные сущности
|
|||
|
|
CREATE (n:Literal {
|
|||
|
|
value: "literal value",
|
|||
|
|
user: "john_doe",
|
|||
|
|
collection: "production_v1"
|
|||
|
|
})
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### Улучшенная структура отношений
|
|||
|
|
```cypher
|
|||
|
|
// Отношения с свойствами user/collection
|
|||
|
|
CREATE (src)-[:Rel {
|
|||
|
|
uri: "http://example.com/predicate1",
|
|||
|
|
user: "john_doe",
|
|||
|
|
collection: "production_v1"
|
|||
|
|
}]->(dest)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### Обновленные индексы
|
|||
|
|
```cypher
|
|||
|
|
// Комплексные индексы для эффективного фильтра
|
|||
|
|
CREATE INDEX node_user_collection_uri FOR (n:Node) ON (n.user, n.collection, n.uri);
|
|||
|
|
CREATE INDEX literal_user_collection_value FOR (n:Literal) ON (n.user, n.collection, n.value);
|
|||
|
|
CREATE INDEX rel_user_collection_uri FOR ()-[r:Rel]-() ON (r.user, r.collection, r.uri);
|
|||
|
|
|
|||
|
|
// Сохранение существующих индексов для обратной совместимости (необязательно)
|
|||
|
|
CREATE INDEX Node_uri FOR (n:Node) ON (n.uri);
|
|||
|
|
CREATE INDEX Literal_value FOR (n:Literal) ON (n.value);
|
|||
|
|
CREATE INDEX Rel_uri FOR ()-[r:Rel]-() ON (r.uri);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Изменения в реализации
|
|||
|
|
|
|||
|
|
#### Сервис хранения (`write.py`)
|
|||
|
|
|
|||
|
|
**Текущий код:**
|
|||
|
|
```python
|
|||
|
|
def create_node(self, uri):
|
|||
|
|
summary = self.io.execute_query(
|
|||
|
|
"MERGE (n:Node {uri: $uri})",
|
|||
|
|
uri=uri, database_=self.db,
|
|||
|
|
).summary
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Обновленный код:**
|
|||
|
|
```python
|
|||
|
|
def create_node(self, uri, user, collection):
|
|||
|
|
summary = self.io.execute_query(
|
|||
|
|
"MERGE (n:Node {uri: $uri})",
|
|||
|
|
uri=uri, user=user, collection=collection, database_=self.db,
|
|||
|
|
).summary
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### Сервис запросов
|
|||
|
|
- Добавьте фильтры для user и collection в запросы, чтобы обеспечить изоляцию.
|
|||
|
|
|
|||
|
|
### План реализации
|
|||
|
|
|
|||
|
|
### Этап 1: Основа (Неделя 1)
|
|||
|
|
1. [ ] Обновление сервиса хранения для приема и хранения свойств user/collection
|
|||
|
|
2. [ ] Создание комплексных индексов для эффективного запроса
|
|||
|
|
3. [ ] Реализация обратной совместимости
|
|||
|
|
4. [ ] Создание модульных тестов для новой функциональности
|
|||
|
|
|
|||
|
|
### Этап 2: Обновление запросов (Неделя 2)
|
|||
|
|
1. [ ] Обновление всех шаблонов запросов для включения фильтров user/collection
|
|||
|
|
2. [ ] Добавление валидации запросов и мер безопасности
|
|||
|
|
3. [ ] Обновление интеграционных тестов
|
|||
|
|
4. [ ] Тестирование производительности с запросами, отфильтрованными
|
|||
|
|
|
|||
|
|
### Этап 3: Миграция и развертывание (Неделя 3)
|
|||
|
|
1. [ ] Создание скриптов миграции для существующих экземпляров Neo4j
|
|||
|
|
2. [ ] Документация и руководства по развертыванию
|
|||
|
|
3. [ ] Мониторинг и оповещения об изоляции
|
|||
|
|
4. [ ] Тестирование конвейера
|
|||
|
|
|
|||
|
|
### Этап 4: Усиление (Неделя 4)
|
|||
|
|
1. [ ] Удаление режима обратной совместимости
|
|||
|
|
2. [ ] Добавление комплексной журнализации
|
|||
|
|
3. [ ] Проверка безопасности и тестирование на проникновение
|
|||
|
|
4. [ ] Оптимизация производительности
|
|||
|
|
|
|||
|
|
## Стратегия тестирования
|
|||
|
|
|
|||
|
|
### Модульные тесты
|
|||
|
|
```python
|
|||
|
|
def test_user_collection_isolation():
|
|||
|
|
# Храним тройки для user1/collection1
|
|||
|
|
processor.store_triples(triples_user1_coll1)
|
|||
|
|
|
|||
|
|
# Храним тройки для user2/collection2
|
|||
|
|
processor.store_triples(triples_user2_coll2)
|
|||
|
|
|
|||
|
|
# Запрос как user1 должен возвращать только данные user1
|
|||
|
|
results = processor.query_triples(query_user1_coll1)
|
|||
|
|
assert all_results_belong_to_user1_coll1(results)
|
|||
|
|
|
|||
|
|
# Запрос как user2 должен возвращать только данные user2
|
|||
|
|
results = processor.query_triples(query_user2_coll2)
|
|||
|
|
assert all_results_belong_to_user2_coll2(results)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Интеграционные тесты
|
|||
|
|
- Сценарии многопользовательского взаимодействия с перекрывающимися данными
|
|||
|
|
- Запросы к перекрестным коллекциям (должны завершаться неудачей)
|
|||
|
|
- Тестирование миграции с существующими данными
|
|||
|
|
- Тестирование производительности с большими наборами данных
|
|||
|
|
|
|||
|
|
### Тесты безопасности
|
|||
|
|
- Попытки запросить данные других пользователей
|
|||
|
|
- Атаки SQL injection на параметры user/collection
|
|||
|
|
- Проверка полной изоляции при различных шаблонах запросов
|
|||
|
|
|
|||
|
|
## Соображения производительности
|
|||
|
|
|
|||
|
|
### Стратегия индексирования
|
|||
|
|
- Комплексные индексы на `(user, collection, uri)` для оптимальной фильтрации
|
|||
|
|
- Рассмотрите частичные индексы, если некоторые коллекции значительно больше
|
|||
|
|
- Отслеживайте использование и производительность индекса
|
|||
|
|
|
|||
|
|
### Оптимизация запросов
|
|||
|
|
- Используйте EXPLAIN для проверки использования индекса в запросах, отфильтрованных по user/collection
|
|||
|
|
- Рассмотрите кэширование результатов запросов для часто используемых данных
|
|||
|
|
- Профилируйте использование памяти с большим количеством пользователей/коллекций
|
|||
|
|
|
|||
|
|
### Масштабируемость
|
|||
|
|
- Каждая комбинация пользователя/коллекции создает отдельные "острова данных"
|
|||
|
|
- Отслеживайте размер базы данных и использование пула соединений
|
|||
|
|
- Рассмотрите стратегии горизонтального масштабирования, если необходимо
|
|||
|
|
|
|||
|
|
## Безопасность и соответствие
|
|||
|
|
|
|||
|
|
### Гарантии изоляции данных
|
|||
|
|
- **Физическая**: Все данные пользователя хранятся с явными свойствами user/collection
|
|||
|
|
- **Логическая**: Все запросы фильтруются по контексту user/collection
|
|||
|
|
- **Контроль доступа**: Уровень сервиса обеспечивает проверку доступа
|
|||
|
|
|
|||
|
|
### Требования к отчетности
|
|||
|
|
- Отслеживайте доступ к данным с контекстом user/collection
|
|||
|
|
- Отслеживайте активности миграции и перемещения данных
|
|||
|
|
- Мониторинг попыток нарушить изоляцию
|
|||
|
|
|
|||
|
|
### Соображения соответствия
|
|||
|
|
- GDPR: Улучшенная возможность находить и удалять данные, специфичные для пользователя
|
|||
|
|
- SOC2: Четкая изоляция и контроль доступа
|
|||
|
|
- HIPAA: Сильная изоляция для данных о здравоохранении
|
|||
|
|
|
|||
|
|
## Риски и смягчающие факторы
|
|||
|
|
|
|||
|
|
| Риск | Влияние | Вероятность | Смягчение |
|
|||
|
|
|------|--------|------------|------------|
|
|||
|
|
| Отсутствие фильтра user/collection в запросе | Высокий | Средняя | Обязательная валидация, комплексное тестирование |
|
|||
|
|
| Снижение производительности | Средний | Низкая | Оптимизация индекса, профилирование запросов |
|
|||
|
|
| Повреждение данных во время миграции | Высокий | Низкая | Стратегия резервного копирования, процедуры отката |
|
|||
|
|
| Уязвимость для безопасности | Высокий | Низкая | Проверка безопасности, тестирование на проникновение |
|
|||
|
|
|
|||
|
|
## Критерии успеха
|
|||
|
|
|
|||
|
|
1. **Безопасность**: Полная изоляция данных между пользователями в производственной среде
|
|||
|
|
2. **Производительность**: <10% влияния на производительность запросов по сравнению с нефильтрованными запросами
|
|||
|
|
3. **Миграция**: 100% данных существующего экземпляра Neo4j успешно мигрированы без потерь
|
|||
|
|
4. **Удобство использования**: Все существующие шаблоны запросов работают с контекстом user/collection
|
|||
|
|
5. **Соответствие**: Полный журнал доступа к данным с контекстом user/collection
|
|||
|
|
|
|||
|
|
## Заключение
|
|||
|
|
|
|||
|
|
Предлагаемый подход на основе фильтрации свойств обеспечивает наилучший баланс между безопасностью, производительностью и удобством обслуживания для добавления изоляции пользователя/коллекции в Neo4j. Он соответствует существующим многопользовательским шаблонам TrustGraph, одновременно используя возможности Neo4j в области запросов и индексирования графов.
|
|||
|
|
|
|||
|
|
Это решение гарантирует, что бэкенд Neo4j TrustGraph соответствует тем же стандартам безопасности, что и другие бэкенды, обеспечивая при этом изоляцию данных, одновременно сохраняя гибкость и мощь запросов графов.
|