DOAG Datenbank Kolumne: Privilegienkapselung – eine einfache Methode zur Entlastung des DBAs

  • Erstellt von Matthias Mann
  • Datenbank Kolumne, Datenbank

Oft wiederkehrende Vorgänge, welche administrative Privilegien erfordern, können in Prozeduren gekapselt werden und ausgewählte Benutzer können darauf berechtigt werden. Dies ist eine einfache Maßnahme zur Absicherung der Datenbankinstanz und verringert das Arbeitsvolumen des DBAs.

Ein einfaches Beispiel ist das erzwungene Beenden von Datenbanksessions. Es eignet sich für solche Umgebungen, in denen die Datenbank nur die Schemas für eine Applikation enthält und es die Funktion eines Applikationsadminstrators gibt.

Als erstes legen wir einen Datenbankuser an und statten diesen mit den benötigten Privilegien aus. Der Account ist ein “Schema-Only”-account, man kann sich also nicht direkt mit diesem anmelden.

 

SQL> -- create a service account to host procedures

SQL> create user service no authentication;

SQL> alter user service account lock; 

 

SQL> -- grant required privileges

SQL> grant create procedure to service;

SQL> grant alter system to service;

SQL> grant select on gv_$session to service;

 

Nun definieren wir eine Prozedur, welche die administrative Tätigkeit ausführt, in unserem Beispiel das erzwungene Beenden einer Datenbank-Session.

 

-- create procedure

SQL> create procedure service.kill_session

      ( pn_sid number

       ,pn_serial number

       ,pn_instid number)

     as

       lv_user varchar2(30);

       v_statement varchar2(255);

     begin

       select username into lv_user from sys.gv_\$session 

       where sid = pn_sid and serial# = pn_serial and inst_id = pn_instid;

       if lv_user is not null and lv_user not in ('sys','system')      

         then

         v_statement := 'alter system kill session  

'''||pn_sid||','||pn_serial||',@'||pn_instid||''' immediate';

         dbms_output.put_line(v_statement);

         execute immediate v_statement;

       else

         raise_application_error(-20000,'attempt to kill protected system 

session has been blocked.');

       end if;

     end;

     /

 

Optional kann man das Recht zum Ausführen der Prozedur an eine lokale oder globale Datenbankrolle vergeben. 

SQL> grant execute on service.kill_session to service_role;

Im ersten Fall kann die Rolle durch den DBA an die lokalen Benutzer vergeben werden, die diese Administrationstätigkeit ausführen sollen.

SQL> grant service_role to appl_mgr;

Im Falle einer global authentifizierten Rolle wird im Unternehmensdirectory eine zugehörige Enterprise-Rolle angelegt. Diese kann durch den Directoryadministrator an die gewünschten Directory-Benutzer vergeben werden kann. Der Applikationsadministrator kann nun unter kontrollierten Bedingungen Sessions beenden und braucht nicht mehr die Hilfe des DBAs zu beanspruchen.

APPL_MGR> -- get session data which should be ended

APPL_MGR> select sid, serial#, inst_id from gv$session where …

APPL_MGR> exec service.kill_session(<sid>,<serial#>,<inst_id>);

 

Matthias Mann

© andreaschitz