18. September 2012

Protect important roles with a password

Einführung

Wenn ich die Sicherheit einer Datenbank überprüfe, empfehle ich oft wichtige Rollen wie EXP_FULL_DATABASE mit einem Kennwort zu schützen.

Diesen Schutz einzuschalten, ist ganz einfach. Siehe folgendes Kommando.


alter role EXP_FULL_DATABASE identified by oracle;

Nun hat mich ein Kunde neulich gefragt: "Wie aktiviere ich die Rolle, wenn ich das Export-Utility (exp oder expdp) nutze?"

Das war eine sehr gute Frage. Natürlich können die Utilities keine password-geschützte Rollen automatisch setzen und ein erneutes Password abfragen. Entweder sind die notwendigen Rollen beim Login an das Utility gesetzt oder nicht. Das Setzen von Rollen mit Password macht man mit dem SET ROLE Kommando, also:


SET ROLE exp_full_database identified by oracle;
oder PL/SQL


begin DBMS_SESSION.SET_ROLE('EXP_FULL_DATABASE identified by oracle');end;/

Erst dann, wenn man das richtige Password wusste, erscheint die Rolle als gesetzt in der View SESSION_ROLES.
So, was nun?

Data Pump API nutzen

ok mit den Utilities geht das nicht, also die Data Pump API nutzen. Hier kann man leicht einen SQL Script bauen und im Script das Kennwort für das setzen der Rolle abfragen.



DECLARE  ind NUMBER;              -- Loop index  h1 NUMBER;               -- Data Pump job handle  percent_done NUMBER;     -- Percentage of job completeBEGIN-- set the EXP_FULL_DATABASE role  dbms_output.put_line('First set the password');  DBMS_SESSION.SET_ROLE('EXP_FULL_DATABASE identified by &role_password ');  dbms_output.put_line('...password set');-- Create a (user-named) Data Pump job to do a schema export.  dbms_output.put_line('Open Full Database Export');  h1 := DBMS_DATAPUMP.OPEN('EXPORT','FULL',NULL,'FULL_DB_EXPORT1','LATEST');  dbms_output.put_line('...export opened');-- Specify a single dump file for the job (using the handle just returned)-- and a directory object, which must already be defined and accessible-- to the user running this procedure.  DBMS_DATAPUMP.ADD_FILE(h1,'fulldb_export1.dmp','DATA_PUMP_DIR');-- Start the job. An exception will be generated if something is not set up-- properly.   DBMS_DATAPUMP.START_JOB(h1);-- Indicate that the job finished and detach from it.      dbms_output.put_line('Job has completed');  dbms_datapump.detach(h1);END;/exit;
Will man nun das Script als Export-Utility benutzen, würde die Ausführung wie nachfolgend dargestellt, stattfinden:


$ sqlplus scott/tiger @export_fulldatabase.sql
Vereinfacht dargestellt, könnte das eine Möglichkeit sein mit PASSWORD geschützten Rollen umzugehen.

Warum das alles?

Es gibt tatsächlich Datenbank Instancen in denen viele Endbenutzer Rollen Grants haben, die diese nicht benötigen. So kann es vorkommen, dass hunderte von Endbenutzern eine komplette DB exportieren können. Um die Logik der Anwendung nicht zu gefährden, empfiehlt es sich diese wichtige Rollen mit einem Password zu schützen.
Prinzipiell sollte man sich immer über die Zustände und Gefährdungen seines SYSTEMS im Klaren sein. Hierzu gehört auch gefährliche und hochprivilegierte Rollen zu kennen, und diese in einem gefährlichen Umfeld zu schützen.

Zusatz-Information:

Oracle empfiehlt anstelle der Kennwort-geschützten Rollen die Secure Application Roles stattdessen zu verwenden. Die Logik, die erforderlich ist, um eine Rolle automatisch zu setzen, wird in PL/SQL implementiert.
In der nachfolgenden Grafik werden beide Verfahren gegenüber gestellt.


Secure Application und password-geschützte Roles