Rollenspiele - Benutzerberechtigungen effektiver und sicherer verwalten mit Rollen
von Heinz-Wilhelm Fabry, ORACLE Deutschland B.V. & Co. KG

Rollen steigern die Produktivität des DBAs und können gleichzeitig die Sicherheit von Datenbanksystemen erhöhen. Die Produktivitätssteigerung wird dadurch erreicht, dass nach der Zuweisung von Privilegien oder Rollen an eine Rolle zukünftig nur noch diese Rolle vergeben werden muß, wenn ein neuer Benutzer mit identischen Berechtigungen einzurichten ist. Man könnte zwar argumentieren, dass ein einfaches Skript mit einer Reihe von GRANT Befehlen ähnlich produktiv ist. Allerdings wird bei Änderungen im Berechtigungskonzept unmittelbar deutlich, dass es viel aufwändiger ist, zunächst alle Benutzer eindeutig auszumachen, deren Berechtigungen betroffen sind, und diese Benutzer dann zu modifizieren. Arbeitet man dagegen mit Rollen sind die Berechtigungen nur noch an einer Stelle zu pflegen - nämlich im Rahmen der Rollen.

Die Sicherheit wird erhöht, weil über Rollen das Prinzip des least privilege leichter umzusetzen ist: Es werden nur die Berechtigungen an eine Rolle vergeben, die die Benutzer der Rolle unbedingt benötigen.

Jede Edition der Datenbank - also auch die Standard Editionen - bietet die Möglichkeit, Rollen anzulegen, die einem Benutzer beim Einloggen automatisch zugewiesen werden oder die ein Benutzer selbst ein- und ausschalten kann. Die Enterprise Edition geht einen Schritt weiter: Erstens stellt sie die Möglichkeit bereit, Rollen in einem Directory Server zu verwalten, zweitens stellt sie die sogenannten Sicheren Anwendungsrollen (secure application roles) zur Verfügung. Das sind Rollen, die ausschließlich über eine Prozedur oder über ein Package aus Anwendungen heraus zu aktivieren sind: Umgeht man die Anwendung, wird eine solche Rolle nicht aktiviert, und man erhält so nicht die Berechtigungen, die zum Arbeiten mit den Daten der Anwendung nötig sind. Und schließlich bietet die Option Oracle Database Vault die Möglichkeit, Rollen festzulegen, die nur mit den besonders sicheren Vorgehensweisen des Database Vault zu aktivieren sind.

Rollen in allen Editionen

Nur ein Benutzer mit dem Privileg CREATE ROLE kann Rollen anlegen. Dieses Privileg haben - neben dem Benutzer SYS - nach dem Anlegen einer Datenbank nur die Rollen DBA und IMP_FULL_DATABASE. Das Anlegen selbst erfolgt mit dem Befehl, der so heißt, wie das Privileg: CREATE ROLE. Einer so angelegten Rolle können im zweiten Schritt mit dem Befehl GRANT Privilegien und andere Rollen zugewiesen werden. Damit Benutzer mit einer Rolle arbeiten können, d.h. damit sie die darin festgelegten Berechtigungen nutzen können, muß in einem dritten Schritt die Rolle mit GRANT einem Benutzer zugewiesen werden. Alle drei Schritte sind im folgenden Beispiel ausgeführt.

CREATE ROLE rolle1;
CREATE ROLE rolle2;
CREATE ROLE rolle3;
CREATE ROLE rolle4;

GRANT CREATE VIEW, rolle2 TO rolle1;
GRANT select on scott.emp TO rolle1;
GRANT ... TO rolle2;
...
GRANT rolle1, rolle3, rolle4 TO benutzername;
Die angelegten Rollen kann benutzername mit dem Befehl SET ROLE aktivieren. Sollen bestimmte Rollen bei jedem Einloggen aktiviert werden, kann dies ein privilegierter Benutzer mit dem Befehl ALTER USER veranlassen. Das nächste Beispiel geht davon aus, dass für benutzername bei jedem Einloggen die Rollen rolle1 und rolle3 aktiviert werden. Die Rolle rolle4 kann der Benutzer selbst aktivieren. Nach Einloggen und dem Befehl SET ROLE sind dann alle vier angelegten Rollen aktiviert: Die Rolle rolle2 wird als Teil der Rolle rolle1 zugewiesen. Da rolle2 Teil einer Rolle und nicht explizit mit GRANT zugewiesen wurde, ist sie nur über die Rolle rolle1 zu aktivieren.
ALTER USER benutzername DEFAULT ROLE rolle1, rolle3;
-- alternativ ALTER USER benutzername DEFAULT ROLE ALL EXCEPT rolle4

CONNECT benutzername/benutzerpasswort
-- Falls keine DEFAULT ROLEs eingerichtet wurden
SET ROLE ALL EXCEPT rolle4, rolleN
...
SET ROLE rolle4;
In einer Session können maximal 148 Rollen aktiviert werden. Dabei werden auch die Rollen mitgezählt, die Bestandteil einer Rolle sind. Wird beim Einloggen versucht, für einen Benutzer mehr als 148 Rollen zu aktivieren, scheitert das Login. Welche Rollen aktiv sind, erfährt der Benutzer gegebenenfalls durch eine Abfrage auf die Data Dictionary View SESSION_ROLES. Die View besteht nur aus der Spalte ROLE.

Rollen können auch mit einem Passwort gesichert werden. Derartige Rollen können allerdings nicht im Rahmen des Login aktiviert werden. Das folgende Beispiel zeigt, wie eine derartige Rolle angelegt und aktiviert wird.
CREATE ROLE rolle5 IDENTIFIED BY rollenpasswort;

GRANT ... TO rolle5;
GRANT rolle5 TO benutzername;

CONNECT benutzername/benutzerpasswort
SET ROLE rolle5 IDENTIFIED BY rollenpasswort;
Es gibt im Rahmen aller Editionen der Datenbank eine weitere Möglichkeit, mit einfachen Rollen zu arbeiten. Auf Betriebssystemen, die ein Rollenkonzept unterstützen, kann der Initialisierungsparameter OS_ROLES der Datenbank auf TRUE gesetzt werden. Die Rollen werden dann mit dem Befehl CREATE ROLE rollenname IDENTIFIED EXTERNALLY angelegt. Alle Berechtigungen derartiger Rollen werden anschließend auf der Betriebssystemebene verwaltet.

Spezielle Rollen der Enterprise Edition

Ist eine Enterprise Edition der Datenbank im Einsatz und zusätzlich ein Internet Directory so kann das Feature Enterprise User Security genutzt werden. Rollen werden dabei mit dem Befehl CREATE ROLE rollenname IDENTIFIED GLOBALLY angelegt. Die Autorisierung zum Nutzen der Rolle wird im Directory getroffen. Für das Arbeiten mit dieser Rolle gelten ansonsten die Ausführungen oben.

Die sicheren Anwendungsrollen bieten die Möglichkeit, Rollen aus einer Anwendung heraus über eine Prozedur oder ein Package zu aktivieren. Die Befehle SET ROLE oder ALTER USER greifen hier nicht. Syntaktisch wird eine Variante des Befehls CREATE ROLE verwendet, die mit der IDENTIFIED USING Klausel die entsprechende Prozedur oder das entsprechende Package explizit angibt.
CREATE ROLE rolle6 IDENTIFIED USING benutzer.prozedurname;
Auch dieser Rolle sind mit dem Befehl GRANT die gewünschten Privilegien oder Rollen zuzuweisen.

Es gibt einige Gründe, warum sichere Anwendungsrollen sicherer sind als die Rollen, die auch in der Standard Edition zur Verfügung stehen:
  • Sichere Anwendungsrollen und damit die darin festgelegten Berechtigungen sind nicht ausserhalb des Rahmens der Anwendung verfügbar.
  • Sie vermeiden das latente Risiko von Passworteingaben zum Aktivieren passwortgeschützter Rollen.
  • Sie werden über den Befehl GRANT ausschließlich an den Anwendungsbenutzer vergeben. So kann selbst die Kenntnis von Details über die Prozeduren / Packages nicht zum Aktivieren missbraucht werden.
  • Innerhalb der Prozeduren / Packages können umfangreichere Überprüfungen stattfinden, deren Ergebnis die Freigabe der Rolle bestimmen. So können zum Beispiel Parameter aus der Umgebung des Benutzers der Anwendung (siehe SYS_CONTEXT('USERENV', 'xxx')) für die Freigabe der Rolle herangezogen werden.
Im folgenden rudimentären Beispiel ist die Vorgehensweise zum Arbeiten mit sicheren Anwendungsrollen dargestellt. Die Reihenfolge, in der Rolle und Prozedur / Package angelegt werden, ist nicht festgelegt. So kann die Rolle auch - anders als in diesem Beispiel - erst nach der Programmierung der Prozedur angelegt werden.
CREATE ROLE rolle6 IDENTIFIED USING benutzer.prozedurname;
GRANT ... TO rolle6;

CREATE OR REPLACE PROCEDURE benutzer.prozedurname
AUTHID CURRENT_USER
IS
...
DBMS_SESSION.SET_ROLE('rolle6');
...
END;
/

GRANT EXECUTE ON benutzer.prozedurname TO anwendungsbenutzer;

-- Die Anwendung kann nun zum Beispiel beim Aufbau einer Session für einen Benutzer die Prozedur
-- benutzer.prozedurname aufrufen und damit die in der Rolle enthaltenen Privilegien freigeben.
Welche sicheren Anwendungsrollen in der Datenbank angelegt sind, zeigt eine Abfrage auf die Data Dictionary View DBA_APPLICATION_ROLES mit den Spalten ROLE, SCHEMA und PACKAGE.

Weitere Informationen zu den sicheren Anwendungsrollen bieten auch OTN und ein Beispiel (Oracle By Example, OBE), das im Browser am Bildschirm bearbeitet werden kann.

Arbeiten mit Rollen in Oracle Database Vault

Oracle Database Vault bietet einerseits die Möglichkeit, die bisher beschriebenen Rollen über sogenannte Realms zu schützen. Realms sind Bereiche, auf die man nur mit expliziten Privilegien zugreifen kann und die damit dem Zugriff von Benutzern, die mit ANY Privilegien arbeiten, entzogen sind. Zu diesen letztgenannten Benutzern gehören zum Beispiel Datenbankadministratoren.

Database Vault lässt sich zwar auch über Packages nutzen, aber für diesen Artikel soll die graphische Benutzeroberfläche, Database Vault Administrator (dva), verwendet werden. Die folgende Abbildung zeigt, dass die von dem Benutzer SYSTEM angelegte Rolle rolle1 durch einfaches Anklicken dem Realm Rollenspiele hinzugefügt wird. Während nicht durch Realms geschützte Rollen zum Beispiel über den Umweg GRANT an sich selbst und anschließendes SET ROLE dem DBA zugänglich sind, ist die Rolle rolle1 nun davor geschützt. Dazu berechtigte Benutzer können dagegen ohne Probleme zum Beispiel mit dem Befehl SET ROLE die Rolle aktivieren.

Anmerkung: Bilder zum Tipp werden sichtbar, indem man mit der Maus über das Brillen Icon fährt.


Um das Bild wieder zu verkleinern, auf das Bild klicken.


Abbildung 1: Eine Rolle durch ein Realm schützen

Es gibt allerdings auch sichere Anwendungsrollen, die explizit in Database Vault angelegt werden und dann nach Auswertung Database Vault spezifischer Regelgruppen (rule set) aktiviert werden können. Die folgenden Abbildung zeigt, wie auf der entsprechenden Seite des dva die Rolle Rollenspiel eingerichtet wird. Zum Aktivieren wird die Regelgruppe Rolle aktivieren ausgewertet. Diese Regelgruppe und ihrer Regeln müssen durch den Eigentümer des Database Vault eingerichtet werden. Nach dem Anlegen der Rolle können ihr ganz normal Privilegien und andere Rollen mit dem Befehl GRANT zugewiesen werden.


Abbildung 2: Eine sichere Anwendungsrolle im Database Vault Administrator anlegen

Diese sichere Anwendungsrolle kann nicht mit dem üblichen Befehl SET ROLE aktiviert werden, sondern ausschließlich durch den Aufruf einer Database Vault spezifischen Prozedur aus dem Package DVSYS.DBMS_MACSEC_ROLES. Den Aufruf, der üblicherweise aus einer Anwendung heraus erfolgt, stellt das folgende Beispiel dar. Die Rolle wird aktiviert, wenn die Auswertung der Regeln der zugewiesenen Regelgruppe den Wert TRUE ergibt.
DVSYS.DBMS_MACSEC_ROLES.SET_ROLE('Rollenspiel');
Alle Informationen zu den in Database Vault angelegten Rollen finden sich ebenfalls in den Data Dictionary Views, die oben und im folgenden Text beschrieben sind.

Monitoring: Informationen zu den Rollen

Neben den oben bereits beschriebenen Data Dictionary Views SESSION_ROLES und DBA_APPLICATION_ROLES gibt es weitere Views, die einen Überblick über Rollen und ihre Berechtigungen geben.
  • DBA_ROLES listet Informationen über alle in der Datenbank angelegten Rollen.
  • DBA_ / USER_ROLE_PRIVS informiert darüber, welcher Benutzer welche Rollen aktivieren kann.
  • ROLE_ROLE_ / SYS_ / TAB_PRIVS zeigt, welche Rollen, System- und Tabellenprivilegien einer Rolle mit GRANT zugewiesen wurden.
Ausgangspunkte, um sich noch detaillierter über das Arbeiten mit Rollen zu informieren, bieten die SQL Reference und der Security Guide.

Zurück zur Community-Seite