Das Suchen war zwei Wochen. Das Nicht-Zeigen drei Monate.
Ein Fertigungsbetrieb wollte eine Suche über sein gesamtes Firmenwissen — ohne SaaS für 50–200 k€/Jahr und ohne Daten in die US-Cloud. Selbst gebaut auf Meilisearch, on-premise. Die eigentliche Arbeit war nicht das Finden, sondern das Nicht-Zeigen.
Der Trailer (für Eilige)
Ein Fertigungsbetrieb wollte eine Suche über sein gesamtes Firmenwissen – ohne die fertigen SaaS-Produkte für 50–200 k€ im Jahr und ohne seine Daten in eine US-Cloud zu geben. Also selbst gebaut, auf Meilisearch, on-premise. Und dabei die eine Lektion gelernt, die niemand auf dem Zettel hatte:
- Das Suchen war zwei Wochen Arbeit. Das Nicht-Zeigen drei Monate. Die harte Nuss ist nicht, Treffer zu finden – sondern zu verhindern, dass jemand einen Treffer sieht, den er nicht sehen darf.
- Der Titel ist schon der Inhalt.
Kündigung_Schmidt.docxverrät alles, ohne dass man die Datei öffnet. Deshalb: was du nicht sehen darfst, existiert für dich gar nicht – kein Titel, kein Snippet. - Ein Dutzend Datenquellen, ein Dutzend unverträgliche Rechtemodelle (Dateiserver, Wiki, ERP, Cloud, Code, Chat, Mail …), die man verlustarm auf ein gemeinsames Modell zwingen muss.
- Souveränität ist kein Marketing-Wort, sondern eine Architektur: die Daten verlassen das Haus nicht, für unter 1 k€/Jahr Hosting.
Wer's genau wissen will, liest weiter. Wer nur die Fakten braucht, springt ans Ende zu den Hardfacts. Alle anderen bekommen jetzt eine Geschichte.
Ein Betrieb, der sein eigenes Wissen verlegt hat
Es beginnt, wie es immer beginnt: mit einem Menschen, der etwas sucht. Ein Angebot von vor drei Jahren, für genau diesen Kunden. Es existiert, ganz sicher – nur weiß niemand mehr, ob im ERP, im Wiki, auf dem Laufwerk Vertrieb_2, im Postfach des Kollegen, der letztes Jahr gegangen ist, oder in dieser einen PDF, die jemand mal „schnell" in die Cloud geschoben hat. Man fragt drei Leute. Man findet es nicht. Man schreibt es neu.
Das ist der Moment, in dem jemand „wir brauchen eine Suche" sagt und alle nicken. Ein Index über alles, eine Suchzeile, wie bei Google, nur intern. Kann ja nicht schwer sein – Google macht das für das ganze Internet und will dafür nicht mal Geld.
Und da wären wir bei der Pointe, die ich gleich an den Anfang stelle, weil sie die ganze Geschichte trägt: Das Suchen war nie das Problem. Das Problem war eine einzige Frage. Und die lautet nicht „wer darf das finden?", sondern „wer darf das nicht?".
Die Sirenen heißen Glean, Coveo und Mindbreeze
Man muss das ja nicht selbst bauen, es gibt einen Markt. Mindbreeze, aus Österreich, tadellos, DSGVO-konform – und ruft dafür fünfzig- bis zweihunderttausend Euro auf. Im Jahr. Für eine Suchzeile. Glean und Coveo, die amerikanischen Platzhirsche, mit Oberflächen zum Niederknien, und einem kleinen Detail im Kleingedruckten: Die Server stehen jenseits des Atlantiks. Man vertraut also seine Konstruktionsdaten und Personalakten einem US-Anbieter an, in einer Rechtslage, die der Europäische Gerichtshof 2020 mit Schrems II für kaputt erklärt hat, und unterschreibt zur Beruhigung „Standardvertragsklauseln" – ungefähr so tröstlich, wie sich beim Fallschirmspringen einen Zettel in die Tasche zu stecken, auf dem „bitte öffnen" steht.
Verstehen Sie mich nicht falsch, die Produkte sind exzellent. Aber es ist schon ein bemerkenswertes Geschäftsmodell: Man verlangt einen sechsstelligen Jahresbetrag dafür, deine eigenen Daten für dich durchsuchbar zu machen – indem du sie vorher aus dem Haus gibst. Die Cloud ist am Ende nur der Computer von jemand anderem. Und Enterprise Search ist dann der Dienst, den Computer von jemand anderem zu fragen, wo dein eigenes Zeug liegt.
Ich verkaufe meinen Kunden keine Abhängigkeit, die ich selbst nicht eingehen würde. Ein System, das mir seine Rechnung schickt, aber nicht seine Interna zeigt, ist kein Werkzeug – es ist ein Mietverhältnis mit besserem Marketing.
Also fällt die Entscheidung, wie sie fallen musste: Wir bauen selbst. Meilisearch als Kern – ein Suchindex in Rust, quelloffen, ein Binary unter hundert Megabyte. Ein paar hundert Zeilen Python als Anbindung an die Datenquellen. Alles auf eigenen Maschinen, in Österreich. Und dann sagt jemand den Satz, den man bei jedem Projekt genau einmal sagt: „Das sind doch zwei Wochen."
Zwei Wochen – und dann kam die Frage
Das Überraschende: Er hatte fast recht. Das Indexieren war zwei Wochen. Meilisearch nimmt einem genau die Dinge ab, an denen man sich früher die Zähne ausbiss – Tippfehlertoleranz, Ranking, Facetten, viele Nutzer auf einem Index. Kein Elasticsearch-Cluster, den man wie ein launisches Haustier füttert, kein Solr, für das man einen eigenen Menschen einstellt. Ein Dutzend Quellen laufen durch je einen kleinen Connector in einen gemeinsamen Index, vorne drei Türen: Weboberfläche, KI-Agenten, Chat-Bot. Oben tippen, unten Treffer. Zwei Wochen. Hätte man da aufgehört, wäre es eine kurze, vergessenswerte Geschichte geworden.
Dann tippte jemand „Gehalt" in die Suche.
Denn irgendwo liegt eine Datei. Sie heißt nicht geheim.docx, sie heißt Gehaltsanpassung_Müller_final_2.docx. Und der Dateiname ist das Dokument. „Müller kriegt mehr" steht schon im Titel – und der Titel ist genau das, was eine Suche liebevoll als ersten Treffer präsentiert.
Die meisten Suchsysteme lösen das mit einer eleganten Geste der Selbsttäuschung: Sie zeigen allen alles und prüfen die Berechtigung erst, wenn man ein Dokument öffnet. Das nennt man freundlich „click-through security". Man könnte es auch nennen: Vertraulichkeit hinter einem Türspalt, durch den vorher alle hineingeschaut haben. Wir wollten das andere, teurere, ehrlichere Modell – ich nenne es „strikt überall": Ein Treffer, den du nicht sehen darfst, existiert für dich nicht. Kein Inhalt, kein Titel, keine Existenz.
Das klingt nach einer Kleinigkeit. Es ist der Unterschied zwischen zwei Wochen und drei Monaten.
Ein Dutzend Wahrheiten, die sich gegenseitig nicht kennen
Der Mechanismus ist im Kern beleidigend simpel: Jedes Dokument trägt eine Gästeliste mit sich – diese Leute dürfen mich sehen. Sucht jemand, wird er umgekehrt in seine eigene Liste übersetzt: seine Kennung, jede Gruppe, jede Gruppe über der Gruppe, „alle Angemeldeten", „öffentlich". Die Suchmaschine hält beide Listen nebeneinander und zeigt nur die Schnittmenge. Ein Filter. Fertig.
Und jetzt raten Sie, was fehlte. Die Gästeliste des Suchenden. Denn „in welchen Gruppen ist dieser Mensch?" klingt trivial – und die Antwort stand nur an einer einzigen Stelle sauber bereit: im Browser, als kleiner Zusatz beim Web-Login. Der KI-Agent und der Bot melden sich nicht per Browser an. Sie standen vor der Gästeliste und wussten nicht, wer der Gast ist. Also war das Erste, was gebaut werden musste, gar nicht die Suche, sondern ein unscheinbarer Nachschlage-Speicher, der Anmeldedienst und Active Directory alle paar Minuten spiegelt – mit einer eisernen Regel: Wen ich nicht kenne, der sieht nur, was öffentlich ist. Im Zweifel weniger. Niemals mehr.
Dann die eigentliche Fleißarbeit: ein Dutzend Quellen, ein Dutzend historisch gewachsene, miteinander völlig unverträgliche Vorstellungen davon, was „Berechtigung" heißt. Das Wissens-Store: darf jeder. Mail und Kalender: dein Postfach ist deins. Der Chat-Verlauf: nur die Räume, in denen du selbst sitzt. Das Code-Hosting: wer im Projekt ist, sieht das Projekt. Das ERP mit seinem verschachtelten Rollenmodell haben wir bewusst feige behandelt – nur Eigentümer, Ersteller, Mitleser; im Zweifel zu streng. Und die Windows-Laufwerke, mit Berechtigungen tief in kryptischen Kennungen, waren der fragilste Punkt: Unsere Suchmaschine kann nur erlauben, nicht verbieten – Windows kennt aber den expliziten Rauswurf einzelner Personen, den eine Positivliste nicht abbilden kann. Die Lösung war am Ende organisatorisch, nicht technisch: geschützte Ordner so bauen, dass man Leute gar nicht erst einlädt, statt sie hinterher hinauszuwerfen.
Ich zeige lieber zu wenig als einmal zu viel. Ein nicht gefundener Treffer ärgert jemanden für fünf Minuten. Ein geleakter Titel ärgert ihn vor Gericht.
Das ist der Punkt, an dem „ACL ist schwer" aufhört, eine Behauptung zu sein: Nicht das Konzept ist kompliziert, sondern ein Dutzend Wahrheiten verlustarm auf eine abzubilden – und ehrlich zu benennen, wo die neue schwächer ist als die alte.
Die schönste Narbe
Kein solches Projekt ohne Kriegsgeschichten, und meine liebste ist die kürzeste. Drei Monate haben wir an einer berechtigungsbewussten Suche gebaut – und ausgebremst wurden wir am Ende nicht von den Berechtigungen im Index, sondern von den Zugriffsrechten einer einzigen Konfigurationsdatei: Der Dienst durfte sie nicht lesen, scheiterte aber lautlos und arbeitete einfach ohne die Zugangsdaten weiter. Kein Fehler, kein Log, nur ein ewiges „Zugriff verweigert" bei jeder Anfrage. Berechtigung ist eben überall. Auch eine Ebene tiefer, als man gerade hinschaut.
Souveränität ist kein Wort für die „Über uns"-Seite
Am Ende steht ein System mit einer fast altmodischen Eigenschaft: Die Daten verlassen das Haus nicht. Der Index läuft auf eigenen Maschinen in Österreich, im Index liegen nur kurze Ausschnitte, nie das ganze Dokument. Die Berechtigung wird auf dem Server geprüft, nicht im Browser, wo ein neugieriger Mensch sie aushebeln könnte. Und das Protokoll merkt sich, dass gesucht wurde, nicht was gefunden wurde.
Jeder dieser Punkte lässt sich bei einem eingekauften Dienst bestenfalls vertraglich zusichern. Man bekommt dann ein Papier. Selbst gebaut sind es keine Zusicherungen, sondern Eigenschaften – Dinge, die man nachprüfen kann, weil man sie selbst hineingeschrieben hat.
Souveränität ist keine Vokabel für die Website. Sie steht entweder im Code – oder in einem Vertrag, den im Ernstfall ein Gericht in einem anderen Land auslegt. Ich nehme den Code.
Das Suchen war zwei Wochen. Das Nicht-Zeigen war drei Monate. Und wenn ich aus dieser Geschichte eine Sache mitnehme, dann die: Wer bei einer Suche lange am Suchen baut, baut am falschen Ende. Die harte, unsichtbare Arbeit steckt in der höflichen kleinen Frage, die am Anfang niemand für ein Problem hielt.
Wer darf das sehen?