Propriété de base de données TRUSTWORTHY

S’applique à :SQL ServerAzure SQL Managed Instance

La TRUSTWORTHY propriété de base de données est utilisée pour indiquer si l’instance de SQL Server approuve la base de données et le contenu qu’elle contient. Par défaut, ce paramètre est OFF, mais peut être défini sur ON à l’aide de l’instruction ALTER DATABASE . Par exemple : ALTER DATABASE AdventureWorks2022 SET TRUSTWORTHY ON;.

Note

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 définie sur OFF pour atténuer certaines menaces qui peuvent exister en raison de l’attachement TRUSTWORTHY 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’ils sont utilisés 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 connexion, si vous avez accès au fichier de base de données, vous pouvez éventuellement l’attacher à une instance de SQL Server de votre choix et ajouter du contenu malveillant à la base de données. Lorsque les bases de données sont détachées et jointes dans SQL Server, certaines autorisations sont définies sur les données et les fichiers journaux qui limitent l’accès aux fichiers de base de données.

Étant donné qu’une base de données attachée à une instance de SQL Server ne peut pas être approuvée immédiatement, la base de données n’est pas autorisée à accéder aux ressources au-delà de l’étendue de la base de données tant que la base de données n’est pas explicitement marquée comme 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 sur la même instance OU une autre instance SQL Server, la propriété est définie sur OFF lorsque l’attachement TRUSTWORTHY ou la restauration est terminé. En outre, les modules conçus pour accéder aux ressources en dehors de la base de données et les assemblys avec le paramètre d’autorisation EXTERNAL_ACCESS et UNSAFE ont des exigences supplémentaires pour s’exécuter correctement.

Note

Par défaut, le TRUSTWORTHY paramètre est défini sur ON pour la msdb base de données. 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 msdb base de données.

Si le TRUSTWORTHY paramètre 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 administratives, 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.

Informations complémentaires

Dans un environnement de fournisseur de services Internet (ISP) (par exemple, dans un service d’hébergement web), chaque client est autorisé à gérer sa propre base de données et est limité à l’accès aux bases de données système et à d’autres bases de données utilisateur. Par exemple, les bases de données de deux sociétés concurrentes peuvent être hébergées par le même isp et existent dans la même instance de SQL Server. Le code dangereux peut être ajouté à une base de données utilisateur lorsque la base de données est attachée à son instance d’origine, et le code est 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 entre bases de données Service Broker, est requise. Une relation d’approbation entre les bases de données peut être établie en activant le chaînage de propriétés inter-bases de données ou en marquant une base de données comme approuvée par l’instance à l’aide de la TRUSTWORTHY propriété. La is_trustworthy_on colonne de l’affichage sys.databases catalogue indique si une base de données a sa TRUSTWORTHY propriété 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 TRUSTWORTHY propriété.

L’exemple de code suivant peut être utilisé pour obtenir la liste des bases de données dont la propriété a la valeur ON et dont le TRUSTWORTHY propriétaire de la 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 TRUSTWORTHY propriété de la msdb base de données :

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 TRUSTWORTHY propriété est définie sur OFF, vous pouvez exécuter la requête suivante pour définir la TRUSTWORTHY propriété sur ON.

ALTER DATABASE msdb SET TRUSTWORTHY ON;
GO

Avertissement

Il existe des façons d’élever un utilisateur avec le db_owner rôle à devenir un sysadmin lors de la définition TRUSTWORTHY sur ON. Soyez prudent lors de l’utilisation de la TRUSTWORTHY propriété. 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 db_owner rôle.

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