Aktivierung fein abgestufter Zugriffskontrolle mit Milvus Row-Level RBAC
Warum Zugriffskontrolle in modernen Datensystemen wichtig ist
Zugriffskontrolle ist eine der drängendsten Herausforderungen im modernen Datenmanagement, insbesondere für Unternehmen. Wenn Organisationen wachsen, besonders in Umgebungen mit mehreren Abteilungen und Rollen, sind sowohl robuste Sicherheit als auch nahtloser Zugriff entscheidend. Sehen wir uns zwei Beispiele an, bei denen Zugriffskontrolle besonders wichtig ist.
Gesundheitswesen: Datenschutz und Zusammenarbeit in Einklang bringen
Im Gesundheitswesen müssen Organisationen die Privatsphäre von Patienten schützen und gleichzeitig die Zusammenarbeit zwischen medizinischen Fachkräften fördern. Stellen Sie sich einen Arzt vor, der vollständigen Zugriff auf die Krankenakte eines Patienten benötigt, um eine genaue Diagnose und einen Behandlungsplan zu erstellen. Dieser Arzt sollte jedoch nicht auf die Akten von Patienten zugreifen können, die er nicht behandelt. Um diesem Bedarf gerecht zu werden, ist eine fein abgestufte Zugriffskontrolle unerlässlich, die sicherstellt, dass nur autorisiertes medizinisches Personal sensible Patientendaten einsehen kann. Dieses Maß an Kontrolle hilft Organisationen, strenge Vorschriften wie HIPAA einzuhalten und gleichzeitig die Privatsphäre zu schützen.
Finanzwesen: Schutz sensibler Daten
Die Finanzbranche steht vor ähnlichen Herausforderungen, wenn es um Zugriffskontrolle geht. Banken und Finanzinstitute verarbeiten riesige Mengen sensibler Daten—Kontodetails, Transaktionsverläufe, Kredit-Scores usw. Diese Daten werden häufig in Vektoren umgewandelt und in einer Vektordatenbank wie Milvus für Betrugserkennung, Risikoanalyse und personalisierte Kundenerlebnisse gespeichert. Ohne geeignete Zugriffskontrollen könnten sensible Daten unbefugten Parteien offengelegt werden, was erhebliche finanzielle und rechtliche Konsequenzen nach sich ziehen würde.
Fein abgestufte Kontrollen, wie Berechtigungen auf Zeilenebene, ermöglichen es Institutionen, den Zugriff auf bestimmte Nutzer zu beschränken—zum Beispiel kann ein Kundenbetreuer nur auf die Kontodaten seiner eigenen Kunden zugreifen. Selbst umfassenderer Zugriff, der von Risikomanagement-Teams benötigt wird, kann sorgfältig überwacht und eingeschränkt werden, um Missbrauch zu verhindern.
Milvus Row-level RBAC: eine fein abgestufte Lösung für Zugriffskontrolle
Role-Based Access Control (RBAC) ist ein Sicherheitsmodell, bei dem der Zugriff auf Ressourcen basierend auf der Rolle eines Nutzers innerhalb einer Organisation gewährt wird. Rollen definieren Berechtigungen, und Nutzer erben diese Berechtigungen, wodurch eine sichere und effiziente Verwaltung von Zugriffsrechten gewährleistet wird.
Milvus ist eine quelloffene, leistungsstarke Vektordatenbank, die für Skalierbarkeit entwickelt wurde. Sie eignet sich perfekt für die Entwicklung von Modell-KI-Anwendungen wie retrieval augmented generation (RAG), semantischen Suchmaschinen, Empfehlungssystemen und Chatbots. Milvus bietet eine fein abgestufte RBAC-Lösung auf Basis eines Berechtigungsmodells, das Bitmap-Indizierung verwendet, um Zugriffskontrolle auf Zeilenebene zu ermöglichen. Diese Funktion ermöglicht es Ihnen, den Zugriff auf bestimmte Milvus-Ressourcen und Berechtigungen basierend auf den Rollen und Privilegien von Nutzern zu steuern. Derzeit ist Milvus RBAC nur in Python und Java verfügbar.
Milvus RBAC bietet mehrere Vorteile:
Geschwindigkeit und Effizienz: Sie ermöglicht das schnelle Abfragen von Berechtigungen in großen Datensätzen.
Flexibilität: Sie passt sich an, wenn sich Rollen und Verantwortlichkeiten weiterentwickeln, und stellt sicher, dass Berechtigungen auf dem neuesten Stand bleiben.
RBAC-Grundlagen
Rollen und Berechtigungen
Rolle: Stellt die Rolle eines Nutzers im System dar, wobei jeder Rolle ein bestimmter Satz von Berechtigungen zugewiesen ist.
Berechtigung: Gibt Zugriffsrechte auf einzelne Zeilen in einer Datenverbindung (Tabelle) innerhalb von Milvus an, wie etwa die Möglichkeit, bestimmte Daten zu lesen, zu schreiben oder zu löschen.
Aufbau des Bitmap-Index
Bitmap-Indizes sind die Grundlage dieses Zugriffskontrollmechanismus:
Jede Rolle ist mit einer Bitmap verknüpft, die die Zeilen angibt, auf die sie zugreifen kann.
Die Länge der Bitmap entspricht der Anzahl der Zeilen in der Verbindung:
Eine 1 an einer Position bedeutet, dass die Rolle Zugriff auf diese Zeile hat.
Eine 0 bedeutet keinen Zugriff.
Verwendung von Bitmap-Indizes
Berechtigungen gewähren: Um einer Rolle Zugriff auf eine Zeile zu geben, setzen Sie das entsprechende Bit in der Bitmap der Rolle auf 1.
Berechtigungen prüfen: Um zu überprüfen, ob eine Rolle auf eine bestimmte Zeile zugreifen kann, prüfen Sie einfach, ob das entsprechende Bit in der Bitmap 1 ist.
Angenommen, wir haben eine Verbindung (Tabelle), Collection A, die Unternehmenswissen speichert. Jede Zeile stellt Inhalte dar, die durch doc_id und die zugehörige Wissensdatenbank, kb_id, identifiziert werden.
| Zeilen-ID | PK | Daten | doc_id | kb_id | Rolle |
|---|---|---|---|---|---|
| 1 | 0 | Daten A | 1 | 1 | role1 |
| 2 | 1 | Daten B | 1 | 1 | role1 |
| 3 | 2 | Daten C | 2 | 1 | role1 |
| 4 | 3 | Daten D | 2 | 1 | role1 |
| 5 | 4 | Daten E | 3 | 2 | role2 |
Rollen sind wie folgt definiert:
Rolle 1: Kann auf die Zeilen 1, 2, 3 und 4 zugreifen (
kb_id = 1).Rolle 2: Kann auf Zeile 5 zugreifen (
kb_id = 2).
Abfrageoperationen
Wenn ein Benutzer die Daten abfragt, wird die Bitmap seiner Rolle mit den Abfragebedingungen kombiniert, um Zeilen zu filtern, auf die er zugreifen darf. Wenn beispielsweise ein Benutzer mit Rolle 1 „alle Daten“ abfragt, gibt seine Bitmap 11110 die Zeilen 1–4 zurück (Data A, Data B, Data C und Data D).
Berechtigungen aktualisieren
Um den Zugriff für eine Rolle hinzuzufügen oder zu entfernen, aktualisieren Sie einfach das entsprechende Bit in der Bitmap der Rolle. Wenn Sie beispielsweise ein Bit auf 1 setzen, wird Zugriff gewährt, während das Setzen auf 0 ihn entzieht.
Vorteile und Überlegungen
Effizienz: Bitmap-Operationen sind schnell und gut geeignet, um Berechtigungen in großen Datensätzen zu verwalten.
Geringer Speicher-Overhead: Bitmaps verbrauchen nur minimalen Speicher, selbst bei Datensätzen mit Millionen von Zeilen.
Flexibilität: Bitmap-Indizes unterstützen komplexe Abfragebedingungen und Kombinationen, wodurch sie sich sehr gut an verschiedene Anwendungsfälle anpassen lassen.
Demonstration von Milvus Row-level RBAC
In diesem Abschnitt demonstrieren wir, wie Milvus den Zugriff auf verschiedene Wissensdatenbanken eines großen Unternehmens verwaltet.
Anwendungsfall: Ein Enterprise-RAG mit mehreren Wissensdatenbanken
In einem großen Unternehmen pflegen verschiedene Abteilungen häufig separate Wissensdatenbanken – einige öffentlich, andere vertraulich – für ihre von Milvus unterstützte RAG-Anwendung. Um Berechtigungen über diese Wissensdatenbanken hinweg effektiv zu verwalten, implementieren wir rollenbasierte Zugriffskontrollen (RBAC) auf Basis von Entitäten oder Dokumenten. Beispielsweise könnte eine Super-Admin-Rolle (admin) den Zugriff überwachen, mit zusätzlichen Rollen für bestimmte Geschäftsbereiche wie CEO, finance, sales und developer, die jeweils Zugriff auf unterschiedliche Datensätze haben.
Abbildung: Zugriffskontrolle für verschiedene Rollen in einem großen Unternehmen
Definieren von Berechtigungsspalten
Um den Zugriff zu verwalten, speichern wir Berechtigungsdaten in einer Array-Spalte innerhalb von Milvus. Diese Spalte definiert, welche Rollen Zugriff auf welche Datenzeilen haben. Der field_name für diese Berechtigungsspalte ist anpassbar, und die Größe des Arrays kann je nach Bedarf des Benutzers angepasst werden. Für diese Spalte wird dann ein BITMAP-Index erstellt, wodurch Berechtigungsprüfungen effizient werden.
Unten sehen Sie, wie diese Einrichtung im Code erfolgt:
# 1. Set up a Milvus client
client = MilvusClient(
uri=CLUSTER_ENDPOINT
)
# 2. Create a collection
schema = MilvusClient.create_schema(
auto_id=False,
enable_dynamic_field=False,
)
# 3. define schema
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="data", datatype=DataType.VARCHAR, max_length=100)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=128)
# 4. add security column
schema.add_field(field_name="security_group", datatype=DataType.ARRAY,
element_type=DataType.VARCHAR, max_capacity=10, max_length=100)
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="vector",
index_type="IVF_FLAT",
metric_type="L2",
params={"nlist": 1024}
)
# 5. Bitmap-Index für security-Spalte erstellen
index_params.add_index(field_name="security_group",
index_type="BITMAP")
# 6. Collection erstellen
client.create_collection(
collection_name="test_collection",
schema=schema,
index_params=index_params
)
Schreibberechtigungen
Beim Einfügen neuer Daten weisen Sie Berechtigungen zu, indem Sie angeben, welche Rollen auf jede Zeile zugreifen können. Dies kann erfolgen, indem die entsprechende(n) Rolle(n) in die Spalte security_group geschrieben werden.
Hier ist ein Beispiel dafür, wie es funktioniert:
data =[]
data.append({
"id": random.randint(0, 100000),
"vector": [ random.uniform(-1, 1) for _ in range(128) ],
"data": "data" + str(random.randint(0,100000)),
# ceo-Rolle kann lesen
"security_group": ["ceo"]
})
data.append({
"id": random.randint(0, 100000),
"vector": [ random.uniform(-1, 1) for _ in range(128) ],
"data": "data" + str(random.randint(0,100000)),
# finance-Rolle kann lesen
"security_group": ["finance"]
})
data.append({
"id": random.randint(0, 100000),
"vector": [ random.uniform(-1, 1) for _ in range(128) ],
"data": "data" + str(random.randint(0,100000)),
# sowohl sales als auch developer können lesen
"security_group": ["sales", "finance"]
})
res = client.insert(collection_name="test_collection", data=data)
Abfrageberechtigung
Bei der Durchführung von Such- oder Abfrageoperationen ist es wichtig, die Ergebnisse so einzuschränken, dass nur die Daten angezeigt werden, auf die die spezifische Rolle eines Benutzers Zugriff hat. Daten außerhalb der zugelassenen Rollen des Benutzers werden in den Abfrageergebnissen ausgeblendet. So kann dies umgesetzt werden:
Abfragen von Daten basierend auf Rollenberechtigungen
In den folgenden Beispielen verwenden wir die Funktion array_contains(), um Daten basierend auf rollenspezifischen Berechtigungen zu filtern. Jede Abfrage ruft nur die Daten ab, die die jeweilige Rolle sehen darf.
res = client.query(
collection_name="test_collection",
# Daten abfragen, die nur für die CEO-Rolle sichtbar sind
filter='array_contains(security_group, "ceo")',
output_fields=["id", "data", "security_group"],
)
print("ceo role read:")
print(res)
res = client.query(
collection_name="test_collection",
# Daten abfragen, die nur für die Sales-Rolle sichtbar sind
filter='array_contains(security_group, "sales")',
output_fields=["id", "data", "security_group"],
)
print("sales role read:")
print(res)
res = client.query(
collection_name="test_collection",
# Daten abfragen, die nur für die Developer-Rolle sichtbar sind
filter='array_contains(security_group, "develop")',
output_fields=["id", "data", "security_group"],
)
print("developer role read:")
print(res)
res = client.query(
collection_name="test_collection",
# Daten abfragen, die entweder für die Developer- oder die CEO-Rolle sichtbar sind
filter='array_contains_any(security_group, ["develop", "ceo"])',
output_fields=["id", "data", "security_group"],
)
print("developer or ceo role read:")
print(res)
Hier ist ein Beispiel dafür, wie die Ausgabe aussehen würde:
ceo role read:
data: [
"{'security_group': ['ceo'], 'id': 3443, 'data': 'data35077'}",
"{'security_group': ['ceo'], 'id': 12181, 'data': 'data99090'}",
"{'security_group': ['ceo'], 'id': 16551, 'data': 'data74619'}",
"{'security_group': ['ceo'], 'id': 24466, 'data': 'data1373'}", ...
sales role read:
data: [
"{'data': 'data75305', 'security_group': ['sales'], 'id': 9122}",
"{'data': 'data61054', 'security_group': ['sales'], 'id': 20087}",
"{'data': 'data47948', 'security_group': ['sales', 'develop'], 'id': 21726}",
"{'data': 'data8596', 'security_group': ['sales'], 'id': 40090}", ...
developer role read:
data: [
"{'data': 'data1515', 'security_group': ['develop'], 'id': 6429}",
"{'data': 'data47031', 'security_group': ['develop'], 'id': 10953}",
"{'data': 'data47948', 'security_group': ['sales', 'develop'], 'id': 21726}",
"{'data': 'data86894', 'security_group': ['develop'], 'id': 56980}"], ...
developer or ceo role read:
data: [
"{'data': 'data35077', 'security_group': ['ceo'], 'id': 3443}",
"{'data': 'data1515', 'security_group': ['develop'], 'id': 6429}",
"{'data': 'data47031', 'security_group': ['develop'], 'id': 10953}",
"{'data': 'data99090', 'security_group': ['ceo'], 'id': 12181}", ...
Dieser Ansatz stellt sicher, dass jede Rolle genau die Daten sieht, zu deren Anzeige sie berechtigt ist, während alle nicht autorisierten Daten verborgen bleiben. Sie können außerdem mehrere Rollen im security_group-Array stapeln, was eine flexible und effiziente Berechtigungsverwaltung ermöglicht.
Benutzerdefinierte Filter mit rollenbasiertem Zugriff
In manchen Fällen müssen Benutzer beim Abfragen von Daten möglicherweise benutzerdefinierte Filter anwenden. Diese Filter können mit rollenbasiertem Zugriff kombiniert werden, um Suchen zu verfeinern. Durch die Anwendung der rollenbasierten Zugriffskontrolle zusammen mit benutzerdefinierten Filterbedingungen können wir sicherstellen, dass Benutzer nur Daten abrufen, die sie sowohl basierend auf der Rolle als auch auf den spezifischen Abfragekriterien sehen dürfen.
Zum Beispiel:
res = client.query(
collection_name="test_collection",
# Sales role queries data with the filter "pk in [1, 3, 5]"
filter='pk in [1, 3, 5] && array_contains(security_group, "sales")',
output_fields=["id", "data", "security_group"],
)
res = client.query(
collection_name="test_collection",
# Developer role queries data with the filter "pk > 10"
filter='pk > 10 && array_contains(security_group, "develop")',
output_fields=["id", "data", "security_group"],
)
In diesen Beispielen prüfen die Abfragen nicht nur die rollenbasierten Berechtigungen, sondern wenden auch zusätzliche Filter (wie pk in [1, 3, 5] oder pk > 10) an, um die Ergebnisse basierend auf bestimmten Kriterien einzugrenzen. Diese Flexibilität ermöglicht es Benutzern, hochgradig zielgerichtete Abfragen zu erstellen und gleichzeitig eine strenge Kontrolle über den Datenzugriff aufrechtzuerhalten.
Berechtigungen aktualisieren
Es gibt Zeiten, in denen Sie Berechtigungen ändern müssen—sei es, um einer bestimmten Rolle Zugriff auf eine bestimmte Datenzeile zu gewähren, oder um diesen Zugriff zu entfernen. Milvus macht diesen Prozess mit seiner upsert-API einfach, mit der Sie die mit einer Datenzeile verbundenen Berechtigungen aktualisieren können.
Gehen wir durch, wie Sie diese API verwenden können, um Berechtigungen für eine bestimmte Zeile zu ändern.
Beispiel: Aktualisieren von Berechtigungen für eine Datenzeile
Um die Berechtigungen für eine Zeile zu aktualisieren, passen Sie einfach das Feld security_group an. In diesem Beispiel fügen wir die Rolle "sales" zu einer Zeile hinzu, die zuvor nur für die Rolle "finance" zugänglich war.
upsert_row_update = {
"id": 101,
"vector": upsert_vector,
"data": upsert_data,
# update role
"security_group": ["finance", "sales"]
}
res = client.upsert(
collection_name="test_collection",
data=upsert_row_update)
Ergebnis:
Vor dem Upsert sah die Zeile mit pk = 101 so aus:
pk = 101:
data: [" {'id': 101,
'data': 'data63309',
'vector': [0.38069534, 0.15088418, -0.6266929, -0.6038463, 0.2516377...],
'security_group': ['finance'],"]
nach Upsert
data: ["{'id': 101,
'data': 'data63309',
'vector': [0.38069534, 0.15088418, -0.6266929, -0.6038463, 0.2516377...],
'security_group': ['finance', 'sales']}"]
Durch die Verwendung der Array-Spalte security_group und der Bitmap-Index-Filterung haben wir eine solide Grundlage für die Lesezugriffskontrolle auf Zeilenebene geschaffen, die es uns ermöglicht, Berechtigungen während Abfragen effektiv zu verwalten. Diese Methode bietet starke Leistung und eine fein abgestufte Kontrolle über Zugriffsrechte. Sie erfordert jedoch einen stärker manuellen Ansatz von Administratoren, die Berechtigungen beim Einfügen oder Aktualisieren von Daten sorgfältig verwalten und beim Erstellen von Tabellen eine gut durchdachte Berechtigungsstrategie sicherstellen müssen.
Fazit
Die Implementierung fein abgestufter Zugriffskontrolle ist ein kritischer Bestandteil des modernen Datenmanagements, insbesondere für Branchen, die mit sensiblen Informationen wie Gesundheitswesen und Finanzen arbeiten. Milvus bietet zeilenbasiertes RBAC (Role-Based Access Control), eine robuste Lösung zur präzisen und effizienten Verwaltung des Datenzugriffs.
Dieser Ansatz erhöht nicht nur die Sicherheit, sondern bietet auch Flexibilität für sich entwickelnde Geschäftsanforderungen und stellt sicher, dass Zugriffsrichtlinien angepasst werden können, wenn sich Rollen und Verantwortlichkeiten ändern. Mit seinen leistungsstarken Tools und seinem flexiblen Berechtigungsmodell befähigt Milvus Organisationen, hochsichere, skalierbare Datensysteme zu erstellen, die regulatorische Anforderungen erfüllen und gleichzeitig den richtigen Personen nahtlosen Zugriff bieten.
Für ein noch dynamischeres Berechtigungsmanagement und Vererbung verfügt Zilliz Cloud, der vollständig verwaltete Dienst von Milvus, über noch feinere Berechtigungsfunktionen. Diese Verbesserungen werden nicht nur die administrative Effizienz steigern, sondern auch größere Flexibilität bieten, wodurch es einfacher wird, ein breiteres Spektrum an Geschäftsanforderungen zu erfüllen. Weitere Informationen zu Zilliz Cloud RBAC finden Sie in der Dokumentation.
Weiterführende Lektüre
Weiterlesen

How Zilliz Ended Up at the Center of NVIDIA’s Unstructured Data Story at GTC 2026
If unstructured data is the context of AI, then the ceiling of AI applications will be set not just by models, but by how mature the infrastructure for unstructured data becomes.

How Zilliz Saw the Future of Vector Databases—and Built for Production
An inside look at how Zilliz built vector databases for real-world use, focusing on scalability, stability, and running them reliably at scale.

Proactive Monitoring for Vector Database: Zilliz Cloud Integrates with Datadog
we're excited to announce Zilliz Cloud's integration with Datadog, enabling comprehensive monitoring and observability for your vectorDB deployments.



