AUDIT в Oracle SQL. Введение
Если любишь не только писать SQL, но и понимать, кто, что и когда сделал в базе, то AUDIT — твой большой союзник.
В Oracle тема аудита давно выросла из простой «галочки безопасности» в полноценную систему наблюдения за действиями пользователей, ролей, привилегий и SQL-операций.
Особенно красиво это раскрывается в unified auditing: ты создаёшь политику, включаешь её через AUDIT POLICY и получаешь аккуратный контроль вместо хаоса.
Синтаксис
-- создание unified audit policy
CREATE AUDIT POLICY policy_name
ACTIONS action_list;
-- включение policy
AUDIT POLICY policy_name;
-- включение policy только для выбранных пользователей
AUDIT POLICY policy_name BY user1, user2;
-- писать запись только при ошибке или только при успехе
AUDIT POLICY policy_name WHENEVER NOT SUCCESSFUL;
AUDIT POLICY policy_name WHENEVER SUCCESSFUL;В актуальных версиях Oracle основной путь — unified auditing:
сначала создаёшь политику через CREATE AUDIT POLICY,
потом включаешь её через AUDIT POLICY.
Традиционный аудит Oracle считает устаревшим подходом для новых систем, а в 23c он уже desupported. :contentReference[oaicite:1]{index=1}
Где используют
- контроль доступа к чувствительным таблицам и схемам
- отслеживание DDL и DML-изменений
- мониторинг административных действий
- выявление неуспешных попыток доступа
- комплаенс, расследования и внутренний контроль
- точечный аудит пользователей, ролей, привилегий и объектов
100 примеров
1. Базовая unified policy для входа в систему
CREATE AUDIT POLICY pol_logon
ACTIONS LOGON2. Включение policy для всех пользователей
AUDIT POLICY pol_logon3. Включение policy только при успешном входе
AUDIT POLICY pol_logon
WHENEVER SUCCESSFUL4. Включение policy только при неуспешном входе
AUDIT POLICY pol_logon
WHENEVER NOT SUCCESSFUL5. Policy для выхода из системы
CREATE AUDIT POLICY pol_logoff
ACTIONS LOGOFF6. Включение аудита выхода
AUDIT POLICY pol_logoff7. Policy для CREATE TABLE
CREATE AUDIT POLICY pol_create_table
ACTIONS CREATE TABLE8. Policy для ALTER TABLE
CREATE AUDIT POLICY pol_alter_table
ACTIONS ALTER TABLE9. Policy для DROP TABLE
CREATE AUDIT POLICY pol_drop_table
ACTIONS DROP TABLE10. Policy для CREATE USER
CREATE AUDIT POLICY pol_create_user
ACTIONS CREATE USER11. Policy для ALTER USER
CREATE AUDIT POLICY pol_alter_user
ACTIONS ALTER USER12. Policy для DROP USER
CREATE AUDIT POLICY pol_drop_user
ACTIONS DROP USER13. Policy для CREATE ROLE
CREATE AUDIT POLICY pol_create_role
ACTIONS CREATE ROLE14. Policy для GRANT
CREATE AUDIT POLICY pol_grant
ACTIONS GRANT15. Policy для REVOKE
CREATE AUDIT POLICY pol_revoke
ACTIONS REVOKE16. Policy для CREATE VIEW
CREATE AUDIT POLICY pol_create_view
ACTIONS CREATE VIEW17. Policy для CREATE INDEX
CREATE AUDIT POLICY pol_create_index
ACTIONS CREATE INDEX18. Policy для DROP INDEX
CREATE AUDIT POLICY pol_drop_index
ACTIONS DROP INDEX19. Policy для CREATE SEQUENCE
CREATE AUDIT POLICY pol_create_sequence
ACTIONS CREATE SEQUENCE20. Включение нескольких policies сразу
AUDIT POLICY pol_create_table,
pol_alter_table,
pol_drop_tableЕще 20 примеров
21. Policy для SELECT на конкретной таблице
CREATE AUDIT POLICY pol_sel_orders
ACTIONS SELECT ON oe.orders22. Policy для UPDATE на конкретной таблице
CREATE AUDIT POLICY pol_upd_orders
ACTIONS UPDATE ON oe.orders23. Policy для DELETE на таблице заказов
CREATE AUDIT POLICY pol_del_orders
ACTIONS DELETE ON oe.orders24. Policy для INSERT в таблицу клиентов
CREATE AUDIT POLICY pol_ins_customers
ACTIONS INSERT ON oe.customers25. Policy сразу для UPDATE и DELETE на объекте
CREATE AUDIT POLICY pol_mod_orders
ACTIONS UPDATE, DELETE ON oe.orders26. Включение policy только для одного пользователя
AUDIT POLICY pol_sel_orders
BY scott27. Включение policy для нескольких пользователей
AUDIT POLICY pol_mod_orders
BY scott, hr28. Policy только для ошибок UPDATE
AUDIT POLICY pol_upd_orders
WHENEVER NOT SUCCESSFUL29. Policy только для успешных DELETE
AUDIT POLICY pol_del_orders
WHENEVER SUCCESSFUL30. Условный аудит по HOST
CREATE AUDIT POLICY pol_host_check
ACTIONS UPDATE ON oe.orders
WHEN 'SYS_CONTEXT(''USERENV'',''HOST'') NOT IN (''sales_24'',''sales_12'')'
EVALUATE PER SESSION31. Условный аудит по CLIENT_IDENTIFIER
CREATE AUDIT POLICY pol_clientid
ACTIONS DELETE ON oe.orders
WHEN 'SYS_CONTEXT(''USERENV'',''CLIENT_IDENTIFIER'') = ''sales_clerk'''
EVALUATE PER STATEMENT32. Условный аудит по типу идентификации
CREATE AUDIT POLICY pol_external_auth
ACTIONS UPDATE ON oe.orders
WHEN 'SYS_CONTEXT(''USERENV'',''IDENTIFICATION_TYPE'') = ''EXTERNAL'''
EVALUATE PER STATEMENT33. Включение условной policy
AUDIT POLICY pol_host_check34. Включение policy кроме одного пользователя
AUDIT POLICY pol_clientid
EXCEPT jmartin35. Policy для CREATE ANY TABLE privilege use
CREATE AUDIT POLICY pol_any_table
PRIVILEGES CREATE ANY TABLE36. Policy для ALTER ANY TABLE privilege use
CREATE AUDIT POLICY pol_alter_any_table
PRIVILEGES ALTER ANY TABLE37. Policy для DROP ANY TABLE privilege use
CREATE AUDIT POLICY pol_drop_any_table
PRIVILEGES DROP ANY TABLE38. Policy для CREATE SESSION privilege
CREATE AUDIT POLICY pol_create_session
PRIVILEGES CREATE SESSION39. Включение privilege-based policy
AUDIT POLICY pol_create_session40. Policy для EXECUTE на конкретной процедуре
CREATE AUDIT POLICY pol_exec_proc
ACTIONS EXECUTE ON hr.calc_bonusЕще 20 примеров
41. Policy для EXECUTE на package
CREATE AUDIT POLICY pol_exec_pkg
ACTIONS EXECUTE ON hr.pkg_utils42. Policy для MERGE на таблице
CREATE AUDIT POLICY pol_merge_orders
ACTIONS MERGE ON oe.orders43. Policy для TRUNCATE TABLE
CREATE AUDIT POLICY pol_truncate_table
ACTIONS TRUNCATE TABLE44. Policy для CREATE PROCEDURE
CREATE AUDIT POLICY pol_create_proc
ACTIONS CREATE PROCEDURE45. Policy для ALTER PROCEDURE
CREATE AUDIT POLICY pol_alter_proc
ACTIONS ALTER PROCEDURE46. Policy для DROP PROCEDURE
CREATE AUDIT POLICY pol_drop_proc
ACTIONS DROP PROCEDURE47. Policy для CREATE TRIGGER
CREATE AUDIT POLICY pol_create_trigger
ACTIONS CREATE TRIGGER48. Policy для DROP TRIGGER
CREATE AUDIT POLICY pol_drop_trigger
ACTIONS DROP TRIGGER49. Policy для CREATE VIEW и DROP VIEW вместе
CREATE AUDIT POLICY pol_view_lifecycle
ACTIONS CREATE VIEW, DROP VIEW50. Policy для CREATE ROLE и DROP ROLE
CREATE AUDIT POLICY pol_role_lifecycle
ACTIONS CREATE ROLE, DROP ROLE51. Включение policy только для SYS и SYSTEM не делают так без причины, но пример полезный
AUDIT POLICY pol_role_lifecycle
BY sys, system52. Policy для CREATE DIRECTORY
CREATE AUDIT POLICY pol_create_directory
ACTIONS CREATE DIRECTORY53. Policy для DROP DIRECTORY
CREATE AUDIT POLICY pol_drop_directory
ACTIONS DROP DIRECTORY54. Policy для CREATE DATABASE LINK
CREATE AUDIT POLICY pol_create_dblink
ACTIONS CREATE DATABASE LINK55. Policy для DROP PUBLIC SYNONYM
CREATE AUDIT POLICY pol_drop_public_syn
ACTIONS DROP PUBLIC SYNONYM56. Policy для ALTER SYSTEM
CREATE AUDIT POLICY pol_alter_system
ACTIONS ALTER SYSTEM57. Policy для CREATE TABLESPACE
CREATE AUDIT POLICY pol_create_tablespace
ACTIONS CREATE TABLESPACE58. Policy для DROP TABLESPACE
CREATE AUDIT POLICY pol_drop_tablespace
ACTIONS DROP TABLESPACE59. Policy для AUDIT SYSTEM GRANT option use
CREATE AUDIT POLICY pol_grant_sys_priv
PRIVILEGES GRANT ANY PRIVILEGE60. Включение сразу privilege и object policies
AUDIT POLICY pol_any_table,
pol_exec_proc,
pol_sel_ordersЕще 20 примеров
61. Проверка включённых unified policies
SELECT policy_name,enabled_option
FROM audit_unified_enabled_policies62. Просмотр всех созданных policies
SELECT policy_name,audit_option,audit_option_type
FROM audit_unified_policies
ORDER BY policy_name,audit_option63. Просмотр unified audit trail
SELECT event_timestamp,dbusername,action_name,object_schema,object_name
FROM unified_audit_trail
ORDER BY event_timestamp DESC64. Фильтр trail только по пользователю
SELECT event_timestamp,action_name,return_code
FROM unified_audit_trail
WHERE dbusername = 'SCOTT'
ORDER BY event_timestamp DESC65. Фильтр trail по policy name
SELECT event_timestamp,dbusername,action_name
FROM unified_audit_trail
WHERE unified_audit_policies LIKE '%POL_SEL_ORDERS%'66. Просмотр только неуспешных действий
SELECT event_timestamp,dbusername,action_name,return_code
FROM unified_audit_trail
WHERE return_code <> 0
ORDER BY event_timestamp DESC67. Просмотр только успешных действий
SELECT event_timestamp,dbusername,action_name
FROM unified_audit_trail
WHERE return_code = 0
ORDER BY event_timestamp DESC68. Trail только по конкретной таблице
SELECT event_timestamp,dbusername,action_name
FROM unified_audit_trail
WHERE object_schema = 'OE'
AND object_name = 'ORDERS'69. Trail только по хосту клиента
SELECT event_timestamp,dbusername,userhost
FROM unified_audit_trail
WHERE userhost = 'sales_24'70. Trail по client identifier
SELECT event_timestamp,dbusername,client_identifier,action_name
FROM unified_audit_trail
WHERE client_identifier = 'sales_clerk'71. Trail за текущий день
SELECT event_timestamp,dbusername,action_name
FROM unified_audit_trail
WHERE event_timestamp >= TRUNC(SYSDATE)72. Подсчёт audit events по action_name
SELECT action_name,COUNT(*) AS cnt_val
FROM unified_audit_trail
GROUP BY action_name
ORDER BY cnt_val DESC73. Подсчёт audit events по пользователю
SELECT dbusername,COUNT(*) AS cnt_val
FROM unified_audit_trail
GROUP BY dbusername
ORDER BY cnt_val DESC74. Подсчёт ошибок аудита по return_code
SELECT return_code,COUNT(*) AS cnt_val
FROM unified_audit_trail
GROUP BY return_code
ORDER BY cnt_val DESC75. Последние 10 событий по orders
SELECT event_timestamp,dbusername,action_name
FROM unified_audit_trail
WHERE object_name = 'ORDERS'
ORDER BY event_timestamp DESC
FETCH FIRST 10 ROWS ONLY76. Policies, которые реально доступны в unified audit metadata
SELECT DISTINCT policy_name
FROM audit_unified_policies
ORDER BY policy_name77. Policy для ADMINISTER KEY MANAGEMENT
CREATE AUDIT POLICY pol_key_mgmt
ACTIONS ADMINISTER KEY MANAGEMENT78. Policy для CREATE MATERIALIZED VIEW
CREATE AUDIT POLICY pol_create_mv
ACTIONS CREATE MATERIALIZED VIEW79. Policy для DROP MATERIALIZED VIEW
CREATE AUDIT POLICY pol_drop_mv
ACTIONS DROP MATERIALIZED VIEW80. Политика для чувствительной таблицы salaries
CREATE AUDIT POLICY pol_salary_access
ACTIONS SELECT, UPDATE ON hr.salariesЕще 20 примеров
81. Включение salary policy только для HR
AUDIT POLICY pol_salary_access
BY hr82. Salary policy только на ошибки доступа
AUDIT POLICY pol_salary_access
BY hr
WHENEVER NOT SUCCESSFUL83. Policy для CREATE ANY PROCEDURE privilege
CREATE AUDIT POLICY pol_create_any_proc
PRIVILEGES CREATE ANY PROCEDURE84. Policy для ALTER ANY PROCEDURE privilege
CREATE AUDIT POLICY pol_alter_any_proc
PRIVILEGES ALTER ANY PROCEDURE85. Policy для DROP ANY PROCEDURE privilege
CREATE AUDIT POLICY pol_drop_any_proc
PRIVILEGES DROP ANY PROCEDURE86. Policy для ALTER DATABASE
CREATE AUDIT POLICY pol_alter_database
ACTIONS ALTER DATABASE87. Policy для CREATE PROFILE
CREATE AUDIT POLICY pol_create_profile
ACTIONS CREATE PROFILE88. Policy для DROP PROFILE
CREATE AUDIT POLICY pol_drop_profile
ACTIONS DROP PROFILE89. Policy для CREATE AUDIT POLICY itself
CREATE AUDIT POLICY pol_create_audit_policy
ACTIONS CREATE AUDIT POLICY90. Policy для ALTER AUDIT POLICY
CREATE AUDIT POLICY pol_alter_audit_policy
ACTIONS ALTER AUDIT POLICY91. Policy для DROP AUDIT POLICY
CREATE AUDIT POLICY pol_drop_audit_policy
ACTIONS DROP AUDIT POLICY92. Просмотр trail только по policy salary access
SELECT event_timestamp,dbusername,action_name,object_name
FROM unified_audit_trail
WHERE unified_audit_policies LIKE '%POL_SALARY_ACCESS%'93. Просмотр trail по CREATE TABLE activity
SELECT event_timestamp,dbusername,sql_text
FROM unified_audit_trail
WHERE action_name = 'CREATE TABLE'94. Просмотр trail по LOGON activity
SELECT event_timestamp,dbusername,return_code,userhost
FROM unified_audit_trail
WHERE action_name = 'LOGON'95. Legacy-пример традиционного AUDIT TABLE для старых систем
AUDIT TABLE96. Legacy-пример AUDIT SESSION
AUDIT SESSION97. Legacy-пример AUDIT SELECT TABLE, INSERT TABLE
AUDIT SELECT TABLE, INSERT TABLE98. Legacy-пример object audit по таблице
AUDIT SELECT, UPDATE
ON oe.orders99. Legacy-пример только при ошибке
AUDIT SESSION
WHENEVER NOT SUCCESSFUL100. Финальный пример: полноценная policy для чувствительных заказов с условием, включением и просмотром trail
CREATE AUDIT POLICY pol_sensitive_orders
ACTIONS SELECT, UPDATE, DELETE ON oe.orders
WHEN 'SYS_CONTEXT(''USERENV'',''HOST'') NOT IN (''sales_24'',''sales_12'')'
EVALUATE PER SESSION;
AUDIT POLICY pol_sensitive_orders
WHENEVER NOT SUCCESSFUL;
SELECT event_timestamp,dbusername,action_name,object_name,return_code
FROM unified_audit_trail
WHERE unified_audit_policies LIKE '%POL_SENSITIVE_ORDERS%'
ORDER BY event_timestamp DESCЗаключение
С AUDIT Oracle становится не просто базой, а системой с памятью.
Ты уже не гадаешь, кто сделал DROP,
кто менял TABLE,
кто трогал чувствительные строки и где были неуспешные попытки.
Для новых проектов правильнее мыслить через unified auditing:
создавать понятные policies, включать их точечно и читать следы в UNIFIED_AUDIT_TRAIL.
Это и безопаснее, и взрослее, и просто красивее с точки зрения архитектуры. :contentReference[oaicite:2]{index=2}
Официальная документация Oracle:
AUDIT (Unified Auditing)
Creating Custom Unified Audit Policies
UNIFIED_AUDIT_TRAIL
AUDIT (Traditional Auditing, legacy)