powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Аудит действий пользователей FGA vs триггеры
6 сообщений из 6, страница 1 из 1
Аудит действий пользователей FGA vs триггеры
    #39389101
Джун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

Есть задача: отслеживать действия пользователей, которые работают через приложение.
Действия - это изменение, добавление, удаление. Возможно, в будущем ещё понадобится отлавливать ещё и просмотр объектов.
Ещё нужно писать сеансы: какие пользователи в какое время в приложение заходили, и когда выходили.
Администратор приложения должен иметь возможность просматривать всю записанную инфу в приложении.

Вопросы:
1. Правильно ли я понимаю, что изменение, добавление, удаление вполне можно отслеживать, добавляя триггеры на таблицы, а затем записывать интересующие меня действия в какую-нибудь общую таблицу типа AUDIT (с указанием таблицы, столбца, id объекта, старого и нового значения, типа операции, пользователя, даты и времени действия)?

2. Будет ли хорошей идеей добавить в таблицу AUDIT ещё и некий GROUP_ID, чтобы потом было проще понять, какие операции были совершены одновременно? (например, если пользователь отредактировал 1 объект, изменив в нём несколько полей)

3. Какие вообще есть очевидные минусы при использовании триггеров и сваливании всех действий по всем таблицам в единую таблицу AUDIT? (в использовании отдельных таблиц а-ля TABLE_NAME_HISTORY отталкивает удвоение размера БД).

4. Правильно ли я понимаю, что никак нельзя отследить действие "просмотр объекта" при помощи триггеров и придётся использовать FGA?

5. Если отслеживание просмотров доступно только через FGA, насколько оправдано пользоваться и FGA, и триггерами одновременно?

6. Как отловить входы / выходы, чтобы потом вывести эту инфу в интерфейс администратору?
...
Рейтинг: 0 / 0
Аудит действий пользователей FGA vs триггеры
    #39389153
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем случае (вернее в бoльшинстве случаев) нeправильно. Oтслеживать действия пользователей, которые работают через приложение нужно только в приложeнии. Пользователь прилoжения != пользователь базы.
В большинстве случаев используется middle-tier, так-что даже информация с какого сервeра и каким OS пользователем открыта сессия ничего не дает, тем более что в большинстве случаев используется connection pooling. Так-что без пердачи приложeнием информации о пользователе приложeния отслеживать действия пользователей на уровне базы не получится да и смысла нет - ведь не все действия пользователей в приложeнии это действия в базе а уж если oтслеживать действия пользователей то все и хранить в единой repository.

SY.
...
Рейтинг: 0 / 0
Аудит действий пользователей FGA vs триггеры
    #39389260
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДжунВопросы:
1. Правильно ли я понимаю, что изменение, добавление, удаление вполне можно отслеживать, добавляя триггеры на таблицы, а затем записывать интересующие меня действия в какую-нибудь общую таблицу типа AUDIT (с указанием таблицы, столбца, id объекта, старого и нового значения, типа операции, пользователя, даты и времени действия)?
2. Будет ли хорошей идеей добавить в таблицу AUDIT ещё и некий GROUP_ID, чтобы потом было проще понять, какие операции были совершены одновременно? (например, если пользователь отредактировал 1 объект, изменив в нём несколько полей)
3. Какие вообще есть очевидные минусы при использовании триггеров и сваливании всех действий по всем таблицам в единую таблицу AUDIT? (в использовании отдельных таблиц а-ля TABLE_NAME_HISTORY отталкивает удвоение размера БД).
4. Правильно ли я понимаю, что никак нельзя отследить действие "просмотр объекта" при помощи триггеров и придётся использовать FGA?
5. Если отслеживание просмотров доступно только через FGA, насколько оправдано пользоваться и FGA, и триггерами одновременно?
6. Как отловить входы / выходы, чтобы потом вывести эту инфу в интерфейс администратору?

Я не говорю, что Unified Auditing удовлетворит всем требованиям задачи, т.к. тут не раскрыты многие детали, но посмотрите в его сторону.
По умолчанию, он буферизует записи в SGA, что плодотворно скажется на производительности.
Политики unified auditing поддерживают условия их срабатывания, т.е. их можно сформировать гибко под конкретную задачу.
Узким местом может стать большой поток записей через unified audit, но можно попробовать его ограничить через условия срабатывания (например, какая-то процедура выполняющая миллион update-ов - нужно ли это видеть в аудите - зависит от конкретных требований).
Во вложении небольшой пример, когда политика unified auditing выполняется только для сессий определенного сервиса, с которым работает приложение.

session1 dba session step1
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
SQL> grant create procedure, create session, create table to tc identified by tc;

Grant succeeded.

SQL> alter user tc quota 100M on users;

User altered.

SQL> 
SQL> exec dbms_service.stop_service( 'my_app')

PL/SQL procedure successfully completed.

SQL> exec dbms_service.delete_service( 'my_app')

PL/SQL procedure successfully completed.

SQL> 
SQL> exec dbms_service.create_service( 'my_app', 'my_app')

PL/SQL procedure successfully completed.

SQL> exec dbms_service.start_service( 'my_app')

PL/SQL procedure successfully completed.

SQL> 
SQL> create audit policy test_pol
  2    privileges create session
  3    actions all
  4    when 'sys_context(''userenv'', ''service_name'')=''my_app'''
  5    evaluate per session;

Audit policy created.

SQL> 
SQL> audit policy test_pol;

Audit succeeded.

SQL> 
SQL> 
SQL> col ts_start old_v ts_start
SQL> select systimestamp ts_start from dual;

TS_START
---------------------------------------------------------------------------
23.01.2017 10:51:52.686586 +07:00

SQL> 
SQL> pause Login into the 2nd session and press enter when ready...
Login into the 2nd session and press enter when ready...



session2 app_session
в выводе видем нашего пользователя и ECID.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
$ sp tc/tc@\'host:1530/my_app\' @20170123/uni_aud_service_user

SQL*Plus: Release 12.2.0.0.2 Beta on Mon Jan 23 10:51:56 2017

Copyright (c) 1982, 2015, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics,
Real Application Testing and Unified Auditing options

SQL> 
 SQL> exec dbms_session.set_identifier( 'Vasya') 

PL/SQL procedure successfully completed.

 SQL> exec dbms_session.set_context( 'E2E_CONTEXT', 'ECID_UID', 'guid1') 

PL/SQL procedure successfully completed.

SQL> 
SQL> var n number
SQL> exec :n:=123

PL/SQL procedure successfully completed.

SQL> select :n from dual;

  :N
----------
       123

SQL> 
SQL> create table t(x int);

Table created.

SQL> 
SQL> insert into t values (:n);

1 row created.

SQL> 
SQL> create or replace procedure p(n t.x%type)
  2  is
  3  begin
  4    update t set x=p.n;
  5  end;
  6  /

Procedure created.

SQL> 
SQL> exec p(:n)

PL/SQL procedure successfully completed.

SQL> 
SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics,
Real Application Testing and Unified Auditing options



session1 dba session step2
В выводе видим пользователя и ECID.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
Login into the 2nd session and press enter when ready...

SQL> 
SQL> exec dbms_audit_mgmt.flush_unified_audit_trail

PL/SQL procedure successfully completed.

SQL> 
SQL> col event_timestamp for a26
SQL> col action_name for a16
SQL> col sql_textfo r a50
SQL> col sql_bindsfor a50
SQL> col client_identifier for a20
SQL > col execution_id   for a20
SQL> select event_timestamp,
  2       ac  tion_name,
  3       transaction_id,
  4       sql_text,
  5       sql_binds,
  6       client_identifier,
  7       execution_id
  8    from unified_audit_trail
  9   where event_timestamp>=to_timestamp_tz(q'#&ts_start.#')
 10   order by 1;
old   9:  where event_timestamp>=to_timestamp_tz(q'#&ts_start.#')
new   9:  where event_timestamp>=to_timestamp_tz(q'#23.01.2017 10:51:52.686586 +07:00#')

EVENT_TIMESTAMP      ACTION_NAME    TRANSACTION_ID   SQL_TEXTSQL_BINDS                           CLIENT_IDENTIFIEREXECUTION_ID
-------------------------- -------  --------- ---------------- -------------------------------------------------- -------------------------------------------------- -------------------- --------------------
23.01.2017 10:51:56.590585 LOGON    0000000 000000000
23.01.2017 10:51:56.591579 ALTER SESSION    0000000000000000 ALTER SESSION SET NLS_LANGUAGE= 'AMERICAN' NLS_TERRITORY= 'A
                   MERICA' NLS_CURRENCY

23.01.2017 10:51:56.593679 EXECUTE    0000000000000000   begin :con := "DBMS_RCVVPC"."F_VPC_USERS"(:sn, :on); end;#1(52):filte  r_user = SYS_CONTEXT('USERENV', 'SESSION_USER')
                             #2(4):RCAT #3(9):VP

23.01.2017 10:51:56.594036 SELECT    0000000000000000 SELECT  'Y' FROM VPC_USERS WHERE FILTER_UID = SYS_CONTEXT('US
                   ERENV', 'SESSION_USE

23.01.2017 10:51:56.594301 EXECUTE    0000000000000000 DECLARE  

EVENT_TIMESTAMP      ACTION_NAME    TRANSACTION_ID   SQL_TEXTSQ             L_BINDS   CLIENT_IDENTIFIEREXECUTION_ID
-------------------------           - ---------------- ---------------- -------------------------------------------------- -------------------------------------------------- -------------------- --------------------
                     l_dummyVARCHAR2        (1);
                   BEGIN
                     SELECT 'Y'
                 I

23.01.2017 10:51:56.602442 SELECT    0000000000000000 SELECT DECODE(USER, 'XS$NULL',    XS_SYS_CONTEXT('XS$SESSION',
                   'USERNAME'), USER) F

23.01.2017 10:51:56.605023 EXECUTE    0000000000000000 BEGIN DBMS_OUTPUT.DISABLE; END;
23.01.  2017 10:51:56.606167 SELECT    0000000000000000 SELECT ATTRIBUTE,SCOPE  ,NUMERIC_VALUE,CHAR_VALUE,DATE_VALUE F
                   ROM SYSTEM.PRODUCT_P

EVENT_TIMESTAMP      ACTION_NAME    TRANSACTION_ID   SQL_TEXTSQL_BINDS                           CLIENT_IDENTIFIEREXECUTION_ID
-------------------------- ------------ ---- ---------------- -------------------------------------------------- -------------------------------------------------- -------------------- --------------------

23.01.2017 10:51:56.607414 SELECT    0000000000000  000 SELECT CHAR_VALUE FROM SYSTEM.PRODUCT_PRIVS WHERE (UPPER('
                     SQL*Plus') LIKE UPPE

23.01.2017 10:51:56.609410 EXECUTE    00000 00000000000 BEGIN DBMS_APPLICATION_INFO.SET_MODULE(:1,NULL); END;  #1(8):SQL*Plus


23.01.2017 10:51:56.610560 SELECT    0000000000000000 SELECT   DECODE('A','A','1','2') FROM SYS.DUAL


23.01.2017 10:51:56.611459 COMMIT    0000000000000000

EVENT_TIMESTAMP      ACTION_NAME    TRANSACTION_ID   S    QL_TEXTSQL_BINDS   CLIENT_IDENTIFIEREXECUTION_ID
----------                        ---------------- ---------------- ---------------- -------------------------------------------------- -------------------------------------------------- -------------------- --------------------
23.01.2017 10:51:56.611991 COMMIT    0000000000000000
23.01.2017 10:51:56.618676 EX ECUTE    0000000000000000 BEGIN dbms_session.set_identifier( 'Vasya');   END;   Vasya


23.01.2017 10:51:56.623056 EXECUTE    000000000               0000000 BEGIN dbms_session.set_context( 'E2E_CONTEXT', 'ECID_UID', '             Vasyaguid1
                   guid1'); END;


23.01.2017 10:51:56.62465   9 EXECUTE    0000000000000000 BEGIN :n:=123; END; #1(3):123                      Vasyaguid1



EVENT_TIMESTAMP      ACTION_NAME    TRANSACTION_ID   S      QL_TEXTSQL_BINDS   CLIENT_IDENTIFIEREXECUTION_ID
----------                        ---------------- ---------------- ---------------- -------------------------------------------------- -------------------------------------------------- -------------------- --------------------
23.01.2017 10:51:56.626274 SELECT    0000000000000000 select :n from dual #1(3)         :123   Vasyaguid1
23.01.2017 10:51:56.630991 EXECUTE    0007001               E000042CC declare   Vasyaguid1
                    error boolean                           ;
                     st_syn_detected EXCEPTION;
                PRAGMA EXCEPTION_INIT(st

23.01.2017 10:51:56.640307 CREATE TABLE     0007001E000042CC create table t(x int)   Vasyaguid1
23.01.2017 10:51:56.656147 IN                       SERT    0005000000006F99 insert into t values (:n) #1(3):123                      Vasyaguid1
23.01.2017 10:51:56.659653 EXECUTE    0000000000000000      declare   Vasyaguid1
                    error boolean;
                                                st_syn_detected EXCEPTION;

EVENT_TIMESTAMP      ACTION_NAME    T RANSACTION_ID   SQL_TEXTSQL_BINDS   CLIENT_IDENTIFIEREXECUT                       ION_ID
-------------------------- ---------------- ---------------- -------------------------------------------------- -------------------------------------------------- -------------------- --------------------
                PRAGMA EXCEPTION_INIT(st

23.01.2017 10:51:56.689527 CREATE PROCEDURE 000D0014000002D9 create or replace procedure p(n t.x%type)   Vasyaguid1
                   is
                   begin
                                         update t set x=p.n;
                   end;

23.01.2017 10:51:56.706869 UPDATE    0009000D00005AFD UPDATE T SET X=:B1         #1(3):123   Vasyaguid1               
23.01.2017 10:51:56.707230 EXECUTE    0009000D00005AFD BEGIN p(:n); E ND; #1(3):123   Vasyaguid1


EVENT_TIMESTAMP      ACTION_NAM                       E    TRANSACTION_ID   SQL_TEXTSQL_BINDS   CLIENT_IDENTIFIER                         EXECUTION_ID
-------------------------- ---------------- ---------------- -------------------------------------------------- -------------------------------------------------- -------------------- --------------------

23.01.2017 10:51:56.709002 LOGOFF    0009000D00005AFD                              Vasyaguid1
23.01.2017 10:51:58.795640 EXECUTE    0000      000000000000 BEGIN dbms_audit_mgmt.flush_unified_audit_trail; END;



26 rows selected.




По отдельным пунктам:
ДжунВопросы:
2. Будет ли хорошей идеей добавить в таблицу AUDIT ещё и некий GROUP_ID, чтобы потом было проще понять, какие операции были совершены одновременно? (например, если пользователь отредактировал 1 объект, изменив в нём несколько полей)

unified_audit_trail.transaction_id/ecid
Джун4. Правильно ли я понимаю, что никак нельзя отследить действие "просмотр объекта" при помощи триггеров и придётся использовать FGA?

Unified Auditing позволяет отслеживать "просмотр объекта", если мы имеем в виду под этим одно и то же.
Джун6. Как отловить входы / выходы, чтобы потом вывести эту инфу в интерфейс администратору?

unified_audit_trail.action_name=LOGON/LOGOFF%.
SYOтслеживать действия пользователей, которые работают через приложение нужно только в приложeнии. Пользователь прилoжения != пользователь базы.
Не только лишь в приложении.
Допустим, middle-tier вызывает высокоуровневое API - PL/SQL процедуру, которая меняет множество всего в БД. Самого факт вызова PL/SQL процедуры и ее параметров - может оказаться не достаточно. middle-tier не знает ничего о том, чего эта процедура в БД наменяла и к каким данным обращалась (а если захочет знать, то это не всегда дешево предоставить).
Поэтому само утверждение о том "что только в приложении" - не везде применимо.
Логи приложения к дополнениям логи БД - это то, что нужно на тех проектах, где я работаю. Естественно, все лучше централизовать, например, через тот же ELK стэк, чтобы иметь все нужные данные в одном месте, а ECID использовать в качестве сквозного идентификатора - он генерится приложением, о нем знает приложение, о нем знает БД, и при необходимости он пробрасывается в иные системы (например, middle-tier зовет БД, БД зовет внешнюю систему или другую БД и т.д.).
На практике, middle-tier может звать тучу БД в рамках XA-транзакции в рамках одного ECID, по которому, например, затем в ELK специально обученные пользователи смотрят, что происходило в рамках одного клиентского запроса в разных ИС.
SYТак-что без пердачи приложeнием информации о пользователе приложeния отслеживать действия пользователей на уровне базы не получится да и смысла нет - ведь не все действия пользователей в приложeнии это действия в базе а уж если oтслеживать действия пользователей то все и хранить в единой repository.

На уровне стандартов разработки вводится требование, что любые приложения при работе с БД используют:
service, module, action, client_id, ecid. DBOP еще не введен, но я пока в нем не вижу большого смысла.
JDBC все указанные поля передает на уровне одного SQL*Net пакета при выполнении следующего вызова в БД, т.е. нет дополнительных накладных расходов на поддержание инструментирования.
Естественно, периодически возникают задачи по подключению к БД новых сторонних приложений, написанных набранными по объявлениям студентами, не знающими, что такое инструментирование. Они либо садятся на существующие/новые сервисы, или модифицируют свой код в соответствии с общепринятыми стандартами того проекта, где я работаю.
...
Рейтинг: 0 / 0
Аудит действий пользователей FGA vs триггеры
    #39389462
Джун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SeaGateЯ не говорю, что Unified Auditing удовлетворит всем требованиям задачи, т.к. тут не раскрыты многие детали, но посмотрите в его сторону.

Спасибо! А можно через него отследить именно вставку, удаление, изменение или всё равно нужно будет триггеры на таблицы прикручивать?
И он как-то отдельно лицензируется?
...
Рейтинг: 0 / 0
Аудит действий пользователей FGA vs триггеры
    #39389982
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джун,

ДжунСпасибо! А можно через него отследить именно вставку, удаление, изменение или всё равно нужно будет триггеры на таблицы прикручивать?
И он как-то отдельно лицензируется?
В своем примере я привел аудит:
insert
update из процедуры

По лицензированию, я не вижу, что он в Feature Availability by Edition в Licensing Manual указан.
Насколько я знаю, он бесплатен, т.к.:
его можно использовать со Standard Edition: Unable to Set Unified Auditing in Oracle Database Standard Edition (Doc ID 2021411.1)
, а отдельные опции применимы только к EE:
Database Licensing Information User Manual
2 Options and PacksAll the Oracle Database options can be purchased with Oracle Database Enterprise Edition. Oracle Real Application Clusters (Oracle RAC) is included with Oracle Database Standard Edition. You cannot purchase any options with Oracle Database Standard Edition One or Oracle Express Edition. The Personal Edition includes all options except Oracle RAC at no additional cost.
...
Рейтинг: 0 / 0
Аудит действий пользователей FGA vs триггеры
    #39389990
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДжунА можно через него отследить именно вставку, удаление, изменение или всё равно нужно будет триггеры на таблицы прикручивать?


Зачем это нужно при аудите приложения? Пользователь приложения может выполнять только те функции которые доступны в приложении. Если пользователь создал, например, invoice то аудит и дoлжен содержать запись Вася Пупкин в такое-то время создал invoice на $100 за ремонт унитаза тете Соне. Какая разница в какие таблицы что пихалось? Тем более что вставку, удаление, изменение делал не Вася Пупкин а само приложение.

SY.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Аудит действий пользователей FGA vs триггеры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]