Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как разрешить insert из процедуры, но запретить напрямую ?  [new]
Павел Яковлев
Member

Откуда: Петербург
Сообщений: 11
Цель - дать возможность работать с БД только через процедуры.Возможно это ?

С Select проходит - подключил к ролям БД datareader datawriter - работает прямой вызов Select и из процедуры, отключаю - проходит только из процедуры (конечно дал разрешение на выполнение этой процедуры этому пользователю). А вот с insert не получается. Убираю эти роли (datareader и datawriter) и говорит, что нет разрешения на insert
25 июн 15, 15:56    [17816147]     Ответить | Цитировать Сообщить модератору
 Re: Как разрешить insert из процедуры, но запретить напрямую ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Павел Яковлев
и говорит, что нет разрешения на insert

процедура и таблица должны принадлежать одному владельнцу
25 июн 15, 15:58    [17816161]     Ответить | Цитировать Сообщить модератору
 Re: Как разрешить insert из процедуры, но запретить напрямую ?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8833
Павел Яковлев
Возможно это ?


Даже нужно, если Ваша база должна быть безопасной. Читайте справку топик:
EXECUTE AS, предложение (Transact-SQL)
25 июн 15, 16:59    [17816509]     Ответить | Цитировать Сообщить модератору
 Re: Как разрешить insert из процедуры, но запретить напрямую ?  [new]
Павел Яковлев
Member

Откуда: Петербург
Сообщений: 11
Владислав Колосов
Павел Яковлев
Возможно это ?

Даже нужно, если Ваша база должна быть безопасной. Читайте справку топик:
EXECUTE AS, предложение (Transact-SQL)


Да! То, что нужно!
26 июн 15, 19:03    [17821760]     Ответить | Цитировать Сообщить модератору
 Re: Как разрешить insert из процедуры, но запретить напрямую ?  [new]
Павел Яковлев
Member

Откуда: Петербург
Сообщений: 11
В продолжение вопрос. С таблицами все получается (я напрямую закрываю все операции с таблицами путем занесения их в защищаемых объектах для пользователя - кстати вопрос - насколько это правильно?) С процедурами - напрямую открываю там же в защищаемых объектах запуск и управление.
А вот как закрыть доступ к остальным системным таблицам и другим базам ?
Скажем благополучно проходит
SELECT name, database_id, create_date FROM sys.databases

Это же неправильно?
Пытался ставить пользователю denydatareader и denydatawriter - все равно лезет в другие базы.
Что-то я делаю явно не так. Но что ? Подскажите пожалста
30 июн 15, 17:04    [17833864]     Ответить | Цитировать Сообщить модератору
 Re: Как разрешить insert из процедуры, но запретить напрямую ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Павел Яковлев
Это же неправильно?

Сколько дали прав, столько и получил пользователь
Права из ниоткуда не беруться
30 июн 15, 17:11    [17833906]     Ответить | Цитировать Сообщить модератору
 Re: Как разрешить insert из процедуры, но запретить напрямую ?  [new]
Павел Яковлев
Member

Откуда: Петербург
Сообщений: 11
Glory
Павел Яковлев
Это же неправильно?

Права из ниоткуда не беруться


Да это я понял. Видимо я неверно вопрос сформулировал.

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

По цитируемому мной запросу - я не смог найти базу данных sys, чтобы запретить доступ к ней.
Вообще, видимо я не с той стороны подошел. Ибо делать отдельный запрет на каждую таблицу - это наверное неправильно...
30 июн 15, 17:17    [17833939]     Ответить | Цитировать Сообщить модератору
 Re: Как разрешить insert из процедуры, но запретить напрямую ?  [new]
o-o
Guest
Павел Яковлев
Скажем благополучно проходит
SELECT name, database_id, create_date FROM sys.databases

Это же неправильно?

откройте хэлп на sys.databases, permissions.
убедитесь что достаточно иметь view any database.
а он есть у паблика по умолчанию.
не нравится -- отберите:
deny view any database to public

ну или не всем, а только тому логину
у товарища сразу еще и ОЕ "облысеет"
30 июн 15, 17:24    [17833992]     Ответить | Цитировать Сообщить модератору
 Re: Как разрешить insert из процедуры, но запретить напрямую ?  [new]
o-o
Guest
о блин, sys -- это схема.
почитайте что ли на досуге на эту тему
30 июн 15, 17:25    [17833997]     Ответить | Цитировать Сообщить модератору
 Re: Как разрешить insert из процедуры, но запретить напрямую ?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8833
Павел Яковлев,

не совсем так, поместите процедуры, которые требуется вызывать, в какую-то пользовательскую схему базы (создайте эту схему), процедуры создайте как execute as dbo. Пользователям дайте права EXECUTE только на эту схему.
В нужных база создайте роль, эту роль сделайте владельцем схемы для выполнения процедур. Логины отобразите на эту роль.
Кроме процедур в указанных базах пользователи не смогут ничего вызвать, просмотреть, удалить и т.д.
30 июн 15, 17:26    [17833999]     Ответить | Цитировать Сообщить модератору
 Re: Как разрешить insert из процедуры, но запретить напрямую ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Павел Яковлев
Какие право надо (видимо) отнять, чтобы запретить селекты/инсерты для всех таблиц ?

спросите сначала себя, а откуда у него взялись у нег эти права
30 июн 15, 17:29    [17834015]     Ответить | Цитировать Сообщить модератору
 Re: Как разрешить insert из процедуры, но запретить напрямую ?  [new]
Павел Яковлев
Member

Откуда: Петербург
Сообщений: 11
Glory
Павел Яковлев
Какие право надо (видимо) отнять, чтобы запретить селекты/инсерты для всех таблиц ?

спросите сначала себя, а откуда у него взялись у нег эти права

Видимо из public ?
30 июн 15, 17:37    [17834077]     Ответить | Цитировать Сообщить модератору
 Re: Как разрешить insert из процедуры, но запретить напрямую ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Павел Яковлев
Glory
пропущено...

спросите сначала себя, а откуда у него взялись у нег эти права

Видимо из public ?

Т.е. по вашему роль одной базы данных может давать права на другие базы и сервер ?
1 июл 15, 09:40    [17835952]     Ответить | Цитировать Сообщить модератору
 Re: Как разрешить insert из процедуры, но запретить напрямую ?  [new]
o-o
Guest
мне кажется, ТС не различает "права в других базах" и права на просмотр системных вьюх типа sys.databases.
и считает, что раз пользователь базы видит инфо обо всех базах в sys.databases,
то он уже "лезет во все базы".

Павел Яковлев, если вы "паблик" цитируете из моего ответа,
то уточню, ответ был по поводу "почему читает из sys.databases", а совсем не про "селекты/инсерты для всех таблиц".
и имелась в виду серверная роль public, не датабэйсная
1 июл 15, 10:03    [17836068]     Ответить | Цитировать Сообщить модератору
 Re: Как разрешить insert из процедуры, но запретить напрямую ?  [new]
Павел Яковлев
Member

Откуда: Петербург
Сообщений: 11
o-o
мне кажется, ТС не различает "права в других базах" и права на просмотр системных вьюх типа sys.databases.
и считает, что раз пользователь базы видит инфо обо всех базах в sys.databases,
то он уже "лезет во все базы".

Да. В этом моя ошибка. Я не различаю много чего. Пытаюсь методом тыка понять. Ибо я просто программист, волею судеб удостоенный чести по необходимости настроить среду для работы.
По поводу "вьюх" - правильно я понимаю, что мне нужно в защищаемые объекты добавить представления соответствующие и запретить к ним доступ ?
И насколько это критично, что есть право на просмотр системных представлений? Может и не нужно огород городить - защищать ?
1 июл 15, 11:28    [17836603]     Ответить | Цитировать Сообщить модератору
 Re: Как разрешить insert из процедуры, но запретить напрямую ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Павел Яковлев
Пытаюсь методом тыка понять.

Может начнете лучше с чтения хелпа ?

Павел Яковлев
По поводу "вьюх" - правильно я понимаю, что мне нужно в защищаемые объекты добавить представления соответствующие и запретить к ним доступ ?

Изначально у логинов/пользователей НЕТ никаких прав. Права они получают через назначение.
1 июл 15, 11:35    [17836661]     Ответить | Цитировать Сообщить модератору
 Re: Как разрешить insert из процедуры, но запретить напрямую ?  [new]
o-o
Guest
вот я и говорю.
начните с чтения на тему "Security in SQL Server".
Overview of SQL Server Security
Metadata Visibility Configuration
там и про схемы, и про метаданные, кому что положено видеть.
в двух словах так: на что есть права, то и видишь,
т.е. если нет прав даже на чтение каких-то таблиц -- юзер их "не видит".
в смысле, не получит эти таблицы при запросе из sys.tables,
не "увидит" в ОЕ.
какие-то системные объекты юзер видит, просто из самого факта попадания на сервер.
никуда не отмаплен, а видит linked servers, видит все базы.
некоторых очень бесит, что юзер видит базы, куда не отмаплен, это то самое, sys.databases.
хотите это запретить -- отбирайте view any database у конкретного логина или у паблика.

Павел Яковлев
И насколько это критично, что есть право на просмотр системных представлений? Может и не нужно огород городить - защищать ?

я думаю, в MS хорошо подумали, прежде чем дали бесправным видеть лишнее.
но т.к. кому-то все же это мешает, сделали Contained Databases
там юзер дальше своей базы не видит. вообще ничего на сервере.
хотя, может Contained Databases сделали совсем и не для этого, а чтобы вообще от сервера "отвязаться",
т.е. в базе уже все необходимое есть, есть юзеры, к-ые сами себе логины.
1 июл 15, 11:47    [17836768]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить