Benutzer-Werkzeuge

Webseiten-Werkzeuge


dba:unified_auditing_oracle_migration_23ai

Oracle Unified Auditing – Pflicht in 23ai - Umstellung von Klassischen/Mixed Audit auf Unified Auditing in der 19c als Vorbereitung für die 23ai Migration

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:

  1. Prüfen ob sich die 19c im Mixed Mode befindet und Audit Status ermitteln
  2. Downtime 1 – DEV/QS online - in Prod mit mehr Vorsicht besser ohne die Applikation im Live Betrieb- Gefahr eines Locks auf der DB!!
    1. Audit Tabellen (Klassich und Unified ) in eigenen Tablespace umziehen
    2. Bei Bedarf SYSAUX Tablespace verkleinern wenn möglich
    3. Lösch Jobs für die Logs erstellen
  3. Einstellungen des Klassischen Auditing in Unified Audit Policis umwandeln bzw. eigene Poilices definieren
  4. Prüfen ob Lösch Jobs angelegt wurden bzw. aktiveren
  5. Prüfen wer die Audit Daten verwendet und ob „etwas“ die Audits aus der Datenbank ließt
    1. Falls im Einsatz Überwachungstools entsprechend umstellen bzw. Umstellung für die Downtime planen
  6. Downtime 2 - Kann nur offline erfolgen!
    1. Umstellen auf Unified Auditing
      1. Linux : Relink Kernel
      2. Windows: Umbennen einer DDL
    2. Überwachungstools anpassen bei Bedarf
  7. Aufräumen
  8. Lösch Jobs überwachen

Was ist in der 19c aktiviert? Ist Status prüfen

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.

Wieviele Log Einträge gibt es schon seit wann in der DB

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;

Audit Tabellen (Klassich und Unified ) in eigenen Tablespace umziehen

Wo liegen aktuell die Audit Tabellen

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!

Vor dem Aktiveren des Unifed Audits den Tablespace umstellen! Ansonsten verbleiben die bereits existierenden Partition im SYSAUX Tablespace und erst nach einem Intervall (default Monat) wird in den neuen Tablespace geschrieben mit einer neuen Partition (Partition Typ = RANGE )

Audit Daten bereinigen

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;
/

Umziehen auf den neuen Tablespace

Audit Tablespace anlegen

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;
 
/
Klassisches Audit umziehen
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
Unfied Audit umziehen
BEGIN
DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(
          audit_trail_type            => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED
       ,  audit_trail_location_value  => 'AUDITLOG');
END;
/
Prüfen ob die Tabellen nun im richtigen TBS liegen
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
 
Prüfen ob sich SYSAUX wieder verkleinern lässt

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


Speicher Parameter der Unified Audit Tabelle prüfen und setzen

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;

Lösch Jobs einrichten

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.

Lösch Jobs prüfen

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


Audit Policies definieren

Was wurde bisher klassisch Auditiert?

Ü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;

Neue Regeln definieren

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:

  • CREATE USER - ALTER USER - DROP USER
  • CREATE ROLE - ALTER ROLE - DROP ROLE
  • CREATE PROFILE - ALTER PROFILE - DROP PROFILE
  • CREATE SYNONYM - ALTER SYNONYM - DROP SYNONYM
  • CREATE DATABASE - LINK - ALTER DATABASE LINK - DROP DATABASE LINK
  • CREATE PROCEDURE - ALTER PROCEDURE - DROP PROCEDURE
  • CREATE TRIGGER - ALTER TRIGGER - DROP TRIGGER
  • GRANT - REVOKE
  • ALTER SYSTEM
  • AUDSYS.AUD$UNIFIED delete - truncate actions
  • LOGON AND LOGOFF

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;
 
Vor den Aktvieren den Tablespace Umzug abschließen!

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');

Auswerten

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;

Finales Umstellen auf Unified Auditing

Ablauf Linux

  • Alle Datenbanken/Listner aus dem Oracle Home stoppen
  • Oracle DB Kernel neu linken
  • Alle Datenbanken/Listner aus dem Oracle Home starten

Linken des Kernels mit:

cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk uniaud_on ioracle 
 
prüfen was gelinkt wurde

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

Ablauf Windows

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
Patch Verhalten Windows! Nach jedem Patch Vorgang prüfen ob eine neue orauniaud19.dll.dbl kopiert wurde, die alte löschen und diese neue vom Patch aktivieren!

Prüfen

Nach Neustart prüfen:

SELECT PARAMETER, VALUE 
  FROM V$OPTION
WHERE PARAMETER='Unified Auditing';
 
 
PARAMETER             VALUE                                                           
--------------------  --------
Unified Auditing      TRUE

Archivierung von Archive Logs

Manuell

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.

Archive Zeitpunkt setzen

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;

Oracle Audit Vault

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/


Operating System Audit Records in die Datenbank kopieren

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 ⇒ https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_AUDIT_MGMT.html#GUID-77C238AB-7B08-4D84-B3B8-4FC5CBDB4A3F

siehe auch https://databasesecurityninja.wordpress.com/tag/dbms_audit_mgmt-load_unified_audit_files/


Das Audit der Datenbank auswerten

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

Performance

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;
 /

Rollen & Rechte in Unified Auditing (AUDIT_ADMIN, AUDIT_VIEWER)

AUDIT_ADMIN

Die Rolle AUDIT_ADMIN wird für alle administrativen Aufgaben rund um das Unified Auditing benötigt.

Die Rolle umfasst folgende Berechtigungen:

  • Erstellen, Ändern und Löschen von Audit-Policies
  • Aktivieren und Deaktivieren von Audit-Policies für einzelne oder alle Benutzer
  • Nutzung von DBMS_AUDIT_MGMT zur Verwaltung und Archivierung des Unified Audit Trail
  • Zugriff auf das Unified Audit Trail über die View UNIFIED_AUDIT_TRAIL
  • Verwaltung des Audit Trail Purging

AUDIT_VIEWER

Die Rolle AUDIT_VIEWER dient zum lesenden Zugriff auf die Auditdaten.

Die Rolle umfasst folgende Berechtigungen:

  • Nur Lesezugriff auf das Unified Audit Trail (View UNIFIED_AUDIT_TRAIL)

⇒>

  • Keine Berechtigungen zum Erstellen oder Verändern von Audit-Policies
  • Kein Zugriff auf DBMS_AUDIT_MGMT

Fazit - Ausblick 23ai

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.



Quellen

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
"Autor: Gunther Pipperr"
dba/unified_auditing_oracle_migration_23ai.txt · Zuletzt geändert: von gpipperr