Proprietà di database TRUSTWORTHY
Si applica a: SQL Server Istanza gestita di SQL di Azure
La proprietà del database TRUSTWORTHY
consente di indicare se l'istanza di SQL Server considera attendibile il database e il relativo contenuto. Per impostazione predefinita, questa impostazione è disattivata (OFF) ma può essere attivata (ON) usando l'istruzione ALTER DATABASE
. Ad esempio: ALTER DATABASE AdventureWorks2022 SET TRUSTWORTHY ON;
.
Nota
Per impostare questa opzione è necessario essere un membro del ruolo predefinito sysadmin del server.
È consigliabile lasciare la proprietà del database TRUSTWORTHY
impostata su OFF per prevenire determinate minacce che possono esistere a seguito del collegamento di un database contenente uno degli oggetti seguenti:
Assembly dannosi con un'impostazione di autorizzazione EXTERNAL_ACCESS o UNSAFE. Per altre informazioni, vedere Sicurezza per l'integrazione con CLR.
Moduli dannosi definiti in modo da essere eseguiti con un account utente con privilegi elevati. Per altre informazioni, vedere Clausola EXECUTE AS (Transact-SQL).
Entrambe le situazioni richiedono un livello di privilegi specifico e vengono evitate grazie a meccanismi appropriati quando vengono usati nel contesto di un database già collegato a un'istanza di SQL Server. Tuttavia, se il database è offline, se si dispone dell’accesso al file di database è possibile collegarlo a un'istanza arbitraria di SQL Server e aggiungere contenuti dannosi al database. Quando i database vengono scollegati e collegati in SQL Server, sui dati e sui file di log vengono impostate determinate autorizzazioni che limitano l'accesso ai file di database.
Poiché un database che viene collegato a un'istanza di SQL Server non può essere considerato immediatamente attendibile, non può accedere a risorse esterne al proprio ambito fino a quando viene contrassegnato esplicitamente come attendibile. Pertanto, se si esegue il backup o lo scollegamento di un database con l'opzione TRUSTWORTHY
impostata su ON e si collega o ripristina il database nella stessa o in un'altra istanza di SQL Server, la proprietà TRUSTWORTHY
viene impostata su OFF al termine del collegamento o del ripristino. Sono previsti, inoltre, ulteriori requisiti per l'esecuzione dei moduli progettati per l’accesso a risorse esterne al database e degli assembly con impostazione di autorizzazione EXTERNAL_ACCESS e UNSAFE.
Nota
Per impostazione predefinita, l'impostazione TRUSTWORTHY
è attivata (ON) per il database msdb
. Se si modifica il valore predefinito di questa impostazione, i componenti di SQL Server che usano il database msdb
potrebbero comportarsi in maniera imprevista.
Se l'impostazione TRUSTWORTHY
è attivata (ON) e il proprietario del database è membro di un gruppo che dispone di credenziali amministrative, ad esempio il gruppo sysadmin, il proprietario del database può creare ed eseguire assembly non sicuri che possono compromettere l'istanza di SQL Server.
Ulteriori informazioni
In un ambiente ISP (Internet Service Provider), ad esempio in un servizio di hosting Web, ogni cliente è autorizzato a gestire il proprio database e non può accedere ai database di sistema e ad altri database utente. Ad esempio, i database di due società concorrenti potrebbero essere ospitati dallo stesso ISP ed esistere nella stessa istanza di SQL Server. A un database utente potrebbe essere aggiunto codice pericoloso quando il database è collegato all'istanza originaria e il codice viene abilitato nell'istanza ISP quando il database viene implementato. Questa situazione rende fondamentale il controllo dell'accesso tra database.
Se la stessa entità generale è proprietaria e gestisce ogni database, è comunque sconsigliabile stabilire una relazione di trust con un database a meno che non sia necessaria una funzionalità specifica dell'applicazione, ad esempio una comunicazione tra database di Service Broker. È possibile stabilire una relazione di trust tra database abilitando il concatenamento della proprietà tra database o contrassegnando un database come attendibile dall'istanza usando la proprietà TRUSTWORTHY
. La colonna is_trustworthy_on
della vista catalogo sys.databases
indica se un database dispone del relativo insieme di proprietà TRUSTWORTHY
.
Le procedure consigliate per la proprietà e l'attendibilità del database includono quanto segue:
- Disporre di proprietari distinti per i database. Non tutti i database devono essere di proprietà dell'amministratore di sistema.
- Limitare il numero di proprietari per ogni database.
- Conferire l'attendibilità in modo selettivo.
- Lasciare l'impostazione catena di proprietà tra DB disattivata (OFF), a meno che non vengano distribuiti più database in una singola unità.
- Eseguire la migrazione all’attendibilità selettiva anziché usare la proprietà
TRUSTWORTHY
.
L'esempio di codice seguente può essere usato per ottenere un elenco di database con la proprietà TRUSTWORTHY
impostata su ON e il cui proprietario del database appartiene al ruolo del server 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
È possibile eseguire la query seguente per determinare la proprietà TRUSTWORTHY
del database msdb
:
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
Se questa query mostra che la proprietà TRUSTWORTHY
è impostata su OFF, è possibile eseguire la query seguente per impostare la proprietà TRUSTWORTHY
su ON.
ALTER DATABASE msdb SET TRUSTWORTHY ON;
GO
Avviso
Esistono vari modi per elevare un utente con il ruolo db_owner
affinché diventi un sysadmin
quando si imposta TRUSTWORTHY
su ON. Prestare attenzione quando si usa la proprietà TRUSTWORTHY
. Il codice SQL seguente può essere usato per ottenere un elenco di utenti del database in un database a cui viene concesso il ruolo db_owner
.
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