Кросс-цепочка владения базами данных SQL Server 2008 R2 Не работает? - PullRequest
1 голос
/ 08 мая 2011

Я восстановил две базы данных SQL Server 2005 (DB1 и DB2) в новую коробку под управлением SQL Server 2008 R2.

Все объекты принадлежат dbo

У меня есть хранимая процедура DB1.dbo.mp_SPTest. Я дал разрешения на выполнение SQLUser1.

CREATE PROCEDURE mp_SPTest
AS
SELECT DB2.dbo.mf_UserHasAccess("BasicUser", "bob")

mp_SPTest вызывает скалярную функцию в DB2 DB2.dbo.mf_UserHasAccess(), эта функция проверяет, является ли переданное имя пользователя членом роли SQL .....

CREATE FUNCTION [dbo].[mf_UserHasAccess] (@RoleName varchar(50), @UserName varchar(128))  
RETURNS bit
AS  
BEGIN 
    DECLARE @Result bit

    SELECT @Result = 1
    WHERE @RoleName IN (
    SELECT CASE
        WHEN (usg.uid is null) THEN 'public'
        ELSE usg.name
        END AS RoleName
    FROM    dbo.sysusers usu
    LEFT OUTER JOIN (dbo.sysmembers mem 
         INNER JOIN dbo.sysusers usg 
         ON mem.groupuid = usg.uid)
    ON  usu.uid = mem.memberuid
    LEFT OUTER JOIN master.dbo.syslogins lo 
    ON  usu.sid = lo.sid
    WHERE   
        (usu.islogin = 1 AND usu.isaliased = 0 AND usu.hasdbaccess = 1)
    AND (usg.issqlrole = 1 OR usg.uid is NULL)
    AND usu.name = @UserName)

    IF @Result <> 1
    BEGIN
        SET @Result = 0
    END

    RETURN @Result
END

Когда я запускаю эту процедуру как «SQLUser1», она говорит мне, что bob не является членом BasicUser, но когда я запускаю ее как «sa», она говорит мне, что он является членом.

Насколько я понимаю ... поскольку процедура и функция принадлежат dbo, то это контекст, в котором будет выполняться функция в test2 db, поэтому она должна иметь доступ к тем же таблицам пользователя и входа в систему.

Это нормально работало на SQL Server 2005, не могу понять.

Надеюсь, это имеет смысл, заранее спасибо.

Ответы [ 2 ]

1 голос
/ 09 мая 2011

Скорее всего, в старом SQL Server 2005 была включена опция *1002* для цепочки владения перекрестным владением * 1001, в то время как для нового экземпляра SQL Server 2008 R2 параметр оставлен со значением по умолчанию (выкл.).

Но ваше предположение, что «dbo» в DB1 равнозначно «dbo» в DB2, неверно.'dbo' в DB1 - это логин, который соответствует owner_sid DB1 в sys.databases .'dbo' в DB2 - это также имя входа, которое соответствует onwer_sid в sys.databases для DB2.Если два имени входа различны (если owner_sid двух баз данных различен), то очень вероятно, что 'dbo' DB1 отобразится на другого пользователя, и цепочка владения будет разорвана, даже если разрешено пересекать базы данных.Выполнение ALTER AUTHORIZATION ON DATABASE::[DB..] TO [sa] решит эту проблему (т. Е. Приведет к совпадению owner_sid).

И, наконец, то, что вы делаете, в корне ошибочно, так как основано на активации цепочки владения между базами данных, котораяогромная дыра в безопасности, см. Потенциальные угрозы .Намного лучше лучше использовать подпись кода .

0 голосов
/ 01 марта 2013

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

USE [TargetDB]

ALTER AUTHORIZATIONON SCHEMA :: [TargetSchema] TO [SourceSchema]

Например ИСПОЛЬЗОВАТЬ [DB1]

ИЗМЕНИТЬ АВТОРИЗАЦИЮ В SCHEMA :: [mem] TO [dbo] GO

Будетразрешить представление в виде DB2.DBO.view при условии, что цепочка включена, для доступа к таблице в DB1.mem.table.По сути, перекрестная цепочка БД приводит к тому, что он обращается к целевой БД в виде схемы, под которой находится представление, а не к пользователю, которому принадлежит база данных.

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