|
По материалам статьи Amol Kulkarni: Ownership
Chains in Yukon Когда объекты базы данных последовательно обращаются друг к другу, такая последовательность называется "цепочкой". Хотя эти цепочки не существуют независимо, когда SQL Server рассматривает ссылки в цепочке, то он оценивает права пользователя на доступ к объектам иначе, чем если бы пользователь обращался к ним по отдельности. Эти различия имеют большое влияние на управление безопасностью. В этой статье мы рассмотрим, как работают цепочки владения в Yukon. Для демонстрации, мы используем троих пользователей (Mary, John и Scott) и рассмотрим три сценария. Четыре сценария Если хотите, можете выполнить следующий код в тестовой базе данных SQL Server. Этот код создает трех пользователей, которые нужны для нашего сценария.
Повторите вышеуказанный код для двух других пользователей: John и Scott. (замените в коде Mary на John, а потом на Scott). Сценарий I Неразорванная цепочка владения - это цепочка, в которой владелец вызываемого объекта также является владельцем всех объектов, на которые ссылается вызываемый объект. Например, Mary создает хранимую процедуру, которая ссылается на таблицу, владельцем которой также является Mary. Она дает права на выполнение хранимой процедуры другому пользователю, John. Когда John выполняет хранимую процедуру, SQL Server проверяет, что он имеет права на выполнение хранимой процедуры. Т.к. John имеет права на работу с хранимой процедурой, и т.к. хранимая процедура и таблица, на которую ссылается эта процедура, имеют общего владельца, то дополнительная проверка доступа не производится и команда выполняется. Другими словами, когда Mary дала John права на работу с хранимой процедурой, она косвенно дала ему права на работу с таблицей, на которую ссылается хранимая процедура (и которая также принадлежит Mary). 1. Подсоединитесь к серверу как Mary и создайте таблицу и хранимую процедуру.
2. Дайте John права на выполнение хранимой процедуры 'stud_sp'.
3. Теперь подсоединитесь к серверу как John и выполните хранимую процедуру 'stud_sp'.
Сценарий II John создает хранимую процедуру, которая ссылается на таблицу, которая ему не принадлежит, но он имеет права на выполнение SELECT из этой таблицы (владелец таблицы - Mary, и она дала John права на таблицу). John дает Scott права на выполнение хранимой процедуры. Когда Scott выполняет хранимую процедуру, SQL Server проверяет, что он имеет права на выполнение хранимой процедуры. Scott имеет такие права, но т.к. John не является владельцем таблицы, на которую ссылается процедура, то SQL Server проверяет, имеет ли Scott права на эту таблицу. Если нет, то выполнение хранимой процедуры прерывается. 1. Подсоединитесь к серверу как Mary и дайте John права доступа к таблице students.
2. Подсоединитесь к серверу как John и создайте хранимую процедуру 'stud_sp_john'.
3. Дайте Scott права на выполнение хранимой процедуры 'stud_sp_john'.
4. Теперь подсоединитесь к серверу как Scott и выполните хранимую процедуру.
На заметку: это не сработает из-за разорванной цепочки владения В Yukon хранимая процедура в сценариях 1 и 2 может также выглядеть следующим образом:
EXECUTE AS CALLER является значением по умолчанию (для обратной совместимости). Сценарий III Mary создает хранимую процедуру, которая ссылается на таблицу, владельцем которой Mary не является (владельцем таблицы является John, который дал Mary права на выборку данных из таблицы), но имеет права на выборку данных. Она указывает EXECUTE AS USER = Mary в команде CREATE PROCEDURE. Mary дает права на выполнение хранимой процедуры другому пользователю, Scott. Когда Scott выполняет хранимую процедуру, SQL Server проверяет, что он имеет права на выполнение хранимой процедуры; но при этом права на доступ к таблице, на которую ссылается процедура, проверяются у Mary. В этом сценарии, даже если Scott не имеет прямых прав на выборку данных из таблицы, он может получить доступ к данным через процедуру, т.к. Mary, в чьем контексте выполняется процедура, имеет доступ к таблице. 1. Подсоединитесь к серверу как Mary и создайте хранимую процедуру 'stud_sp_mary' с опцией "WITH EXECUTE AS USER = Mary".
2. Теперь дайте Scott права на выполнение 'stud_sp_mary'.
3. Подсоединитесь к серверу как Scott и выполните хранимую процедуру 'stud_sp_mary'
Сценарий IV EXECUTE AS SELF является сокращенным вариантом опции для текущего пользователя (того, который создает или изменяет процедуру), чтобы определить контекст, в котором этот пользователь хочет выполнять команды процедуры. EXECUTE AS SELF является эквивалентом AS USER = user_name (описано в предыдущем сценарии), где указанный в опции пользователь есть одновременно лицо, создающее или изменяющее процедуру. В каталоге на самом деле хранится ID пользователя, а не значение SELF. 1. Подсоединитесь к серверу как Mary и создайте хранимую процедуру 'stud_sp_mary' с опцией "WITH EXECUTE AS SELF".
2. Теперь дайте Scott права на выполнение 'stud_sp_mary'.
3. Подсоединитесь к серверу как Scott и выполните хранимую процедуру 'stud_sp_mary'
Заключение Используйте EXECUTE AS CALLER в следующих случаях:
Используйте EXECUTE AS USER = user_name в следующих случаях:
Используйте EXECUTE AS SELF в следующих случаях:
Amol Kulkarni - сотрудник Tata Consultancy Services (TCS), Hyderabad, India. |
Перевод: Виталия Степаненко 2004г. |