Propriété de base de données TRUSTWORTHY

S'applique à : SQL Server Azure SQL Managed Instance

La propriété de base de données TRUSTWORTHY permet d’indiquer si l’instance de SQL Server approuve la base de données et son contenu. Par défaut, cette propriété a la valeur OFF, mais peut être définie sur ON à l'aide de l'instruction ALTER DATABASE. Par exemple : ALTER DATABASE AdventureWorks2022 SET TRUSTWORTHY ON;.

Remarque

Pour définir cette option, vous devez être membre du rôle serveur fixe sysadmin .

Nous vous recommandons de laisser la propriété de base de données TRUSTWORTHY définie sur OFF pour atténuer certaines menaces qui peuvent exister en raison de l’attachement d’une base de données qui contient l’un des objets suivants :

Les deux situations nécessitent un degré de privilège spécifique et sont protégées par des mécanismes appropriés lorsqu’elles sont utilisées dans le contexte d’une base de données déjà attachée à une instance de SQL Server. Toutefois, si la base de données est mise hors ligne, si vous avez accès au fichier de base de données, vous pouvez potentiellement l’attacher à une instance de SQL Server de votre choix et ajouter du contenu malveillant à la base de données. En cas de détachement et d'attachement de bases de données dans SQL Server, certaines autorisations sont définies dans des fichiers de données et des fichiers journaux pour restreindre l'accès aux fichiers de la base de données.

Dans la mesure où il est impossible de faire immédiatement confiance à une base de données qui est attachée à une instance de SQL Server, la base de données n'a pas le droit d'accéder aux ressources au-delà de son étendue tant qu'elle n'a pas été explicitement déclarée fiable. Par conséquent, si vous sauvegardez ou détachez une base de données qui a l’option TRUSTWORTHY ON et que vous attachez ou restaurez la base de données à la même instance SQL Server ou à une autre instance, la propriété TRUSTWORTHY est définie sur OFF lorsque la connexion ou la restauration est terminée. De plus, les modules conçus pour accéder aux ressources extérieures à la base de données et les assemblys dotés des autorisations EXTERNAL_ACCESS ou UNSAFE ont des exigences supplémentaires à respecter pour fonctionner correctement.

Remarque

Par défaut, le paramètre TRUSTWORTHY est défini sur ON pour la base de données msdb. Si vous modifiez ce paramètre par rapport à sa valeur par défaut, cela peut entraîner un comportement inattendu par les composants SQL Server qui utilisent la base de données msdb.

Si le paramètre TRUSTWORTHY est défini sur ON et si le propriétaire de la base de données est membre d’un groupe disposant d’informations d’identification d’administration, comme le groupe sysadmin, le propriétaire de la base de données peut ensuite être en mesure de créer et d’exécuter des assemblys non sécurisés qui peuvent compromettre l’instance de SQL Server.

Plus d’informations

Dans un environnement de fournisseur d’accès Internet (FAI) (par exemple, dans un service d’hébergement Web), chaque client est autorisé à gérer sa propre base de données et ne peut pas accéder aux bases de données système et aux autres bases de données utilisateur. Par exemple, les bases de données de deux entreprises concurrentes pourraient être hébergées par le même FAI et exister dans la même instance de SQL Server. Un code dangereux pourrait être ajouté à une base de données utilisateur lorsque la base de données est attachée à son instance d’origine, et le code serait activé sur l’instance ISP lorsque la base de données est déployée. Cette situation rend crucial le contrôle de l’accès inter-bases de données.

Si la même entité générale possède et gère chaque base de données, il n’est toujours pas recommandé d’établir une relation d’approbation avec une base de données, sauf si une fonctionnalité spécifique à l’application, telle qu’une communication inter-base de données Service Broker, est requise. Une relation de confiance entre les bases de données peut être établie en activant le chaînage des propriétés des bases de données croisées ou en marquant une base de données comme approuvée par l’instance à l’aide de la propriété TRUSTWORTHY. La colonne is_trustworthy_on de l’affichage catalogue sys.databases indique si une base de données a sa propriété TRUSTWORTHY définie.

Les meilleures pratiques pour la propriété et l’approbation de la base de données sont les suivantes :

  • Avoir des propriétaires distincts pour les bases de données. Toutes les bases de données ne doivent pas être détenues par l’administrateur système.
  • Limitez le nombre de propriétaires pour chaque base de données.
  • Confère une confiance sélective.
  • Laissez le paramètre de chaînage de propriétés de base de données croisée défini sur OFF, sauf si plusieurs bases de données sont déployées à une seule unité.
  • Migrez l’utilisation vers une approbation sélective au lieu d’utiliser la propriété TRUSTWORTHY.

L’exemple de code suivant peut être utilisé pour obtenir une liste des bases de données dont la propriété TRUSTWORTHY est définie sur ON et dont le propriétaire de base de données appartient au rôle serveur 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

Vous pouvez exécuter la requête suivante pour déterminer la propriété TRUSTWORTHY de la base de données 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

Si cette requête indique que la propriété TRUSTWORTHY est définie sur OFF, vous pouvez exécuter la requête suivante pour définir la propriété TRUSTWORTHY sur ON.

ALTER DATABASE msdb SET TRUSTWORTHY ON;
GO

Avertissement

Il existe des façons d’élever un utilisateur avec le rôle db_owner à devenir un sysadmin lors de la définition TRUSTWORTHY sur ON. Soyez prudent lors de l’utilisation de la propriété TRUSTWORTHY. Le code SQL suivant peut être utilisé pour obtenir une liste d’utilisateurs de base de données dans une base de données qui disposent du rôle 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

Étapes suivantes