Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Обучение от Mail.Ru Group.
Онлайн-университет
для программистов с
гарантией трудоустройства.
Набор открыт!
2005 г.

Изучаем метки доступа к строкам: специальные привилегии для избранных

Владимир Пржиялковский,
Преподаватель технологий Oracle
www.ccas.ru/prz/
 
"Тараканы прибегали,
Все стаканы выпивали,
А букашки -
По три чашки
С молоком
И крендельком ... "
Корней Чуковский,
«Муха-Цокотуха»

Аннотация

Эта статья является непосредственным продолжением статьи «Изучаем метки доступа к строкам: задание свойств столбца доступа в таблице», и рассматривает некоторые дополнительные свойства средства Label Security в Oracle, соответствующие мандатному доступу. Именно, показана возможность преодолевать в индивидуальном порядке запреты на изменения меток, сформулированные для групп доступа.

Подразумеваемые в статье состояние базы и сценарные файлы соответствуют концу предыдущей статьи.

Персональные привилегии для избранных пользователей

Изменение метки в качестве исключения из правила

Итак, если мы применяем политику секретности к таблице и указываем при этом режим LABEL_UPDATE использования меток, обычные пользователи теряют возможность эти метки конкретных строк изменять. Однако для каких-то пользователей Label Security позволяет сделать исключение. Для этого используются специальные привилегии. В отличие от традиционных привилегий Oracle (системных и объектных) они носят не разрешающий характер (a priori ничего делать нельзя, а все, что можно, специально разрешено привилегиями), а характер преодоления явно указанного запрета (определенные действия явно запрещены, но в виде исключения допускаются); именно для них и естественно сказать: "привилегии", в то время как для традиционных "привилегий" просится более подходящее слово "полномочия". Вот их названия:

  • WRITEUP,
  • WRITEDOWN,
  • WRITEACROSS.

Выдаются они не командой GRANT, а с помощью специальной процедуры SET_USER_PRIVS из пакета SA_USER_ADMIN. Это к сожалению, но отчасти разработчиков можно понять: эти привилегии даются пользователям в рамках конкретных политик, коих может иметься много.

Подготовим файл userprivilege.sql:

CONNECT lbacsys/lbacsys

BEGIN
SA_USER_ADMIN.SET_USER_PRIVS 
(
  POLICY_NAME => 'empsec_policy'
, USER_NAME   => '&1'
, PRIVILEGES  => '&2'
);
END;
/

Выдадим привилегию WRITEUP и понаблюдаем, как изменятся возможности пользователя HEAD по изменению значений меток при наличии у таблицы PHONE режима LABEL_UPDATE их использования:

SQL> @userprivilege head 'writeup'
Connected.

PL/SQL procedure successfully completed.

SQL> CONNECT head/head 
Connected.
SQL> @updateallen OPEN

1 row updated.

SQL> @updateallen LIMITED

1 row updated.

SQL> @updateallen OPEN
UPDATE scott.phone
*
ERROR at line 1:
ORA-12406: unauthorized SQL statement for policy EMPSEC_POLICY
... ... ... ...

Привилегия WRITEUP, выданная пользователю HEAD, позволяет сделать для него исключение и «играть на повышение».

Выдадим:

@userprivilege head 'writedown'

Проверка действия привилегии WRITEDOWN:

SQL> CONNECT head/head 
Connected.
SQL> @updateallen LIMITED

1 row updated.

SQL> @updateallen OPEN

1 row updated.

SQL> @updateallen LIMITED
UPDATE scott.phone
*
ERROR at line 1:
ORA-12406: unauthorized SQL statement for policy EMPSEC_POLICY
... ... ... ...

Пользователь HEAD в виде исключения получил право понижать секретность, но не повышать.

Выдадим:

@userprivilege head 'writeacross'

Проверка действия привилегии WRITEACROSS:

SQL> CONNECT head/head 
Connected.
SQL> @updateallen LIMITED

1 row updated.

SQL> @updateallen OPEN

1 row updated.

SQL> @updateallen LIMITED

1 row updated.

В отличие от своих возможных коллег по доступу к ограниченной информации, пользователь HEAD теперь может как повышать, так и понижать секретность строки.

Следующий запрос позволяет проверить наличие привилегий преодоления запрета изменять метки:

SQL> COLUMN USER_NAME FORMAT A15
SQL> COLUMN USER_PRIVILEGES FORMAT A20
SQL> SELECT * FROM DBA_SA_USER_PRIVS;

USER_NAME       POLICY_NAME                    USER_PRIVILEGES
--------------- ------------------------------ --------------------
HEAD            EMPSEC_POLICY                  WRITEACROSS

Для того, чтобы изъять у пользователя привилегию, потребуется не выдать привычную команду REVOKE, а опустить значение (проставить NULL) в параметре PRIVILEGES процедуры SET_USER_PRIVS. Продолжим:

SQL> SAVE showprivs
Created file showprivs.sql

SQL> @userprivilege head ''
Connected.

PL/SQL procedure successfully completed.

SQL> @showprivs

no rows selected

SQL> CONNECT head/head 
Connected.
SQL> @updateallen LIMITED

1 row updated.

SQL> @updateallen OPEN
UPDATE scott.phone
*
ERROR at line 1:
ORA-12406: unauthorized SQL statement for policy EMPSEC_POLICY
... ... ... ...

Пользователь HEAD лишился возможности изменять метку - при наличии у таблицы режима LABEL_UPDATE работы с метками.

В нашем примере WRITEACROSS, казалось бы, заменяет WRITEUP + WRITEDOWN, но в общем случае (например, при структурной метке) все три привилегии самодостаточны. В общем случае возможно и приобретает смысл комбинирование привилегий WRITEUP, WRITEDOWN и WRITEACROSS, не сводящееся к выбору какой-нибудь одной из них.

Другие привилегии

Помимо трех указанных привилегий, связанных с запретом LABEL_UPDATE использования меток, имеются и некоторые прочие:

  • READ,
  • FULL,
  • COMPACCESS,
  • PROFILE_ACCESS.

Ограничимся здесь анализом первой из них. Остальные окажут эффект только при более сложной организации доступа, здесь не рассматриваемой, например, при наличии структурных меток.

Привилегия READ дает возможность ее обладателю преодолеть запрет на чтение строк со стороны действующей политики. Продолжим:

SQL> CONNECT employee/employee
Connected.
SQL> @phones

ENAME      PNO
---------- --------------------
ALLEN
WARD       610-1718
MARTIN     103-1983
BLAKE
CLARK
KING
TURNER     293-1398
JAMES      932-6728
MILLER     865-6706

9 rows selected.

SQL> @userprivilege employee 'read'
Connected.

PL/SQL procedure successfully completed.

SQL> @showprivs

USER_NAME       POLICY_NAME                    USER_PRIVILEGES
--------------- ------------------------------ --------------------
EMPLOYEE        EMPSEC_POLICY                  READ
HEAD            EMPSEC_POLICY                  WRITEACROSS

SQL> CONNECT employee/employee
Connected.
SQL> @phones

ENAME      PNO
---------- --------------------
SMITH      665-7282
ALLEN      882-3154
WARD       610-1718
JONES      100-6539
MARTIN     103-1983
BLAKE      193-3112
CLARK      310-2673
SCOTT      680-4853
KING       542-6672
TURNER     293-1398
ADAMS      278-5105
JAMES      932-6728
FORD       485-9127
MILLER     865-6706

14 rows selected.

Название привилегии READ не должно вызывать иллюзий: в нашем случае она позволяет не только читать строки, включая поле метки, но и изменять. Для доказательства этого факта продолжим (от имени EMPLOYEE):

SQL> @updateallen OPEN

1 row updated.

SQL> @updateallen LIMITED

1 row updated.

Новости мира IT:

Архив новостей

Последние комментарии:

Loading

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 985 1945361
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2015 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...