powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle label security
8 сообщений из 8, страница 1 из 1
Oracle label security
    #39410087
Anklav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вечер добрый, Господа!
Столкнулся с такой проблемой: существует ряд гайдов на просторах интернета о том, как настроить технологию OLS, однако дальше ограничение доступа на чтение ничего не находил (пользователи видят ровно те строки, к которым у них имеется доступ). Требуется реализовать контроль операций вставки в таблицу для пользователя. К примеру:
1. базовый случай -- пользователь может вставить строки туда, где имеется доступ на чтение (не знаю как более по-русски).
2. более сложная ситуация -- вставка строк туда, куда нет доступа на чтение
3. итог -- невозможность вставлять строки вообще, только чтение.
Вопрос -- как это реализовать?

Логично, что интересует весь комплект DML-операций, но полагаю, что INSERT'a хватит и остальное можно будет сделать по аналогии. Решение интересует только в рамках данной технологии. Увы, документация была просмотрена, вполне возможно, что там всё это доступно изложено, однако -- проблема языкового барьера.

Благодарю за внимание!
...
Рейтинг: 0 / 0
Oracle label security
    #39410100
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anklav,

На основании чего было решено использовать OLS? Ты в курсе, что это платная опция и стоит много тыщ долларов на процессор?

Есть идущая в комплекте с Enterprise Edition опция Virtual Private Database (VDP) так же известная как RLS (row level security).
Так вот она позволяет сделать что тебе требуется
Код: plsql
1.
dbms_rls.add_policy(..., statement_types => 'INSERT', ...)



OLS имхо излишне замысловата, но если таки интересует, то начинай от
Код: plsql
1.
sa_sysdba.create_policy(..., default_options  => 'insert_control')



А вообще, можно рассмотреть вариант c check constrains если позволяет специфика
Код: plsql
1.
create table tbl (..., u varchar2(30) default user)

И дальше вешаешь проверки с участием u.
...
Рейтинг: 0 / 0
Oracle label security
    #39410107
Anklav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодарю за информацию! Задачи у меня строго учебные, поэтому оплата опции сильно не интересует-)
...
Рейтинг: 0 / 0
Oracle label security
    #39410108
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anklav,

Я правильно понимаю что в обычном российском вузе учат как применять OLS?
...
Рейтинг: 0 / 0
Oracle label security
    #39410109
Anklav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В большей степени "Вот тема. Разберись сам".

К слову, относительно данного кода

Код: plsql
1.
sa_sysdba.create_policy(..., default_options  => 'insert_control')



Устанавливал данную опцию на политику и при применении к таблице, однако была возможность вставить данные туда, куда нет доступа, по идее.
...
Рейтинг: 0 / 0
Oracle label security
    #39410115
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnklavУстанавливал данную опцию на политику и при применении к таблице, однако была возможность вставить данные туда, куда нет доступа, по идее.У тебя как студента руки стремятся расти не оттуда, поэтому твоя нетехническая лирика не заслуживает технических комментариев.
А в test-case-е легко указать на ошибки.
...
Рейтинг: 0 / 0
Oracle label security
    #39410249
Anklav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно код, который использую в своей реализации. Основа реализации заимствована из данной статьи ( https://habrahabr.ru/post/185946/). Далее только меняю опции для ограничения операций вставки в таблицу.
Код: 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.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
begin 
SA_SYSDBA.CREATE_POLICY(policy_name => 'TestI', column_name => 'lvlI', default_options => 'READ_CONTROL,INSERT_CONTROL,UPDATE_CONTROL,DELETE_CONTROL'); 
  /* Корневая группа */
  SA_COMPONENTS.CREATE_GROUP (
   policy_name     => 'TestI',
   group_num       => 10,  /* Числовое заначение */
   short_name      => 'bos', /* Сокращенное наименование */
   long_name       => 'Boss'); /* Полное наименование */

  SA_COMPONENTS.CREATE_GROUP (
   policy_name     => 'TestI',
   group_num       => 20,
   short_name      => 'emp',
   long_name       => 'Employer',
   parent_name     => 'bos'); /* родитель */

  SA_COMPONENTS.CREATE_GROUP (
   policy_name     => 'TestI',
   group_num       => 21,
   short_name      => 'par',
   long_name       => 'Partner',
   parent_name     => 'bos'); /* родитель */

  SA_COMPONENTS.CREATE_GROUP (
   policy_name     => 'TestI',
   group_num       => 30,
   short_name      => 'cust',
   long_name       => 'Customer',
   parent_name     => 'emp');
   
 SA_COMPONENTS.CREATE_LEVEL (
   policy_name   => 'TestI',
   level_num     => 90,  /* Числовое значение */
   short_name    => 'TS', /* Сокращенное наименование */
   long_name     => 'TopSecret'); /* Полное наименование */

 SA_COMPONENTS.CREATE_LEVEL (
   policy_name   => 'TestI',
   level_num     => 80,
   short_name    => 'PRI',
   long_name     => 'Private');

 SA_COMPONENTS.CREATE_LEVEL (
   policy_name   => 'TestI',
   level_num     => 70,
   short_name    => 'PUB',
   long_name     => 'Public');
   
SA_LABEL_ADMIN.CREATE_LABEL (
   policy_name     => 'TestI',
   label_tag       => 1100, /* Числовое передставление метки */
   label_value     => 'PUB::CUST' /* Текстовое передставление метки */, 
   data_label => TRUE);
SA_LABEL_ADMIN.CREATE_LABEL (
   policy_name     => 'TestI',
   label_tag       => 1110, /* Числовое передставление метки */
   label_value     => 'PUB::EMP' /* Текстовое передставление метки */, 
   data_label => TRUE);
SA_LABEL_ADMIN.CREATE_LABEL (
   policy_name     => 'TestI',
   label_tag       => 1111, /* Числовое передставление метки */
   label_value     => 'PUB::PAR' /* Текстовое передставление метки */, 
   data_label => TRUE);
SA_LABEL_ADMIN.CREATE_LABEL (
   policy_name     => 'TestI',
   label_tag       => 1120, /* Числовое передставление метки */
   label_value     => 'PUB::BOS' /* Текстовое передставление метки */, 
   data_label => TRUE);

SA_LABEL_ADMIN.CREATE_LABEL (
   policy_name     => 'TestI',
   label_tag       => 2100, /* Числовое передставление метки */
   label_value     => 'PRI::CUST' /* Текстовое передставление метки */, 
   data_label => TRUE);
SA_LABEL_ADMIN.CREATE_LABEL (
   policy_name     => 'TestI',
   label_tag       => 2110, /* Числовое передставление метки */
   label_value     => 'PRI::EMP' /* Текстовое передставление метки */, 
   data_label => TRUE);
SA_LABEL_ADMIN.CREATE_LABEL (
   policy_name     => 'TestI',
   label_tag       => 2111, /* Числовое передставление метки */
   label_value     => 'PRI::PAR' /* Текстовое передставление метки */, 
   data_label => TRUE);
SA_LABEL_ADMIN.CREATE_LABEL (
   policy_name     => 'TestI',
   label_tag       => 2120, /* Числовое передставление метки */
   label_value     => 'PRI::BOS' /* Текстовое передставление метки */, 
   data_label => TRUE);

SA_LABEL_ADMIN.CREATE_LABEL (
   policy_name     => 'TestI',
   label_tag       => 3100, /* Числовое передставление метки */
   label_value     => 'TS::CUST' /* Текстовое передставление метки */, 
   data_label => TRUE);
SA_LABEL_ADMIN.CREATE_LABEL (
   policy_name     => 'TestI',
   label_tag       => 3110, /* Числовое передставление метки */
   label_value     => 'TS::EMP' /* Текстовое передставление метки */, 
   data_label => TRUE);
SA_LABEL_ADMIN.CREATE_LABEL (
   policy_name     => 'TestI',
   label_tag       => 3111, /* Числовое передставление метки */
   label_value     => 'TS::PAR' /* Текстовое передставление метки */, 
   data_label => TRUE);
SA_LABEL_ADMIN.CREATE_LABEL (
   policy_name     => 'TestI',
   label_tag       => 3120, /* Числовое передставление метки */
   label_value     => 'TS::BOS' /* Текстовое передставление метки */, 
   data_label => TRUE);
   
SA_POLICY_ADMIN.APPLY_TABLE_POLICY('TestI','USER1','PAYMENTS',
'INSERT_CONTROL',
'USER1.payments_label(:new.region,:new.amount)',null);

 SA_USER_ADMIN.SET_LEVELS (
  policy_name   => 'TestI',
  user_name     => 'user1', 
  max_level     => 'TS');

 SA_USER_ADMIN.SET_GROUPS (
  policy_name   => 'TestI',
  user_name     => 'user1', 
  read_groups   => 'bos');

-- medium boss
 SA_USER_ADMIN.SET_LEVELS (
  policy_name   => 'TestI',
  user_name     => 'user2', 
  max_level     => 'pri');

 SA_USER_ADMIN.SET_GROUPS (
  policy_name   => 'TestI',
  user_name     => 'user2', 
  read_groups   => 'emp');

 SA_USER_ADMIN.SET_LEVELS (
  policy_name   => 'TestI',
  user_name     => 'user4', 
  max_level     => 'PRI');

 SA_USER_ADMIN.SET_GROUPS (
  policy_name   => 'TestI',
  user_name     => 'user4', 
  read_groups   => 'par');
-- big boss of MO region
 SA_USER_ADMIN.SET_LEVELS (
  policy_name   => 'TestI',
  user_name     => 'user5', 
  max_level     => 'PUB');

 SA_USER_ADMIN.SET_GROUPS (
  policy_name   => 'TestI',
  user_name     => 'user5', 
  read_groups   => 'cust');
END;


Функцию для генерации лейблов не менял
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create or replace function payments_label(region varchar2, amount number) return LBACSYS.LBAC_LABEL as 
  lvlI varchar2(32);
  reg varchar2(32);
  rvalue number(10);
 begin
  case region
   when 'MO1' then reg := 'CUST';
   when 'MO2' then reg := 'EMP';
   when 'MO3' then reg := 'BOS';
   when 'NW' then reg := 'PAR';
   else raise_application_error(-20000, 'invalid region.');
  end case;
  case 
   when amount >= 10000 then lvlI := 'TS';
   when amount >= 5000 then lvlI := 'PUB';
   else lvlI := 'PRI';
  end case;
   return LBACSYS.to_lbac_label('PAYMENTS_POL', lvlI || '::' || reg);
end;


По идее. Если я делаю два insert'а
Код: plsql
1.
2.
insert into user1.payments (id,cname,amount,region) values (1,'Пиво',100,'MO1');--должен пройти insert
insert into user1.payments (id,cname,amount,region) values (2,'Водка',10000,'MO3');--не должен пройти insert, но проходит
...
Рейтинг: 0 / 0
Oracle label security
    #39412209
Фотография Immunitet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle® Database Reference SQL92_SECURITY
Values

true

The user must have SELECT privilege on a column to reference it in the WHERE clause of a DELETE or UPDATE statement, on the right hand side of an assignment in the SET clause of an UPDATE statement.

false

A user with DELETE privilege on the target table of a DELETE statement may reference any column of that target table in the WHERE clause. A user with UPDATE privilege on the target table of an UPDATE statement may reference any column of that target in the WHERE clause or on the right hand side of any assignment in the SET clause of the UPDATE statement.

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


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