Создание пользователя SQL Server с разрешением на чтение одного представления и ничего более - но он может видеть системные представления и процедуры? - PullRequest
6 голосов
/ 16 июля 2010

Моя компания наняла подрядчика для выполнения небольшого проекта для нас, для которого ему нужно выбрать данные из одного единственного представления в нашей основной базе данных (SQL Server 2005).

Я хотел создать для него заблокированный SQL Server логин с правами доступа только к SELECT из «его» представления ... и больше ничего.

Итак, я создал нового пользователя на сервере, а затем дал ему разрешение только на это одно представление:

grant select on SpecialView to SpecialUser;

По сути, это работает - он не видит ни наших таблиц и хранимых процедур, ни каких-либо представлений, кроме «своего».

Но:

  • он может получить доступ ко всем системным представлениям
  • он может получить доступ ко всем системным хранимым процедурам.

Видимо, его разрешения автоматически блокируются (sys.objects показывает только объекты, на которые у него есть разрешения, sp_who показывает только его собственные процессы и т. Д.).

Итак, мой вопрос:

Можно ли создать пользователя без доступа к системным представлениям и хранимым процедурам?
(и если да, что я делаю не так?)

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

EDIT:
kevchadders, пользователь не имеет доступа к master, model или msdb - только к базе данных с видом, который он должен видеть.

Но, чтобы прояснить одну вещь: системные представления / процессы, которые может видеть пользователь, находятся в базе данных, где "его" представление ... не в основной базе данных. Поэтому я не могу отключить весь его доступ, так как ему нужно выбрать одно представление в той же базе данных.
Суть в том, что даже если я явно установлю разрешение только для единственного представления, которое он должен видеть, почему он все еще видит также системные представления / процессы?

Ответы [ 3 ]

2 голосов
/ 16 июля 2010

Используйте DENY VIEW DEFINITION. Вы не можете удалить возможность пользователя видеть существование представлений и хранимых процедур, но вы можете удалить возможность просмотра (большей части) содержимого в них.

deny view definition to smallperms_role 
go
sp_addrolemember 'smallperms_role ', 'smallperms_user'
go
sp_addrolemember 'db_datareader', 'smallperms_user'
go

Например:
EXEC sys.sp_databases ничего не возвращает, но выполняет.
SELECT * FROM INFORMATION_SCHEMA.TABLES ничего не возвращает, но не возвращает ошибку.

1 голос
/ 16 июля 2010

Щелкните правой кнопкой мыши по пользователю и выберите страницу User Mapping .

Оттуда вы попытались отключить весь его доступ из модели master , и msdb database?

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

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

0 голосов
/ 16 июля 2010

Я не думаю, что вы можете удалить публичный доступ для пользователя. (Из свойств пользователя)

Вы можете ОТКЛОНИТЬ права на PUBLIC из свойств базы данных.

  • Щелкните правой кнопкой мыши БД
  • Перейти к свойствам
  • Перейти к разрешениям
  • Изменение разрешений для роли GUEST.

Но вы не можете отказать в разрешении «КОНТРОЛЬ» на Master или Temp dbs, и вы не можете войти на сервер, если откажете SELECT на MASTER.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...