14 KiB
| layout | title | parent |
|---|---|---|
| default | Поддержка изоляции пользователя/коллекции в Neo4j | 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, но игнорирует их
Текущая проблема безопасности
# Любой пользователь может запросить любые данные - нет изоляции
MATCH (src:Node)-[rel:Rel]->(dest:Node)
RETURN src.uri, rel.uri, dest.uri
Предлагаемое решение: Фильтрация на основе свойств (Рекомендуется)
Обзор
Добавьте свойства user и collection ко всем узлам и отношениям, а затем фильтруйте все операции по этим свойствам. Этот подход обеспечивает надежную изоляцию, сохраняя при этом гибкость запросов и обратную совместимость.
Изменения в модели данных
Улучшенная структура узла
// Узел
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"
})
Улучшенная структура отношений
// Отношения с свойствами user/collection
CREATE (src)-[:Rel {
uri: "http://example.com/predicate1",
user: "john_doe",
collection: "production_v1"
}]->(dest)
Обновленные индексы
// Комплексные индексы для эффективного фильтра
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)
Текущий код:
def create_node(self, uri):
summary = self.io.execute_query(
"MERGE (n:Node {uri: $uri})",
uri=uri, database_=self.db,
).summary
Обновленный код:
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)
- Обновление сервиса хранения для приема и хранения свойств user/collection
- Создание комплексных индексов для эффективного запроса
- Реализация обратной совместимости
- Создание модульных тестов для новой функциональности
Этап 2: Обновление запросов (Неделя 2)
- Обновление всех шаблонов запросов для включения фильтров user/collection
- Добавление валидации запросов и мер безопасности
- Обновление интеграционных тестов
- Тестирование производительности с запросами, отфильтрованными
Этап 3: Миграция и развертывание (Неделя 3)
- Создание скриптов миграции для существующих экземпляров Neo4j
- Документация и руководства по развертыванию
- Мониторинг и оповещения об изоляции
- Тестирование конвейера
Этап 4: Усиление (Неделя 4)
- Удаление режима обратной совместимости
- Добавление комплексной журнализации
- Проверка безопасности и тестирование на проникновение
- Оптимизация производительности
Стратегия тестирования
Модульные тесты
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 в запросе | Высокий | Средняя | Обязательная валидация, комплексное тестирование |
| Снижение производительности | Средний | Низкая | Оптимизация индекса, профилирование запросов |
| Повреждение данных во время миграции | Высокий | Низкая | Стратегия резервного копирования, процедуры отката |
| Уязвимость для безопасности | Высокий | Низкая | Проверка безопасности, тестирование на проникновение |
Критерии успеха
- Безопасность: Полная изоляция данных между пользователями в производственной среде
- Производительность: <10% влияния на производительность запросов по сравнению с нефильтрованными запросами
- Миграция: 100% данных существующего экземпляра Neo4j успешно мигрированы без потерь
- Удобство использования: Все существующие шаблоны запросов работают с контекстом user/collection
- Соответствие: Полный журнал доступа к данным с контекстом user/collection
Заключение
Предлагаемый подход на основе фильтрации свойств обеспечивает наилучший баланс между безопасностью, производительностью и удобством обслуживания для добавления изоляции пользователя/коллекции в Neo4j. Он соответствует существующим многопользовательским шаблонам TrustGraph, одновременно используя возможности Neo4j в области запросов и индексирования графов.
Это решение гарантирует, что бэкенд Neo4j TrustGraph соответствует тем же стандартам безопасности, что и другие бэкенды, обеспечивая при этом изоляцию данных, одновременно сохраняя гибкость и мощь запросов графов.