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.
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.
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 das klassisches Auditing noch aktiv ist, und gleichzeitig Unified Audition in Teilen aktiviert ist.
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? Aufdie 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 /code> **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: <code sql> 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; /
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; /
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.
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.
-- 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); 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); 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.
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 WHERE policy_name IN ( 'GPI_DB_MIN_SEC_AUDIT','GPI_SEC_AUDIT_TRUNC'); 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 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;
Aktiveren:
-- For the entire CDB (all PDBs): -- AUDIT POLICY GPI_DB_MiN_SEC_AUDIT CONTAINER=ALL; AUDIT POLICY GPI_SEC_AUDIT_TRUNC CONTAINER=ALL; -- For specific PDBs only: -- OR for normal DB Settings AUDIT POLICY GPI_DB_MiN_SEC_AUDIT ; AUDIT POLICY GPI_SEC_AUDIT_TRUNC ;
Überprüfen:
SELECT * FROM audit_unified_enabled_policies WHERE policy_name IN ( 'GPI_DB_MIN_SEC_AUDIT','GPI_SEC_AUDIT_TRUNC');
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;
Ablauf Linux
Linken des Kernels mit:
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk uniaud_on ioracle
Windows: (muss noch getestet werden!)
Rem Enable %ORACLE_HOME%/bin/orauniaud19.dll.dbl file to %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