J'ai des utilisateurs qui voient un serveur lié qu'ils ne sont pas censés voir.
Le serveur lié est défini de sorte que seul j'y ai accès, mais tout le monde peut le voir et l'utiliser.
J'ai créé le nouveau serveur lié en suivant les étapes suivantes:
Server Objects
, Cliquez avec le bouton droit sur Linked Servers
Et cliquez avec le bouton gauche sur New Linked Server...
General
, choisissez SQL Server
Pour Server type
Et écrivez le nom du serveurSecurity
dans la partie supérieure, cliquez sur Add
, choisissez "sa" comme Local Login
, Entrez le nom de Remote User
Et Remote Password
Security
dans la partie inférieure (sous For a login not defined in the list above, connections will:
), Choisissez la première option: Not be made
OK
et lancez les testsMaintenant, la seule personne censée voir le serveur lié est moi ("sa"), mais d'une manière ou d'une autre les autres utilisateurs peuvent le voir et l'utiliser.
Remarque 1: les utilisateurs qui peuvent utiliser le serveur lié ont des autorisations sur le serveur distant, ils ne voient pas les données qu'ils ne devraient pas voir, ils peuvent simplement y accéder à partir du serveur lié alors qu'ils ne devraient pas pouvoir.
Remarque 2: je suis le seul sysadmin
sur les deux instances.
Il n'y a aucun moyen de "cacher" un serveur lié ou d'empêcher les utilisateurs non autorisés de essayer de l'utiliser. Tout ce que vous pouvez contrôler, c'est s'ils ont réellement accès de l'autre côté. Un serveur lié en soi n'est pas un objet réel; comme un synonyme, vous n'accordez pas l'accès à l'alias, uniquement aux éléments auxquels il fait référence.
Essayez-le et vous verrez que certaines de vos hypothèses (par exemple, "une connexion ... ne peut pas voir le serveur lié dans l'Explorateur d'objets") sont fausses. J'ai fait ça:
sys.servers
pour voir la liste des serveurs liés.J'ai pu exécuter la requête suivante sans problème:
SELECT name FROM [linked server].master.sys.objects;
Cependant, je n'ai pas pu exécuter de requêtes sur des bases de données non système, car je n'avais pas accordé d'accès explicite à une base de données non système ou aux objets à l'intérieur. Par exemple.:
SELECT SalesOrderID FROM [linked server].AdventureWorks2012.Sales.SalesOrderHeader;
A généré cette erreur:
Msg 7314, niveau 16, état 1, ligne 1
Le fournisseur de base de données OLE "SQLNCLI11" pour le serveur lié "serveur lié" ne contient pas la table "" AdventureWorks2012 "." Sales "." SalesOrderHeader "". La table soit n'existe pas ou l'utilisateur actuel n'a pas d'autorisations sur cette table.
Je m'attends à ce que vous puissiez obtenir des résultats plus restrictifs en refusant explicitement l'accès à des objets spécifiques sur le serveur lié (ou par DENY CONNECT SQL
à cette connexion), mais cela ne limite pas son effet au serveur lié; elle affecte également les connexions directes.
En tout cas, je ne vois pas l'intérêt de ce que vous essayez d'accomplir: