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 :
Assemblys malveillants dotés d'une autorisation EXTERNAL_ACCESS ou UNSAFE. Pour plus d’informations, consultez Sécurité de l’intégration du CLR.
Modules malveillants définis dans le but de s'exécuter en tant qu'utilisateurs à privilèges élevés. Pour plus d’informations, consultez Clause EXECUTE AS (Transact-SQL).
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