23 sep 2010 Audit Informatie Verzamelen met Fine Grained Auditing (FGA) Nieuws Audit Informatie Verzamelen in de Oracle Database Audit informatie heb je nodig als je wil zien wie wat heeft gedaan in een systeem. Oracle kent dan 2 soorten: Standaard auditing Fine Grained Auditing(FGA) Voorbeelden van standaard auditing zijn: Wie is ingelogd? Wie heeft de structuur van een tabel gewijzigd? Wie heeft de inhoud van een tabel gewijzigd? Als het gewenst is om te bekijken wie er specifieke rijen in een tabel heeft gewijzigd of geselecteerd kun je FGA gebruiken. Een voorbeeld hiervan kan zijn: wie heeft het salaris van de directeur bekeken? De feature Fine Grained Auditing (fga) maakt het mogelijk om heel specifiek auditinginformatie te verzamelen, doordat er criteria kunnen worden opgegeven op basis waarvan Oracle evalueert of een actie wel of niet in de fga audit trail komt. Met onderstaand voorbeeld wordt FGA gedemonstreerd en wordt aangegeven waarom bepaalde acties nu juist wel of niet terug te vinden zijn in deze fga audit. Voor de voorbeelden gebruiken we tabel WINKELS, met een primary key op de id kolom: SQL> select * from winkels; ID NAAM LOCATIE_ID -------------------------------------------------------- 1 Texas Ranch 1400 2 San Fran 1500 3 Jersey's 1600 4 Warenhuis Washington 1700 5 Toronto 1800 6 Australian Auction 2200 7 Mexican's 3200 8 Ting Hou Wah 2000 9 Indoor India 2100 In het volgende voorbeeld is onderstaande policy aangemaakt: SQL> begin 2 dbms_fga.add_policy (object_schema => 'FGA', 3 object_name => 'WINKELS', 4 policy_name => 'WINKELSSELECT', 5 audit_condition => 'locatie_id > 2000', 6 audit_column => 'ID', 7 statement_types => 'select'); 8 end; 9 / Wanner de parameter audit_condition opgegeven wordt, worden de parameters audit_column en audit_column_opts genegeerd. Onderstaande queries worden nu beide geaudit: SQL> select * from winkels where locatie_id = 2100; SQL> select * from winkels where naam = 'Indoor India'; SQL> select sql_text from dba_fga_audit_trail; SQL_TEXT -------------------------------------------------- -------------------------------------------------- select * from winkels where locatie_id = 2100 select * from winkels where naam = 'Indoor India' Delete werkt anders dan select/insert/update Als bij een delete geen audit_condition wordt opgegeven (of audit_condition => null) wordt elke delete geaudit. Het maakt daarbij niet uit of deze nu wel of niet in de where een of meerdere audit_columns heeft staan. De waardes bij audit_column en audit_column_opts worden hier dus genegeerd. Bij select, insert en update daarentegen worden de waardes bij audit_column en audit_column_opts wel netjes bekeken als er geen audit_condition is opgegeven. Hierbij zijn 2 mogelijkheden: Alleen acties waarbij een van de kolommen die bij audit_column staan terugkomen in het statement wordt geaudit bij audit_column_opts => dbms_fga.any_columns Alleen acties waarbij alle kolommen die bij audit_column staan terugkomen in het statement worden geaudit bij audit_column_opts => dbms_fga.all_columns Onderstaande policy is aangemaakt: SQL> begin 2 dbms_fga.add_policy (object_schema => 'FGA', 3 object_name => 'WINKELS', 4 policy_name => 'WINKELSUPDATE', 5 audit_condition => 'locatie_id > 2000', 6 audit_column => 'ID', 7 audit_column_opts => dbms_fga.all_columns, 8 statement_types => 'update'); 9 end; 10 / Van onderstaande statements wordt alleen de laaste geaudit, omdat alle kolommen (audit_column_opts => dbms_fga.all_columns) die genoemd staan bij audit_column in de where clausule staan: SQL> update winkels set naam = 'Ting' where locatie_id = 2100; SQL> update winkels set naam = 'Ting' where id=9; SQL> select sql_text from dba_fga_audit_trail; SQL_TEXT ----------------------------------------------- update winkels set naam = 'Ting' where id = 9 Onderstaande policy is aangemaakt: SQL> begin 2 dbms_fga.add_policy (object_schema => 'FGA', 3 object_name => 'WINKELS', 4 policy_name => 'WINKELSDELETE', 5 audit_condition => null, 6 audit_column => 'ID', 7 statement_types => 'delete'); 8 end; 9 / Onderstaande statements worden dus allebei geaudit: SQL> delete from winkels where locatie_id = 2100; SQL> delete from winkels where id=9; SQL> select sql_text from dba_fga_audit_trail; SQL_TEXT ---------------------------------------------- ---------------------------------------------- delete from winkels where locatie_id = 2100 delete from winkels where id = 9 Delete met een primary of unique key constraint Bij delete is het van belang of er een primary of unique key constraint zit op de kolom die je in de where selecteert als je ook een audit_condition hebt opgegeven. Als alleen deze kolom met sleutel wordt geselecteerd, dan wordt er niet geaudit. Als je naast deze sleutel ook de audit_condition nog opgeeft dan wordt er weer wel geaudit. Onderstaande policy is aangemaakt: SQL> begin 2 dbms_fga.add_policy (object_schema => 'FGA', 3 object_name => 'WINKELS', 4 policy_name => 'WINKELDELETE', 5 audit_condition => 'locatie_id is not null', 6 statement_types => 'delete'); 7 end; 8 / Van onderstaande statements wordt dus alleen de laaste geaudit: SQL> delete winkels where id = 9; SQL> delete winkels where id = 9 and locatie_id = 2100; SQL> select sql_text from dba_fga_audit_trail; SQL_TEXT ---------------------------------------------------- delete winkels where id = 9 and locatie_id = 2100 Objecten van de gebruiker sys worden niet geaudit middels fga Net als bij standaard database auditing worden objecten van de gebruiker sys niet geaudit. Meer over auditing leert u in de cursus: Oracle Database 11g: Administration deel 1a Gerelateerde artikelen Vijfhart: kennispartner in de Digitale Transformatie Java voor testers (met Startgarantie) Help je loopbaan vooruit als MCSA Windows Server 2016