(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Детальный контроль доступа и контексты приложения. Часть 1

Источник: Oracle Magazine RE
Том Кайт

Введение

В этой статье рассмотрены два новых механизма Oracle8i: детальный контроль доступа (Fine Grained Access Control) и контексты защищенных приложений (Secure Application Contexts). При совместном использовании они обеспечивают новые качественные возможности для обеспечения информационной безопасности базы данных.

Как и в других статьях этого цикла, в этом опусе будут рассмотрены:

В различных изданиях детальный контроль доступа может быть назван по-разному. Ниже перечислены его синонимы:
  • Детальный контроль доступа (Fine Grained Access Control - техническое название)
  • Виртуальная частная база данных (Virtual Private Database - рыночное название)
  • Безопасность на уровне строк (Row Level Security - техническое название, идущее от того, что эту возможность реализуют PL/SQL-пакеты)

В двух словах, детальный контроль доступа в Oracle8i - это возможность во время работы динамически присоединить предикат (предложения where) как к одному, так и ко всем запросам к таблице или представлению. Таким образом, появилась возможность процедурной модификации запроса в процессе выполнения. Можно вычислить, кто выполняет запрос, откуда запрос выполняется, когда началось выполнение запроса, и сформировать предикат, соответствующий этим критериям. При использовании Контекстов Приложения можно незаметно через окружение (например, через роль, назначенную пользователю приложения) добавить дополнительную информацию, и получить доступ к ней через процедуру или предикат.

Примером детального контроля доступа может служить политика безопасности, которая определяет, какие строки могут быть доступны различным группам пользователей. Политика безопасности формирует предикат, вид которого зависит от соединенного с базой пользователя и группы, к которой он относится. Детальный контроль доступа позволяет при вводе запроса "select * from emp" различными пользователями преобразовать его к следующему виду:

Пользователь

Запрос динамически переписывается в

Замечания

Служащий

select * 
from ( select *
         from emp
        where ename = USER )
 

Служащие могут видеть только свои записи

Менеджер

select * 
  from ( select *
           from emp
          where mgr = ( select empno
                          from emp
                         where ename = USER )
             or ename = USER )
 

Менеджеры могут видеть свои записи и записи тех, кто работает под их руководством.

Контролер

select * 
  from (select *
          from emp
         where deptno =
             SYS_CONTEXT( ‘OurApp’, ‘Deptno’ ) )
 

Контролер может видеть любого в заданном отделе. Этот пример знакомит с синтаксисом получения переменных контекста приложения - встроенной функцией SYS_CONTEXT().

Почему используется эта возможность

Есть много причин, чтобы использовать этот механизм. Наиболее распространенные из них:

  • Легко поддерживается. Детальный контроль доступа позволяет иметь только одну таблицу и одну хранимую управляющую процедуру, которые заменят использование множества представлений. Создание множества представлений обычно приводит к увеличению числа объектов базы данных, так как для каждой группы пользователей требуется создание отдельного представления. Например, в описанном выше примере со служащими, менеджерами и контролерами в обычной системе необходимо создать 3 представления базы данных. Если потребуется еще одна группа пользователей, то придется добавить еще один набор представлений, которым надо будет управлять и поддерживать. Если политика безопасности изменится (то есть, потребуется, чтобы менеджеры видели не только своих непосредственных подчиненных, но и на 2 уровня ниже), необходимо будет пересоздать представления базы данных, после чего все объекты, ссылающихся на эти представления, станут недействительными.
  • Осуществляется на сервере. Учитывая сложность управления и поддержки большого количества представлений, разработчики раз за разом стремятся закладывать логику приложения в самое приложение. Приложения просматривают, кто присоединен к базе данных, что он запрашивает, и выполняют соответствующий запрос. Это защищает данные, но только тогда, когда доступ к ним осуществляется через данное приложение. Это снижает возможность использования средств выполнения запросов и генерации отчетов, а также других средств обработки данных. Повышается также вероятность получения искаженных данных, так как для того, чтобы сделать искажение, достаточно подключиться к базе данных через любое другое средство, отличное от рассматриваемого приложения, и запросить данные. Благодаря же включению в базу данных логики безопасности, то есть механизма, который определяет, какие данные может видеть пользователь, - вы можете быть уверены, что данные будут защищены независимо от используемого средства доступа к ним, и обращение можно осуществлять с помощью любого средства, из которого возможен доступ к данным.
  • Запрет на соединение с базой данных от имени обобщенных пользователей. Благодаря детальному контролю доступа каждый пользователь должен соединяться с базой данных под своим именем. В этом случае обеспечивается полная подотчетность - можно отслеживать действия на уровне пользователя. Раньше многие приложения при работе с различными представлениями данных для различных пользователей должны были применять обобщенных пользователей базы данных, соответственно выбираемым данным. Например, в вышеописанном случае служащий/менеджер/контролер в приложении должно быть создано три учетных записи. Каждый служащий должен использовать учетную запись "Служащий". Каждый менеджер должен использовать учетную запись "Менеджер". Каждый контролер должен использовать учетную запись "Контролер". Это делает невозможным учитывать действия на уровне истинных пользователей
  • Упрощение разработки приложения. Детальный контроль доступа забирает логику безопасности из логики приложения. Для поддержки безопасности данных разработчик приложения может сконцентрироваться на самом приложении, а не на логике низкоуровневого доступа к данным. Так как детальный контроль доступа полностью осуществляется на сервере, то приложения непосредственно наследуют эту логику. Раньше разработчики приложения должны были встраивать логику в приложение, делая приложение все более сложным, сначала для разработки и особенно сложным для его последующей поддержки. Если из приложения возможен доступ к данным, причем к одним и тем же данным и из нескольких точек приложения, то простейшее изменение политики безопасности может затронуть много дюжин модулей приложения. Благодаря применению детального контроля доступа , изменения в политике безопасности не влияют на модули приложения.
  • Применение развитых средств разработки приложения. Во многих средах политика безопасности по началу еще должным образом не определена и через некоторое время может измениться. Если происходит слияние компаний или другие структурные перемены или вводятся правила секретности, то политику безопасности необходимо изменить. Благодаря тому, что управление доступом осуществляется на уровне, близком к данным, можно создать условия для развития приложения с минимальным влиянием, и на него, и на средства разработки. Это является одной из причин для того, чтобы перейти к автоматическому использованию как новой логики, так и всех приложений и инструментов, позволяющих осуществлять доступ к базе данных со встроенной новой логикой.

Способы использования этой возможности

В Oracle8i существует два типа детального контроля доступа:

  • "Контекст" приложения. Это пространство имен с набором пар соответствующих параметров переменная/значение. Например, в контексте, называемом ‘OurApp’, можно получить доступ к переменным ‘DeptNo’, ‘Mgr’ и так далее. Контексты приложения всегда связываются с некоторым PL/SQL-пакетом. Единственный способ присваивания значений контекста - это вызов пакета. Например, для получения переменной ‘DeptNo’ и установки ее значения в контексте ‘OurApp’ необходимо вызвать специальный пакет, связанный с контекстом ‘OurApp’. Этот пакет гарантирует корректную установку значений контекста ‘OurApp’ (вы сами так написали, поэтому корректная установка контекста гарантируется). В этом случае предотвращается установка значений контекста приложения злоумышленниками, которые в противном случае могли бы получить доступ к той информации, доступа к которой у них быть не должно. Любой пользователь может читать значения контекста приложения, но установить их может только пакет.
  • Политика безопасности. Политика безопасности представляет собой просто функцию, построенную так, чтобы во время выполнения запроса она могла возвращать предикат для динамической фильтрации данных. Эта функция обычно использует значения контекста приложения для формирования и возврата корректного предиката (т.е. она просматривает, ‘кто’ присоединен к базе данных, ‘что’ он собирается сделать, и проверяет, есть ли у него привилегии для выполнения этих операций). Следует обратить внимание, что по отношению к пользователю SYS (или INTERNAL) никогда не используется политика безопасности, эти пользователи могут видеть все данные.

Для того, чтобы воспользоваться этой возможностью, разработчик, кроме стандартных ролей connect и resource, должен иметь следующие привилегии:

  • EXECUTE_CATALOG_ROLE. Позволяет разработчику выполнять функции и процедуры пакета dbms_rls. Другой вариант - можно, присоединившись как SYS, передать привилегию только на пакет: grant execute on dbms_rls to <учетная_запись>.
  • CREATE ANY CONTEXT: Позволяет разработчику создавать контексты приложения.

Контексты приложения создаются простой SQL-командой

SQL> create context OurApp using Our_Context_Pkg;

OurApp - это имя контекста, а Our_Context_Pkg - это PL/SQL-пакет, через который устанавливаются значения контекста. Возможность использования контекстов приложения для детального контроля доступа имеет большое значение по двум причинам:

  • Обеспечивается гарантированный способ установки переменных пространства имен. Устанавливать значения этого контекста может только PL/SQL-пакет, связанный с контекстом. В этом случае гарантируется целостность значений контекста. Так как контексты предназначены для ограничения или разрешения доступа к данным, целостность значений контекста должна быть обеспечена.
  • В SQL-запросе ссылки на значения контекста приложения трактуются как связанные переменные. Например, установка переменной ‘DeptNo’ контекста ‘OurApp’ и использование политики "deptno = SYS_CONTEXT(‘OurApp’,’DeptNo’)" для возврата условия where не повлияют на частоту использования разделяемого sql-предложения, так как ссылка SYS_CONTEXT подобна "deptno = :b1". Каждый может пользоваться значениями ‘Deptno’, но все будут повторно использовать один и тот же разобранный оптимизированный план запроса.

Пример 1. Реализация политики безопасности

Если требуется, чтобы политика безопасности позволяла пользователю, не являющемуся RLS_ADMIN, видеть только такие строки, "владельцем" которых он является, то необходимо выполнить команду:\

SQL> create function my_security_function( p_schema in varchar2,
  2     p_object in varchar2 ) return varchar2
  3  as
  4  begin
  5      if ( user = 'RLS_ADMIN' ) then
  6          return '';
  7      else
  8          return 'owner = USER';
  9      end if;
10  end;
11  /
Функция создана.

Предикат "where owner = USER" будет динамически добавляться ко всем запросам по таблице, с которой связана эта функция, что значительно уменьшает количество строк, доступных пользователю. Предикат NULL (пусто) возвращается только в том случае, когда на данный момент к базе данных присоединен пользователь RLS_ADMIN. Пустой возвращаемый предикат выглядит как "1=1" или "TRUE".

Для того, чтобы связать эту функцию с таблицей, необходимо использовать PL/SQL-процедуру "dbms_rls.add_policy". Например, имеется следующая таблица:

SQL> create table my_table
   2  (  data        varchar2(30),
   3     OWNER       varchar2(30) default USER
   4  )
   5  /
Table created.
SQL> grant all on my_table to public
   2  /
Grant succeeded.
SQL> insert into my_table ( data ) values ( 'Некоторыеданные' )
   2  /
1 row created.
SQL> insert into my_table ( data, owner )
   2  values ( 'Some Data Owned by SCOTT', 'SCOTT' )
   3  /
1 row created.
SQL> commit
   2  /
Commit complete.
SQL> select * from my_table
   2  /
DATA                             OWNER
------------------------------------- ------------
Некоторые данные                 RLS
Некоторые данные владелеца SCOTT SCOTT
 Политику "My_Security_Policy" следует подключать следующим образом:
SQL> begin
  2     dbms_rls.add_policy
  3     ( object_schema   => 'RLS',
  4       object_name     => 'MY_TABLE',
  5       policy_name     => 'MY_POLICY',
  6       function_schema => 'RLS',
  7       policy_function => 'My_Security_Function',
  8       statement_types => 'select, insert, update, delete' ,
  9       update_check    => TRUE );
 10  end;
 11  /
 PL/SQL procedure successfully completed.

Теперь все DML-предложения, относящиеся к таблице EMP, будут иметь предикат, возвращаемый связанной функцией my_security_function, независимо от источника, вызвавшего DML-операцию (т.е. независимо приложения, получающего доступ к данным). Посмотрим на это в действии:

SQL> connect rls/rls
Connected.
SQL> select * from my_table
  2  /
DATA                 OWNER
------------------------- ------------
Некоторые данные     RLS

Итак, полученный результат показывает, что строки отфильтрованы надлежащим образом - текущий пользователь RLS может видеть только свои строки - он является их владельцем. Строки, владельцем которых является SCOTT, стали невидимы. Присоединимся теперь как учетная запись RLS_ADMIN:

SQL> connect rls_admin/rls_admin
Connected.
SQL> select * from rls.my_table
   2  /
DATA                             OWNER
-------------------------------- ------------------
Некоторые данные                 RLS
Некоторые данные владельца SCOTT SCOTT

Результат показывает, что учетная запись RLS_ADMIN может видеть все данные, какие пожелает. Присоединимся опять учетной записью RLS и посмотрим, что произойдет при попытке создания данных, которые нельзя 'увидеть' (пользователь не являемся их владельцем):

SQL> connect rls/rls
Connected.
SQL> insert into my_table ( data ) values ( 'Некоторыеновыеданные' )
   2  /
1 row created.
SQL> insert into my_table ( data, owner )
   2  values ('Некоторые новые данные владельца SCOTT', 'SCOTT' )
   3  /
insert into my_table ( data, owner )
           *
ERROR at line 1:
ORA-28115: нарушение политики с опцией проверки
Ошибка ORA-28115 возникает, так как при добавлении политики было указано:

9       update_check    => TRUE );

по аналогии с созданием представления с включенной возможностью "CHECK OPTION". Такая политика позволяет создавать только те данные, которые можно выбрать. По умолчанию можно создавать данные, которые выбрать нельзя.

Часть 2



 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 11.01.2002 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Oracle Database Personal Edition Named User Plus License
Oracle Database Standard Edition 2 Processor License
Oracle Database Standard Edition 2 Named User Plus License
Oracle Database Personal Edition Named User Plus Software Update License & Support
Stimulsoft Reports.Ultimate Single License Includes one year subscription, source code
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Программирование на Visual С++
ЕRP-Форум. Творческие дискуссии о системах автоматизации
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100