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

На сервере три базы A, B, C. В базе C находится таблица tb_data, в базе В создана процедура usp_touch_data
create procedure usp_touch_data
as
begin
  set nocount on 
  select current_user
  select top 10 * from c.dbo.tb_data
end

В базе A заведен пользователь test, db_owner, отмаплен на B и на C. Ему даны права на запуск процедуры usp_touch_data, межбазовые цепочки владения для B и для С включены. Владелец процедуры usp_touch_data и таблицы tb_data один, dbo.

Заходим под test, запускаем usp_touch_data - процедура работает.

Делаем
alter procedure usp_touch_data execute as 'dbo'
as
begin
  set nocount on 
  select current_user
  select top 10 * from c.dbo.tb_data
end
, снова запускаем процедуру - получаем ошибку Msg 916
The server principal "логин" is not able to access the database "C" under the current security context.

То же самое, если вместо execute as 'dbo' поставить execute as owner

Почему???
1 авг 17, 16:56    [20692450]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
msLex
Member

Откуда:
Сообщений: 8091
Карл'сОн,

Для execute as 'dbo' в базе B должен выключен trustworthy.
1 авг 17, 17:00    [20692465]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36972
Так же в базе "C" надо или замапить текущий логин, или включить guest.
1 авг 17, 17:04    [20692477]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
o-o
Guest
не надо включать trustworthy.
надо объяснить товарищу, что происходит, чтобы свою тактику поменял.
----
если овнер базы В не отмаплен в базу С, то и trustworthy не поможет
1 авг 17, 17:06    [20692481]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
o-o
Guest
Гавриленко Сергей Алексеевич
Так же в базе "C" надо или замапить текущий логин, или включить guest.

с гостем да, прокатит.
а логин мапить бесполезно:
жалуется не на исполнителя, а на того, кто овнер базы.
у него же execute as dbo.
так в другую базу не отмаплен овнер этой базы
1 авг 17, 17:08    [20692490]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
o-o
Guest
в частности, если овнер базы -- sa,
то именно он и получает ошибку о том, что не может попасть в соседнюю базу
1 авг 17, 17:11    [20692496]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
o-o
Guest
Карл'сОн,
когда вы пишете WITH EXECUTE AS USER = ...,
это именно юзер, и никогда не логин.
а значит, выполняя процедуру, вы сами себя ограничили лишь этой базой,
т.к. юзер орудует только в ней.

как уже сказал msLex, можно распахнуть дыру в безопасности,
выставив базе TRUSTWORTHY ON.
тогда уже юзер, которого вы имперсонэйтили, будет "выпущен" из базы,
и орудовать вы будете уже от имени соответствующего логина.
(соответствующего юзеру, которого имперсонэйтили,
т.е. в случае dbo, соответствующий логин это овнер базы)
1 авг 17, 17:19    [20692516]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
o-o
Guest
мной написанное тоже упрощено.
права уровня сервера юзер получит только если у овнера трастворсной базы есть AUTHENTICATE SERVER.
а в соседнюю базу можно будет попасть, если у овнера трастворсной базы есть AUTHENTICATE в соседней базе.

соответственно, если ваш овнер базы это некий сисадмин,
то любой юзер этой базы с правом IMPERSONATE, выполнив exec as user = 'dbo', будет сисадмином сервера.
в частноcти, мемберы db_owner в полной малине.

ну а если овнер базы ниочемный логин,
то вам еще придется довыдать ему права в соседней базе (AUTHENTICATE)
1 авг 17, 17:27    [20692538]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
Карл'сОн
Guest
Спасибо всем, я, вероятно, путаюсь в понятиях, и, соответственно, все сказанное выше не освоил.

Могу сказать, что trustworthy выключен, логин конечного пользователя замаплен в B и C (в результате в B и C создались юзеры test, и тому юзеру test, который создан в B дан grant на execute процедуры). Когда я пишу WITH EXECUTE AS USER = ..., это именно юзер, а не логин; dbo это же юзер. А жалоба идет именно на логин, при чем на логин сисадмина, создавшего таблицу tb_data.

Т.е. в этой вот фразе
The server principal "логин" is not able to access the database "C" under the current security context

фигурирует логин сисадмина.

Что происходит непонятно, я думал, если овнер процедуры и таблицы dbo, то от того, что я укажу его явно, ничего не изменится, раз. Два - при чем здесь логин вообще?
1 авг 17, 18:50    [20692744]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
msLex
Member

Откуда:
Сообщений: 8091
Почитайте про trustworthy

Должно стать понятнее
1 авг 17, 19:06    [20692760]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
o-o
Guest
Карл'сОн
это именно юзер, а не логин; dbo это же юзер. А жалоба идет именно на логин, при чем на логин сисадмина, создавшего таблицу tb_data.

вы невнимательно читаете.
жалоба на сисадмина идет потому, что это логин,
соответствующий тому юзеру, execute as user которого прописан в процедуре.
если прописан dbo, ему соответствует логин овнера базы,
значит сисадмин это овнер базы
1 авг 17, 19:25    [20692783]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
o-o
Guest
в процедуре вместо того, чтобы лезть в соседнюю базу, напишите
select user, system_user;

запустите процедуру и вы увидите, кто вы внутри процедуры.
первым будет выведен тот юзер, что прописан в with execute as user.
ну а вторым соответствующий ему логин, "жалоба" на которого у вас в ошибке
--------------------
итого:
хотите пользоваться цепочками владения,
не пишите никакой with execute as user в процедуре
1 авг 17, 19:29    [20692787]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
msLex
Member

Откуда:
Сообщений: 8091
o-o
хотите пользоваться цепочками владения,
не пишите никакой with execute as user в процедуре



Или включите trustworthy на базе
1 авг 17, 19:34    [20692791]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
o-o
Guest
для эксперимента смените овнера базы, где создана процедура:
alter authorization on database::B to [another_login]

запустите снова ту же процедуру с with execute as user = 'dbo'.
если там все еще лезете в соседнюю базу, получите ошибку для логина another_login.
если же выводите user, system_user, то получите теперь уже dbo, another_login
1 авг 17, 19:35    [20692792]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
o-o
Guest
msLex
Или включите trustworthy на базе

вы (msLex) у него там не db_owner часом, на его сервере?
у него овнер базы -- сисадмин, вы понимаете, как вы осчастливите db_owner-ов, которые в теме?
1 авг 17, 19:39    [20692798]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
msLex
Member

Откуда:
Сообщений: 8091
o-o
msLex
Или включите trustworthy на базе

вы (msLex) у него там не db_owner часом, на его сервере?
у него овнер базы -- сисадмин, вы понимаете, как вы осчастливите db_owner-ов, которые в теме?

ну если dbowner-ы - во всех базах это один и тот же круг лиц, то не вижу в этом проблемы.
1 авг 17, 19:43    [20692808]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
o-o
Guest
msLex
o-o
пропущено...

вы (msLex) у него там не db_owner часом, на его сервере?
у него овнер базы -- сисадмин, вы понимаете, как вы осчастливите db_owner-ов, которые в теме?

ну если dbowner-ы - во всех базах это один и тот же круг лиц, то не вижу в этом проблемы.

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

ну а насчет ни один из них не админ -- это официально.
а неофициально у меня давно уже заполучены права.
хотя я всего лишь "db_owner в двух базах"

потому что все вокруг пофигисты,
и бесопасность кругом ниже плинтуса.

я считаю, так им всем и надо.
и вам наверное туда же
1 авг 17, 23:28    [20693206]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
msLex
Member

Откуда:
Сообщений: 8091
o-o
msLex
пропущено...

ну если dbowner-ы - во всех базах это один и тот же круг лиц, то не вижу в этом проблемы.

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

ну а насчет ни один из них не админ -- это официально.
а неофициально у меня давно уже заполучены права.
хотя я всего лишь "db_owner в двух базах"

потому что все вокруг пофигисты,
и бесопасность кругом ниже плинтуса.

я считаю, так им всем и надо.
и вам наверное туда же

У вас одна ситуация, у нас совершенно другая. У нас в группу dbowner-ов всех баз входят только sysadmin-ы сервера, не потому, что так проще, а потому что так нужно. В этой ситуации не вижу проблем с trustworthy.
Какова ситуация у ТС-а мы не знаем, зачем гадать, что ему лучше?
2 авг 17, 08:59    [20693608]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
o-o
Guest
msLex
Какова ситуация у ТС-а мы не знаем, зачем гадать, что ему лучше?

Я как раз не гадаю, а исхожу из имеющегося.
Достоверно известно, что ТС не осознает, какую дыру он откроет через trustworthy on.
И еще известно, что овнер базы сисадмин.
Береженого бог бережет.
2 авг 17, 09:08    [20693640]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
Карл'сОн
Guest
o-o, спасибо.

o-o
Достоверно известно, что ТС не осознает, какую дыру он откроет через trustworthy on.

Да. Не осознает. Но догадывается, и очень не хочет. Абсолютно согласен вот с этим:
o-o
все вокруг пофигисты,
и безопасность кругом ниже плинтуса

И как раз от такой ситуации хотелось бы уйти.

msLex
если dbowner-ы - во всех базах это один и тот же круг лиц, то не вижу в этом проблемы.

dbowner-ы разные. Для базы A это один круг лиц, для баз B и C - другой. По сути B и C одна логическая сущность, базы сделаны разными, поскольку для хранящихся там и там данных имеют смысл различные модели резервирования. И нужно, чтобы пользователи базы A имели доступ только к процедурам в базе B, которые, в свою очередь, обращаются к таблицам как в B, так и в С.
2 авг 17, 15:44    [20695285]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
o-o
Guest
Карл'сОн
msLex
если dbowner-ы - во всех базах это один и тот же круг лиц, то не вижу в этом проблемы.

dbowner-ы разные. Для базы A это один круг лиц, для баз B и C - другой. По сути B и C одна логическая сущность,
базы сделаны разными, поскольку для хранящихся там и там данных имеют смысл различные модели резервирования.
И нужно, чтобы пользователи базы A имели доступ только к процедурам в базе B, которые,
в свою очередь, обращаются к таблицам как в B, так и в С.

msLex не описал главную проблему.
при наличии трастворсной базы с овнером-сисадмином,
любой, у кого имеется IMPERSONATE, может себя повысить до сисадмина.

обычно это db_owner-ы, но мало ли у кого какие права кому розданы.

а "разный или одинаковый набор db_owner-ов для ряда баз"
это интересно в случае зачейнивания баз, как у вас.
потому что если db_owner-ы разные, а базы зачейнены (межбазовые цепочки владения),
то напрямую нет, а через процедуру да,
любой овнер одной базы может вычерпать данные откуда угодно из второй базы,
лишь бы не нарушалась цепочка(обычно владелец всего это dbo и проблем никаких)
2 авг 17, 16:10    [20695406]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
o-o
Guest
db_owner, даже если он во всех базах db_owner, это ни разу ни сисадмин.
овнер не в состоянии даже отресторить собственную базу,
я молчу о доступе к конфигурации сервера.

если у кого есть сомнения, что сервер можно уложить на лопатки,
поменявши системные настройки, погуглите темы козлова-sql_user2.
если к делу подойти с фантазией, камня на камне не останется
2 авг 17, 16:17    [20695442]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
Карл'сОн
Guest
Спасибо за ценное предупреждение.


o-o
Карл'сОн
msLex
если dbowner-ы - во всех базах это один и тот же круг лиц, то не вижу в этом проблемы.

dbowner-ы разные. Для базы A это один круг лиц, для баз B и C - другой. По сути B и C одна логическая сущность, базы сделаны разными, поскольку для хранящихся там и там данных имеют смысл различные модели резервирования. И нужно, чтобы пользователи базы A имели доступ только к процедурам в базе B, которые, в свою очередь, обращаются к таблицам как в B, так и в С.

...

а "разный или одинаковый набор db_owner-ов для ряда баз"
это интересно в случае зачейнивания баз, как у вас.
потому что если db_owner-ы разные, а базы зачейнены (межбазовые цепочки владения),
то напрямую нет, а через процедуру да,
любой овнер одной базы может вычерпать данные откуда угодно из второй базы,
лишь бы не нарушалась цепочка(обычно владелец всего это dbo и проблем никаких)


Можно ли уточнить? В моем случае межбазовые цепочки владения включены для двух баз из трех (для B и C; для A они выключены). db_owner базы A сам себе их включить не способен. И новую базу он тоже создать не способен. Соотв., хотя владелец всех объектов в B и С, это действительно dbo, риск несанкционированного доступа к данным на первый взгляд отсутствует.

Или он, все-таки, есть?
4 авг 17, 13:57    [20700748]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
o-o
Guest
db_owner-у базы A ничего не светит.
но db_owner-ы зачейненных баз В и С могут друг у друга данные получать через процедуры.
разумеется, если они отмаплены в соседнюю базу.

т.е. например db_owner базы В отмаплен еще и в С,
но прав там не имеет.
вот он может получать данные из С, сидя в своей базе, через процедуры, обращающиеся в С
4 авг 17, 14:08    [20700790]     Ответить | Цитировать Сообщить модератору
 Re: Как тут должна работать цепочка владения?  [new]
Карл'сОн
Guest
o-o,

спасибо, устраивает :). B и C - одна логическая сущность, db_owner-ы там совпадают.

Жаль, что цепочки нельзя включить строго между двумя этими базами, т.е. если появятся новые базы D, E, ..., между которыми так же должны будут функционировать цепочки владения, появятся и новые вопросы.
4 авг 17, 15:40    [20701252]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить