Sécurité d'accès du code de l'intégration du CLR
Le Common Language Runtime (CLR) prend en charge un modèle de sécurité appelé sécurité d'accès du code pour le code managé. Dans ce modèle, les autorisations sont accordées aux assemblys selon l'identité du code. Pour plus d'informations, consultez la section relative à la sécurité d'accès du code dans le kit de développement logiciel (SDK) .NET Framework.
La stratégie de sécurité qui détermine les autorisations accordée aux assemblys est définie dans trois emplacements différents :
Stratégie de l'ordinateur : il s'agit de la stratégie appliquée pour tout le code managé qui s'exécute sur l'ordinateur sur lequel SQL Server est installé.
Stratégie de l'utilisateur : il s'agit de la stratégie appliquée pour le code managé hébergé par un processus. Pour SQL Server, la stratégie de l'utilisateur est spécifique au compte Windows sur lequel le service SQL Server s'exécute.
Stratégie de l'hôte : il s'agit de la stratégie configurée par l'hôte du CLR (dans ce cas, SQL Server) qui est appliquée pour le code managé qui s'exécute sur cet hôte.
Le mécanisme de sécurité d'accès du code pris en charge par le CLR est basé sur la supposition que le module d'exécution peut héberger à la fois du code d'un niveau de confiance total et d'un niveau de confiance partiel. Les ressources protégées par la sécurité d'accès du code CLR sont généralement intégrées à des interfaces de programmation d'applications managées qui requièrentl'autorisation correspondante avant d'accorder l'accès à la ressource. La demanded'autorisation est satisfaite seulement si tous les appelants (au niveau de l'assembly) de la pile d'appels possèdent l'autorisation pour la ressource correspondante.
Le jeu d'autorisations de sécurité d'accès du code accordées au code managé en cas d'exécution à l'intérieur de SQL Server est l'intersection du jeu d'autorisations accordées par les trois niveaux de stratégie précités. Même si SQL Server accorde un jeu d'autorisations à un assembly chargé dans SQL Server, le jeu éventuel d'autorisations accordées au code utilisateur peut être restreint davantage par les stratégies de l'utilisateur et de l'ordinateur.
Jeux d'autorisations au niveau stratégie de l'hôte de SQL Server
Le jeu d'autorisations de sécurité d'accès du code accordées aux assemblys par le niveau de stratégie de l'hôte SQL Server est déterminé par le jeu d'autorisations spécifié lors de la création de l'assembly. Il existe trois jeux d'autorisations : SAFE, EXTERNAL_ACCESS et UNSAFE (spécifiées à l'aide de l'option PERMISSION_SET deCREATE ASSEMBLY (Transact-SQL)).
SQL Server fournit un niveau de stratégie de sécurité au niveau de l'hôte au CLR (Common Language Runtime) quand il l'héberge ; cette stratégie est un niveau de stratégie supplémentaire sous les deux niveaux de stratégie qui sont toujours effectifs. Cette stratégie est définie pour chaque domaine d'application qui est créé par SQL Server. Cette stratégie n'est pas destinée au domaine d'application par défaut appliqué lorsque SQL Server crée une instance du CLR.
La stratégie de niveau hôte de SQL Server est une combinaison de la stratégie fixe de SQL Server pour les assemblys système et de la stratégie spécifiée par l'utilisateur pour les assemblys utilisateur.
La stratégie fixe pour les assemblys CLR et les assemblys système SQL Server leur accorde une confiance totale.
La partie spécifiée par l'utilisateur de la stratégie de l'hôte SQL Server est basée sur le propriétaire de l'assembly spécifiant un des trois compartiments d'autorisation pour chaque assembly. Pour plus d'informations sur les autorisations de sécurité répertoriées ci-dessous, consultez le kit de développement logiciel SDK .NET Framework.
SAFE
Seul un accès aux données local et au calcul interne est autorisé. SAFE est le jeu d'autorisations le plus restrictif. Le code exécuté par un assembly à l'aide des autorisations SAFE ne peut pas accéder aux ressources système externes telles que les fichiers, le réseau, les variables d'environnement ou le Registre.
Les assemblys SAFE ont les autorisations et valeurs suivantes :
Autorisation |
Valeur(s)/description |
---|---|
SecurityPermission |
Execution: autorisation pour exécuter le code managé. |
SqlClientPermission |
Context connection = true, context connection = yes: seule la connexion contextuelle peut être utilisée et la chaîne de connexion peut spécifier uniquement une valeur de « context connection=true » ou « context connection=yes ». AllowBlankPassword = false: les mots de passe vierges ne sont pas autorisés. |
EXTERNAL_ACCESS
Les assemblys EXTERNAL_ACCESS ont les mêmes autorisations que les assemblys SAFE , avec la capacité supplémentaire d'accéder aux ressources système externes telles que les fichiers, réseaux, variables d'environnement et le Registre.
Les assemblys EXTERNAL_ACCESS ont également les autorisations et valeurs suivantes :
Autorisation |
Valeur(s)/description |
---|---|
DistributedTransactionPermission |
Unrestricted: les transactions distribuées sont autorisées. |
DNSPermission |
Unrestricted: autorisation de demander des informations auprès de serveurs de noms de domaines. |
EnvironmentPermission |
Unrestricted: l'accès complet aux variables du système et de l'environnement utilisateur est accordé. |
EventLogPermission |
Administer: les actions suivantes sont autorisées : création d'une source d'événement, lecture de journaux existants, suppression de sources d'événements ou de journaux, réponse aux entrées, effacement d'un journal des événements, écoute des événements et accès à une collection de tous les journaux des événements. |
FileIOPermission |
Unrestricted: l'accès complet aux fichiers et aux dossiers est accordé. |
KeyContainerPermission |
Unrestricted: l'accès complet aux conteneurs de clés est accordé. |
NetworkInformationPermission |
Access: l'exécution de requêtes ping est autorisée. |
RegistryPermission |
Autorise des droits de lecture à HKEY_CLASSES_ROOT, HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER, HKEY_CURRENT_CONFIG et HKEY_USERS. |
SecurityPermission |
Assertion: possibilité de déclarer que tous les appelants de ce code ont l'autorisation requise pour l'opération. ControlPrincipal: possibilité de manipuler l'objet principal Execution: autorisation d'exécuter le code managé. SerializationFormatter: possibilité de fournir des services de sérialisation. |
SmtpPermission |
Access: les connexions sortantes au port 25 hôte SMTP sont autorisées. |
SocketPermission |
Connect: les connexions sortantes (tous les ports, tous les protocoles) sur une adresse de transport sont autorisées. |
SqlClientPermission |
Unrestricted: l'accès complet à la source de données est accordé. |
StorePermission |
Unrestricted: l'accès complet aux magasins de certificats X.509 est accordé. |
WebPermission |
Connect: les connexions sortantes aux ressources Web sont autorisées. |
UNSAFE
UNSAFE offre aux assemblys un accès sans restriction aux ressources, à la fois à l'intérieur et à l'extérieur de SQL Server. Le code qui s'exécute dans un assembly UNSAFE peut également appeler du code non managé.
Les assemblys UNSAFE dispose de l'approbation FullTrust.
Remarque relative à la sécurité |
---|
SAFE est le paramètre recommandé pour les autorisations des assemblys qui effectuent des calculs et des tâches de gestion des données sans accéder à des ressources en dehors de SQL Server. EXTERNAL_ACCESS est recommandé pour les assemblys qui accèdent à des ressources en dehors de SQL Server. Par défaut, les assemblys EXTERNAL_ACCESS s'exécutent en tant que compte de service SQL Server. Le code EXTERNAL_ACCESS peut explicitement emprunter l'identité du contexte de sécurité d'Authentification Windows de l'appelant. Étant donné que la valeur par défaut est l'exécution en tant que compte de service SQL Server, l'autorisation d'exécuter EXTERNAL_ACCESS ne doit être accordée qu'aux connexions habilitées à s'exécuter en tant que compte de service. Du point de vue de la sécurité, les assemblys EXTERNAL_ACCESS et UNSAFE sont identiques. Toutefois, les assemblys EXTERNAL_ACCESS fournissent différentes protections en matière de fiabilité et de robustesse absentes des assemblys UNSAFE. Si vous indiquez UNSAFE, le code au sein de l'assembly peut effectuer des opérations illégales à l'encontre de l'espace de traitement SQL Server. C'est ainsi que la robustesse et l'évolutivité de SQL Server risquent d'être compromises. Pour plus d'informations sur la création d'assemblys dans SQL Server, consultez Gestion des assemblys d'intégration du CLR. |
Accès aux ressources externes
Si un type défini par l'utilisateur (UDT), une procédure stockée ou autre type d'assembly de construction est inscrit avec le jeu d'autorisations SAFE, le code managé qui s'exécute dans la construction ne peut pas accéder aux ressources externes. Toutefois, si le jeu d'autorisations EXTERNAL_ACCESS ou UNSAFE est spécifié et que le code managé tente d'accéder aux ressources externes, SQL Server applique les règles suivantes :
Si |
Alors |
---|---|
Le contexte d'exécution correspond à une connexion SQL Server. |
Les tentatives d'accéder aux ressources externes sont refusées et une exception de sécurité est levée. |
Le contexte d'exécution correspond à une connexion Windows et le contexte d'exécution est l'appelant d'origine. |
La ressource externe est accédée sous le contexte de sécurité du compte de service SQL Server. |
L'appelant n'est pas l'appelant d'origine. |
L'accès est refusé et une exception de sécurité est levée. |
Le contexte d'exécution correspond à une connexion Windows et est l'appelant d'origine, et l'identité de l'appelant a été empruntée. |
L'accès s'effectue en utilisant le contexte de sécurité de l'appelant plutôt que le compte de service. |
Synthèse des jeux d'autorisations
Le graphique suivant résume les restrictions et autorisations accordées aux jeux d'autorisations SAFE, EXTERNAL_ACCESS et UNSAFE.
SAFE |
EXTERNAL_ACCESS |
UNSAFE |
|
Code Access Security Permissions |
Exécution uniquement |
Exécution + accès aux ressources externes |
Illimité (y compris P/Invoke) |
Programming model restrictions |
Oui |
Oui |
Aucune restriction |
Verifiability requirement |
Oui |
Oui |
Non |
Local data access |
Oui |
Oui |
Oui |
Ability to call native code |
Non |
Non |
Oui |