3274 УПРАВЛЕНИЕ ДОСТУПОМ К ДАННЫМ В INTERBASE

1. Теоретическая часть

1.1. Обзор привилегий доступа

Безопасность в языке SQL контролируется на уровне таблицы с помощью привилегий доступа – списка операций, которые пользователю разрешено выполнять над данной таблицей или над представлением, использующим данную таблицу. В табл.1 дается описание привилегий доступа.

 

Описание привилегий доступа                                                 Таблица 1

Привилегия

Уровень доступа

ALL

Выбор, вставка, обновление, удаление данных и ссылка внешнего ключа другой таблицы на первичный ключ данной таблицы

SELECT

Чтение данных

INSERT

Запись новых данных

UPDATE

Изменение существующих данных

DELETE

Удаление данных

EXECUTE

Выполнение или вызов хранимой процедуры

REFERENCES

Ссылка внешнего ключа другой таблицы на первичный ключ данной таблицы

имя_роли

Представляет все привилегии, переданные данной роли

Примечание. Зарезервированное слово ALL обеспечивает механизм для присвоения одновременно привилегий: SELECT, DELETE, INSERT, UPDATE и REFERENCES. При этом ALL не передает право на использование роли или привилегии EXECUTE на выполнение хранимой процедуры.

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

-       передача пользователям, триггерам, хранимым процедурам или представлениям: SELECT, INSERT, UPDATE, DELETE и REFERENCES привилегий доступа к таблице или представлению;

-       передача для роли: SELECT, INSERT, UPDATE, DELETE и REFERENCES привилегий доступа к таблице или представлению;

-       передача пользователям права использовать привилегии, переданные конкретной роли, т.е. при подключении к БД обладать привилегиями, определенными соответствующей ролью в БД;

-       передача пользователям, триггерам, хранимым процедурам или представлениям привилегии EXECUTE на выполнение хранимой процедуры.

При создании объектов БД задается уровень доступа к ним. Первоначально только создатель объекта БД имеет полный доступ к созданному объекту и только он может передать определенные привилегии доступа другим пользователям или хранимым процедурам. В то же время пользователь SYSDBA (системный администратор InterBase) имеет доступ ко всем, без исключения, объектам БД, даже к тем, создателем которых он не является. В связи с этим после установки сервера InterBase необходимо изменять стандартный пароль "masterkey", который имеет SYSDBA.

Для предоставления различных привилегий доступа к данным в языке SQL существует оператор GRANT, а для отмены предоставленных привилегий - оператор REVOKE.

1.2. Передача привилегий

1.2.1. Оператор GRANT

Синтаксис оператора GRANT представлен на рис.1.

 

GRANT {<привилегии> ON [TABLE] {имя_таблицы | имя_представления}

TO {<объект> | <список_пользователей>}}

| EXECUTE ON PROCEDURE имя_процедуры

TO {<объект> | <список_пользователей>}

| <роль_с_привилегиями>

TO {PUBLIC | <список_обладателей_привилегий>};

Рис.1. Синтаксис оператора GRANT

<привилегии> ::= {ALL [PRIVILEGES] | <список_привилегий>}

<список_привилегий> ::= SELECT

| DELETE

| INSERT

| UPDATE [(имя_столбца [, имя_столбца …])]

| REFERENCES [(имя_столбца [, имя_столбца …])]

[, <список_привилегий> …]

<объект> ::= PROCEDURE имя_процедуры

| TRIGGER имя_триггера

| VIEW имя_представления

| PUBLIC

[, <объект> …]

<список_пользователей> ::=

[USER] имя_пользователя | имя_роли

[, <список_пользователей> …]

[WITH GRANT OPTION]

<роль_с_привилегиями> ::= имя_роли [, имя_роли …]

<список_обладателей_привилегий> ::=

[USER] имя_пользователя [, [USER] имя_пользователя …]

[WITH ADMIN OPTION]

Зарезервированное слово PUBLIC означает, что указанные привилегии доступа к заданному объекту БД становятся общедоступными и невозможно отобрать эти привилегии у конкретного пользователя.

С целью иллюстрации возможных вариантов  использования оператора GRANT далее будут рассмотрены примеры передачи привилегий к различным объектам БД. Пусть на сервере с помощью утилиты InterBase Server Manager (которая будет рассмотрена далее) зарегистрированы два пользователя: IVANOV и PETROV. Имеется представление CLIENT_VIEW, хранимые процедуры FACTORIAL и FACTORIALSET, триггеры CLIENTS_INSERT и SALESPEOPLE_UPDATE, которые, как и все остальные объекты БД, созданы пользователем SYSDBA. Тогда, например, для передачи пользователю IVANOV всех привилегий доступа к таблице CLIENTS следует выполнить следующий оператор GRANT:

GRANT ALL ON CLIENTS TO IVANOV;

для передачи привилегии SELECT на представление CLIENT_VIEW пользователю PETROV:

GRANT SELECT ON CLIENT_VIEW TO PETROV;

для передачи в общее пользование права обновлять столбцы SNAME и COMM таблицы SALESPEOPLE:

GRANT UPDATE(SNAME, COMM) ON SALESPEOPLE TO PUBLIC;.

Аналогично производится передача привилегий хранимым процедурам или триггерам для доступа к таблице или представлению, которые имеют другого владельца. Например, чтобы передать хранимой процедуре FACTORIAL и триггеру SALESPEOPLE_UPDATE все привилегии на таблицу SALESPEOPLE, необходимо использовать следующий оператор GRANT:

GRANT ALL ON SALESPEOPLE TO

PROCEDURE FACTORIAL, TRIGGER SALESPEOPLE_UPDATE;.

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

GRANT ALL ON ORDERS TO IVANOV, PETROV;.

Зарезервированное слово WITH GRANT OPTION используется для передачи пользователю права передавать привилегии другим пользователям. Например, чтобы передать пользователю IVANOV привилегию чтения таблицы SALESPEOPLE с правом передавать эту привилегию другим пользователям, необходимо использовать следующий оператор GRANT:

GRANT SELECT ON TABLE SALESPEOPLE TO IVANOV

WITH GRANT OPTION;.

1.2.2. Использование ролей для передачи привилегий

Процесс управления доступом пользователей к различным объектам БД можно представить следующим образом. SYSDBA с помощью оператора GRANT передает привилегии определенным пользователям в соответствии с требуемым уровнем доступа к данным. В реальной БД такая политика предоставления привилегий оказывается очень громоздкой. Например, необходимо пользователям 1, 2 и 3 в различные моменты времени передать привилегию SELECT на таблицу А и привилегию DELETE на таблицу В (рис.2). В этом случае может потребоваться выполнить шесть операторов GRANT.

 

 

 

 

 

 

 

 

 

Рис.2. Пример последовательной передачи привилегий

Привилегии SELECT и DELETE (в данном случае) можно объединить в таком объекте БД, как роль. Роль представляет собой метод обеспечения безопасности на уровне групп привилегий, а не на уровне объектов БД. Роль также можно представить как объект БД, концентрирующий в себе определенные привилегии доступа к различным объектам БД. На рис.3 представлена иллюстрация предыдущего примера при использовании роли.

 

 

 

 

 

 

 

 

Рис.3. Пример передачи привилегий при использовании роли

Таким образом, сконцентрировав в конкретной роли произвольный набор привилегий, достаточно лишь передать пользователю право использовать ту или иную роль. Роль создается оператором CREATE ROLE, а удаляется оператором DROP ROLE. На рис.4 представлен синтаксис операторов CREATE ROLE и DROP ROLE.

 

CREATE  ROLE  имя_роли;

DROP  ROLE  имя_роли;

Рис.4. Синтаксис операторов CREATE ROLE и DROP ROLE

Алгоритм использования роли состоит из следующих этапов.

1. Создание роли оператором CREATE ROLE.

2. Присвоение этой роли одной или более привилегий с помощью оператора GRANT:  GRANT <привилегии> TO имя_роли;

3. Передача права на использование этой роли одному или более пользователю:

GRANT <роль_с_привилегиями>

TO <список_обладателей_привилегий>;.

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

4. При подключении к БД пользователь, который обладает какой-либо ролью, должен указать имя этой роли в поле Role диалога Database Connect утилиты WISQL.

Например, чтобы передать пользователю PETROV привилегии SELECT, INSERT и DELETE соответственно на таблицы SALESPEOPLE, CLIENTS и ORDERS, используя роль PETROV_ROLE, концентрирующую в себе перечисленные выше привилегии доступа, необходимо применить следующие SQL операторы:

CREATE ROLE PETROV_ROLE;

GRANT SELECT ON SALESPEOPLE TO PETROV_ROLE;

GRANT INSERT ON CLIENTS TO PETROV_ROLE;

GRANT DELETE ON ORDERS TO PETROV_ROLE;

GRANT PETROV_ROLE TO PETROV;.

Для передачи пользователю PETROV права на передачу роли PETROV_ROLE другим пользователям необходимо использовать следующий оператор GRANT:

GRANT PETROV_ROLE TO PETROV WITH ADMIN OPTION;.

Чтобы удалить привилегии, переданные какой-либо роли, можно использовать оператор REVOKE или просто удалить соответствующую роль со всеми ее привилегиями:

DROP ROLE PETROV_ROLE;.