Базы данных Oracle - статьи

гаджет корзина для 7          

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


Итак, если мы применяем политику секретности к таблице и указываем при этом режим 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, не сводящееся к выбору какой-нибудь одной из них.



    Проверка действия привилегии 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, не сводящееся к выбору какой-нибудь одной из них.


    Содержание раздела