V tomto článku budu pokračovat s Oracle Database Security a uvedu některá důležitá fakta o standardním auditování databází, spouštěčích auditu a zásadách auditu v Oracle. Audit databáze má dvě složky:monitorování a trvalou registraci zavedených databázových aktivit a událostí. Účelem auditu databáze je neodmítnutí, vyšetřování podezřelých aktivit, detekce problémů generovaných konfiguracemi ohledně autorizace (přístupu ke zdrojům), souladu s aktuální legislativou a kontroly.
Standardní audit
Jaké činnosti provádíme audit? Spouštění a zastavování databáze, stejně jako připojení vytvořená správcem databáze, jsou implicitně auditovány společností Oracle a data jsou automaticky ukládána do operačního systému. Níže uvedená tabulka ukazuje další aktivity, které lze monitorovat:
Kde uchováváme auditované aktivity?
- v databázi , pomocí databázového audit trailu, kde máme dvě možnosti:
- audit_trail =DB
což lze provést pomocí následujícího kódu:alter system set audit_trail=db scope=spfile;
- audit_trail =DB
- audit_trail =DB,EXTENDED
pomocí následujícího kódu:alter system set audit_trail= db, extended scope=spfile;
Rozdíl mezi DB a DB, EXTENDED je v tom, že druhý naplní sloupce SQLBIND a SQLTEXT CLOB tabulky SYS.AUD$.
- audit_trail =DB,EXTENDED
- externí , pomocí auditní stopy operačního systému, s následujícími možnostmi:
- audit_trail =OS
a použitý kód je:alter system set audit_trail=os scope=spfile;
- audit_trail =XML a AUDIT_FILE_DEST =cesta k souboru (implicitně je $ORACLE_BASE/admin/$ORACLE_SID/adump)
s kódem:alter system set audit_trail=xml scope=spfile;
- audit_trail =OS
Chcete-li najít aktuální konfiguraci uložených auditovaných aktivit, můžete spustit následující dotaz napsaný malými písmeny:
select value from v$parameter where name='audit_trail';
Další užitečné příkazy:
[id tabulky=43 /]
Nyní si uveďme několik příkladů auditování databáze.
Zde je příklad standardního auditu s auditovanými informacemi uloženými v databázi:
Auditované informace se skládají z příkazů SELECT provedených v databázových tabulkách.
V SQL Developer spusťte následující skript:
alter system set audit_trail= db, extended scope=spfile; AUDIT SELECT TABLE;
Poté je nutné databázi restartovat. Chcete-li to provést, v terminálu SQLPlus se připojte pomocí uživatelského jména sys jako sysdba / password a spusťte následující příkazy:
SHUTDOWN IMMEDIATE STARTUP
Všimněte si, že výše uvedené velikosti se u jednotlivých systémů liší.
Chcete-li ověřit, zda je auditní záznam nastaven správně, spusťte následující dotaz:
select value from v$parameter where name='audit_trail';
nebo:
show parameter audit_trail;
Když chcete zastavit audit, proveďte:
NOAUDIT SELECT TABLE;
Chcete-li zobrazit, jaké výroky audit zaznamenal, můžete použít:
select dbms_lob.substr( sqltext, 4000, 1 ) from SYS.AUD$ where OBJ$NAME IN ('EMPLOYEES','DEPARTMENTS','JOBS','LOCATIONS');
nebo
select count(*), OBJ$NAME, USERID from SYS.AUD$ where OBJ$NAME IN ('EMPLOYEES','DEPARTMENTS','JOBS','LOCATIONS') group by rollup (OBJ$NAME, USERID);
Dalším příkladem je standardní audit s auditovanými daty uloženými v souboru XML ve standardní cestě.
alter system set audit_trail=xml scope=spfile; AUDIT SELECT, INSERT, UPDATE, DELETE ON employees WHENEVER NOT SUCCESSFUL;
Znovu restartujte databázi:připojte se k terminálu SQLPlus s uživatelským jménem sys jako sysdba / heslo a spusťte příkazy VYPNOUT OKAMŽITÉ a STARTUP.
Pokaždé, když selže dotaz na výběr, vložení, aktualizaci a odstranění v tabulce zaměstnanců, měl by být zaznamenán do souboru XML.
Když chceme audit zastavit, spustíme ve vývojovém prostředí databáze následující příkazy:
NOAUDIT ALL; NOAUDIT ALL ON DEFAULT;
A obnovit výchozí auditní záznam:
alter system set audit_trail=db scope=spfile;
Níže je uveden příklad části souboru auditu XML:
Jak smažeme auditované informace?
Objem auditovaných dat může být velmi velký vzhledem k počtu auditovaných činností a jejich četnosti. Proto se doporučuje pravidelně archivovat auditovaná data a mazat je z produkčního systému.
Pokud jsou auditovaná data uložena v databázi (databázový audit trail), můžeme použít příkazy delete (ale až poté, co data archivujeme!):
DELETE FROM SYS.AUD$;
Můžete se rozhodnout odstranit auditované informace pro konkrétní databázový objekt, například tabulku nazvanou produkty:
DELETE FROM SYS.AUD$ WHERE OBJ$NAME='PRODUCTS';
Spouštěče auditu
Spouštěč je blok PL/SQL nebo příkaz CALL procedury PL/SQL, který se automaticky provede pokaždé, když dojde k události. Existují dva typy spouštěčů:na úrovni databáze (příkazy databáze) a na úrovni aplikace (například stisknutí tlačítka na formuláři Oracle). Spouštěče používané pro audit jsou spouštěče na úrovni databáze. Rozdělují se do následujících kategorií:
- Spouštěče DML – kde se v tabulce spouští příkaz DML. Tyto spouštěče lze provést jednou na úrovni příkazu bez ohledu na počet záznamů (spouštěče na úrovni příkazů) nebo je lze provést PRO KAŽDÝ ŘÁDEK (spouštěče na úrovni záznamu). Typy spouštěčů úrovně záznamu:PŘED VÝKAZEM, PO VÝKAZU, PŘED KAŽDÝM ŘÁDKEM, PO KAŽDÉM ŘÁDKU;
- MÍSTO spouštěčů – kde se v pohledu spouští příkaz DML;
- SYSTÉMOVÉ spouštěče – spouštěné událostmi, jako je spuštění/zastavení databáze, příkazy DDL, přihlášení/odhlášení uživatele. Typy systémových spouštěčů:PO UDÁLOSTI, PŘED UDÁLOSTÍ.
Dotaz na SYS.TRIGGER$ nebo ALL_TRIGGERS view nabízí informace o všech spouštěčích na úrovni databáze. Například odlišný typ spouštěče z databáze lze nalézt takto:
SELECT DISTINCT TRIGGER_TYPE FROM ALL_TRIGGERS;
Pohled DBA_TRIGGERS nabízí informace o spouštěčích automaticky vytvořených produkty Oracle při instalaci. Pokud chceme najít informace o SYSTÉMOVÝCH spouštěčích („PŘED UDÁLOSTÍ“ a „PO UDÁLOSTI“), můžeme spustit následující příkaz:
SELECT SUBSTR(OWNER,1,20) OWNER ,SUBSTR(TRIGGER_NAME,1,30), TRIGGER_NAME, SUBSTR(TRIGGERING_EVENT,1,30) TRIGGERING_EVENT, TRIGGER_TYPE FROM DBA_TRIGGERS WHERE TRIGGER_TYPE='BEFORE EVENT' OR TRIGGER_TYPE='AFTER EVENT' ORDER BY TRIGGER_TYPE DESC;
Při instalaci se také automaticky vytvoří spouštěče DML ve schématu uživatele HR:
SELECT SUBSTR(TABLE_NAME,1,20) TABLE_NAME, SUBSTR(TRIGGER_TYPE,1,30) TRIGGER_TYPE,TRIGGER_BODY FROM DBA_TRIGGERS WHERE OWNER='HR';
Pro auditování můžeme vytvořit přizpůsobené spouštěče pro záznam požadovaných informací, ale je třeba vytvořit speciální tabulku pro uložení auditovaných informací.
Je důležité zajistit, aby vyvinuté spouštěče neovlivňovaly běžnou aktivitu databáze. Účelem auditu je pasivně sledovat běžnou každodenní činnost databáze a uložit ji pro pozdější analýzu. V důsledku toho se nedoporučuje vytvářet MÍSTO spouštěčů pro vrácení výsledků z cílových tabulek do tabulky auditu.
Spouštěče DML na úrovni příkazů mohou koexistovat se spouštěči DML na úrovni záznamu. Pořadí hovoru je:
- spustit příkaz PŘED
- pro každý dotčený záznam
- spustit PŘED záznamem
- aktuální akci DML
- spustit PO záznamu
- spustit příkaz AFTER
Uživatelem definované spouštěče budou provedeny pouze v případě, že podle Oracle je příkaz správný a může se vyskytnout. V případě nesprávného příkazu DML nebo příkazu, který porušuje omezení, bude vrácena chyba a spouštěč nebude proveden. Proto se pro audit doporučuje používat zejména spouštěče LMD na úrovni příkazů.
Příklad spouštěče auditu:
Předpokládejme, že chceme vytvořit spouštěč, který zaznamená do tabulky auditu (nazvané TAB_AUDIT_EMP) informace o prohlášeních DML, které stanovují mzdy zaměstnanců společnosti nad 20 000 (měna zde není důležitá). Chceme uložit do TAB_AUDIT_EMP pořadové číslo dotazu, uživatelské jméno, relaci, hostitele a datum.
To lze provést pomocí následujícího:
CREATE TABLE TAB_AUDIT_EMP (secv_id NUMBER(3) PRIMARY KEY, username VARCHAR2(20), session_nr NUMBER(10), hostname VARCHAR2(100), query_date DATE ); CREATE SEQUENCE secv_aud_emp START WITH 1 INCREMENT BY 1; CREATE OR REPLACE TRIGGER huge_salary AFTER INSERT OR UPDATE OR DELETE OF SALARY ON EMPLOYEES FOR EACH ROW WHEN (NEW.salary>20000) BEGIN INSERT INTO TAB_AUDIT_EMP VALUES(secv_aud_emp.NEXTVAL , sys_context('userenv', 'session_user'), sys_context('userenv', 'sessionid'), sys_context('userenv', 'host'), sysdate); END;
Předpokládejme, že provedeme úpravu platů pro zaměstnance v konkrétním oddělení:
UPDATE EMPLOYEES SET SALARY=25000 WHERE ID_DEPARTMENT = 1;
A pak ověříme monitorování:
select secv_id, substr(username,1,20) username, session_nr, substr(hostname,1,30) hostname, query_date from TAB_AUDIT_EMP;
Zásady auditu
Třetí metoda auditu se týká zásad auditu. Definice zásady auditu obsahuje následující:
- specifikace objektu (schéma, název objektu, sloupce), který je předmětem monitorování
- specifikace akcí auditovaných pro objekt (SELECT, INSERT, UPDATE, DELETE):implicitně je to SELECT
- specifikace podmínek, které musí být splněny, aby byly auditované informace zaznamenány, je to provedeno v klauzuli WHEN spouštěče a je nepovinné
- obslužnou rutinu události, která událost navíc zpracovává, což je volitelné.
Zásada auditu může být aktivní (stav POVOLENO) nebo neaktivní (stav VYPNUTO). Seznam zásad auditu lze získat dotazem na pohled ALL_AUDIT_POLICIES:
SELECT POLICY_TEXT, ENABLED FROM ALL_AUDIT_POLICIES
Pro správu zásad auditu máme balíček DBMS_FGA. Aby bylo možné tento balíček používat, je nutné udělit oprávnění uživatelům, kteří budou psát kód PL/SQL:
grant execute on dbms_fga to username;
Příklad zásady auditu:
Chceme vytvořit zásady auditu pro zaznamenávání příkazů DML, které upravují manažery (MANAGER_ID) v tabulce ODDĚLENÍ. Můžeme se rozhodnout vytvořit obslužnou rutinu pro politiku s názvem proc_audit_alert, která nás informuje o úpravě týkající se správce:
CREATE OR REPLACE PROCEDURE proc_audit_alert ( object_schema VARCHAR2, object_name VARCHAR2, policy_name VARCHAR2 ) AS BEGIN DBMS_OUTPUT.PUT_LINE('Alert! Manager Changed !'); END;
A politika může být:
CREATE OR REPLACE PROCEDURE proc_audit_manager AS BEGIN DBMS_FGA.ADD_POLICY ( object_schema=>'ADMINDB', object_name=>'DEPARTMENTS', policy_name=>'proc_audit_manager', audit_column=>'ID_MANAGER', enable=>false, statement_types=>'UPDATE', handler_module=>'proc_audit_alert' ); DBMS_FGA.ENABLE_POLICY ( object_schema=>'ADMINDB', object_name=>'DEPARTMENTS', policy_name=>'proc_audit_manager'); END;
Všimněte si, že object_schema, object_name, policy_name, audit_column, statement_types a handler_module musí být přizpůsobeny zásadě, kterou chcete napsat.
Poté provedeme proceduru:
EXECUTE proc_audit_manager;
Můžeme ověřit, zda je zásada povolena:
SELECT ENABLED, POLICY_NAME FROM ALL_AUDIT_POLICIES WHERE OBJECT_NAME='DEPARTMENTS';
Poté ověřte, zda postup a zásady fungují správně, provedením aktualizace:
UPDATE DEPARTMENTS SET ID_MANAGER=2 WHERE ID_DEPARTAMENT=1;
Závěrem lze říci, že auditování je nezbytné pro každou databázi a výše uvedené metody vám pomohou najít podezřelou aktivitu, která by mohla ovlivnit zabezpečení vaší databáze. Další podrobnosti o auditování databází Oracle naleznete v bibliografii níže.
Bibliografie:
- http://www.datadisk.co.uk/html_docs/oracle/auditing.htm
- http://docs.oracle.com/cd/B10501_01/server.920/a96521/audit.htm
- https://docs.oracle.com/cd/E11882_01/server.112/e10575/tdpsg_auditing.htm#TDPSG50000