Obávám se, že buď váš popis, nebo vaše pojetí vlastnického řetězení je nejasné, takže začnu tím:
"Řetězení vlastnictví" jednoduše odkazuje na skutečnost, že při provádění uložené procedury (nebo zobrazení) na serveru SQL aktuálně spouštěná dávka dočasně získá práva/oprávnění vlastníka sProc (nebo vlastníka schématu sProc) při provádění tohoto kódu SQL. Takže v případě sProc nemůže uživatel tyto priv použít k ničemu, co pro něj kód sProc neimplementuje. Všimněte si zejména, že nikdy nezíská Identitu Vlastníka, pouze jeho práva, dočasně (nicméně EXECUTE AS... to dělá).
Takže typický přístup k využití tohoto pro zabezpečení je:
-
Vložte všechny datové tabulky (a také všechna nezabezpečená zobrazení) do jejich vlastního schématu, říkejme tomu [data] (ačkoli se obvykle používá [dbo], protože tam již je a je příliš privilegovaný pro schéma uživatele). Ujistěte se, že k tomuto schématu [data] nemají přístup žádní stávající uživatelé, schémata ani vlastníci.
-
Vytvořte schéma nazvané [exec] pro všechny sProcs (a/nebo případně jakékoli pohledy zabezpečení). Ujistěte se, že vlastník tohoto schématu má přístup ke schématu [data] (to je snadné, pokud vlastníkem tohoto schématu učiníte dbo).
-
Vytvořte novou db-Role nazvanou "Users" a udělte jí EXECUTE přístup ke schématu [exec]. Nyní přidejte všechny uživatele do této role. Ujistěte se, že vaši uživatelé mají pouze práva Connect a nemají udělený přístup k žádnému jinému schématu, včetně [dbo].
Nyní mohou vaši uživatelé přistupovat k datům pouze spuštěním sProcs v [exec]. Nemohou přistupovat k žádným jiným datům ani provádět žádné jiné objekty.
Nejsem si jistý, zda to odpovídá na vaši otázku (protože jsem si nebyl jistý, jaká otázka přesně byla), takže mě neváhejte přesměrovat.
Pokud jde o zabezpečení na úrovni řádků, vždy to dělám s výše uvedeným schématem zabezpečení:
-
Zabezpečení na úrovni řádků vždy implementuji jako sérii pohledů, které zrcadlově zabalí každou tabulku a porovnají identitu uživatele (obvykle s Suser_Sname() nebo s jedním z dalších) se seznamem zabezpečení zakódovaným z bezpečnostního kódu v samotném řádku. Toto jsou Security-Views.
-
Vytvořte nové schéma nazvané [řádky], dejte jeho vlastníkovi přístup ke schématu [data] a nic jiného. Do tohoto schématu vložte všechna zobrazení zabezpečení.
-
Odeberte vlastníkovi [exec] přístup ke schématu [data] a místo toho mu udělte přístup k datům ke schématu [rows].
Hotovo. Nyní bylo implementováno zabezpečení na úrovni řádků transparentním vsunutím mezi sProcs a tabulky.
Nakonec zde je uložený procure, který mi pomáhá zapamatovat si, jak velká část těchto obskurních bezpečnostních věcí funguje a interaguje sama se sebou (jejda, opravená verze kódu ):
CREATE proc [TestCnxOnly].[spShowProc_Security_NoEX] as
--no "With Execute as Owner" for this version
--create User [UserNoLogin] without login
--Grant connect on database :: TestSecurity to Guest
--alter database TestSecurity set trustworthy on
--Show current user context:
select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (sproc)]
, suser_sname() as sname
, system_user as system_
--Execute As Login = 'UserNoLogin'
select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (after exec as)]
, suser_sname() as sname
, system_user as system_
EXEC('select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (in Exec(sql))]
, suser_sname() as sname
, system_user as system_')
EXEC sp_ExecuteSQL N'select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (in sp_Executesql)]
, suser_sname() as sname
, system_user as system_'
--Revert
select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (aftr revert)]
, suser_sname() as sname
, system_user as system_
[EDIT:opravená verze kódu)