Я ищу лучший способ отключить доступ к sys.tables
/ Information Schema
для пользователя / группы в SQL Server.
Я нашел эту тему с 2008 года
Он показывает способ запрета доступа [sys].[something]
следующим образом:
DENY SELECT ON [sys].[columns] TO DenySystemTableSelectRole
GO
DENY SELECT ON [sys].[tables] TO DenySystemTableSelectRole
GO
DENY SELECT ON [sys].[syscolumns] TO DenySystemTableSelectRole
GO
DENY SELECT ON [sys].[sysobjects] TO DenySystemTableSelectRole
GO
Но нет способа, как отключить доступ на Information Schema
:
DENY SELECT ON INFORMATION_SCHEMA.TABLES To DenySystemTableSelectRole
Кажется, это не работает.
Как я могу отключить доступ к information_schema?
И есть ли более простой способ отключить доступ ко всем sys
/ information_schema
?
Обновление: На самом деле я не могу выполнить оба следующих утверждения:
DENY SELECT ON [sys] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA To reducedDBO
GO
Я попытался запустить их на конкретной БД, где существует пользователь, и я также попытался на «мастер».
Я все еще могу бежать:
SELECT * from
INFORMATION_SCHEMA.TABLES
-> по-прежнему возвращает результаты
SELECT * from
sys.TABLES
-> больше никаких результатов
Включение SCHEMA::
в запрос позволило создать защищаемые
DENY SELECT ON SCHEMA::[sys] TO reducedDBO
GO
DENY SELECT ON SCHEMA::INFORMATION_SCHEMA To reducedDBO
GO
Но теперь я все еще могу выбрать всю информацию из БД.
Я взглянул на вкладку «Securables» в окне свойств пользователя в Management Studio 2008, она выглядит так:
Запись, которая блокирует выбор sys.tables
Схема: sys, Имя: таблицы, Тип: Вид
Разрешения для sys.tables: Разрешение: Выбрать, Предоставитель: dbo, Запрещено
Запись, не блокирующая выбор
Схема :, Имя: INFORMATION_SCHEMA, Тип: Схема
Разрешения для INFORMATION_SCHEMA: Разрешение: Выбрать, Предоставитель: dbo, Запретить НЕ проверено (Я пытался проверить, но без шансов ..)
Разрешение: Выберите, Предоставитель: INFORMATION_SCHEMA, Отклонен проверен
Я пытался установить разрешения через графический интерфейс, но затем я получаю ту же ошибку, что установка разрешений будет возможна только на главной базе данных. Но у меня нет имени пользователя / логина, добавленного к безопасности главных БД.
Решение:
Единственный способ , которым я мог бы сделать deny
работу для information_schema
было добавить пользователя в мастер-БД и запустить deny select
на мастер:
DENY SELECT ON [sys].[tables] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA.TABLES To reducedDBO
GO
И как в этом коде, он может быть выполнен только для отдельных таблиц.
Ответы:
Вы должны иметь возможность просто запретить разрешения для всей
sys
и всейinformation_schema
схемы:Это должно в основном просто препятствовать тому, чтобы этот пользователь делал какие-либо выборки в этих двух схемах.
источник
Во-первых, вы правы в том, что (слегка нелогичный) способ предотвратить доступ к схемам [sys] и [INFORMATION_SCHEMA] состоит в том, чтобы сначала убедиться, что вход в систему (ну, принципал уровня сервера) существует как пользователь (э-э, субъект уровня базы данных) в базе данных master.
Предположим, у вас есть логин SQL для простоты:
Теперь создайте соответствующего пользователя в базе данных master:
Теперь вы хотите запретить этой учетной записи доступ к любой из таблиц в системных схемах - [sys] и [INFORMATION_SCHEMA].
Похоже, что произошло изменение поведения между SQL Server 2008 R2 и SQL Server 2012:
В SQL Server 2012 (и, возможно, более поздних версиях) выполнение следующего в базе данных [master] делает, как вы ожидаете:
Однако в SQL Server 2008 R2 (и, по-видимому, более ранних версиях) операторы предоставления акций, предоставляющие доступ к объектам в этих схемах членам [public], по-видимому, перекрывают вышеприведенные операторы DENY, что мне кажется огромной кучей неудач. Следовательно, в 2008 R2 вам необходимо явно ОТКАЗАТЬСЯ за каждый ГРАНТ [public]. Вот скрипт для этого:
Запустите вышеуказанное в базе данных master, и вы удалили доступ к содержимому этих схем.
Примечания:
Если вы закомментируете следующие две строки в приведенном выше сценарии:
Это приведет к отмене ВСЕХ ГРАНТОВ по умолчанию для общественности. Это предотвратит доступ, например, к sys.sp_tables и, таким образом, нарушит его, например, способность Microsoft Access вообще перечислять таблицы, но в сценариях с высоким уровнем безопасности полезно делать именно это, чтобы пользователи получали доступ только там, где вы явно предоставили Это.
источник
Я не уверен, когда этот трюк стал доступен - поскольку никто не упомянул его - но, похоже, он работает по крайней мере с SQL Server 2008.
Вышеупомянутое работает без добавления пользователя в
master
базу данных, как упомянуто в некоторых других ответах.источник