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:

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

Passaggi successivi