trustgraph/docs/tech-specs/neo4j-user-collection-isolation.tr.md
Alex Jenkins 8954fa3ad7 Feat: TrustGraph i18n & Documentation Translation Updates (#781)
Native CLI i18n: The TrustGraph CLI has built-in translation support
that dynamically loads language strings. You can test and use
different languages by simply passing the --lang flag (e.g., --lang
es for Spanish, --lang ru for Russian) or by configuring your
environment's LANG variable.

Automated Docs Translations: This PR introduces autonomously
translated Markdown documentation into several target languages,
including Spanish, Swahili, Portuguese, Turkish, Hindi, Hebrew,
Arabic, Simplified Chinese, and Russian.
2026-04-14 12:08:32 +01:00

14 KiB
Raw Blame History

layout title parent
default Neo4j Kullanıcı/Koleksiyon İzolasyonu Desteği Turkish (Beta)

Neo4j Kullanıcı/Koleksiyon İzolasyonu Desteği

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.

Problem Tanımı

Mevcut Neo4j üçlü depolama ve sorgu uygulaması, kullanıcı/koleksiyon izolasyonu eksikliği nedeniyle çoklu kiracılık güvenliği sorunlarına yol açmaktadır. Tüm üçlüler, kullanıcıların diğer kullanıcıların verilerine erişmesini veya koleksiyonları karıştırmasını engelleyen herhangi bir mekanizma olmadan aynı grafik alanında saklanmaktadır.

TrustGraph'taki diğer depolama arka uçlarından farklı olarak: Cassandra: Her kullanıcı için ayrı anahtarlar ve her koleksiyon için tablolar kullanır. Vektör depoları (Milvus, Qdrant, Pinecone): Koleksiyona özgü ad alanlarını kullanır. Neo4j: Şu anda tüm verileri tek bir grafik alanında paylaşır (güvenlik açığı).

Mevcut Mimari

Veri Modeli

Düğümler: :Node etiketi ile uri özelliği, :Literal etiketi ile value özelliği. İlişkiler: :Rel etiketi ile uri özelliği. Dizinler: Node.uri, Literal.value, Rel.uri.

Mesaj Akışı

Triples mesajları metadata.user ve metadata.collection alanlarını içerir. Depolama hizmeti kullanıcı/koleksiyon bilgilerini alır, ancak bunları yoksayar. Sorgu hizmeti TriplesQueryRequest içinde user ve collection'i bekler, ancak bunları yoksayar.

Mevcut Güvenlik Sorunu

# Any user can query any data - no isolation
MATCH (src:Node)-[rel:Rel]->(dest:Node) 
RETURN src.uri, rel.uri, dest.uri

Önerilen Çözüm: Özellik Tabanlı Filtreleme (Önerilen)

Genel Bakış

Tüm düğümlere ve ilişkilerlere user ve collection özelliklerini ekleyin, ardından tüm işlemleri bu özelliklere göre filtreleyin. Bu yaklaşım, güçlü bir izolasyon sağlarken sorgu esnekliğini ve geriye dönük uyumluluğu korur.

Veri Modeli Değişiklikleri

Gelişmiş Düğüm Yapısı

// Node entities
CREATE (n:Node {
  uri: "http://example.com/entity1",
  user: "john_doe", 
  collection: "production_v1"
})

// Literal entities  
CREATE (n:Literal {
  value: "literal value",
  user: "john_doe",
  collection: "production_v1" 
})

Gelişmiş İlişki Yapısı

// Relationships with user/collection properties
CREATE (src)-[:Rel {
  uri: "http://example.com/predicate1",
  user: "john_doe",
  collection: "production_v1"
}]->(dest)

Güncellenmiş İndeksler

// Compound indexes for efficient filtering
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);

// Maintain existing indexes for backwards compatibility (optional)
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);

Uygulama Değişiklikleri

Depolama Hizmeti (write.py)

Mevcut Kod:

def create_node(self, uri):
    summary = self.io.execute_query(
        "MERGE (n:Node {uri: $uri})",
        uri=uri, database_=self.db,
    ).summary

Güncellenmiş Kod:

def create_node(self, uri, user, collection):
    summary = self.io.execute_query(
        "MERGE (n:Node {uri: $uri, user: $user, collection: $collection})",
        uri=uri, user=user, collection=collection, database_=self.db,
    ).summary

Geliştirilmiş store_triples Metodu:

async def store_triples(self, message):
    user = message.metadata.user
    collection = message.metadata.collection
    
    for t in message.triples:
        self.create_node(t.s.value, user, collection)
        
        if t.o.is_uri:
            self.create_node(t.o.value, user, collection)  
            self.relate_node(t.s.value, t.p.value, t.o.value, user, collection)
        else:
            self.create_literal(t.o.value, user, collection)
            self.relate_literal(t.s.value, t.p.value, t.o.value, user, collection)

Sorgu Hizmeti (service.py)

Mevcut Kod:

records, summary, keys = self.io.execute_query(
    "MATCH (src:Node {uri: $src})-[rel:Rel {uri: $rel}]->(dest:Node) "
    "RETURN dest.uri as dest",
    src=query.s.value, rel=query.p.value, database_=self.db,
)

Güncellenmiş Kod:

records, summary, keys = self.io.execute_query(
    "MATCH (src:Node {uri: $src, user: $user, collection: $collection})-"
    "[rel:Rel {uri: $rel, user: $user, collection: $collection}]->"
    "(dest:Node {user: $user, collection: $collection}) "
    "RETURN dest.uri as dest",
    src=query.s.value, rel=query.p.value, 
    user=query.user, collection=query.collection,
    database_=self.db,
)

Göç Stratejisi

1. Aşama: Yeni Verilere Özellikler Ekleme

  1. Kullanıcı/koleksiyon özelliklerini yeni üçlülere eklemek için depolama hizmetini güncelleyin.
  2. Geriye dönük uyumluluğu korumak için sorgularda özelliklerin gerekli olmaması.
  3. Mevcut veriler erişilebilir durumda kalır, ancak izole edilmez.

2. Aşama: Mevcut Verilerin Taşınması

// Migrate existing nodes (requires default user/collection assignment)
MATCH (n:Node) WHERE n.user IS NULL
SET n.user = 'legacy_user', n.collection = 'default_collection';

MATCH (n:Literal) WHERE n.user IS NULL  
SET n.user = 'legacy_user', n.collection = 'default_collection';

MATCH ()-[r:Rel]->() WHERE r.user IS NULL
SET r.user = 'legacy_user', r.collection = 'default_collection';

3. Aşama: İzolasyonu Sağlama

  1. Sorgu hizmetini, kullanıcı/koleksiyon filtrelemesini gerektirecek şekilde güncelleyin.
  2. Doğru kullanıcı/koleksiyon bağlamı olmadan yapılan sorguları reddedecek doğrulama ekleyin.
  3. Eski veri erişim yollarını kaldırın.

Güvenlik Hususları

Sorgu Doğrulama

async def query_triples(self, query):
    # Validate user/collection parameters
    if not query.user or not query.collection:
        raise ValueError("User and collection must be specified")
    
    # All queries must include user/collection filters
    # ... rest of implementation

Parametre Enjeksiyonunu Önleme

Yalnızca parametreli sorguları kullanın Kullanıcı/toplam değerlerini izin verilen kalıplara karşı doğrulayın Neo4j özellik adı gereksinimleri için sanitizasyonu göz önünde bulundurun

Denetim Kaydı

logger.info(f"Query executed - User: {query.user}, Collection: {query.collection}, "
           f"Pattern: {query.s}/{query.p}/{query.o}")

Alternatif Yaklaşımlar

Seçenek 2: Etiket Tabanlı İzolasyon

Yaklaşım: Dinamik etiketler kullanın, örneğin User_john_Collection_prod

Avantajları: Etiket filtreleme yoluyla güçlü izolasyon Etiket indeksleriyle verimli sorgu performansıık veri ayrımı

Dezavantajları: Neo4j'nin etiket sayısı konusunda pratik sınırlamaları vardır (~1000'ler) Karmaşık etiket adı oluşturma ve temizleme Gerekli olduğunda koleksiyonlar arasında sorgu yapmak zordur

Uygulama Örneği:

CREATE (n:Node:User_john_Collection_prod {uri: "http://example.com/entity"})
MATCH (n:User_john_Collection_prod) WHERE n:Node RETURN n

Seçenek 3: Kullanıcı Başına Veritabanı

Yaklaşım: Her kullanıcı veya kullanıcı/koleksiyon kombinasyonu için ayrı Neo4j veritabanları oluşturun.

Avantajları: Tam veri izolasyonu Çapraz bulaşma riski yok Kullanıcı başına bağımsız ölçeklendirme

Dezavantajları: Kaynak yükü (her veritabanı bellek tüketir) Karmaşık veritabanı yaşam döngüsü yönetimi Neo4j Community Edition veritabanı limitleri Kullanıcılar arası analizler yapmak zordur.

Seçenek 4: Bileşik Anahtar Stratejisi

Yaklaşım: Tüm URI'ları ve değerleri kullanıcı/koleksiyon bilgileriyle ön ekleyin.

Avantajları: Mevcut sorgularla geriye dönük uyumluluk Basit uygulama Şema değişiklikleri gerektirmez

Dezavantajları: URI kirliliği, veri anlamını etkiler Daha az verimli sorgular (dize ön eki eşleştirme) RDF/semantik web standartlarını ihlal eder

Uygulama Örneği:

def make_composite_uri(uri, user, collection):
    return f"usr:{user}:col:{collection}:uri:{uri}"

Uygulama Planı

Aşama 1: Temel (1. Hafta)

  1. Depolama hizmetini, kullanıcı/koleksiyon özelliklerini kabul edecek ve saklayacak şekilde güncelleyin.
  2. Verimli sorgulama için bileşik indeksler ekleyin.
  3. Geriye dönük uyumluluk katmanı uygulayın.
  4. Yeni işlevler için birim testleri oluşturun.

Aşama 2: Sorgu Güncellemeleri (2. Hafta)

  1. Tüm sorgu kalıplarını, kullanıcı/koleksiyon filtrelerini içerecek şekilde güncelleyin.
  2. Sorgu doğrulaması ve güvenlik kontrolleri ekleyin.
  3. Entegrasyon testlerini güncelleyin.
  4. Filtrelenmiş sorgularla performans testi yapın.

Aşama 3: Göç ve Dağıtım (3. Hafta)

  1. Mevcut Neo4j örnekleri için veri geçiş betikleri oluşturun.
  2. Dağıtım belgeleri ve çalıştırma kılavuzları.
  3. İzolasyon ihlalleri için izleme ve uyarı.
  4. Çok sayıda kullanıcı/koleksiyonla uçtan uca testler yapın.

Aşama 4: Güçlendirme (4. Hafta)

  1. Eski uyumluluk modunu kaldırın.
  2. Kapsamlı denetim kaydı ekleyin.
  3. Güvenlik incelemesi ve sızma testi.
  4. Performans optimizasyonu.

Test Stratejisi

Birim Testleri

def test_user_collection_isolation():
    # Store triples for user1/collection1
    processor.store_triples(triples_user1_coll1)
    
    # Store triples for user2/collection2  
    processor.store_triples(triples_user2_coll2)
    
    # Query as user1 should only return user1's data
    results = processor.query_triples(query_user1_coll1)
    assert all_results_belong_to_user1_coll1(results)
    
    # Query as user2 should only return user2's data
    results = processor.query_triples(query_user2_coll2)
    assert all_results_belong_to_user2_coll2(results)

Entegrasyon Testleri

Eş zamanlı veri içeren çok kullanıcılı senaryolar Koleksiyonlar arası sorgular (başarısız olmalıdır) Mevcut verilerle yapılan geçiş testleri Büyük veri kümeleriyle yapılan performans ölçümleri

Güvenlik Testleri

Diğer kullanıcıların verilerine erişme girişimleri Kullanıcı/koleksiyon parametrelerine yönelik SQL enjeksiyonu tarzı saldırılar Çeşitli sorgu kalıpları altında tam izolasyonu doğrulayın

Performans Hususları

İndeks Stratejisi

Optimum filtreleme için (user, collection, uri) üzerinde birleşik indeksler Bazı koleksiyonların çok daha büyük olması durumunda, kısmi indeksleri göz önünde bulundurun İndeks kullanımını ve sorgu performansını izleyin

Sorgu Optimizasyonu

Filtrelenmiş sorgularda indeks kullanımını doğrulamak için EXPLAIN'i kullanın Sık erişilen veriler için sorgu sonucu önbelleklemesini göz önünde bulundurun Çok sayıda kullanıcı/koleksiyonla bellek kullanımını analiz edin

Ölçeklenebilirlik

Her kullanıcı/koleksiyon kombinasyonu, ayrı veri adacıkları oluşturur Veritabanı boyutunu ve bağlantı havuzu kullanımını izleyin Gerekirse, yatay ölçeklendirme stratejilerini göz önünde bulundurun

Güvenlik ve Uyumluluk

Veri İzolasyon Garantileri

Fiziksel: Tüm kullanıcı verileri, açık kullanıcı/koleksiyon özellikleri ile saklanır Mantıksal: Tüm sorgular, kullanıcı/koleksiyon bağlamıyla filtrelenir Erişim Kontrolü: Hizmet seviyesindeki doğrulama, yetkisiz erişimi engeller

Denetim Gereksinimleri

Tüm veri erişimlerini kullanıcı/koleksiyon bağlamıyla kaydedin Geçiş etkinliklerini ve veri hareketlerini izleyin İzolasyon ihlali girişimlerini izleyin

Uyumluluk Hususları

GDPR: Kullanıcıya özel verileri bulma ve silme yeteneğinin geliştirilmesi SOC2: Açık veri izolasyonu ve erişim kontrolleri HIPAA: Sağlık verileri için güçlü kiracı izolasyonu

Riskler ve Önlemler

Risk Etki Olasılık Önlem
Sorguda eksik kullanıcı/koleksiyon filtresi Yüksek Orta Zorunlu doğrulama, kapsamlı testler
Performans düşüşü Orta Düşük İndeks optimizasyonu, sorgu analizi
Geçiş sırasında veri bozulması Yüksek Düşük Yedekleme stratejisi, geri alma prosedürleri
Karmaşık, koleksiyonlar arası sorgular Orta Orta Sorgu kalıplarını belgeleyin, örnekler sağlayın

Başarı Kriterleri

  1. Güvenlik: Üretimde, kullanıcılar arası veri erişiminin sıfır olması
  2. Performans: Filtrelenmemiş sorgulara kıyasla %10'dan düşük sorgu performans etkisi
  3. Geçiş: Mevcut verilerin %100'ü, kayıp olmadan başarıyla geçirilmiştir
  4. Kullanılabilirlik: Tüm mevcut sorgu kalıpları, kullanıcı/koleksiyon bağlamıyla çalışır
  5. Uyumluluk: Kullanıcı/koleksiyon verilerine yapılan tüm erişimlerin tam denetim kaydı

Sonuç

Özellik tabanlı filtreleme yaklaşımı, Neo4j'ye kullanıcı/koleksiyon izolasyonu eklemek için güvenlik, performans ve bakım açısından en iyi dengeyi sağlar. TrustGraph'ın mevcut çok kiracılık kalıplarıyla uyumludur ve aynı zamanda Neo4j'nin grafik sorgulama ve indeksleme konusundaki güçlü yönlerinden yararlanır.

Bu çözüm, TrustGraph'ın Neo4j arka ucunun, diğer depolama arka uçları ile aynı güvenlik standartlarını karşılamasını sağlar ve veri izolasyonu güvenlik açıklarını önlerken, grafik sorgularının esnekliğini ve gücünü korur.