Aufgabe Sicherheit und Compliance zukunftsfähig machen – den Umstieg auf Oracle 23ai rechtzeitig vorbereiten.
Mit Oracle 23ai ist Unified Auditing verpflichtend. Eine Migration auf 23ai oder höher ist nur möglich, wenn bereits jetzt unter Oracle 19c auf Unified Auditing umgestellt wird.
Doch viele produktive 19c-Systeme verwenden nach wie vor klassisches oder Mixed Auditing – was zu Problemen bei Upgrade und Compliance führen kann.
Das Oracle Unified Auditing wurde mit der Oracle Database 12cR1 eingeführt.
Im ersten Schritt werden daher in allen Datenbank erstmal der klassische Audit Log „gepflegt“ und das Audit in einen eigenen Tablespace umgezogen für beide Methoden.
Das kann online bei nicht so kritischen System erfolgen, auch das Verkleinern des SYSAUX Tablespace ist online möglich solange nicht andere Objekte in dem Tablespace das verhindern.
Für die Pflege der Logs werden die notwendigen Jobs angelegt und in die Überwachung integriert.
Dann wird eine Audit Policy für die drei Typen (DEV / QS / Prod) der Datenbank nach dem Firmen Vorschriften erarbeitet, diese ersetzt dann später alle „alten“ Audit Regeln / default Policies.
Wenn das alles vorbereitet ist, wird die erste Datenbank komplett umgestellt, da dazu eine Downtime notwendig ist bietet sich das an mit einem geplanten Patch zu kombinieren.
Alle weiteren System werden dann nach dem gleichen Muster umgestellt.
Der große Verteil ist dann am Ende das über die Tabelle „UNIFIED_AUDIT_TRAIL“ alle Audits der Datenbank ausgelesen werden kann.
Soll ein eigener DB User die Verwaltung und Kontrolle der Audit Tabellen übernehmen, muss diesem die Rolle „AUDIT_ADMIN“ vergeben werden.
Ablauf:
SYS auf 19c
SELECT PARAMETER, VALUE FROM V$OPTION WHERE PARAMETER='Unified Auditing'; PARAMETER VALUE -------------------- -------- Unified Auditing FALSE -- gibt es aber schon Log einträge SELECT COUNT(*) FROM UNIFIED_AUDIT_TRAIL; COUNT(*) ---------- 1783
Die Aussage „Unified Auditing=FALSE“ und die Anzahl <> 0 von Datensätzen in der UNIFIED_AUDIT_TRAIL zeigt uns an, das wir die Datenbank 19c im Mixed Mode betreiben (also schon eine Audit Policies in der DB Exisiert).
Das klassisches Auditing ist damit noch aktiv ist, und gleichzeitig wkird Unified Audition in Teilen bereits verwenden.
Gib es keine Audit Policies in der Datenbank 19c ( z.b in einer 19c, die historisch seit 9i immer wieder upgegradet wurde (select count(*) from audit_unified_enabled_policies ⇒ 0 ) werden auch keine Logs in die UNIFIED_AUDIT_TRAIL geschrieben.
Plugable DB Umgebung beachten!
Im klassischen Auditing hat die CDB eine AUD$ und jede PDB eine eigene AUD$ Tabelle und auf der jeweiligen Ebene muss im Dateil das Auditing betrachtet werden. Ein Grund mehr auf Unified Audit umzustellen.
select count(*) as cnt,'AUD' as tab,CON_ID from CONTAINERS("SYS"."AUD$") group by CON_ID union all select count(*) as cnt,'UN' as tab,CON_ID from AUDSYS.AUD$UNIFIED group by CON_ID; select count(*) as cnt,'AUD' as tab,CON_ID from CONTAINERS("SYS"."DBA_AUDIT_TRAIL") group by CON_ID union all select count(*) as cnt,'UN' as tab,CON_ID from CDB_UNIFIED_AUDIT_TRAIL group by CON_ID; select count(*) as cnt,'AUD' as tab,CON_ID,min(timestamp) as first_log,max(timestamp) as last_log from CONTAINERS("SYS"."DBA_AUDIT_TRAIL") group by CON_ID union all select count(*) as cnt,'UN' as tab,CON_ID,min(EVENT_TIMESTAMP ) as first_log,max(EVENT_TIMESTAMP ) as last_log from CDB_UNIFIED_AUDIT_TRAIL group by CON_ID;
Was ist eingestellt über die View DBA_AUDIT_MGMT_CONFIG_PARAMS:
SELECT PARAMETER_NAME, PARAMETER_VALUE, AUDIT_TRAIL FROM DBA_AUDIT_MGMT_CONFIG_PARAMS ; PARAMETER_NAME, PARAMETER_VALUE, AUDIT_TRAIL DB AUDIT TABLESPACE SYSAUX STANDARD AUDIT TRAIL DB AUDIT TABLESPACE SYSAUX FGA AUDIT TRAIL DB AUDIT TABLESPACE SYSAUX UNIFIED AUDIT TRAIL
Per Default liegt alles im SYSAUX Tablespace.
Wo sind die Audit Tabellen und wie groß ist das ganze?
SELECT t.OWNER,t.TABLE_NAME,s.TABLESPACE_NAME,s.PARTITION_NAME, t.BLOCKS ,nvl(p.PARTITIONING_TYPE,'NONE') AS PARTITIONING_TYPE FROM dba_tables t LEFT JOIN DBA_PART_TABLES p ON ( p.TABLE_NAME = t.TABLE_NAME AND p.owner=t.owner) INNER JOIN DBA_SEGMENTS s ON (s.SEGMENT_NAME=t.TABLE_NAME AND s.owner=t.owner) WHERE t.table_name LIKE 'AUD$%' AND t.owner IN ('SYS','AUDSYS') ORDER BY 1,2; OWNER TABLE_NAME TABLESPACE_NAME PARTITION_NAME BLOCKS PARTITIONING_TYPE AUDSYS AUD$UNIFIED SYSAUX SYS_P202 1391 RANGE SYS AUD$ SYSAUX 54444 NONE
Nun können wir erkennen das unsere Audit Tabelle AUD$ für das Klassische Auditing noch im SYSAUX Tablespace (default) liegt und das die neue Audit log Tabelle für das Unified Audit „AUD$UNIFIED“ ebenfalls im SYSAUX liegt, nun allerdings als Partitionierte Tabelle!
Können alte Daten gelöscht werden? Am einfachsten alles löschen? Auf die Plubable Umgebung achten! als SYS per Hand:
SELECT COUNT(*) AS cnt,'AUD' AS tab FROM sys.aud$ UNION SELECT COUNT(*) AS cnt,'UN' AS tab FROM AUDSYS.AUD$UNIFIED -- alles -- truncate table aud$; -- delete alles älter als 180 Tage DELETE aud$ WHERE TIMESTAMP# < (systimestamp - 180) commit;
Eleganter über die DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL Methode:
--lösche alles in der 19c BEGIN DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL , use_last_arch_timestamp => FALSE , container => DBMS_AUDIT_MGMT.CONTAINER_ALL ); END; / SELECT COUNT(*) AS cnt,'AUD' AS tab FROM sys.aud$ UNION SELECT COUNT(*) AS cnt,'UN' AS tab FROM AUDSYS.AUD$UNIFIED 0
Problem: ORA-46258: Cleanup not initialized for the audit trail
Lösung: da wir noch nicht komplett auf Unified Audit umgestellt haben muss erst das init erfolgen:
BEGIN DBMS_AUDIT_MGMT.INIT_CLEANUP(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, default_cleanup_interval => 24); END; /
Passenden Tablespace anlegen wie AUDITLOG mit uniform Size allocation.
CREATE SMALLFILE TABLESPACE "AUDITLOG" LOGGING DATAFILE '&&AUDITLOG_TAB_LOC' SIZE 100M AUTOEXTEND ON NEXT 120M MAXSIZE 32000M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M; /
BEGIN DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD, audit_trail_location_value => 'AUDITLOG'); END; / BEGIN DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_FGA_STD , audit_trail_location_value => 'AUDITLOG'); END; /
Prüfen das keine Objekte in der Datenbank ungültig wurden! Bei Bedarf neu übersetzen!
@?/rdbms/admin/utlrp.sql
BEGIN DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED , audit_trail_location_value => 'AUDITLOG'); END; /
SELECT PARAMETER_NAME, PARAMETER_VALUE, AUDIT_TRAIL FROM DBA_AUDIT_MGMT_CONFIG_PARAMS WHERE PARAMETER_NAME='DB AUDIT TABLESPACE' ; DB AUDIT TABLESPACE SYSAUDIT STANDARD AUDIT TRAIL DB AUDIT TABLESPACE SYSAUX FGA AUDIT TRAIL DB AUDIT TABLESPACE SYSAUDIT UNIFIED AUDIT TRAIL -- SELECT t.OWNER,t.TABLE_NAME,s.TABLESPACE_NAME,s.PARTITION_NAME, t.BLOCKS ,nvl(p.PARTITIONING_TYPE,'NONE') AS PARTITIONING_TYPE FROM dba_tables t LEFT JOIN DBA_PART_TABLES p ON ( p.TABLE_NAME = t.TABLE_NAME AND p.owner=t.owner) INNER JOIN DBA_SEGMENTS s ON (s.SEGMENT_NAME=t.TABLE_NAME AND s.owner=t.owner) WHERE ( t.table_name LIKE 'AUD$%' OR t.table_name LIKE 'FGA_L%') AND t.owner IN ('SYS','AUDSYS') ORDER BY 1,2; OWNER TABLE_NAME TABLESPACE_NAME PARTITION_NAME BLOCKS PARTITIONING_TYPE --------------------------------------------------------------------------------- AUDSYS AUD$UNIFIED SYSAUX AUD_UNIFIED_P0 0 RANGE AUDSYS AUD$UNIFIED SYSAUDIT SYS_P62832 0 RANGE SYS AUD$ SYSAUDIT 6820 NONE SYS FGA_LOG$ SYSAUDIT NONE
Meist hat man keine Glück, da am Ende des Tablespace sich oft noch weitere Objekte befinden und der SYSAUX Tablespace nur bedingt reorganisert werden kann.
Bzgl. dem Wachstum in SYSAUX Tablespace siehe auch Das Oracle AWR Repository - Abfrage und Pflege
Die Tabelle AUDSYS.AUD$UNIFIED ist in 19c/24ai partitioniert nach Range (Datum des Log Eintrages), das erzeugen von neuen Partitionen kann über die Methode DBMS_AUDIT_MGMT.ALTER_PARTITION_INTERVAL gesteuert werden.
Was ist eingestellt:
SELECT owner ,TABLE_NAME ,INTERVAL ,partitioning_type ,partition_count ,def_tablespace_name FROM dba_part_Tables WHERE owner='AUDSYS'; OWNER TABLE_NAME INTERVAL PARTITIONING_TYPE PARTITION_COUNT DEF_TABLESPACE_NAME ----------------------------------------------------------------------------------------------------- AUDSYS AUD$UNIFIED INTERVAL '1' MONTH RANGE 1048575 SYSAUDIT
Anpassen mit:
BEGIN DBMS_AUDIT_MGMT.ALTER_PARTITION_INTERVAL( interval_number => 14, -- Each number of interval_frequency -- in this example all 14 Days interval_frequency => 'DAY'); -- YEAR, MONTH, and DAY. END;
Siehe auch Die Audit Logs der Datenbank unter Oracle 11g/12c mit DBMS_AUDIT_MGMT "aufräumen"
Das Problem bei Schreiben von Logs ist am Ende immer das man die Daten ja auch wieder löschen muss, sonst läuft alles recht schnell voll.
Hier wird mit Archive Timestamp gearbeitet, d.h. wir schreiben jeden Tag diesen Timestamp weiter und löschen alles älter als.
-- Auditlog init --------------------------- BEGIN DBMS_AUDIT_MGMT.INIT_CLEANUP( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL, default_cleanup_interval => 24 /* hours */); END; / -- Delete all after 180 Days BEGIN -- Standard database audit records in the SYS.AUD$ table DBMS_AUDIT_MGMT.set_last_archive_timestamp( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD , last_archive_time => SYSTIMESTAMP-180); -- Unified audit trail. In unified auditing, all audit records are written to the unified audit trail and are made -- available through the unified audit trail views, such as UNIFIED_AUDIT_TRAIL. DBMS_AUDIT_MGMT.set_last_archive_timestamp( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED , last_archive_time => SYSTIMESTAMP-180); -- Operating system audit trail. This refers to the audit records stored in operating system files. DBMS_AUDIT_MGMT.set_last_archive_timestamp( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_OS , last_archive_time => SYSTIMESTAMP-180); -- Statistik erneuern DBMS_STATS.GATHER_TABLE_STATS( 'AUDSYS', 'AUD$UNIFIED'); END; / -- Alternativ Alles mit BEGIN -- delte all DBMS_AUDIT_MGMT.set_last_archive_timestamp( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL , last_archive_time => SYSTIMESTAMP-180); -- Statistik erneuern DBMS_STATS.GATHER_TABLE_STATS( 'AUDSYS', 'AUD$UNIFIED'); END; / -- create the job to move the timeframe each day BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'AUDIT_ARCHIVE_BEFORE_TIMESTAMP', job_type => 'PLSQL_BLOCK', job_action => 'DBMS_AUDIT_MGMT.set_last_archive_timestamp( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL , last_archive_time => SYSTIMESTAMP-180); ', start_date => sysdate, repeat_interval => 'FREQ=HOURLY;INTERVAL=24', enabled => TRUE, comments => 'Set the point in time before delete all audit log entries' ); END; / -- Create Auditlog purge Job ------------------ BEGIN DBMS_AUDIT_MGMT.create_purge_job( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL, audit_trail_purge_interval => 24 /* hours */, audit_trail_purge_name => 'PURGE_ALL_AUDIT_TRAILS', use_last_arch_timestamp => TRUE); END; /
Vorteil ist nun das nach dem späteren Umstellen dann auch noch das alte Log nach 180 Tage nach und nach gelöscht wird und für das neue Verfahren alles bereits eingerichtet ist.
Gibt es die Jobs:
SELECT JOB_NAME , JOB_STATUS , AUDIT_TRAIL , JOB_FREQUENCY , USE_LAST_ARCHIVE_TIMESTAMP , JOB_CONTAINER FROM DBA_AUDIT_MGMT_CLEANUP_JOBS; JOB_NAME, JOB_STATUS, AUDIT_TRAIL, JOB_FREQUENCY, USE_LAST_ARCHIVE_TIMESTAMP, JOB_CONTAINER ---------------------------------------------------------------------------------------------- CLEANUP_AUDIT_TRAIL_ALL ENABLED ALL AUDIT TRAILS FREQ=HOURLY;INTERVAL=24 YES CURRENT
Sind die Jobs in der Vergangenheit gelaufen:
SELECT AUDIT_TRAIL , MIN(CLEANUP_TIME) AS first_cleanup , MAX(CLEANUP_TIME) AS last_cleanup , COUNT(*) AS clean_cnt FROM DBA_AUDIT_MGMT_CLEAN_EVENTS GROUP BY AUDIT_TRAIL;
siehe auch https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_AUDIT_MGMT.html
Überprüfen mit:
-- Klassische Auditing-Einstellungen anzeigen (nicht Unified Auditing) -- 1. Statement Auditing SELECT 'STATEMENT' AS AUDIT_TYPE, USER_NAME, AUDIT_OPTION AS PRIVILEGE, SUCCESS, FAILURE FROM DBA_STMT_AUDIT_OPTS UNION -- 2. Privilege Auditing SELECT 'PRIVILEGE' AS AUDIT_TYPE, USER_NAME, PRIVILEGE, SUCCESS, FAILURE FROM DBA_PRIV_AUDIT_OPTS
User Objekte:
SELECT * FROM DBA_OBJ_AUDIT_OPTS;
siehe dazu https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html und https://www.oracle.com/docs/tech/dbsec/unified-audit-best-practice-guidelines.pdf .
Minimale Regel definieren wie:
Defaults prüfen und ausschalten:
SELECT * FROM audit_unified_enabled_policies -------------------------------- NOAUDIT POLICY ORA_SECURECONFIG;
Policy GPI_DB_MiN_SEC_AUDIT anlegen:
DROP AUDIT POLICY GPI_DB_MiN_SEC_AUDIT; CREATE AUDIT POLICY GPI_DB_MiN_SEC_AUDIT PRIVILEGES CREATE EXTERNAL JOB, CREATE JOB, CREATE ANY JOB ACTIONS -- User Management CREATE USER, ALTER USER, DROP USER -- Role management , CREATE ROLE, ALTER ROLE, DROP ROLE -- Profile management , CREATE PROFILE, ALTER PROFILE, DROP PROFILE -- Synonym management , CREATE SYNONYM, ALTER SYNONYM, DROP SYNONYM -- Database link management , CREATE DATABASE LINK, ALTER DATABASE LINK, DROP DATABASE LINK -- Procedure management , CREATE PROCEDURE, ALTER PROCEDURE, DROP PROCEDURE -- Trigger management , CREATE TRIGGER, ALTER TRIGGER, DROP TRIGGER -- Privilege operations , GRANT , REVOKE -- System operations , ALTER SYSTEM -- Audit trail modifications , DELETE ON AUDSYS.AUD$UNIFIED , UPDATE ON AUDSYS.AUD$UNIFIED -- Session Management , LOGON, LOGOFF ; --- -- =============== -- Define rule for truncate statement! -- DROP AUDIT POLICY GPI_SEC_AUDIT_TRUNC; CREATE AUDIT POLICY GPI_SEC_AUDIT_TRUNC ACTIONS TRUNCATE TABLE WHEN 'SYS_CONTEXT(''USERENV'',''CURRENT_SCHEMA'') = ''AUDSYS'' AND SYS_CONTEXT(''USERENV'',''CURRENT_OBJECT'') = ''AUD$UNIFIED''' EVALUATE PER STATEMENT; --- -- =============== -- Define rule for User objects -- ! Darauf achten jedes DML einzeln aufzuführen ! -- ! NICHT SELECT,INSERT,UPDATE, DDELETE ON scott.emp; ! -- ! sonst wird JEDES SELECT,INSERT,UPDATE ins Audit geschrieben ! DROP AUDIT POLICY GPI_SEC_AUDIT_SCHEMA_SCOTT; CREATE AUDIT POLICY GPI_SEC_AUDIT_SCHEMA_SCOTT ACTIONS SELECT ON scott.emp , INSERT ON scott.emp , UPDATE ON scott.emp , DELETE ON scott.emp;
Aktiveren:
-- For the entire CDB (all PDBs): -- AUDIT POLICY GPI_DB_MiN_SEC_AUDIT CONTAINER=ALL; AUDIT POLICY GPI_SEC_AUDIT_TRUNC CONTAINER=ALL; AUDIT POLICY GPI_SEC_AUDIT_SCHEMA_SCOTT CONTAINER=ALL; -- For specific PDBs only: -- OR for normal DB Settings AUDIT POLICY GPI_DB_MiN_SEC_AUDIT ; AUDIT POLICY GPI_SEC_AUDIT_TRUNC ; AUDIT POLICY GPI_SEC_AUDIT_SCHEMA_SCOTT;
Überprüfen:
SELECT * FROM audit_unified_enabled_policies WHERE policy_name IN ( 'GPI_DB_MIN_SEC_AUDIT','GPI_SEC_AUDIT_TRUNC','GPI_SEC_AUDIT_SCHEMA_SCOTT');
SELECT event_timestamp , action_name , unified_audit_policies , dbusername FROM unified_audit_trail WHERE unified_audit_policies = 'GPI_DB_MIN_SEC_AUDIT' ORDER BY event_timestamp DESC;
Linken des Kernels mit:
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk uniaud_on ioracle
ON = kzaiang.c
OFF = kzanang.c
Abfragen mit:
strings /u01/app/oracle/product/19c/19.24/bin/oracle | grep kzaiang -?comment:Intel(R) C Intel(R) 64 Compiler for applications running on Intel(R) 64, Version 17.0.2.174 Build 20170213 : kzaiang.c ..... -?comment: kzaiang.c strings /u01/app/oracle/product/19c/19.24/bin/oracle | grep kzanang #empty
Unter Windows muss eine DDL ( %ORACLE_HOME%/bin/orauniaud19.dll.dbl ) durch Umbenennen „aktiviert“ werden, beim nächsten Start wird die DDL eingelesen und damit das Unfied Audit aktiviert.
Rem Enable ren %ORACLE_HOME%/bin/orauniaud19.dll.dbl %ORACLE_HOME%/bin/orauniaud19.dll Rem Disable %ORACLE_HOME%/bin/orauniaud19.dll file to %ORACLE_HOME%/bin/orauniaud19.dll.dbl
Nach Neustart prüfen:
SELECT PARAMETER, VALUE FROM V$OPTION WHERE PARAMETER='Unified Auditing'; PARAMETER VALUE -------------------- -------- Unified Auditing TRUE
Durch einfaches Umkopieren, z.b. in eine zentrale Audit Datenbank verschieben, auf Platte exportieren oder in einer für das Logging optimieren Datenbank speichern.
Im Prinzip:
INSERT INTO TABLE SELECT ... FROM UNIFIED_AUDIT_TRAIL ...;
Wichtig ist es nach dem Wegkopieren der Daten mit DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP der DB mitteilen was nun nicht mehr in der DB benötigt wird, weil inzwischen korrekt archviert.
Zum Löschen der bestehenden Audits den Last Archive Timestamp setzen ( falls in der Löschroutine CLEAN_AUDIT_TRAIL die Verwendung des Zeitpunktes gesetzt ist über use_last_arch_timestamp = TRUE ) :
BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL , last_archive_time => systimestamp -- last_archive_time must be specified in Coordinated Universal Time (UTC) -- testen ob das so auch richtig konvertiert wird ohne Format angabe! ); END;
In einer größeren Umgebung kann das mit Oracle Produkten erfolgen wie Oracle Audit Vault
siehe ⇒ https://oracle.com/de/security/database-security/audit-vault-database-firewall/
Wenn die Datenbank nicht zum schreiben geöffnet ist, werden die Audit Records in das Dateisystem und nicht in die Datenbank geschrieben - Stichwort Unified Auditing spillover files
Um diese Dateien nachzuladen kann mit DBMS_AUDIT_MGMT.LOAD_UNIFIED_AUDIT_FILES diese nachgeladen werden.
Dateien in den aktuellen Container laden:
BEGIN DBMS_AUDIT_MGMT.LOAD_UNIFIED_AUDIT_FILES; -- Parameter aus der Doku klappen nicht??? -- container => 1 -- , load_batch_size => 10); END; /
siehe auch https://databasesecurityninja.wordpress.com/tag/dbms_audit_mgmt-load_unified_audit_files/
View Details siehe ⇒ https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/UNIFIED_AUDIT_TRAIL.html
Eine erste Abfrage:
SELECT AUDIT_TYPE , OS_USERNAME , USERHOST , TERMINAL , DBUSERNAME , CLIENT_PROGRAM_NAME , EVENT_TIMESTAMP , EVENT_TIMESTAMP_UTC , ACTION_NAME , RETURN_CODE , SQL_TEXT , SQL_BINDS , SYSTEM_PRIVILEGE_USED , UNIFIED_AUDIT_POLICIES , AUTHENTICATION_TYPE FROM CDB_UNIFIED_AUDIT_TRAIL ORDER BY EVENT_TIMESTAMP_UTC
Bei Abfragen den Partiton Key EVENT_TIMESTAMP_UTC in der Where Klausel verwenden, damit das Partition Feature auch verwendet wird!
Statistiken auf der Basis Tabelle AUDSYS.AUD$UNIFIED mit DBMS_STATS.GATHER_TABLE_STATS regelmäßig erfassen z.b. beim Delete Job mit integrieren.
BEGIN DBMS_STATS.GATHER_TABLE_STATS( 'AUDSYS', 'AUD$UNIFIED'); END; /
Die Rolle AUDIT_ADMIN wird für alle administrativen Aufgaben rund um das Unified Auditing benötigt.
Die Rolle umfasst folgende Berechtigungen:
Die Rolle AUDIT_VIEWER dient zum lesenden Zugriff auf die Auditdaten.
Die Rolle umfasst folgende Berechtigungen:
⇒>
Nach der Umstellung ist das Auditieren übersichtlicher und viel mächtiger geworden.
Besonders die neuen Möglichkeiten die Policies in 23ai dann zu mit Regeln noch stärkere zu konfigurieren bieten interessante Möglichkeiten.
Wie das Logging nur von Fehlern:
CREATE AUDIT POLICY audit_error_dml_operation ACTIONS SELECT, INSERT, UPDATE, DELETE -- nicht für Hintergrund prozesse WHEN 'SYS_CONTEXT(''USERENV'', ''CLIENT_IDENTIFIER'') IS NOT NULL' EVALUATE PER STATEMENT -- nur fehler ONLY WHEN NOT SUCCESSFUL;
siehe für 23ai ⇒ https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html
Un die Feingranulare Spaltenüberwachung neu in 23ai: Spaltenebene-Auditing ist möglich (UPDATE(col1, col2) oder SELECT(col2) on table) – das spart Ressourcen und reduziert Menge an Audit Daten.
Doku Oracle
23ai
Web:
23ai