10 Regeln die Leser und Autoren Felder betreffen. Und ein paar Tips zu Ihrer Verwendung.
Regel #1 - Die ACL hat immer das letzte Wort
Die Zugriffskontroll Liste (Access Control List (ACL)) bestimmt immer welchen Art eines Zugriffes jemand auf eine Datenbank hat. Alle folgenden Regeln greifen zu guter Letzt auf diese Regel zurück. Wenn jemand in einer Datenbank nur "Einlieferer" Rechte hat, dann kann er keine Dokumente lesen, egal was sonst noch eingestellt wird. Diesen Benutzer in ein Leser oder Autoren Feld einzutragen wird keine Auswirkungen haben.
Regel #2 - Autoren Felder können keine Rechte verleihen die vorher nicht existierten
Ein Autoren Feld kann den Zugang zu einem Dokument nicht einschränken. Wenn ein Benutzer Editorenrechte (oder höhere Rechte) in der Datenbank hat, dann hat ein Autoren Feld keine Auswirkungen für diesen Benutzer, was wieder auf Regel #1 zurückzuführen ist. Genau das gleiche gilt, wenn ein Benutzer nur Leser oder ein noch niedrigeres Zugriffsrecht hat. Dann hat ein Autoren Feld wieder keinen Einfluß, weil die ACL sagt, das das einzige was dieser Benutzer tun kann lesen ist. Als ganzes bedeutet das ,das ein Autoren Feld nur dann anwendbar ist, wenn der fragliche Benutzer Autoren Rechte in der Datenbank hat.
Regel #3 - Leser Felder begrenzen den Zugriff
Ein Leser Feld begrenzt den Zugang immer und es hängt überhaupt nicht von den Zugriffsrechten des Benutzers ab. Wenn man ein Leser Feld in ein Dokument einbaut und es mit einem Wert gefüllt ist, z.B. nur mit Ihrem Namen, dann haben Sie und nur Sie die Möglichkeit dieses Dokument zu sehen, vollkommen egal welche Rechte der andere hat.
Regel #4 - Leser und Autoren Felder sollten immer den vollständigen qualifizierten Benutzernamen enthalten
Wenn sie Benutzer Namen in Leser oder Autoren Felder eintragen, sollten diese immer den qualifizierten Namen enthalten. Das bedeutet, das das "CN=" und alle anderen Bestandteile wie UO ... im Benutzer Namen sichtbar sein müssen. Angezeigt wird der Benutzername in der "Abbreviate" Form, gespeichert wird der Name in der "Canonicalize" Form.
Dieses ist zu bedenken, falls per Agent Namensfelder gesetzt werden.
Falls nur der Common Name eingetragen ist, wird der Benutzer nur dann eindeutig erkannt, falls der Benutzer und der aktuelle Server von der gleichen Zulassungsstelle stammen.
Regel #5 - Rollen können in Leser und Autoren Feldern benutzt werden
Um eine Rolle in diesen beiden Feldtypen verwenden zu können, muß der Name der Rolle in eckige Klammern gesetzt werden. So kann man zum Beispiel indem man "[administrator]" in ein Leser Feld einträgt verhindern, das irgendwer der nicht diese in der ACL eingetragene Rolle hat dieses Dokument lesen kann.
Regel #6 - Wenn ein Leser Feld leer ist, dann kann jeder das Dokument lesen
Nur weil ein Leser Feld in einem Dokument existiert, heißt das noch lange nicht, das jedes einzelne Dokument das diese Maske benutzt Lese Sicherheit eingebaut hat. Da Leser Felder den Zugang begrenzen, bedeutet ein leerer Wert, das der "Zugriff für niemand verboten" ist. Oder anders ausgedrückt. "jeder darf zugreifen".
Regel #7 - Wenn ein Autoren Feld leer ist, dann kann niemand mit Autoren Rechten in der Datenbank dieses Dokument bearbeiten.
Da Autoren Felder den Zugriff auf ein Dokument garantieren, bedeutet ein leerer Wert, "hier bekommt keiner Zugriff" oder "niemand der nur Autoren Rechte hat darf hier ändern". Benutzer mit Editoren oder höheren Rechten sind dann aber immer noch in der Lage diese Dokumente zu bearbeiten. Siehe Regel #1.
Regel #8 - Wenn es mehrere Sicherheits Felder (entweder Leser oder Autor) in einem Dokument gibt, dann wird im Hintergrund aus allen Werten in allen Feldern ein "virtuelles" Sicherheits Feld gebildet, das für die Zugriffskontrolle genutzt wird.
Das muß man jetzt etwas ausführlicher erklären. Wenn man z.B. zwei Leser Felder in seiner Maske hat, von denen eines den Wert "[Administrator]" und das andere den Wert "CN=Amadeus Tester/O=Testfirma" hat, dann ergeben diese beiden Felder zusammen, das alle die für diese Datenbank die Rolle "[Administrator]" haben und außerdem der Benutzer Amadeus Tester dieses Dokument in einer Ansicht sehen können.
Um dieses Beispiel weiterzuentwickeln fügen wir man jetzt ein weiteres Leser Feld in das Dokument ein lassen dieses Feld aber leer. Normalerweise bedeutet ein leeres Leser Feld, das jeder das Dokument lesen kann, nur das in diesem Fall noch andere Leser Felder in dem Dokument sind, so das nicht ausschließlich dieses neue Feld zur Kontrolle benutzt wird. Was jetzt passiert ist, das alle drei Leser Felder kombiniert werden um den Zugriff auf dieses Dokument zu regeln. Wenn alle drei Felder ein "NULL" Wert (kein Eintrag) ergeben, dann kann jeder das Dokument lesen. Da die anderen beiden Felder aber nicht leer sind, ändert das hinzufügen des dritten Feldes ohne Eintrag nichts an den Zugriffsrechten. Das Dokument kann immer noch nur von unserem Benutzer Amadeus Tester, bzw. von allen denen die Rolle "[Administrator]" in der Datenbank zugewiesen wurde gelesen werden.
Bei Autoren Felder ist es der gleiche Vorgang. Mehrere Autoren Felder verbinden sich zu einem übergeordneten "virtuellen" Autoren Feld. Wenn jemand (mit Autoren Rechten in der ACL, um noch einmal kurz auf Regel #1 hinzuweisen) in mindestens einem dieser Felder eingetragen ist, dann ist er in der Lage diese Dokument zu verändern. Es spielt auch hier keine Rolle ob ein Autoren Feld leer ist, während die anderen gefüllt sind.
Regel #9 - Wenn es sowohl Leser als auch Autoren Felder in einem Dokument gibt, dann sind die Autoren Felder auch Leser Felder
Diese Regel scheint auf den ersten Blick keinen Sinn zu machen. Also brauchen wir ein Beispiel. Nehmen wir an, daß dieses Dokument ein Leser Feld hat in das die "[Administrator]" Rolle eingetragen ist. Außerdem hat das Dokument ein Autoren Feld mit "CN=Amadeus Tester/O=Testfirma". Weil Amadeus Tester im Autoren Feld eingetragen ist, wird er automatisch auch in der Lage sein das Dokument in den entsprechenden Ansichten zu sehen. Er muß also nicht zusätzlich noch im Leserfeld eingetragen werden. Das geht auf Regel #2 zurück. Das Leser Feld hat den Zugriff gelöscht, Das Autoren Feld ihn aber wieder garantiert.
Was ich zeigen will ist ,das hier Autoren Felder einen Unterschied für Benutzer machen können, deren Zugriffsrechte mindestens Editor oder höher sind. Wenn Amadeus Tester der Entwickler dieser Datenbank ist, dann kommt das Autoren Feld ins Spiel und erlaubt es ihm die Dokumente in Ansichten zu sehen, obwohl er eigentlich kein Leser ist.
Regel #10 - Leser Felder werden während der Replikation angewandt
Diese Funktionalität wird häufig übersehen. Dabei ist sie wirklich wichtig. Nehmen wir einmal an wir haben eine Datenbank mit zehn Dokumenten. Sie sind nur in zwei dieser Dokumente eingetragen. Sie können nur diese zwei Datenbanken sehen aber wenn sie in die Eigenschaften der Datenbank gehen, dann sehen sie das es zehn Dokumente gibt. Sie können auf dem Server keine Ansicht erstellen, aber sie wollen alle Dokumente sehen. Also erstellen sie eine lokalen Replik der Datenbank, bauen dort die Ansicht ein die alle Dokumente zeigen soll und öffnen die Ansicht. Sie können aber immer noch nur diese beiden Dokumente sehen. Das passiert nicht, weil die Leser Felder auf ihre Lokale Replik angewendet werden. Sie sehen tatsächlich alles. Wenn sie auf die Datenbank Eigenschaften der Lokalen Replik gehen werden sie feststellen, das sie tatsächlich nur zwei Dokumente in dieser Datenbank haben. Domino/Notes läßt es nicht zu, das sie Dokumente zu denen sie keinen Zugriff haben lokal replizieren.
In einer ähnlichen Art, kann man z.B. eine manuelle Replikation zwischen zwei Servern starten. Wenn es Dokumente gibt die sich geändert haben, oder Sie sehen die Änderungen nicht, dann wurden diese Änderungen zwischen den beiden Servern nicht repliziert. Eine Sache die viele Entwickler gerne vergessen ist, das in eine Datenbank immer eine Rolle mit eingebaut werden sollte die in ein Leser Feld eingetragen wird um "LocalDomainServers" das Recht zu geben Dokumente zu replizieren.
Verschiedene Beobachtungen und Tipps
Geben Sie sich selbst Zugriff
Wenn Sie eine Anwendung entwickeln bei der sie Leser und/oder Autoren Felder benutzen werden, dann gibt es einige Dinge die sie beachten sollten.
Jedes einzelne Dokument, das ein Leser Feld hat das nicht leer ist, sollte automatisch auch ein zusätzliches Leserfeld enthalten in dem eine definierte Rolle z.B. "[Administrator]" eingetragen wird. Wenn alle vorhandenen Leser Felder leer sind, dann kann jeder das Dokument sehen. Aber wenn eines der Leserfelder gefüllt ist, dann können nur noch die Benutzer, die in diesen Feldern eingetragen wurden diese Dokumente sehen. Es ist schon häufiger passiert das ein Entwickler nachträglich an einem Dokument in einer Datenbank arbeiten wollte weil lein Benutzer irgendwelche Fragen oder Probleme hatte. Er konnte das aber nicht, weil er keinen Zugriff auf die entsprechenden Dokumente hatte. Deswegen konnte er nichts tun um Unterstützung für dieses Dokument zu leisten. Oder es gibt in einer Datenbank ein Leserfeld in dem exakt ein Benutzer eingetragen ist und dieser Benutzer verläßt das Unternehmen. Das sind schwerwiegende Gründe warum man immer ein "Administrator" Leser Feld mit einer entsprechenden Rolle mit einbauen sollte.
Normalerweise macht man das auf die folgende Art und Weise:
Man erstellt ein verstecktes "AdminReaders" Feld ganz am Ende der Maske. Das Feld ist vom Typ Leser und Berechnet. In der Berechnung des Feldes wird geprüft, ob die Zusammenfassung aller anderen Leser Felder einen Wert enthält oder nicht. Wenn ein Wert eingetragen ist, dann wird die Rolle eingetragen. Zum Beispiel:
@If(@Elements(Readers1 : Readers2 : Readers3) != 0; "[Admin]"; "")
Sie werden sich fragen, was für den Fall passieren soll, das die Anwendung "wirklich" vertraulich ist, und wenn die Eigentümer der Anwendung noch nicht einmal den Support in die Dokumente schauen lassen wollen. In diesem Fall wird das AdminReaders Feld immer noch eingebaut. Nur die zum Zugriff benötigte Rolle wird nicht in der ACL eingetragen. Auf diese Weise sieht der Entwickler der die Anwendung pflegt die Dokumente nicht. In der Bedienungs Anleitung der Datenbank wird die Rolle aber genannt. Auf diese Art kann der Entwickler wenn er Zugriff benötigt (und glauben sie mir das ist keine Frage des ob sondern des wann) zum Datenbank Verantwortlichen gehen und ihm sagen, das er diese Rolle in die Datenbank eintragen und ihm den entsprechenden Zugriff geben soll. Nach Beendigung der Pflegearbeiten kann dem Entwickler die Rolle wieder entzogen werden. Wichtig ist, das diese "Hintertür" aber immer da ist wenn sie denn einmal gebraucht wird.
Wenn man für die Öffentliche Hand oder eine Firma arbeitet, dann kann der obige Absatz einen dazu bringen sich wie ein Wurm zu krümmen, weil man "Hintertürchen" in einer Anwendung nicht sehen will. Aber wenn der Entwickler der die Anwendung unterstützt keine Manager Rechte auf der Datenbank hat, dann muß er erst zu dem jeweils Verantwortlichen gehen um diesen Zugriff zu erhalten.
Server Zugriff gestatten
Wenn die Datenbank zwischen unterschiedlichen Servern repliziert werden soll, dann sollte ein anderes zusätzliches Leser Feld eingebaut werden das eine "[Replikator]" Rolle enthält (wenn notwendig). Hier muß man sicherstellen, das "LocalDomainServers" diese Rolle haben. Dieser Eintrag erlaubt es den Servern alle Dokumente zu sehen und zu replizieren.
Leser Felder und Ansichten
Diese Eigenschaft von Leser Feldern wird von Entwicklern häufig übersehen und sie kann die Datenbank erheblich verlangsamen. Um das Problem zu verstehen braucht man ein wenig Hintergrundwissen über die Art wie der Notes Client mit dem Domino Server zusammenarbeitet. Was jetzt kommt ist ein extrem vereinfachtes Beispiel:
Wenn eine Ansicht geöffnet wird dann sagt der Client zum Server, Ok Junge gibt doch bitte mal den ersten Teil des Ansichts Indexes. Der ganze Index kann ziemlich groß sein, so das zunächst einmal nur ein Brocken des Indexes gesendet wird um die Geschwindigkeit zu erhöhen. Das kann man sehen und nachvollziehen wenn man eine große Ansicht öffnet, das oberste Dokument markiert und dann mit der Pfeil-unten Taste nach unten scrollt. Irgendwann wird es eine Pause geben. Das ist der Zeitpunkt an dem der Server den nächsten Teil des Indexes zum Client schickt.
Jetzt hat der Server den ersten Teil des Ansichtsindex gesendet. Der Client sucht sich jetzt die Dokumente die er anzeigen darf und zeigt diese. Wenn das was er anzeigen darf nicht genug ist um auf den Bildschirm zu passen, dann fordert der Client den Server auf den nächsten Teil des Index zu schicken. Wieder sucht sich der Client die Dokumente die er darstellen kann. Dieser Ablauf wiederholt sich bis der Bildschirm komplett aufgefüllt worden ist.
Jetzt stellen sie sich eine Ansicht mit 100.000 Dokumenten vor die alle Leser Felder haben und von denen sich nur einen verschwindend geringen Bruchteil, sagen wir 5 Stück lesen dürfen. Der Client und der Server müssen den gesamten Index bis zum Ende durchgehen nur um herauszufinden das es trotzdem nicht genug Dokumente sind um den Bildschirm zu füllen. Erst dann werden sie auf dem Bildschirm angezeigt. Das macht die Ansicht wirklich langsam.
Um dieser Falle aus dem Weg zu gehen sollten Sie es vermeiden Ansichten zu benutzen bei denen der Benutzer eine so geringe Anzahl von Dokumenten sehen wird wenn es irgendwie möglich ist. Manchmal mag das aufgrund der Anforderung an die Anwendung unmöglich sein. dann sollten Sie zumindest darauf hinweisen, damit sie später, wenn sich die Anwender über die mangelnde Performance beschweren "ich hab es euch ja gesagt" sagen können.
ein letzter Trick
Wenn man die Regel #9 benutzt (Autoren Felder sind auch Leser Felder) kann das sehr nützlich sein. Nehmen wir einmal an das sie eine Anwendung entwickelt haben bei der die Leute Dokumente erstellen können, aber nur die Dokumente sehen sollen die sie auch erstellt haben. Das kann man sehr einfach erreichen indem jeder Autoren Zugriff in der ACL auf die Datenbank bekommt. Die Benutzer die die entsprechenden Dokumente bearbeiten sollen werden in die entsprechenden Autoren Felder eingetragen. Anschließend wird ein Leser Feld erstellt, das einen Wert enthält der keinen Benutzernamen darstellt. Weil das Leser Feld nicht leer ist, ist das Dokument nicht für jeden zu sehen, Es ist auf die Personen beschränkt, die in dem Leser Feld eingetragen sind (erinnern sie sich, hier steht kein echter Name). Aber es ist jetzt auch für alle Benutzer sichtbar, deren Namen in den Autoren Feldern stehen. Und da die Benutzer nur Autoren Rechte in der Datenbank haben können Sie, auch dann wenn sie durch irgendeinen dummen Zufall auch andere Dokumente sehen würden, diese Dokumente nicht ändern, weil sie in deren Autoren Feld nicht eingetragen sind.
Zusammenfassung
Das Sicherheits Modell von Notes ist eines der besten in der IT und es ist extrem verläßlich und sicher. Wenn, bezogen auf die eingebaute Sicherheit von Leser und Autorenfeldern, die oben genannten Regeln angewendet werden wenn man eine Datenbank erstellt, sollte das helfen sichere Datenbanken zu entwickeln