четверг, 19 апреля 2012 г.

Узнать права у логина на объекты MS SQL сервера

  Как-то дали учетной записи права на выборку из некоторых таблиц БД, учетная запись уже была в БД, но, как оказалось, эта учетная запись уже имела выборку на все таблицы БД, но откуда они шли  из графической оболочки Management Studio не сразу смогли вычислить – смотрел права на таблицы, на роль db_datareader и другие объекты, но как оказалось, права шли с прав на БД, а в графическом интерфейсе Management Studio просто забыли их посмотреть, в конце концов вычислил их через функции безопасности  ms sql server-а и решил законспектировать данный пункт, чтобы лучше запомнить.

  Итак, узнать права  учетной записи можно несколькими способами, приведу их примеры:

      1)В SQL Server Management Studio правая кнопка, вкладка «разрешение» . Это легко  и просто, но есть небольшие нюансы: нельзя узнать, имеет ли права на данный объект учетная запись, когда она входит в роли БД\сервера или  имеются  пересекающиеся права 
     
       2)  Второй способ , это через функции и процедуры ms sql server
Функция HAS_PERMS_BY_NAME предоставляет возможность получить ответ,  имеет ли права учетная запись на объект, за описанием синтаксиса пожалуйста в BOL, я лишь скажу о возвращаемом результате: 1 – пользователь имеет запрашиваемые права на указанный объект, 0 – нет, null –ошибка.
Пример:
EXECUTE AS USER = 'test_user';
SELECT HAS_PERMS_BY_NAME(null, 'database', 'update');
Резудьтат: 0
Т.е не имеем прав на Update на БД
Кстати, в примере запускаем проверку прав через  контекст выполнения другой учетной записи  с помощью EXECUTE AS USER = 'test_user';

Иначе проверка бы происходила для текущего пользователя, используйте команду revert для возврата контекста выполнения к первоначальному пользователю, пример:
EXECUTE AS USER = 'test_user' 
SELECT HAS_PERMS_BY_NAME(null, 'database', 'update');
Revert  --  используется для возврата контекста выполнения
SELECT HAS_PERMS_BY_NAME(null, 'database', 'update');
Результат
0
1
Т.е 1 пользователь не имее прав на обновление в БД, второй имеет права.
Вторая  функция, через которую можно получить список разрешения пользователя это функция  fn_my_permissions
Синтаксис её следующий:
fn_my_permissions ( securable , 'securable_class' )
Аргументы
securable
Имя защищаемого объекта. Если защищаемый объект — сервер или база данных, то это значение должно быть установлено в NULL. Аргумент securable — это скалярное выражение типа sysname. Аргумент securable может быть многочастным именем.
'securable_class'
Имя класса защищаемого объекта, для которого перечислены разрешения. Аргумент securable_class является типом sysname. Аргумент securable_class принимает одно из следующих значений: APPLICATION ROLE, ASSEMBLY, ASYMMETRIC KEY, CERTIFICATE, CONTRACT, DATABASE, FULLTEXT CATALOG, MESSAGE TYPE, OBJECT, REMOTE SERVICE BINDING, ROLE, ROUTE, SCHEMA, SERVICE, SYMMETRIC KEY, TYPE, USER, XML SCHEMA COLLECTION.
Пример выполнения:
EXECUTE AS USER = 'test_user' 
SELECT * FROM fn_my_permissions(NULL, 'DATABASE')
SELECT * FROM fn_my_permissions('table_1', 'object')
Revert
Результат:
entity_name  subentity_name   permission_name
database          CONNECT
database          SELECT
entity_name  subentity_name   permission_name
table_1                       SELECT
table_1                       UPDATE
table_1                       INSERT
table_1                       ALTER
table_1     id               SELECT
table_1     val              SELECT
table_1     id               UPDATE
table_1     val              UPDATE
Из него мы видим, что на объект БД учетная запись имеет права на коннект и на Select, т. е на выборку из любой таблицы данной БД.
Но, при выполнение  функции на таблицу этой же БД, учетная запись имеет еще  дополнительные права. 

Данные функции позволяют легко и сразу определить , если ли права на конкретный объект, не прибегая к испоьзованию графических сред, что очень удобно.
Более подробно описано в разделе «Функции Безопасности» BOL MS SQL Server.

P.S Использовал MS SQL 2008 R2.

Комментариев нет :

Отправить комментарий