|
Программирование >> Программирование баз данных
Допускается возможность применять по мере необходимости различные комбинации и сочетания этих прав применительно к конкретной таблице, представлению или хранимой процедуре, на которые назначаются права. Права, перечисленные в табл. 22.5, могут быть назначены в программе Enterprise Manager. Для этого достаточно перейти к элементу Logins узла Security конкретного сервера, щелкнуть правой кнопкой мыши на имени пользователя и выбрать команду Properties. В зависимости от того, развернута ли база данных или узел Security, будут открываться разные диалоговые окна, но в любом случае появится возможность задавать права доступа. Для назначения прав с использованием языка T-SQL служат три команды, которые следует знать, даже если вы намереваетесь назначать права только с помощью программы Enterprise Manager. Описание этих команд приведено ниже; при этом применяется такая же терминология, как и выше. Команда grant Команда GRANT предоставляет указанному пользователю или роли определенные права доступа на объект, который задан в команде GRANT. Синтаксис оператора GRANT выглядит следующим образом: GRANT ALL [PRIVILEGES] <permission>[,...n] ON <table or view name>[{<column name>[,...n])] I<stored or extended stored procedure name> TO <login or role name>[,...n] [WITH GRANT OPTION] [AS <role name>l Ключевое слово ALL указывает на то, что следует предоставить пользователю все права, применимые для объекта данного типа (причем право EXECUTE никогда не применяется к таблице). Если ключевое слово ALL не используется, то необходимо задать одно или несколько конкретных прав доступа, предоставляемых пользователю применительно к данному объекту. Ключевое слово PRIVILEGES введено в последней версии и не имеет какого-либо реального назначения, кроме обеспечения совместимости со стандартом ANSI-92. Ключевое слово ON служит меткой-заполнителем и указывает на то, что за ним следует объект, на который должны быть предоставлены права доступа. При предоставлении прав доступа к таблице можно задавать разрешения вплоть до уровня столбцов, указывая список столбцов, на которые распространяется действие оператора GRANT; если же конкретные столбцы не заданы, то предполагается, что этот оператор затрагивает все столбцы. Создается впечатление, что специалисты корпорации Microsoft намереваются пересмотреть свое решение, касающееся предоставления прав доступа на уровне столбца. Безусловно, на первый взгляд кажется, что возможность регламентации прав пользователя на выполнение операторов SELECT применительно пюлько к определенным столбцам конкретной таблицы является весьма привлекательной, но фактически реализация такой возможности приводит не только к усложнению процедур обеспечения безопасности, но и требует дополнительной работы от корпорации Microsoft. Поэтому, изучая новейшую литературу по этой теме и анализируя сказанное представителями корпорации, автор пришел к выводу, что Microsoft намерена отказаться от идеи регламентации доступа на уровне столбца. В частности, уже опубликованы рекомендации не использовать эти средства, а если требуется предоставить пользователю возможность просматривать лишь конкретные столбцы, применять вместо этого представления. Ключевое слово ТО позволяет указать, кому должны быть предоставлены определенные права доступа. Вместе с этим ключевым словом может быть задана учетная запись или имя роли. Ключевое слово WITH GRANT OPTION дает возможность пользователю, которому предоставлен доступ, предоставлять доступ другим пользователям. Автор не рекомендует использовать эту опцию, поскольку может очень быстро сложиться такая ситуация, в которой будет сложно проследить, кто кому предоставил доступ и к каким объектам. Безусловно, всегда остается возможность открыть программу Management Studio и ознакомиться с тем, кто имеет права доступа к тому или иному объекту, но это равносильно оборонительному, а не наступательному поведению, поскольку приходится разбираться в том, кто неправильно использует предоставленный ему уровень доступа, а не предотвращать заранее возможность получения нежелательного доступа. На последнем месте в синтаксическом определении оператора GRANT находится ключевое слово AS, но это не означает, что оно не имеет важного значения. Данное ключевое слово применяется в тех случаях, когда рассматриваемая учетная запись принадлежит к нескольким ролям. Теперь мы можем приступить к конкретным действиям и рассмотреть несколько примеров. Как будет показано ниже, созданная ранее учетная запись Test Ас count уже обладает некоторыми правами доступа в силу того, что является членом роли Public; этой роли принадлежат все пользователи базы данных, и такую принадлежность невозможно исключить. Тем не менее количество объектов, к которым учетная запись TestAccount не имеет доступа, весьма велико (поскольку Public- единственная роль, к которой она принадлежит, а Public не имеет никаких прав). Прежде всего зарегистрируйтесь в качестве пользователя TestAccount. После этого попытайтесь выполнить оператор SELECT применительно к таблице Region: SELECT * FROM Region СУБД SQL Server сразу же выведет сообщение о том, что пользователем предпринята попытка обратиться к недоступному для него объекту: Server: Msg 229, Level 14, State 5, Line 1 SELECT permission denied on object Region, database NorthwindSecure, owner dbo. Зарегистрируйтесь отдельно в качестве пользователя sa; при желании такую регистрацию можно провести в том же экземпляре окна Query Analyzer, выбрав команду меню File=>Connect. Затем выберите режим обеспечения безопасности SQL Server для нового соединения и зарегистрируйтесь как пользователь sa, указав соответствующий пароль. После этого вызовите на выполнение оператор GRANT: USE NorthwindSecure GRANT SELECT ON Region TO [ARISTOTLE\TestAccount] Теперь переключитесь на соединение TestAccount (напомним, что информация о том, какой пользователь работает в данном соединении, приведена в строке заголовка окна соединения) и попытайтесь снова выполнить тот же оператор SELECT. На этот раз будут получены более приемлемые результаты: RegionID RegionDescription 1 Eastern 2 Western 3 Northern 4 Southern (4 row(s) affected) Предпримем еще одну попытку. В данном случае выполним те же проверки и команды применительно к таблице EmployeeTerritories: SELECT * FROM EmployeeTerritories И в этом случае попытка окончится неудачей, поскольку пользователь TestAccount не имеет прав доступа к этой таблице, поэтому предоставим ему необходимые права: USE NorthwindSecure GRANT SELECT ON EmployeeTerritories TO [ARISTOrLE\TestAccount] После повторного вызова на выполнение оператора SELECT будут получены требуемые результаты: EmployeelD TerritorylD 1 06897 1 19713 9 48304 9 55113 9 55439 (49 row(s) affected) Чтобы немного усложнить задачу, попытаемся применить к этой таблице оператор INSERT: INSERT INTO EmployeeTerritories VALUES (1, 01581) В СУБД SQL Server сразу же будет сформировано сообщение об ошибке, поскольку отсутствуют требуемые разрешения, поэтому предоставим их пользователю TestAccount (с помощью соединения, в котором работает пользователь sa): USE NorthwindSecure GRANT INSERT ON EmployeeTerritories TO [ARISTOTLE\TestAccount] Теперь снова попытаемся выполнить оператор INSERT: INSERT INTO EmployeeTerritories VALUES (1, 01581) Ha этот раз результаты становятся вполне приемлемыми. Команда deny Команда DENY позволяет явно запретить пользователю применение указанных прав доступа к определенному объекту. Основная особенность операторов DENY состоит в том, что они отменяют права, назначаемые с помощью операторов GRANT. Дело в том, что пользователь может принадлежать к нескольким ролям (о чем будет сказано ниже), поэтому не исключено, что в одних ролях пользователь будет иметь права доступа, а в других на его права также будет распространяться действие оператора DENY. В тех условиях, когда пользователю назначены определенные права отдельно или в составе роли с помощью операторов GRANT и в то же время действует за-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |