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.
14 KiB
| 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
- Kullanıcı/koleksiyon özelliklerini yeni üçlülere eklemek için depolama hizmetini güncelleyin.
- Geriye dönük uyumluluğu korumak için sorgularda özelliklerin gerekli olmaması.
- 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
- Sorgu hizmetini, kullanıcı/koleksiyon filtrelemesini gerektirecek şekilde güncelleyin.
- Doğru kullanıcı/koleksiyon bağlamı olmadan yapılan sorguları reddedecek doğrulama ekleyin.
- 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ı Açı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)
- Depolama hizmetini, kullanıcı/koleksiyon özelliklerini kabul edecek ve saklayacak şekilde güncelleyin.
- Verimli sorgulama için bileşik indeksler ekleyin.
- Geriye dönük uyumluluk katmanı uygulayın.
- Yeni işlevler için birim testleri oluşturun.
Aşama 2: Sorgu Güncellemeleri (2. Hafta)
- Tüm sorgu kalıplarını, kullanıcı/koleksiyon filtrelerini içerecek şekilde güncelleyin.
- Sorgu doğrulaması ve güvenlik kontrolleri ekleyin.
- Entegrasyon testlerini güncelleyin.
- Filtrelenmiş sorgularla performans testi yapın.
Aşama 3: Göç ve Dağıtım (3. Hafta)
- Mevcut Neo4j örnekleri için veri geçiş betikleri oluşturun.
- Dağıtım belgeleri ve çalıştırma kılavuzları.
- İzolasyon ihlalleri için izleme ve uyarı.
- Çok sayıda kullanıcı/koleksiyonla uçtan uca testler yapın.
Aşama 4: Güçlendirme (4. Hafta)
- Eski uyumluluk modunu kaldırın.
- Kapsamlı denetim kaydı ekleyin.
- Güvenlik incelemesi ve sızma testi.
- 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
- Güvenlik: Üretimde, kullanıcılar arası veri erişiminin sıfır olması
- Performans: Filtrelenmemiş sorgulara kıyasla %10'dan düşük sorgu performans etkisi
- Geçiş: Mevcut verilerin %100'ü, kayıp olmadan başarıyla geçirilmiştir
- Kullanılabilirlik: Tüm mevcut sorgu kalıpları, kullanıcı/koleksiyon bağlamıyla çalışır
- 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.