Serveur lié disponible pour les utilisateurs sans autorisations

9

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:

  1. Connectez SSMS Object Explorer à l'instance SQL Server
  2. Développer Server Objects, clic droit Linked Serverset clic gaucheNew Linked Server...
  3. Sous l' Generalonglet choisissez SQL Serverpour Server typeet écrire le nom du serveur
  4. Sous l' Securityonglet dans la partie supérieure Add, cliquez sur , choisissez "sa" as Local Login, entrez Remote Userle nom deRemote Password
  5. Sous l' Securityonglet 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
  6. Cliquez OKet commencez les tests

Maintenant, 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 sysadmindans les deux cas.

Roi Gavish
la source
1
Eh bien, vous ne pouvez pas vraiment cacher le serveur lié, mais quand ils essaient de l'utiliser, si leur contexte de connexion actuel n'a aucune autorisation à l'autre extrémité ...
Aaron Bertrand
@AaronBertrand Vous pouvez masquer un serveur lié simplement en ne lui donnant pas accès. Une connexion qui n'est pas définie dans la liste des connexions autorisées et qui n'est pas un administrateur système ne peut pas voir le serveur lié dans l'explorateur d'objets.
Roi Gavish
@AaronBertrand Si leur contexte de connexion actuel dispose d'autorisations à l'autre extrémité, ils ne sont toujours pas censés pouvoir se connecter via le serveur lié s'ils n'y sont pas autorisés.
Roi Gavish
1
Non, vous ne pouvez pas masquer le serveur lié de cette façon. Avez-vous essayé cela?
Aaron Bertrand

Réponses:

7

Il n'existe aucun moyen de «masquer» un serveur lié ou d'empêcher des utilisateurs non autorisés d' 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:

  1. A créé une connexion et n'a accordé aucun privilège, juste CONNECTER / rôle public.
  2. A créé un serveur lié et n'a pas ajouté cette connexion à la liste des connexions.
  3. Ouverture d'une nouvelle instance de Management Studio, connexion avec cette connexion.
  4. J'ai pu voir tous les serveurs liés sous Objets serveur> Serveurs liés.
  5. J'ai également pu interroger sys.serverspour 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 OLE DB "SQLNCLI11" pour le serveur lié "serveur lié" ne contient pas la table "" AdventureWorks2012 "." Sales "." SalesOrderHeader "". La table 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 SQLcette connexion tout à fait), 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:

  1. Si l'utilisateur n'a pas accès de l'autre côté, quel mal y a-t-il à le laisser essayer ? (Vous pourriez avoir plus de chance de leur dire de ne pas le faire et de les auditer que d'essayer de les empêcher d'essayer en premier lieu.)
  2. Si l'utilisateur ne l' accès de l'autre côté, pourquoi ne peuvent - ils utiliser le serveur lié?
Aaron Bertrand
la source
2

Vous pouvez utiliser la première option "Ne pas être fait avec" un mappage de connexion comme ci-dessous:

entrez la description de l'image ici

Voici le résultat avec la connexion mappée:

entrez la description de l'image ici

Et voici ce qui se passe avec un autre compte

entrez la description de l'image ici

PollusB
la source