2.3 Virtual Private Database

Mit der Version Oracle 8.1.5 wurde in das DBMS ein neuer Mechanismus eingebaut, welcher die effiziente Implementierung der Zugriffssteuerung mit Granularität auf Tupelebenen erlaubt. Er ist unter den Folgenden Namen bekannt:

Es soll möglich sein, einem Benutzer nur die Tupel einer Tabelle zu zeigen, die für ihn freigebenen sind. D.h. zwei Nutzer mit unterschiedlichen Rechten sehen für ein und die selbe Tabelle verschiedene Tupel. Im Allgemeinen werden zur Lösung der Aufgabe für jeden Nutzer eine oder mehrere Views erstellt. Die View filtert die Tabelle mit vorgegebenen Parametern. Der Nutzer stellt seine Anfragen nicht mehr direkt an die Tabelle, sondern an die View. Der betriebende Aufwand ist sehr groß und erhöht sich, wenn sich die Paramerter mit der Zeit oft ändern. Genau hier setzt die Idee der Virtual Private Database an. Die Filterung wird zur Laufzeit der Anfrage bewerkstelligt, indem die Anfrage mit versteckten WHERE Bedingungen erweitert wird. Die Erweiterungen werden transparent vom DBMS durch Policy Funktionen erzeugt. Dazu wird eine PL/SQL Funktion über eine Policy mit der zu schützenden Tabelle verknüpft. Die Verknüpfung stellen Oracle Funktionen aus dem DBMS_RLS Packages zur Verfügung. Der PL/SQL Teil des Konstruktes aus Tabelle, Policy und PL/SQL erzeugt die ergänzenden WHERE Bedinungen und die Policy dient als Mittler zwischen Tabelle und PL/SQL Teil. Das folgende Beispiel verdeutlicht die Funktionsweise. Beispiel 1:

2.3.0.0.0.1 Aufgabe:
Der Zugriff auf die Tabelle SCOTT.EMP ist für alle Benutzer nur während der Geschäftszeit erlaubt.

2.3.0.0.0.2 Lösung mittels VPD:
Es wird eine PL/SQL Funktion GetWorkHoursPredicate erzeugt, die folgende WHERE Klauseln in Form eines Text-Strings generiert:

Diese wird dann mit der Tabelle SCOTT.EMP verkünpft. Dazu wird ein Aufruf des DBMS_RLS Packages benötigt:



\begin{lstlisting}[caption=Definieren einer Policy,language=SQL,label=lst:policy...
...ype => 'SELECT,INSERT,UPDATE,DELETE',
update_check => TRUE );
\end{lstlisting}

Bei jeder Anfrage an diese Tabelle wird nun die Policy aufgerufen. Sie besitzt mehrere Parameter. Interessant sind insbesondere policy_function und statement_type. Erstere verweist auf die PL/SQL Funktion und letzere gibt an, bei welcher Art von Anfrage die Policy reagiert.

2.3.0.0.0.3 Reaktionsweise:
Der Nutzer führt um 8:00 Uhr den folgenden Befehl in der SQL-Konsole aus:



\begin{lstlisting}[caption=SQL Statement ,language=SQL,label=lst:SQL]
SQL> SELEC...
...ERE deptno = 10;
\par
ENAME
--
KING
CLARK
MILLER
\end{lstlisting}

Weil die Anfrage vom Typ SELECT ist, führt Oracle die Policy Funktion aus. Diese überprüft die Zeit mittels GetWorkHoursPredicate und liefert einen Wert zurück, der an die SELECT Anweisung als zusätzliche WHERE Bedingung angehangen wird. So sieht die SQL Anweisung intern aus:



\begin{lstlisting}[caption=SQL Statement mit VPD Erweiterung,language=SQL,label=...
...int]
SELECT ename
FROM scott.emp
WHERE deptno = 10 AND (1=1);
\end{lstlisting}

Das Sicherheitskonzept funktioniert völlig transparent, dynamisch und ohne weitere Eingriffe in die Datenbank. Es ist dem DBA überlassen, wie er die Policies und PL/SQL Funktionen implementiert. Es stehen ihm alle Möglichkeiten offen. Weitere Beispiele und mehr Informationen befinden sich in [2] und [1].

Die vorgestellte VPD Technologie ermöglicht erstmals einen auf Tupelebene wirkenden Zugriffsschutz.



Subsections
Karl Spies 2006-01-09