DBA zu Weihnachten - mit Secure Application Roles
Wenn es um das Zuweisen von Rollen zu Datenbank-Nutzerkonten geht, können Secure Application Roles
ganz interessant sein. Eine Secure Application Role ist zunächst eine ganz normale Rolle, das Besondere
ist aber, dass sie nur durch eine PL/SQL-Programmeinheit, bspw. ein Package, aktiviert werden kann.
So ist die Anforderung, dass eine Rolle nur unter bestimmten Umständen aktiviert werden soll,
mit Secure Application Roles ganz einfach umsetzbar. Allerdings erfordern Secure Application Roles eine
Enterprise Edition, in der Standard-Edition oder gar in OracleXE sind sie nicht verfügbar.
Das Einrichten einer Secure Application Role ist sehr einfach. Die in IDENTIFIED USING genannte
Prozedur muss zum Zeitpunkt des CREATE ROLE-Kommandos noch nicht existieren.
create role dba_an_weihnachten identified using sys.dba_weihnachten_proc /
Das Zuweisen von Privilegien oder anderen Rollen zur Secure Application Role ist ebenfalls ganz einfach:
grant dba to dba_an_weihnachten /
Wenn sich der Nutzer SCOTT nun anmeldet und in der View SESSION_ROLES nachsieht, dann
ist die Rolle nicht aktiv ...
SQL> select * from session_roles; ROLE ------------------------------ CONNECT RESOURCE 2 Zeilen ausgewählt.
Ein einfaches SET ROLE hilft nicht.
SQL> set role dba_an_weihnachten; set role dba_an_weihnachten * FEHLER in Zeile 1: ORA-28201: Keine ausreichenden Berechtigungen zur Aktivierung von Anwendungsrolle 'DBA_AN_WEIHNACHTEN'
Das liegt daran, dass die Rolle eben nur über die im CREATE ROLE genannte Prozedur
SYS.DBA_WEIHNACHTEN_PROC aktiviert werden kann. Wir brauchen also, im Schema SYS,
diese Prozedur.
create or replace procedure sys.dba_weihnachten_proc authid current_user is
begin
if extract(DAY from sysdate) in (24,25,26) and extract(MONTH from sysdate) = 12 then
dbms_session.set_role(
role_cmd => 'DBA_AN_WEIHNACHTEN'
);
else
raise_application_error(-20000, 'ES IST NICHT WEIHNACHTEN!');
end if;
end;
/
sho err
Wichtig ist, dass die Prozedur mit der Klausel AUTHID CURRENT_USER angelegt wird, denn
im Rahmen einer AUTHID DEFINER-Prozedur sind alle Rollen abgeschaltet. Wie Ihr seht, macht
die Prozedur hier nicht viel: Sie prüft das Datum - und an Weihnachten kann der User SCOTT zum
DBA werden. Vergesst nicht, das EXECUTE-Privileg zu vergeben.
grant execute on sys.dba_weihnachten_proc to scott /
Nun als SCOTT anmelden und versuchen, die Rolle zu aktivieren ...
SQL> select * from session_roles; ROLE ------------------------------ CONNECT RESOURCE 2 Zeilen ausgewählt. SQL> exec sys.dba_an_weihnachten; BEGIN sys.dba_an_weihnachten; END; * FEHLER in Zeile 1: ORA-20000: ES IST NICHT WEIHNACHTEN! ORA-06512: in "SYS.DBA_AN_WEIHNACHTEN", Zeile 8 ORA-06512: in Zeile 1
An Weihnachten sieht die Sache aber anders aus ... wieder als SCOTT anmelden ...
SQL> select sysdate from dual;
SYSDATE
-------------------
24.12.2012 00:00:00
1 Zeile wurde ausgewählt.
SQL> exec sys.dba_weihnachten_proc;
PL/SQL-Prozedur erfolgreich abgeschlossen.
SQL> select * from session_roles;
ROLE
------------------------------
CONNECT
RESOURCE
DBA
SELECT_CATALOG_ROLE
:
SQL> select count(*) from dba_tables;
COUNT(*)
----------
5276
Das ist einfach, aber doch sehr mächtig - es ist natürlich wesentlich mehr möglich, als ein
einfacher Check auf "Weihnachten". So kann man aus sich mit der Funktion SYS_CONTEXT jede
Menge Umgebungsinformationen holen. Mehr zum Thema findet Ihr in der Dokumentation.