Zugriffsregeln

Die Zugriffsregeln im Raptor Server kontrollieren, wer welche informationen sehen kann. Dabei wird jeder Zugriff durch einen Client im Zugriffsmodul durch eine Reihe von Zugriffsregeln überprüft. Diese Regeln können den Zugriff auf die Daten des Raptor Systems einschränken.

../../_images/raptor-access-layer.jpg

Die Zugriffsschichten im Raptor Server

Die Regeln welche du definierst werden dabei genau in der konfigurierten Reihenfolge getestet. Jede Regel kann dabei entweder den Zugriff zulassen, oder blockieren. Dabei wird die Überprüfung bei der ersten passenden Regel abgebrochen.

../../_images/raptor-access-rule-list.jpg

Eine Liste von Zugriffsregeln.

Bei jedem Zugriff wird ein spezifischer Kontext überprüft. Dieser besteht aus dem geprüften Subjekt, also der Person welche sich die Informationen ansieht, und dem Ziel, die Information an sich. Die Zugriffsregeln können jetzt diese beiden Seiten des Kontexts testen und falls die Regel auf beide Seiten passt, entweder den Zugriff ablehnen oder zulassen.

Falls keine konfigurierte Regel zutrifft, wird der Zugriff abgelehnt.

Konfiguration

Due Zugriffsregeln werden in der Datei access_rules.xml konfiguriert. Schau dir das folgende Beispiel an, welches die grundlegende Struktur der Datei illustriert:

 1<?xml version="1.0" encoding="UTF-8" ?>
 2<AccessRules
 3    version="1"
 4    xmlns="http://educateit.ch/software/Raptor/AccessRules/1"
 5    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 6
 7    <Deny>
 8        <ControlledSubject>
 9            <!-- Condition -->
10        </ControlledSubject>
11        <Target>
12            <!-- Condition -->
13        </Target>
14    </Deny>
15    <Allow>
16        <ControlledSubject>
17            <!-- Condition -->
18        </ControlledSubject>
19        <Target>
20            <!-- Condition -->
21        </Target>
22    </Allow>
23</AccessRules>

Das ganze Dokument wird mit dem Dokument Element AccessRules eingeschlossen. Darin befinden sich dann die einzelnen Zugriffsregeln.

Das AccessRules Element

Jede Regel in dem AccessRules Element wird entweder durch ein Deny oder Allow Element definiert.

../../_images/raptor-access-rule-hierarchy.jpg

Die Struktur der Zugriffsregel-Elemente

Dabei können in dem Dokument beliebig viele Deny oder Allow Elemente konfiguriert werden. Dabei ist die Reihenfolge der Definition wichtig. Die Regeln werden immer von oben nach unten abgearbeitet und sobald eine der Regeln zutrifft, stoppt die Verarbeitung an der Stelle. Alle Regeln darunter werden nicht mehr berücksichtigt.

 1<?xml version="1.0" encoding="UTF-8" ?>
 2<AccessRules
 3    version="1"
 4    xmlns="http://educateit.ch/software/Raptor/AccessRules/1"
 5    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 6
 7    <Deny>
 8        ...
 9    </Deny>
10    <Allow>
11        ...
12    </Allow>
13    <Deny>
14        ...
15    </Deny>
16</AccessRules>

Das Deny und Allow Element

Je nachdem, ob eine Regel in dem Deny oder Allow Eingeschlossen ist, wird der Zugriff erlaubt (Allow) oder abgelehnt (Deny).

Dabei muss in dem Deny oder Allow Element genau ein ControlledSubject und darauf folgend ein Target Element enthalten sein. Diese Beiden Elemente müssen zwingend definiert werden, und auch in genau dieser Reihenfolge.

 1<?xml version="1.0" encoding="UTF-8" ?>
 2<AccessRules
 3    version="1"
 4    xmlns="http://educateit.ch/software/Raptor/AccessRules/1"
 5    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 6
 7    <Deny>
 8        <ControlledSubject>
 9            <LoginGroup>
10                <Contains>RestrictedAccess</Contains>
11            </LoginGroup>
12        </ControlledSubject>
13        <Target>
14            <Or>
15                <ObjectType>
16                    <Equals>Computer</Equals>
17                </ObjectType>
18                <ObjectName>
19                    <Equals>Administrator</Equals>
20                </ObjectName>
21            </Or>
22        </Target>
23    </Deny>
24    <Allow>
25        <ControlledSubject>
26            <LoginUsername>
27                <Or>
28                    <Equals>test-user-a</Equals>
29                    <Equals>test-user-b</Equals>
30                </Or>
31            </LoginUsername>
32        </ControlledSubject>
33        <Target>
34            <Any />
35        </Target>
36    </Allow>
37    <!-- Last rule in chain-->
38    <Deny>
39        <ControlledSubject>
40            <Any />
41        </ControlledSubject>
42        <Target>
43            <Any />
44        </Target>
45    </Deny>
46</AccessRules>

Das ControlledSubject Element

Das ControlledSubject Element prüft ob der aktuelle Kontext auf das kontrollierte Subjekt, also den Benutzer zutrifft, der die Daten abfragt.

Diese Prüfung wird mit einem oder mehreren LoginUsername und/oder LoginGroup Elementen definiert. Mehrere solcher Elemente können mit logischen Containerelementen And, Or oder Not kombiniert werden. Zudem können mit dem Element Any alle Benutzer für die Regel zugelassen werden.

Wichtig ist, dass das ControlledSubject Element nur genau ein Prüfelement zulässt. Möchtest du mehrere Prüfelemente verwenden, dann muss dieses eine Element ein Logischer Container sein, der wiederum mehrere Elemente enthalten kann.

Die Struktur der ControlledSubject und Target Elemente und der darin enthaltenen Bedingungen wird mit dem folgenden Bild illustriert:

 1<Deny>
 2    <ControlledSubject>
 3        <LoginGroup>
 4            <Contains>RestrictedAccess</Contains>
 5        </LoginGroup>
 6    </ControlledSubject>
 7    <Target>
 8        <Or>
 9            <ObjectType>
10                <Equals>Computer</Equals>
11            </ObjectType>
12            <ObjectName>
13                <Equals>Administrator</Equals>
14            </ObjectName>
15        </Or>
16    </Target>
17</Deny>
18
19<Allow>
20    <ControlledSubject>
21        <LoginUsername>
22            <Or>
23                <Equals>test-user-a</Equals>
24                <Equals>test-user-b</Equals>
25            </Or>
26        </LoginUsername>
27    </ControlledSubject>
28    <Target>
29        <Any />
30    </Target>
31</Allow>

Das Target Element

Das Target Element prüft ob der aktuelle Kontext auf bestimmte Daten zutrifft.

Diese Prüfung wird mit einem oder mehreren ObjectType, ObjectName, ObjectContext und/oder ObjectValue Element definiert. Mehrere solcher Elemente können mit logischen Containerelementen And, Or oder Not kombiniert werden. Zudem können mit dem Element Any alle Daten für die Regel zugelassen werden.

Wichtig ist auch hier, dass das Target Element nur genau ein Prüfelement zulässt. Möchtest du mehrere Prüfelemente verwenden, dann muss dieses eine Element ein Logischer Container sein, der wiederum mehrere Elemente enthalten kann.

 1<Deny>
 2    <ControlledSubject>
 3        <LoginGroup>
 4            <Contains>RestrictedAccess</Contains>
 5        </LoginGroup>
 6    </ControlledSubject>
 7    <Target>
 8        <Or>
 9            <ObjectType>
10                <Equals>Computer</Equals>
11            </ObjectType>
12            <ObjectName>
13                <Equals>Administrator</Equals>
14            </ObjectName>
15        </Or>
16    </Target>
17</Deny>
18
19<Allow>
20    <ControlledSubject>
21        <LoginUsername>
22            <Or>
23                <Equals>test-user-a</Equals>
24                <Equals>test-user-b</Equals>
25            </Or>
26        </LoginUsername>
27    </ControlledSubject>
28    <Target>
29        <Any />
30    </Target>
31</Allow>
../../_images/raptor-access-condition.jpg

Die Struktur der ControlledSubject und Target Elemente

Die Struktur der ControlledSubject und Target Elemente zeigt welche Prüf- und Containerelemente enthalten sein können. Du siehst, dass Logikcontainer wie And und Or beliebig verschachtelt werden können.

Element

Prüfelement

Beschreibung

ControlledSubject

LoginUsername

Der Benutzername des angemeldeten Benutzers.

LoginGroup

Eine Liste aller Gruppen des angemeldeten Benutzers.

Target

ObjectType

Der Typ des Zielobjekts.

ObjectName

Der Name des Zielobjekts.

ObjectContext

Der Kontext des Zielobjekts.

ObjectValue

Ein Permanenter Wert des Zielobjekts. Mit den Attributen informationBlock und valueName wird dieser Wert ausgewählt. Der Wert muss zum Zeitpunkt der Prüfung verfügbar sein.

Für beide Blöcke

Any

Platzhalter der auf alles zutrifft.

And

Ein boolescher AND Container. Er muss zwei oder mehr Prüfelemente enthalten.

Or

Ein boolescher OR Container. Er muss zwei oder mehr Prüfelemente enthalten.

Not

Ein boolescher NOT Container. Er muss genau ein Prüfelement enthalten.

Prüfelemente

Jedes Prüfelement, wie LoginUsername, LoginGroup, ObjectType, ObjectName, ObjectContext und ObjectValue, muss genau ein Operator-Element enthalten. Dieses testet den Wert, welcher du mit dem Prüfelement auswählst auf eine bestimmte Eigenschaft.

Das Prüfelement muss genau ein Operator-Element enthalten. Du kannst aber mehrere Operator-Elemente mit booleschen Containern kombinieren.

Bei den Operatoren Equals, Contains und RegExp kannst du zusätzlich das Attribut caseSensitivity angeben. Als Wert gibst du dabei entweder CaseSensitive oder CaseInsensitive an, je nachdem, ob du möchtest dass die Gross-/Kleinschreibung beachtet wird oder nicht.

Jeder Wert den du mit dem Prüfelement auswählst hat einen bestimmten Typ. Je nach ausgewählten Typ funktionieren nicht alle Operatoren. Die folgenden Tabellen geben dir eine Übersicht über alle Operator-Elemente und deren Effekt auf verschiedene Typen der ausgewählten Werte.

 1<Deny>
 2    <ControlledSubject>
 3        <LoginGroup>
 4            <Contains>RestrictedAccess</Contains>
 5        </LoginGroup>
 6    </ControlledSubject>
 7    <Target>
 8        <Or>
 9            <ObjectType>
10                <Equals>Computer</Equals>
11            </ObjectType>
12            <ObjectName>
13                <Equals>Administrator</Equals>
14            </ObjectName>
15        </Or>
16    </Target>
17</Deny>
18<Allow>
19    <ControlledSubject>
20        <LoginUsername>
21            <Or>
22                <Equals>test-user-a</Equals>
23                <Equals>test-user-b</Equals>
24            </Or>
25        </LoginUsername>
26    </ControlledSubject>
27    <Target>
28        <Any />
29    </Target>
30</Allow>

Operatoren für Text

Operator

Text

Textliste

Equals

Prüft ob der Wert dem angegebenen Text entspricht.

Prüft ob der Text einem der Werte in der Liste entspricht.

Contains

Prüft ob der Text in dem Wert enthalten ist.

Prüft ob der Text in einem der Werte in der Liste enthalten ist.

RegExp

Prüft den Text mit dem angegebenen Regulären Ausdruck.

Prüft ob einer der Texte in der Liste dem angegebenen Regulären Ausdruck entspricht.

Operatoren für Zahlen

Operator

Beschreibung

MaxInclude

Prüft ob der Operator-Wert kleiner oder gleich als die Zahl ist.

MinInclude

Prüft ob der Operator-Wert grösser oder gleich als die Zahl ist.

Boolesche Container

Operator

Beschreibung

And

Ein boolescher AND Container. Er muss zwei oder mehr Prüfelemente enthalten.

Or

Ein boolescher OR Container. Er muss zwei oder mehr Prüfelemente enthalten.

Not

Ein boolescher NOT Container. Er muss genau ein Prüfelement enthalten.

Die folgende Illustration zeigt die Zusammenhänge zwischen den Prüfelementen und den Operator-Elementen:

../../_images/raptor-access-operator.jpg

Das Any Element

Das Any Element ist ein Platzhalter, der auf alles zutrifft. Du verwendest ihn, falls eine Zugriffsregel nur das ControlledSubject Element oder das Target Element verwendet. In dem nicht verwendeten Element fügst du einfach ein Any Element ein, welches dann auf alle Werte zutrifft.

 1<?xml version="1.0" encoding="UTF-8" ?>
 2<AccessRules
 3    version="1"
 4    xmlns="http://educateit.ch/software/Raptor/AccessRules/1"
 5    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 6
 7    ...
 8    <Allow>
 9        <ControlledSubject>
10            <LoginUsername>
11                <Or>
12                    <Equals>test-user-a</Equals>
13                    <Equals>test-user-b</Equals>
14                </Or>
15            </LoginUsername>
16        </ControlledSubject>
17        <Target>
18            <Any />
19        </Target>
20    </Allow>
21    <!-- Last rule in chain-->
22    <Deny>
23        <ControlledSubject>
24            <Any />
25        </ControlledSubject>
26        <Target>
27            <Any />
28        </Target>
29    </Deny>
30</AccessRules>

Die booleschen Container And und Or

Mit den beiden booleschen Container Elementen And und Or verknüpfst du entweder mehrere Prüfelemente oder mehrere Operator-Elemente. Es müssen dabei mindestens zwei dieser Elemente in dem booleschen Container eingeschlossen werden.

 1<Target>
 2    <And>
 3        <ObjectType>
 4            <Equals>Computer</Equals>
 5        </ObjectType>
 6        <ObjectName>
 7            <Equals>Administrator</Equals>
 8        </ObjectName>
 9    </And>
10</Target>
1<ControlledSubject>
2    <LoginUsername>
3        <Or>
4            <Equals>test-user-a</Equals>
5            <Equals>test-user-b</Equals>
6        </Or>
7    </LoginUsername>
8</ControlledSubject>

Der negations Container Not

Schliesst du ein Prüfelement oder Operator-Element mit dem Not Element ein, wird das Ergebnis der Operation umgekehrt.

1<ControlledSubject>
2    <LoginUsername>
3        <Not>
4            <Equals>test-user-a</Equals>
5        </Not>
6    </LoginUsername>
7</ControlledSubject>

Das Prüfelement LoginUsername

Mit dem Prüfelement LoginUsername wendest du einen Operator auf den Textwert des Benutzernamens an.

1<ControlledSubject>
2    <LoginUsername>
3        <Or>
4            <Equals>test-user-a</Equals>
5            <Equals>test-user-b</Equals>
6        </Or>
7    </LoginUsername>
8</ControlledSubject>

Das Prüfelement LoginGroup

Mit dem Prüfelement LoginGroup wendest du einen Operator auf die Text-Liste mit allen Gruppennamen eines Benutzers an.

1<ControlledSubject>
2    <LoginGroup>
3        <Contains>test-admin-</Contains>
4    </LoginGroup>
5</ControlledSubject>

Das Prüfelement ObjectType

Mit dem Prüfelement ObjectType wendest du einen Operator auf den Textwert mit dem Objekttyp an. Hier ist jedoch nur der Equals Operator mit den folgenden Werten erlaubt:

  • User

  • Computer

  • Application

  • Process

 1<Target>
 2    <And>
 3        <ObjectType>
 4            <Equals>Computer</Equals>
 5        </ObjectType>
 6        <ObjectName>
 7            <Equals>Administrator</Equals>
 8        </ObjectName>
 9    </And>
10</Target>

Das Prüfelement ObjectName

Mit dem Prüfelement ObjectName wendest du einen Operator auf den Textwert mit dem Objektnamen an.

 1<Target>
 2    <And>
 3        <ObjectType>
 4            <Equals>Computer</Equals>
 5        </ObjectType>
 6        <ObjectName>
 7            <Equals>Administrator</Equals>
 8        </ObjectName>
 9    </And>
10</Target>

Das Prüfelement ObjectContext

Mit dem Prüfelement ObjectContext wendest du einen Operator auf den Textwert des Objekt Kontexts an.

 1<Target>
 2    <And>
 3        <ObjectName>
 4            <Equals>Administrator</Equals>
 5        </ObjectName>
 6        <ObjectContext>
 7            <Equals>example.com</Equals>
 8        </ObjectContext>
 9    </And>
10</Target>

Das Prüfelement ObjectValue

Mit dem Prüfelement ObjectValue wendest du einen Operator auf einen permanenten Wert in einem Objekt an. Den Wert wählst du dabei mit den Attributen informationBlock für den Informationsblock und mit valueName für den Namen aus. Der Typ des Werts wird dabei von dem Objekt bestimmt.

 1<Target>
 2    <And>
 3        <ObjectValue informationBlock="ActiveDirectory" valueName="ldapPath">
 4            <Contains caseSensitivity="CaseInsensitive">OU=Testers</Contains>
 5        </ObjectValue>
 6        <ObjectContext>
 7            <Equals>example.com</Equals>
 8        </ObjectContext>
 9    </And>
10</Target>

Das Operator-Element Equals

Mit dem Operator-Element Equals prüfst du, ob ein Wert exakt dem angegebenen Wert entspricht. Das optionale Attribut caseSensitivity mit dem Wert CaseSensitive oder CaseInsensitive wählt ob die Gross-/Kleinschreibung beachtet wird oder nicht.

 1<Target>
 2    <And>
 3        <ObjectName>
 4            <Equals>Administrator</Equals>
 5        </ObjectName>
 6        <ObjectContext>
 7            <Equals caseSensitivity="CaseInsensitive">example.com</Equals>
 8        </ObjectContext>
 9    </And>
10</Target>

Das Operator-Element Contains

Mit dem Operator-Element Contains prüfst du, ob der angegebene Text in dem geprüften enthalten ist. Das optionale Attribut caseSensitivity mit dem Wert CaseSensitive oder CaseInsensitive wählt ob die Gross-/Kleinschreibung beachtet wird oder nicht.

 1<Target>
 2    <And>
 3        <ObjectName>
 4            <Contains caseSensitivity="CaseInsensitive">Testuser</Contains>
 5        </ObjectName>
 6        <ObjectContext>
 7            <Equals>example.com</Equals>
 8        </ObjectContext>
 9    </And>
10</Target>

Das Operator-Element RegExp

Mit dem Operator-Element RegExp prüfst du den Wert mit dem angegebenen Regulären Ausdruck. Das optionale Attribut caseSensitivity mit dem Wert CaseSensitive oder CaseInsensitive wählt ob die Gross-/Kleinschreibung beachtet wird oder nicht.

 1<Target>
 2    <And>
 3        <ObjectName>
 4            <RegExp>-test$</RegExp>
 5        </ObjectName>
 6        <ObjectContext>
 7            <Equals>example.com</Equals>
 8        </ObjectContext>
 9    </And>
10</Target>

Das Operator-Element MaxInclude

Mit dem Operator-Element MaxInclude prüfst du ob der geprüfte Zahlenwert kleiner oder gleich dem angegeben Wert ist.

1<Target>
2    <And>
3        <ObjectValue informationBloc="ActiveDirectory" valueName="level">
4            <MaxInclude>3</MaxInclude>
5        </ObjectValue>
6    </And>
7</Target>

Das Operator-Element MinInclude

Mit dem Operator-Element MinInclude prüfst du ob der geprüfte Zahlenwert grösser oder gleich dem angegeben Wert ist.

1<Target>
2    <And>
3        <ObjectValue informationBloc="ActiveDirectory" valueName="level">
4            <MinInclude>3</MinInclude>
5        </ObjectValue>
6    </And>
7</Target>