Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Права доступа, выручайте плиз  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
Есть разработанный мной софт, работающий с несколькими БД под MSSQL только посредством функций и процедур. Однако так сложилось, что работали с софтом "свои", опытные люди и не было необходимости заморачиваться с правами доступа - все работали под Domain Admins.
Сейчас ситуация меняется: требуется дать доступ 10 пользователям посредством SQL Server Authentication, причем, чтоб они даже не видели таблиц при подключении через SSMS - права только на хранимые процедуры и функции.
Опыта работы с правами доступа нет и времени, к сожалению тоже.
Очень прошу помощи, как это ПРАВИЛЬНО сделать в принципе.
27 апр 16, 12:04    [19112070]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
=Сергей=,

создайте роль, роли дайте нужные права, пользователей включайте в роль.
27 апр 16, 12:08    [19112093]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
TaPaK,
Спасибо, делаю
27 апр 16, 13:10    [19112431]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8492
=Сергей=,

роли дайте execute (выполнение) на схему dbo. Полагаю, у вас там всё в dbo.
27 апр 16, 14:00    [19112689]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
Хочу запретить select на таблицу, дабы предотвратить НСД к ней, создав для работы табличную функцию, которая возвращает только 1000 записей. Дал права на select этой функции для группы, но при работе с табличной функцией ей требуется права на защищаемую таблицу.
Как правильно сделать? хранимую процедуру?
29 апр 16, 13:30    [19121690]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
o-o
Guest
=Сергей=
Дал права на select этой функции для группы, но при работе с табличной функцией ей требуется права на защищаемую таблицу.

нет.
селекта на функцию достаточно.
наверное у вас нарушается цепочка владения.
схемы одинаковы у функции и таблицы?
если да и все равно ошибка, смотрите владельцев
create table dbo.t (id int);
go

create user us without login;
go

create function dbo.udf_top_10()
returns table
    return select *
    from dbo.t;
go    

grant select on dbo.udf_top_10 to us 
go

execute as user = 'us'
select *
from dbo.t;

--Msg 229, Level 14, State 5, Line 1
--The SELECT permission was denied on the object 't', database 'db0', schema 'dbo'.

select *
from dbo.udf_top_10(); 
----
--id

revert
29 апр 16, 13:47    [19121772]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
=Сергей=
Хочу запретить select на таблицу, дабы предотвратить НСД к ней, создав для работы табличную функцию, которая возвращает только 1000 записей. Дал права на select этой функции для группы, но при работе с табличной функцией ей требуется права на защищаемую таблицу.
Как правильно сделать? хранимую процедуру?

схема у функции и таблицы одна и та же?
29 апр 16, 13:51    [19121792]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
есть одно уточнение: на сервере несколько БД - DB1, DB2, DB3, однако вся логика размещена в DB1.
сделано так:
create login [user] with password = 'password', check_policy = off
use DB1
go
exec sp_addrole 'role','dbo'
exec sp_adduser 'user','user','role'

create function dbo.GetResults (@Top int) returns @result table([id] int, [RawData] varchar(100))
begin
   insert into @result select top (@Top) [id],[RawData] from [DB2].dbo.[Table]
   return
end

grant exec on dbo.GetResults to [role]

use DB2
go
exec sp_addrole 'role','dbo'
exec sp_adduser 'user','user','role'


когда запускаю от пользователя
select * from dbo.GetResults(50)

The SELECT permission was denied on the object 'Table', database 'DB2', schema 'dbo'.
29 апр 16, 14:22    [19122009]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
=Сергей=,
курите cross database ownership chaining
29 апр 16, 14:24    [19122015]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
ничего не получается, очень нужно сегодня сделать.
пробовал так:
USE master
EXEC sp_dboption 'DB1', 'db chaining', 'ON'
EXEC sp_dboption 'DB2', 'db chaining', 'ON'

чуда не произошло, а вообще страшно "ушатать" рабочую конфигурацию, помогите плиз
29 апр 16, 15:34    [19122529]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
o-o
Guest
для начала удостоверимся,что вы действительно опцию включили.
результат картинкой, пожалуйста
select name, is_db_chaining_on 
from sys.databases
where name in ('db1', 'db2');
29 апр 16, 15:50    [19122639]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
o-o,
DB1   1
DB2   1
к сожалению, картинкой не выйдет, инет на планшете
29 апр 16, 15:54    [19122665]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
o-o
Guest
потом схемы и овнеров таблицы/функции покажите:
select name, schema_id, principal_id
from db1.sys.objects
where name = 'GetResults';

select name, schema_id, principal_id
from db2.sys.objects
where name = 'Table';
29 апр 16, 15:54    [19122670]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
o-o
Guest
ок, поверим тексту.
что с овнерами?
29 апр 16, 15:55    [19122677]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
вот мой тестовый пример:
create database DB1
go
create database DB2
go
use DB1
go
create table db.t([id] int)
go
use DB2
go
create function dbo.GetData(@Top int) returns table
   return select top(@Top) * from DB1.dbo.t
go
create user us without login
go
grant user us on dbo.GetData to us
go
exec sp_dboption 'DB1','db chaining','on'
exec sp_dboption 'DB2','db chaining','on'
go
exec as user = 'us'
   select * from DB1.dbo.t
   select * from dbo.GetData(1)
revoke

The server pricipal "...SID..." is not able to access the database "DB1" under the current security context
29 апр 16, 16:01    [19122717]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
o-o
Guest
где результат второго запроса со схемами/овнерами?
для ownership chaining нужно не только опцию db chaining включить, нужно совпадение овнеров.
показывайте
select name, schema_id, principal_id
from db1.sys.objects
where name = 'GetResults';

select name, schema_id, principal_id
from db2.sys.objects
where name = 'Table';
29 апр 16, 16:03    [19122731]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
Konst_One
Member

Откуда:
Сообщений: 11593
exec sp_dboption 'DB2','db chaining','on'
29 апр 16, 16:03    [19122732]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
Konst_One
Member

Откуда:
Сообщений: 11593
в контексте DB2 же выполняете
29 апр 16, 16:04    [19122734]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
o-o
Guest
Konst_One
exec sp_dboption 'DB2','db chaining','on'

ну двумя постами выше он же показал.
если текстом наврал, его проблемы.
говорит, картинкой не может.
лично я, стоя в пробке, на ноуте делаю, с телефона отправляю.
никаких проблем перекинуть картинку с дивайса на дивайс не вижу
29 апр 16, 16:06    [19122742]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
С учётом моего тестового скрипта:
select name, schema_id, principal_id
from db2.sys.objects
where name = 'GetData';

select name, schema_id, principal_id
from db1.sys.objects
where name = 't';


GetData   1   NULL
t               1   NULL
29 апр 16, 16:06    [19122743]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
Konst_One
в контексте DB2 же выполняете

конечно
29 апр 16, 16:07    [19122748]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
o-o
Guest
=Сергей=
The server pricipal "...SID..." is not able to access the database "DB1" under the current security context

мапить юзера в DB1 кто будет?
29 апр 16, 16:08    [19122753]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
o-o
=Сергей=
The server pricipal "...SID..." is not able to access the database "DB1" under the current security context

мапить юзера в DB1 кто будет?

dbo??
29 апр 16, 16:09    [19122762]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
o-o
Guest
с чейнингом все ок,
у вас юзер не попадает в первую базу.
а вы писали про SELECT permission,
типа после включения опции все то же самое.
ошибка же поменялась
29 апр 16, 16:11    [19122771]     Ответить | Цитировать Сообщить модератору
 Re: Права доступа, выручайте плиз  [new]
Konst_One
Member

Откуда:
Сообщений: 11593
у ТС сначала было 3 базы и в 2-х из них 2 одинковых юзера, потом вдруг стало 2 базы и в них 1 юзер
29 апр 16, 16:12    [19122780]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить