Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
azure SQL Managed Instance
Vlastnost TRUSTWORTHY databáze se používá k označení, zda instance SYSTÉMU SQL Server důvěřuje databázi a obsahu v ní. Ve výchozím nastavení je toto nastavení vypnuté, ale můžete ho nastavit na ZAPNUTO pomocí příkazu ALTER DATABASE . Například: ALTER DATABASE AdventureWorks2022 SET TRUSTWORTHY ON;.
Poznámka:
Chcete-li nastavit tuto možnost, musíte mít CONTROL SERVER oprávnění nebo být členem pevné role serveru správce systému .
Pokud chcete zmírnit určité hrozby, které mohou existovat v důsledku připojení databáze, která obsahuje jeden z následujících objektů, doporučujeme ponechat TRUSTWORTHY vlastnost databáze nastavenou na hodnotu VYPNUTO:
Škodlivá sestavení s nastavením oprávnění EXTERNAL_ACCESS nebo NEBEZPEČNÉ. Další informace najdete v tématu Zabezpečení integrace CLR.
Škodlivé moduly definované tak, aby se spouštěly jako vysoce privilegovaní uživatelé. Další informace naleznete v tématu EXECUTE AS – klauzule (Transact-SQL).
Obě situace vyžadují určitý stupeň oprávnění a jsou chráněny příslušnými mechanismy, pokud se používají v kontextu databáze, která je již připojena k instanci SQL Serveru. Pokud je však databáze přepnuta do offline režimu, můžete ji potenciálně připojit k instanci SQL Serveru podle vašeho výběru a přidat do databáze škodlivý obsah. Pokud jsou databáze odpojené a připojené v SQL Serveru, jsou určitá oprávnění nastavena na data a soubory protokolů, které omezují přístup k databázovým souborům.
Vzhledem k tomu, že databáze připojená k instanci SQL Serveru nemůže být okamžitě důvěryhodná, není přístup k prostředkům nad rámec databáze, dokud databáze není explicitně označena jako důvěryhodná. Proto pokud zálohujete nebo odpojete databázi, která má TRUSTWORTHY možnost ZAPNUTO, a databázi připojíte nebo obnovíte do stejné nebo jiné instance SQL Serveru, TRUSTWORTHY vlastnost je při připojení nebo obnovení nastavena na VYPNUTO. Moduly, které jsou navržené pro přístup k prostředkům mimo databázi a sestavení s nastavením oprávnění EXTERNAL_ACCESS a NEBEZPEČNÉ, mají další požadavky na úspěšné spuštění.
Poznámka:
Ve výchozím nastavení je pro databázi msdb nastavení TRUSTWORTHY zapnuté. Pokud toto nastavení změníte z výchozí hodnoty, může dojít k neočekávanému chování komponent SYSTÉMU SQL Server, které databázi používají msdb .
TRUSTWORTHY Pokud je nastavení zapnuté a vlastník databáze je členem skupiny, která má přihlašovací údaje správce, jako je skupina sysadmin, může pak vlastník databáze vytvořit a spustit nebezpečná sestavení, která můžou ohrozit instanci SQL Serveru.
Více informací
V prostředí poskytovatele internetových služeb (například ve službě pro hostování webů) může každý zákazník spravovat vlastní databázi a má omezený přístup k systémovým databázím a jiným uživatelským databázím. Například databáze dvou konkurenčních společností mohou být hostovány stejným isP a existují ve stejné instanci SQL Serveru. Nebezpečný kód může být přidán do uživatelské databáze, když je databáze připojena k původní instanci, a kód by byl povolen v instanci poskytovatele internetových služeb při nasazení databáze. Tato situace má zásadní význam pro řízení přístupu mezi databázemi.
Pokud stejná obecná entita vlastní a spravuje každou databázi, není stále vhodné vytvořit vztah důvěryhodnosti s databází, pokud není vyžadována funkce specifická pro aplikaci, jako je komunikace služby Service Broker mezi databázemi. Vztah důvěryhodnosti mezi databázemi lze vytvořit povolením řetězení vlastnictví mezi databázemi nebo označením databáze jako důvěryhodné pro instanci pomocí TRUSTWORTHY vlastnosti. Sloupec is_trustworthy_onsys.databases zobrazení katalogu označuje, jestli má databáze nastavenou vlastnost TRUSTWORTHY .
Mezi osvědčené postupy pro vlastnictví databáze a důvěryhodnost patří:
- Mít samostatné vlastníky databází. Ne všechny databáze by měl vlastnit správce systému.
- Omezte počet vlastníků pro každou databázi.
- Udělte důvěru selektivně.
- Nastavení řetězení vlastnictví napříč databázemi ponechte nastavené na VYPNUTO, pokud není na jedné jednotce nasazeno více databází.
- Migrujte použití na selektivní důvěryhodnost místo použití vlastnosti
TRUSTWORTHY.
Následující vzorový kód lze použít k získání seznamu databází, které mají vlastnost nastavenou TRUSTWORTHY na ZAPNUTO a jejíž vlastník databáze patří do role serveru sysadmin .
SELECT SUSER_SNAME(owner_sid) AS DBOWNER,
d.name AS DATABASENAME
FROM sys.server_principals r
INNER JOIN sys.server_role_members m ON r.principal_id = m.role_principal_id
INNER JOIN sys.server_principals p ON p.principal_id = m.member_principal_id
INNER JOIN sys.databases d ON suser_sname(d.owner_sid) = p.name
WHERE is_trustworthy_on = 1
AND d.name NOT IN ('msdb')
AND r.type = 'R'
AND r.name = N'sysadmin';
GO
Spuštěním následujícího dotazu můžete určit TRUSTWORTHY vlastnost msdb databáze:
SELECT name,
trustworthy_setting = CASE is_trustworthy_on
WHEN 1 THEN 'Trustworthy setting is ON for msdb'
ELSE 'Trustworthy setting is OFF for msdb'
END
FROM sys.databases
WHERE database_id = 4;
GO
Pokud tento dotaz ukazuje, že TRUSTWORTHY vlastnost je nastavena na HODNOTU VYPNUTO, můžete spuštěním následujícího dotazu nastavit TRUSTWORTHY vlastnost na ZAPNUTO.
ALTER DATABASE msdb SET TRUSTWORTHY ON;
GO
Výstraha
Existují způsoby, jak povýšit uživatele s db_owner rolí na sysadmin, když je TRUSTWORTHY zapnuto. Při použití TRUSTWORTHY vlastnosti buďte opatrní. Následující kód SQL lze použít k získání seznamu uživatelů databáze v databázi, která má tuto db_owner roli.
SELECT roles.principal_id AS RolePrincipalID
, roles.name AS RolePrincipalName
, database_role_members.member_principal_id AS MemberPrincipalID
, members.name AS MemberPrincipalName
FROM sys.database_role_members AS database_role_members
JOIN sys.database_principals AS roles
ON database_role_members.role_principal_id = roles.principal_id
JOIN sys.database_principals AS members
ON database_role_members.member_principal_id = members.principal_id where roles.name='db_owner' and members.name <>'dbo'
GO