Детальний контроль доступу і контексти додатки. Частина 4

Частина 3


Тепер приєднаємося різними користувачами і протестуємо функціональність програми.



SQL> @rls_adams

SQL> – приєднався як службовець, у якого немає здатності керувати.

SQL> connect rls_adams/rls_adams
Connected.

SQL> set serveroutput on

SQL> – Спочатку спробуємо стати менеджером
SQL> – Ми не є менеджером, тому стати їм
SQL> – не дозволяється
SQL> exec rls.set_role( “mgr” )
BEGIN rls.set_role( “mgr” ); END;

*
ERROR at line 1:
ORA-20002: Ви не менеджер
ORA-06512: at “RLS.SET_ROLE”, line 53
ORA-06512: at line 1

Таким чином, результат показує, що не можна отримати роль, не призначену для поточного користувача. Щоб переконатися, що ні до яких даними, немає доступу, спробуємо тепер запитати що-небудь, і подивимося, що відбудеться:


SQL> – тепер подивимося, що відбудеться при спробі виконати
SQL> – що-небудь без отримання ролі

SQL> exec rls.hr_app.listEmps
—— КонтекстСессіі ———-
HR_APP_CTX.EMPNO = 7876
—— Дані таблиці Emp, які можна побачити —–
BEGIN rls.hr_app.listEmps; END;

*
ERROR at line 1:
ORA-28112: помилка при виконанні функції політики
ORA-06512: at “RLS.HR_APP”, line 18
ORA-06512: at line 1

З'явилося повідомлення про помилку. Це повідомлення виникло, тому що так написана предикатну функція:


function select_function( p_schema in varchar2,
                         p_object in varchar2 ) return varchar2

is
begin

    if ( g_sel_pred is NULL )
   then

        if ( sys_context( g_app_ctx, “RoleName” ) = “EMP” )
        then
           …
        elsif ( sys_context( g_app_ctx, “RoleName” ) = “MGR” )
        then

elsif (sys_context (g_app_ctx, "RoleName") = "HR_REP")
        then

        else
raise_application_error (-20 005, "Рольнеустановлена");
       end if;
   end if;

    return g_sel_pred;
end;

Отриманий результат – це результат виконання raise_application_error в предикатной функції. Кінцевий користувач отримує повідомлення про помилку ORA-28112. Далі, в наступній секції, ми розглянемо, як виявити ці помилки і налагодити їх.


Далі встановимо таку роль, щоб можна було що-небудь зробити, і спробуємо виконати ці ж операції:



SQL> – Тепер встановимо коректну роль і виконаємо що-небудь

 SQL> exec rls.set_role( “emp” );
PL/SQL procedure successfully completed.

SQL> – подивимося контекст і дані,
SQL> – які можна бачити – це тільки один запис

SQL> exec rls.hr_app.listEmps
—— КонтекстСессіі ———-
HR_APP_CTX.ROLENAME = EMP
HR_APP_CTX.EMPNO = 7876
—— Дані таблиці Emp, які можна побачити —–
RLS_ADAMS,1100,RESEARCH

PL/SQL procedure successfully completed.

SQL> – незважаючи на те, що дані "видно" 
SQL> – їх не можна "змінити".

SQL> exec rls.hr_app.updateSal
0 rows updated

PL/SQL procedure successfully completed.

SQL> – не можна видалити ніяку інформацію

 SQL> exec rls.hr_app.deleteAll
0 rows deleted

PL/SQL procedure successfully completed.

SQL> – не можна нічого створити
SQL> exec rls.hr_app.insertNew(20)
BEGIN rls.hr_app.insertNew(20); END;
*
ERROR at line 1:
ORA-28115: порушення політики з опцією перевірки
ORA-06512: at “RLS.HR_APP”, line 44
ORA-06512: at line 1

Отже, результат показує, що можна бачити тільки ту запис, яка відповідає поточному користувачеві, не можна змінити які б то не було дані, не можна видалити записи, і вставка нового службовця також завершується невдало. Відбувається саме те, що й передбачалося. У самому додатку, HR_APP не робиться нічого спеціально для виконання цих правил, тепер це робить база даних.


Далі приєднаємось як MGR і подивимося, що відбудеться:



SQL> – приєднався як менеджер
SQL> connect rls_jones/rls_jones
Connected.

SQL> – Включимо можливість виводу на екран з PL / SQL
SQL> set serveroutput on

SQL> – Для початку спробуємо стати менеджером
SQL> – ми є менеджером, тому що на цей раз нам дозволено
SQL> – статті

SQL> exec rls.set_role( “mgr” )
PL/SQL procedure successfully completed.

SQL> – подивимося контекст і дані,
SQL> – які можна бачити. На цей раз – більше одного рядка.

SQL> exec rls.hr_app.listEmps
—— КонтекстСессіі ———-
HR_APP_CTX.ROLENAME = MGR
HR_APP_CTX.EMPNO = 7566
—— Дані таблиці Emp, які можна побачити —–
RLS_SMITH,800,RESEARCH
RLS_JONES,2975,RESEARCH
RLS_SCOTT,3000,RESEARCH
RLS_ADAMS,1100,RESEARCH
RLS_FORD,3000,RESEARCH

PL/SQL procedure successfully completed.

SQL> – Наступна операція показує, що деякі записи можна 
SQL> – змінити. Потім знову виконаємо listEmps для того, щоб побачити,
SQL> – які рядки змінилися (тільки ті, які підпорядковані напряму)

SQL> exec rls.hr_app.updateSal
2 rows updated

 PL/SQL procedure successfully completed.

 SQL> exec rls.hr_app.listEmps
—— КонтекстСессіі ———-
HR_APP_CTX.ROLENAME = MGR
HR_APP_CTX.EMPNO = 7566
—— Дані таблиці Emp, які можна побачити —–
RLS_SMITH,800,RESEARCH
RLS_JONES,2975,RESEARCH
RLS_SCOTT,9999,RESEARCH
RLS_ADAMS,1100,RESEARCH
RLS_FORD,9999,RESEARCH

PL/SQL procedure successfully completed.

SQL> – так як ми не є контролером, то, 
SQL> – згідно заданими правилами, не можна нікого видалити

SQL> exec rls.hr_app.deleteAll
0 rows deleted

PL/SQL procedure successfully completed.

SQL> – так як ми не є контролером, то, 
SQL> – згідно заданими правилами, не можна нікого вставити
SQL> exec rls.hr_app.insertNew(20)
BEGIN rls.hr_app.insertNew(20); END;
*
ERROR at line 1:
ORA-28115: порушення політики з опцією перевірки
ORA-06512: at “RLS.HR_APP”, line 44
ORA-06512: at line 1

Таким чином, тепер нам, як MGR, можна:


І, нарешті, приєднаємося як контролер і подивимося на поведінку програми при роботі з цією роллю:



SQL> – приєднався як контролер
SQL> connect rls_king/rls_king
Connected.

SQL> – Підключимо можливість виводу на екран з PL / SQL
SQL> set serveroutput on

SQL> – Для початку, спробуємо стати контролером
SQL> – Тепер ми є контролером, так як
SQL> – стати їм дозволено

SQL> exec rls.set_role( “hr_rep” )
PL/SQL procedure successfully completed.

SQL> – подивимося контекст і дані,
SQL> – які можна бачити. На цей раз видно всі рядки, так як
SQL> – користувач – контолер.

SQL> exec rls.hr_app.listEmps
—— КонтекстСессіі ———-
HR_APP_CTX.ROLENAME = HR_REP
HR_APP_CTX.EMPNO = 7839
—— Дані таблиці Emp, які можна побачити —–
RLS_CLARK,2450,ACCOUNTING
RLS_KING,5000,ACCOUNTING
RLS_MILLER,1300,ACCOUNTING
RLS_SMITH,800,RESEARCH
RLS_JONES,2975,RESEARCH
RLS_SCOTT,9999,RESEARCH
RLS_ADAMS,1100,RESEARCH
RLS_FORD,9999,RESEARCH
RLS_ALLEN,1600,SALES
RLS_WARD,1250,SALES
RLS_MARTIN,1250,SALES
RLS_BLAKE,2850,SALES
RLS_TURNER,1500,SALES
RLS_JAMES,950,SALES

PL/SQL procedure successfully completed.

SQL> – наступна операція показує, що можна змінити будь-який запис
SQL> – у кожному відділі, так як користувач для всіх
SQL> – є контролером
SQL> – далі знову запустимо listEmps, щоб побачити, які
SQL> – рядки змінилися (всі)

SQL> exec rls.hr_app.updateSal
14 rows updated

PL/SQL procedure successfully completed.

SQL> – так як користувач – контролер, то він може
SQL> – видалити кого-небудь згідно заданими правилами
SQL> – При видаленні ВСІХ не видаляється "я",
SQL> – тобто поточний користувач

SQL> exec rls.hr_app.deleteAll
13 rows deleted

PL/SQL procedure successfully completed.

SQL> – так як користувач – контролер, то він може 
SQL> – вставити кого-небудь згідно заданими правилами

SQL> exec rls.hr_app.insertNew(20)
PL/SQL procedure successfully completed.

SQL> – подивимося на результат зміни, видалення
SQL> – і наступної вставки

SQL> exec rls.hr_app.listEmps
—— КонтекстСессіі ———-
HR_APP_CTX.ROLENAME = HR_REP
HR_APP_CTX.EMPNO = 7839
—— Дані таблиці Emp, які можна побачити —–
RLS_KING,9999,ACCOUNTING
,1111,RESEARCH
PL/SQL procedure successfully completed.

На цьому завершується тестування трьох ролей розглянутого прикладу. Всі вимоги задоволені – безпека даних забезпечена, і вони стали прозорими для програми.


Обробка помилок і налагодження


Під час створення вищеописаного програми я натрапив на деякі помилки і повинен був його налагоджувати. Так як детальний контроль доступу працює на сервері, то при виявленні помилок та налагодження програми можуть виникнути складності. Наступний розділ допоможе успішній налагодженні і виявлення помилок.


Під час розробки процедур детального контролю доступу можуть з'явитися чотири основних коду помилок Oracle:


При написанні предикатних функцій я часто користуюся однією утилітою – це пакет 'debug'. Цей пакет, автором якого є Крістофер Бек (Christopher Beck) з Oracle, дозволяє вставити в код пропозиції команду 'print'. Крім того, цей пакет дозволяє широко використовувати пропозиції типу:



create function foo …
as
   …
begin
debug.f ('Входвпроцедуру foo');
     if ( some_condition ) then
         l_predicate := ‘x=1’;
     end if; 

debug.f ('Переходквозвратупредіката "% s"', l_predicate);
     return l_predicate;
end;

Таким чином, робота процедури debug.f схожа на с-функцію printf, а сама вона використовує пакет UTL_FILE. На сервері бази даних вона створює керовані програмістом файли трасування. Файли трасування містять налагодження пропозиції, які можна використовувати для перегляду виконаних дій при виконанні коду. Так як програмний код знаходиться в ядрі бази даних, налагодження може виявитися складною. Наявність файлів трасування може заощадити багато часу. Скрипти, які можна завантажити (див. далі в цьому ж розділі) містять налагоджувальний пакет і коментарі з його встановлення і використання.


"За" і "Проти"


Існує багато за цю можливість і зовсім небагато проти. Фактично, важко взагалі знайти хоча одне проти цієї можливості. Як би там не було, вони перераховані нижче:





















За

Проти


Спрощує розробку програми – Переносить управління доступом з програми на рівень даних.



Налагодження може виявитися складним, так як детальний контроль доступу здійснюється у фоновому режимі. Для цієї мети більше підходять пакети типу 'debug', про які йде мова в секції діагностики і налагодження.


Гарантує повний захист інформації бази даних. Незалежно від засобу доступу до даних, гарантується, що політика безпеки підключена і не може бути проігнорована.



Допускає значні зміни політики безпеки без впливу на клієнтські програми.



Спрощує керування об'єктами бази даних. Зменшується загальна кількість об'єктів бази даних, необхідних для підтримки програми.



Добре працює. Використання контекстів додатка дозволяє скористатися перевагами розділяється SQL.



Скрипти


Для того, щоб отримати всі скрипти, які використовуються в цій статті, завантажте tar-файл. Будь ласка, неодмінно прочитайте файл README.TXT, що входить до складу архіву. Tar-файл можна відкрити під Windows за допомогою WinZip версії 6.0 і вище.


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*