Gliederung zu AUDITING 1; Übersicht (Versionen) Seite 2 2; Audit-Kategorien a; Standard-Audit b; Datenbank-Audit c; Wertorientierter Audit d; Anwendungs-Audit 3; SETUP a; Datenbank-Audit aktivieren (und deaktivieren) Beispiel b; Installation AUDITING c; Privileg für den User d; Audit-Optionen festlegen 1; Administrative Verbindungen 2; Auditing auf Objekt-Ebene 3; Auditing auf Privilegien-Ebene 4; Anweisungs-Audit Seite 3 Seite 4 Seite 6 Seite 6 Seite 7 Seite 7 Seite 7 Seite 8 4; Fein abgestimmtes Auditing (FGA) a; Interfaces von DBMS_FGA b; Neu in Version 10g c; Erstellen einer Policy auf Spalten-Ebene (nur 10g) inkl. Spalten Masking (Beispiel) d; Implementierung der Audit Policy e; Triggering f; Beispiele zu 9i g; Beispiele zu 10g g.1. STATIC g.2. Context Sensitive h; Audit Column (+ Beispiel) i; Audit Event Handler (+ Beispiel) Seite 9 Seite 9 Seite 9 Seite 11 Seite 12 Seite 12 Seite 13 Seite 14 Seite 14 Seite 14 Seite 15 Seite 16 5; Syntax zu ADD_POLICY Seite 17 6; VIEWS Seite 19 1 AUDITING 1; Übersicht (Versionen) In den DB-Versionen vor 9i erfolgte das Auditing mit „before“ und „after“ Triggern für INSERT,UPDATE und DELETE. Ab Version 9i lassen sich auch SELECTs auditieren. In Version 10, supportet FGA-DML-Statements + MERGE. In Version 10g ist für den AUDIT_TRAIL – Parameter die Option „DB_EXTENDED“ hinzugekommen. Siehe dort. Ab Version 9i ist es möglich nur die „Success“ oder nur die „Unsuccess“-Operationen zu auditieren.Mit anderen Worten: AUDITING kann nur die Versuche auditieren, auch wenn keine Information abgerufen werden konnte. 2; Audit-Kategorien: a; Standard-Audit Standardmäßig wird geprüft: - STARTUP/SHUTDOWN der Instanzen - Administratorprivilegien (Die Audit-Informationen enthalten den Betriebssystem-User, der sich mit Administrator-Privilegien bei ORACLE anmeldet. b; Datenbank-Audit Beim Datenbank-Audit werden bestimmte Benutzer-DB-Aktionen überwacht und aufgezeichnet. Informationen über das Ereignis werden im Audit-Trail gespeichert. Neben der Überwachung verdächtiger Aktivitäten auf der DB können auch Daten zu speziellen DB-Aktivitäten z.B. in Form von Statistikdaten zu den aktualisierten Tabellen, der Anzahl durchgeführter I/O-Operationen sowie die Anzahl der Benutzer erfasst werden die sich zu Spitzenbelastungszeiten gleichzeitig anmelden. c; Wertorientierter Audit Ein DB-Audit kann keine Spaltenwerte aufzeichnen. Wenn Änderungen von Datenbankspalten überwacht und die Spaltenwerte für jede Änderung aufgezeichnet werden müssen, soll der Anwendungs-Audit verwendet werden. d; Anwendungs-Audit erfolgt über Client-Code, Stored-Procedures oder DB-Trigger. 2 3; SETUP a; Datenbank-Audit aktivieren und deaktivieren Erfolgt mittels AUDIT_TRAIL = „wert“ wert = - DB oder TRUE (Ermöglicht das systemweite Auditing, wobei die auditierten Records in den Audit Trail (= SYS.AUD$ Table) geschrieben werden. - OS (systemweites Auditing, bei dem die auditierten Records in das Audit Trail des Systems geschrieben werden) - DB_EXTENDED (identisch mit der Option „DB/TRUE“; zusätzlich werden die Spalten „SQLBIND“ und „SQLTEXT CLOB“ in der Tabelle SYS.AUD$ gefüllt.) - NONE oder FALSE (Default. Schaltet Auditing aus) Besonderheit zur Option „OS“: Es muß hier der Ort spezifiziert werden: z.B. AUDIT_FILE_DEST = $ORACLE_HOME/rdbms/audit Abfrage mit: SQL> select spid, program, username from v$process; Für weitere Parameter siehe “FGA” auf den Folgeseiten 3 Beispiel: In der init.ora wurde AUDIT_TRAIL auf DB_EXTENDED gesetzt. Damit wurde das automatische Schreiben von Audits ermöglicht. Alle Sätze werden in die SYS.AUD$ Tabelle geschrieben. Zusätzlich werden die CLOB-Spalten der SYS.AUD$ Tabelle, SQLBIND und SQLTEXT gefüllt. Online wäre die gleiche Wirkung erzielt mit: SQL> ALTER SYSTEM SET audit_trail=db_extended SCOPE=SPFILE; SQL> SHOW PARAMETER AUDIT_TRAIL Nachstehendes Beispiel dient zur Erläuterung welche Inhalte in den Spalten „sqlbind“ und „sqltext“ der Tabelle SYS.SYSAUD$ stehen: SQL> AUDIT INSERT INTO piet.dept; -siehe “Audit-Optionen festlegen” SQL> CREATE OR REPLACE PROCEDURE dbms_example (deptnum IN piet.dept.deptno%TYPE, deptname IN piet.dept.dname%TYPE, location IN piet.dept.loc%TYPE) IS stmt_str varchar2(100); rows_processed NUMBER; cur_hdl NUMBER; BEGIN stmt_str := 'INSERT INTO piet.dept VALUES( :deptno, :dname, :loc)'; cur_hdl := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(cur_hdl,stmt_str,DBMS_SQL.NATIVE); DBMS_SQL.BIND_VARIABLE(cur_hdl,´:deptno´, deptnum); DBMS_SQL.BIND_VARIABLE(cur_hdl, ´:dname´,deptname); DBMS_SQL.BIND_VARIABLE(cur_hdl,´:loc´, location); rows_processed := dbms_sql.execute(cur_hdl); DBMS_SQL.CLOSE_CURSOR(cur_hdl); END; / SQL> select Oder: SQL> select Oder: SQL> select sqlbind, sqltext from sys.aud$; sqlbind, sqltext from user_audit_trail; sqlbind, sqltext from dba_audit_trail; In den Spalten “sqlbind” stehen nach Aufruf obiger Prozedur die entsprechenden Werte für die Bindevariablen “:deptno“,“:deptname“ und “:loc“. 4 Der Inhalt von “sqltext“ enthält die SQL-Statements der Prozedur “dbms_example“. Anstatt der Tabelle “SYS.AUD$“ kann auch der View “USER_AUDIT_TRAIL“ / “DBA_AUDIT_TRAIL“ abgefragt werden. Diese Views setzt auf der Tabelle “SYS.AUD$“ auf. Die Verwendung der Views ist die gebräuchlichere Form. „USER_AUDIT_TRAIL“ listet nur die Einträge des Users. 5 b; Installation AUDITING Falls Auditing nicht existiert kann das Auditing nun installiert werden: SVRMGR> connect internal (oder als SYS) SVRMGR> @cataudit.sql Siehe auch “Feinabgestimmtes Auditing mittels DBMS_FGA” auf den Folgeseiten. c; Privileg “audit xxxx“ für den User (“audit system“ / “audit any“) Für das Auditing muß der User das Audit-Priv besitzen. SQL> SQL> SQL> SQL> connect system/manager grant audit system to scott; connect scott/tiger audit session; Mit dem Privileg “audit system” kann der User SCOTT auf Session-Ebene auditieren. User mit dem Audit-Priv werden abgefragt über: SQL> select * 2 from dba_sys_privs 3 where privilege like '%AUDIT%'; d; Audit-Optionen festlegen Erfolgt über das Kommando: AUDIT Legt fest, welche Befehle,Benutzer,Objekte oder Privilegien geprüft werden sollen.. Außerdem lässt sich festlegen, ob Audit-Informationen für jedes Vorkommen oder nur einmal pro Session generiert werden sollen. Allgemeines Format: audit {statement_option|privilege_option} [by user] [by {session|access}] [ whenever {successful|unsuccessful}] Nur “statement_option und privilege option sind pflicht. 6 Eine Statement-Option kann z.B. sein: ALTER, GRANT, RENAME sowie die "klassischen" Datenmanipulationen INSERT, UPDATE usw. Man kann entweder einzelne Objekte, z.B. eine bestimmte Datenbanktabelle, angeben oder DEFAULT. Bei letzterem gilt der Befehl systemweit, also nicht nur für einzelne Objekte. SESSION oder ACCESS steuert, ob die Protokollierung nur beim ersten Mal einer "Sitzung" am Terminal oder bei jedem Zugriff erfolgt. Man kann die Protokollierung dann noch auf erfolgreiche Aktionen oder Misserfolge begrenzen. Auditing kann sich richten auf: 1; 2; 3; 4; Administrative Verbindungen Auditing auf Objekt-Ebene Auditing auf Privilegien Ebene Auditing von Anweisungen Zu 1; Administrative Verbindungen z.B. AUDIT SYS Operations: Hier muß in der init.ora der Parameter gesetzt werden: AUDIT_SYS_OPERATIONS = TRUE Die Operationen von SYS, SYSDBA und SYSOPER werden überwacht. Zu 2; Auditing auf Objekt-Ebene Objekte sind: Tabellen, Views, Sequenzen, Packages, Stored Procedures/ Funktions Welche Optionen sind möglich ? alter, audit, comment, delete, grant, index, insert, lock, rename, select, update, reference and execute “reference“ and “execute“ können nicht auf Tabellen angewendet werden. z.B. AUDIT SELECT ON emi.orders; AUDIT SELECT ON scott.emp by access; In letzterem Fall wird auch jeder versuchte Zugriff auf EMP protokolliert. zu 3; Auditing auf Privilegien-Ebene Es können alle Privs auditiert werden Gültige Privs können nachgesehen werden in: system_privilege_map z.B. AUDIT CREATE ANY TRIGGER; : SQL> select username, priv_used, ses_actions from dba_audit_object; Ergebnis: USERNAME -------SCOTT SCOTT SYSTEM PRIV_USED SES_ACTIONS ---------------------------------------- ------------------CREATE ANY TRIGGER CREATE ANY TRIGGER CREATE ANY TRIGGER Bei z.B. AUDIT TABLE werden Statements zu: CREATE,ALTER und DROP table auditiert. 7 zu 4; Anweisungs-Audit: Ist ähnlich wie bei „Auditing auf Privilegien-Ebene“. Nur wird hier das System Privileg auditiert. z.B. AUDIT CREATE TABLE auditiert nur das CREATE TABLE und nicht irgendeine Anweisung zu ALTER oder DROP Alle diese Optionen können ergänzt werden durch: - WHENEVER SUCCESSFUL / - BY SESSION / BY ACCESS WHENEVER NOT SUCCESSFUL Die vereinbarten Optionen kann man nachsehen in der View: SYS.DBA_SYS_AUDIT_OPTS Session-Auditing beenden mit: SQL> noaudit session; 8 4; Feinabgestimmtes Auditing (FGA) - FGA ermöglicht die Überwachung des Datenzugriffs auf der Basis des Inhalts - Implementierung über das Package DBMS_FGA FGA wurde in der Version 9i nur von SELECT supported. Neu in Version 10g ist der Support von FGA für DML-Statements + MERGE Definition: „Virtual Private Database (VPD)“ Die Kombination von “feinkörnige Zugangskontrolle” mit sicherem Anwendungszusammenhang wird VPD genannt a; Interfaces von DBMS_FGA - ADD_POLICY (Syntax siehe Seite 17)) - ENABLE_POLICY - DISABLE_POLICY - DROP_POLICY ORACLE auditiert immer ein DELETE, auch wenn keine Spalten spezifiziert worden sind, da hier sämtliche Spalten betroffen sind. b; Neu in Version 10g: - Es ist der View DBA_COMMON_AUDIT_TRAIL hinzugekommen Dieser View enthält nun zusätzliche Informationen zu SCN sowie „sqlbind“ und „sql_text“ (siehe SYS.AUD$). Voraussetzung für diesen View ist, dass in der init.ora AUDIT_TRAIL = DB_EXTENDED gesetzt wurde Zusätzliche Informationen sind: die SerienNummer der Audit Datensätze Nummern zu den Statements, die helfen welche Audit-Einträge zu einer AnweisungsNummer (STATEMENTID) gehören. - Folgende Attribute sind sowohl den Standard Audit Trails sowie FGA Audit-Trails Gemeinsam: -- globaler-Zeitstempel (GLOBAL_UID) -- eine eindeutige Instanz-Nummer für die RAC – Instanzen (INSTANCE_NUMBER) -- eine Nummer zur Transaktion um einzelne Datensätze einer Transaktion zuzuordnen (TRANSATIONID) - Die Prozedur DBMS_FGA.ADD_POLICY hat einen neuen Parameter: STATEMENT_TYPES. Dient dazu den Typ der Aktion zu auditieren. Siehe Seite 18. - Es lassen sich Statements zu DML + MERGE auditieren. Hinsichtlich MERGE , so wird die darunter liegende INSERT/UPDATE Operation auditiert. Man kann mehr als nur eine einzelne Spalte für das FGA auditieren. - Man kann auch NULL in den feinkörnigen Aussagen zur Policy verwenden. Beispiel : Siehe auch “Syntax zu ADD_POLICY” am Schluß. begin DBMS_FGA.ADD_POLICY ( 9 object_schema => 'OE', object_name => 'cust_payment_info', policy_name => 'fga_cust_payment_info', audit_condition => 'credit_card_number = 310654305412389', audit_column => NULL, handler_schema => NULL, handler_module => NULL, enable => TRUE, statement_types => 'UPDATE, DELETE, SELECT', audit_trail => DBMS_FGA.DB + DBMS_FGA.EXTENDED); end; / - FGA erzeugt einen signifikant größeren Overhead mit SQL-Informationen. Der Inhalt der Spalten (siehe Tabelle: SYS.AUD$) „sqltext“ und „sqlbind“ wird nun nicht mehr in LOBs abgelegt. - Einführung von STATIC–POLICIES Die DB führt eine „statische Policy“ nur einmal aus. Es entfällt das wiederholte Ausführen der POLICY und legt die Aussagen (Predikate) im Puffer der SGA ab. Von nun an wendet die DB diese Predikate auf alle folgenden Queries für die geschützten Objekte an. Dies entlastet ganz erheblich den Server. In den Versionen zuvor kam ausschließlich die „dynamische Policy“ zur Anwendung. Hierbei wird jeweils eine unterschiedliche „WHERE“ Klausel verwendet. Bei der „statischen Policy“ hingegen kommt stets die selbe WHERE-Klausel zur Anwendung. z..B. DEPTNO=irgendwas. Obwhohl „irgendwas“ für jedes Statement differieren kann, so hat sich die SQL – Abfrage auf die Tabelle nicht geändert. So etwa in Analogie zur Binde_Variablen. z.B. Eine „Function“ fragt einen „UserContext“ ab und generiert unterschiedliche „WHERE“-Klauseln in Abhängigkeit vom Ergebnis. So erhalten einige User z.B. „deptno=xxxxx“ und andere wiederum erhalten als Resultat „mgr=xxxx“. So ergeht beim Ausweis der Policy als „statisch“ die Anweisung an ORACLE dass diese „Function“ nur einen einzigen Wert zurückliefert, unabhängig wer ausführt. Wenn ORACLE nun die Anweisung von der Policy erhält , stets den selben Wert zurückzugeben, so braucht ORACLE diese Policy nicht ständig neu zu generieren. Für Hosting-Umgebungen, z.B. bei Data Warehouse wo die selbe Aussage auf mehrere DB-Objekte angewendet werden muß, wird SHARED_STATIC eingesetzt. Letzterer Parameter unterscheidet sich von SHARED dadurch, dass die Policy über mehrere Objekte verteilt ist. - Einführung von CONTEXT_SENSITIVE und SHARED_CONTEXT_SENSITIVE Bei CONTEXT_SENSITIVE wird die Policy angewendet zum Zeitpunkt des Parsens der Anweisung sowie bei der Ausführung der Anweisung wenn der lokale Kontext seit dem letzten Gebrauch des Cursors sich geändert hat. Wird angewendet bei dreireihiger SessionVereinigung (3-tier session pooling). Ist für Applikationen gedacht, wo mehr als eine Aussage für unterschiedliche User oder Gruppen getroffen werden. Context-Sensitive Policy kommt zur Anwendung vor allem bei Applikationen auf WEB-Basis mit Connection Polling. Hierbei verändert sich die Session in Abhängigkeit vom „CLIENT_IDENTIFIER“ des Users. 10 Der Unterschied SHARED_CONTEXT_SENSITIVE zu CONTEXT_SENSITIVE besteht darin, dass hier die Policy auf mehrere Objekte verteilt ist. c; Erstellen einer Policy auf Spalten-Ebene (nur 10g) (Beispiel) Erfordert das Privilege „EXECUTE ON DBMS_RLS“ Zuerst wird die Policy-Function erstellt Dann wird die Policy zu VPD (Virtual Private Database) erstellt mit DBMS_RLS.ADD_POLICY. Die Spalten-Namen werden spezifiziert über den Parameter: sec_relevant_cols und evtl. ergänzt durch: sec_relevant_cols_opt Erstellen einer Policy-Funktion (Spalten Masking) Begrenzt den Zugang auf die Spalten “Salary” und “Commission” wenn der Angestellte nicht zum Department-Nr 5 gehört. create or replace function test_function (objowner IN 2, varchar2 objname IN varchar2) return varchar2 as con varchar2 (200); begin con := 'deptno = 5'; return (con); end test_function; / Nun wird eine VPD erstellt: begin dbms_rls.add_policy ( object_schema => 'scott', object_name => 'emp', policy_name => 'test_policy', function_schema => 'scott', policy_function => 'test_function', statement_type = 'insert,update' sec_relevant_cols => 'salary, commission'); end; SQL> select deptno, empno, ename, job, sal, comm from emp; Die Spalten “sal” und “comm.” Werden nur für das Department 5 gelistet. Weiteres Beispiel für Spalten-Masking zu obiger VPD (mit dem Parameter sec_relevant_cols_opt => DBMS_RLS.ALL_ROWS) begin dbms_rls.add_policy ( object_schema => 'scott', object_name => 'emp', policy_name => 'sp_job', function_schema => 'scott', policy_function => 'pf_job', 11 sec_relevant_cols => 'sal, comm' sec_relevant_cols_opt => DBMS_RLS.ALL_ROWS ); end; / select deptno, empno, ename, job, sal, comm from emp; Ergebnis: Es werden Salary und Commision nur für die Mitarbeiter in Department 5 gelistet. Es werden ansonsten alle Mitarbeiter gelistet, jedoch ohne die Spalten „sal“ und „comm“. d; Implementierung der Audit Policy - erforderliche Angaben (Schema,Objekt, Name der Policy und die Audit-Kondition) optional (audit Spalte, Schema des Event Handlers, Name des Event Handlers, ob enabled) Die Policies sind in der Tabelle „DBA_AUDIT_POLICIES“ gespeichert Bei einem Drop;Enable/Disable einer Audit-Policy müssen das Schema-Object, sowie die Bezeichnung der Policy angegeben werden. e; Triggering Beim Triggern des Audits, werden die Daten in die Tabelle DBA_FGA_AUDIT_TRAIL geschrieben. Diese enthält: - session id - user name - timestamp - name of policy - Text der SQL-Query 12 f; Beispiele zu 9i: DBMS_FGA.ADD_POLICY ( object_shema object_name policy_name audit_condition ); => => => => 'hr ', 'employees ', 'audit_dept100_employees ', 'department_id = ' '100 ' ' ' DBMS_FGA.ENABLE_POLICY ( object_schema => 'hr', object_name 'employees', policy_name 'audit_dept100_employees ', enable BOOLEAN := TRUE ); DBMS_FGA.DISABLE_POLICY ( object_schema 'hr ', object_name 'employees ', policy_name 'department_id = ' '100 ' ' ' ); DBMS_FGA.DROP_POLICY ( object_schema 'hr ', object_name 'employees ', policy_name 'department_id = ' '100 ' ' ' ); 13 g; Beispiele zu 10g g.1. STATIC begin dbms_rls.add_policy ( object_schema => 'scott ', object_name => 'emp ' , policy_name => 'test_policy ', function_schema => 'test_schema ' , policy_function => 'test_function ' , statement_type = 'select, insert, update ', policy_type => dbms_rls.static sec_relevant_cols => 'salary , commission'); end; Wenn die selbe “ statische Policy Funktion” über mehrere Datenbank-Objekte als „Share“ verteilt werden soll, so muß der Parameter „policy type“ abgeändert werden auf: policy_type => dbms_rls.shared_static g.2. Context-Sensitive begin dbms_rls.add_policy ( object_schema => 'scott ', object_name => 'emp ' , policy_name => 'test_policy ', function_schema => 'test_schema ' , policy_function => 'test_function ' , statement_type = 'select, insert, update ', policy_type => dbms_rls.context_sensitive sec_relevant_cols => 'salary , commission '); end; 14 h; Audit Column Ohne „audit column“ wird die Query auditiert, wenn die Audit-Bedingung zutrifft. Bei Spezifizierung der „Audit Column“ wird der Audit selbst bei zutreffender Bedingung nicht getriggert. Getriggert wird erst bei Bezugnahme in der Query. Allerdings behandelt ORACLE 9i alle Spalten als „Audit Columns“ z.B. DBMS_FGA.ADD_POLICY ( object_shema object_name policy_name audit_condition audit_column ); => => => => 'hr ', 'employees ', 'audit_topsecret_employees ', 'security_clearance = ' 'TOPSECRET ' ' ', => 'ssn ' SELECT last_name, first_name, phone FROM employee WHERE ssn = '123-45-6789 '; Die Security Freigabe für diese Person lautet TOPSECRET. Weil die Bedingung zutrifft und die Angabe der ssn Spalte in der Query angegeben wird so wird diese Abfrage auditiert. SELECT last_name, first_name, phone FROM employee WHERE security_clearance = 'SECRET '; Diese Query resultiert in Employees mit der Freigabe SECRET. Die Audit Policy Bedingung erfordert Audit von TOPSECRET. Die Query wird deshalb nicht ausgeführt. Folgende Query wird ebenfalls nicht auditiert, da sie „ssn“ nicht referenziert: SELECT last_name, first_name, phone FROM employee WHERE security_clearance != 'SECRET '; 15 i; Audit Event Handler Es kann auch ein “Audit Event Handler“ als Bestandteil der Audit Policy spezifiziert werden. Wenn dieser Audit getriggert wird, so ruft ORACLE diesen Event Handler auf. Definiert wird der Event Handler z.B. mit: CREATE OR REPLACE PROCEDURE hr.ts_access_alert (schema varchar2, table_name varchar2, policy_name varchar2) AS BEGIN /* hier befindet sich der Anwendungscode: z.B. Senden E-Mail, Tabelle updaten….. oder aber einen Pager Alert senden. */ UTIL_ALERT_PAGER('TS Access Alert '‚ ||SYSDATE|| ' '||table_name); END; Der Event-Handler wird in der Audit-Policy folgendermaßen definiert: DBMS_FGA.ADD_POLICY ( object_shema => 'hr ', object_name => 'employee ', policy_name => 'audit_topsecret_employees ', audit_condition => 'security_clearance = ' ' TOPSECRET ' ' ', audit_column => 'ssn ', handler_schema => 'hr ', handler_module => 'ts_access_alert ' ); 16 5; Syntax zu ADD.POLICY Syntax DBMS_FGA.ADD_POLICY( object_schema VARCHAR2, object_name VARCHAR2, policy_name VARCHAR2, audit_condition VARCHAR2, audit_column VARCHAR2, handler_schema VARCHAR2, handler_module VARCHAR2, enable BOOLEAN, statement_types VARCHAR2, audit_trail BINARY_INTEGER IN DEFAULT, audit_column_opts BINARY_INTEGER IN DEFAULT); Parameter ADD_POLICY Procedure Parameters Parameter Description object_schema Default: NULL Wenn NULL wird das effective User-Schema angenommen object_name Name des zu auditierenden Objektes policy_name Einzigartiger Name der Policy audit_condition Eine Bedingung in einer Zeile welches die zu überwachende Bedingung angibt. Default: NULL audit_column Die Spalten, die für den Zugriff überwacht warden sollen. Schließt auch HIDDEN ein. NULL bedeudet, Audit, wenn auf eine Spalte zugegriffen wird oder wenn diese betroffen ist. Default: NULL handler_schema Bezeichnet den Event-Handler. NULL bedeutet, dass das gegenwärtige Schema verwendet wird. Default: NULL handler_module Der FUNCTION-Name des Event-Handlers; schließt gegebenenfalls den PACKAGE-Namen mit ein. Diese Funktion wird nur aufgerufen, wenn die erste Reihe in der Query aufgerufen wird. Im Falle einer Exception in der Prozedur, so wird das SQL-Statement nicht ausgeführt. Default: NULL 17 Parameter Description enable Ermöglicht die Policy. Default: TRUE statement_types SQL-Anweisungen in der Policy: INSERT, UPDATE, DELETE oder SELECT Default: SELECT audit_trail Um die Spalten LSQLTEXT und LSQLBIND in fga_log$ zu füllen Default: DB_EXTENDED audit_column_opts Entscheidet darüber ob eine Anweisung auditiert wird, wenn die Abfrage sich auf jede Spalte in dem audit_column Parameter bezieht. Desgleichen, wenn auf alle Spalten referriert wird. Default: ANY_COLUMNS Beispiel: Example: DBMS_FGA.ADD_POLICY( object_schema => 'scott', object_name=>'emp', policy_name => 'mypolicy1', audit_condition => 'sal < 100', audit_column =>'comm, credit_card, expirn_date', handler_schema => NULL, handler_module => NULL, enable => TRUE, statement_types=> 'INSERT, UPDATE'); Eine FGA Policy sollte sich nie auf LOB-Spalten beziehen. Die Audit-Function in HANDLER_MODE muß folgendes Interface aufweisen: PROCEDURE <fname> ( object_schema VARCHAR2, object_name VARCHAR2, policy_name VARCHAR2 ) AS ... Hierbei ist fname der Name der Prozedur, object_shema ist der Name des Schemas für die zu auditierende Tabelle, und policy_name ist der Name der Policy. Jede Audit-Policy wird individuell auf die Abfrage angewendet, unabhängig davon wie viele Policy konforme Zeilen zurückkommen. In anderen Worten: Für jede Policy gibt es nur eine einzige Audit-Zeile. Der View ALL_AUDIT_POLICIES enthät die Spalte audit_column_opts betreffs der gesetzten Optionen. 18 6; VIEWS select * from DBA_AUDIT_EXISTS Datensätze für AUDIT EXISTS/NOT EXISTS select * from DBA_AUDIT_OBJECT Datensätze in Bezug auf Schema-Objekte (DML- und DDL- Audit) select * from DBA_AUDIT_POLICIES wenn FGA angewendet wird Support für mehr als eine relevante Spalte in FGA policy in Version 9i Funktion für SELECT in Version 10g zusätzlich Funktion für DML. select * from DBA_AUDIT_SESSION Alle Einträge zu An- und Abmeldungen select * from DBA_AUDIT_STATEMENT Datensätze für Anweisungs-Audit (GRANT, REVOKE, AUDIT, NOAUDIT, ALTER SYSTEM) select * from DBA_AUDIT_TRAIL Alle Einträge des Audit-Trails select * from DBA_AUDIT_TRAIL Alle Einträge des Audit-Trails select * from DBA_COMMON_AUDIT_TRAIL zeigt alle XML_Einträge zu AUDIT_TRAIL Liefert u.a. folgende Spalten: AUDIT_TYPE,DB_USER,POLICY_NAME,SCN. select * from DBA_OBJ_AUDIT_OPTS Optionen für Schema-Objekt_Audit select * from DBA_PRIV_AUDIT_OPTS Optionen für Privileg-Audit select * from DBA_STMT_AUDIT_OPTS Optionen für Anweisungs-Audit select * from ALL_DEF_AUDIT_OPTS Default-Audit-Optionen 19 20