web-dev-qa-db-fra.com

Utilisation des autorisations IMPERSONATE dans SQL Server?

Au cours d'une lecture, j'ai pris connaissance des autorisations d'emprunt d'identité. D'après ce que j'ai lu, cela ressemble plus à la création d'une copie de l'utilisateur avec tous les niveaux d'autorisation sous un nom différent. Je comprends que cela peut être utilisé pour exécuter des requêtes sous une connexion différente, mais à quoi sert-il finalement?

Pourquoi cette fonctionnalité a-t-elle été introduite?

5
karun_r

Personnellement, j'utilise l'emprunt d'identité pour trois grandes catégories de tâches.

Test Si j'ai besoin de tester quel accès a quelqu'un, je peux l'emprunter, essayez la tâche et voyez si cela fonctionne. Ceci est particulièrement utile lorsque j'ai accordé des autorisations mais que l'utilisateur me dit toujours qu'il ne peut pas effectuer une tâche donnée.

Collecte d'informations Il existe un certain nombre de vues/fonctions système qui vous donnent des informations sur les autorisations des principaux de connexion (même certaines informations AD). Par exemple, si j'emprunte l'identité d'un principal de la base de données (utilisateur) et que j'interroge sys.user_token, je peux obtenir une liste de tous les groupes AD dont ils sont membres et lesquels leur donnent accès à la base de données actuelle.

Accorder l'accès à une tâche sans accorder l'autorisation Un exemple spécifique ici est la possibilité de tronquer une table. Pour tronquer une table, vous devez disposer de l'autorisation ALTER sur la table. Je veux laisser certains tronquer ce tableau, mais je ne veux pas risquer qu'ils y apportent des modifications.

  1. Créer un principal de base de données (utilisateur) qui a une modification sur la table
  2. Créez une procédure stockée qui fait le TRUNCATE et utilise EXECUTE AS pour que le SP s'exécute en tant qu'utilisateur que j'ai créé.
  3. Accordez des autorisations d'exécution à la procédure stockée.

Vous pouvez même utiliser cette technique pour accorder autorisations de niveau sysadmin bien qu'il ait ses propres difficultés et risques.

Modifier:

Je peux voir deux raisons possibles pour lesquelles vous pourriez accorder à quelqu'un des droits d'emprunt d'identité.

Séparez les autorisations des applications des autorisations d'accès direct

ApplicationA requiert que l'utilisateur Joe ait accès à la lecture à partir de n'importe quelle table. Mais dans le cadre de ses responsabilités, Joe doit également mettre à jour une table d'état au cas où quelque chose devrait être réécrit. En accordant des autorisations de mise à jour à l'utilisateur UpdatePerms et en lui accordant un accès à l'identité, il peut se connecter à SSMS, emprunter l'identité de cet utilisateur et mettre à jour la table. Cela signifie qu'il n'a pas accès à la mise à jour via l'application, mais peut toujours effectuer cette tâche occasionnelle.

Nécessite une réflexion/action supplémentaire avant d'effectuer une tâche

Similaire à ci-dessus. Joe doit être en mesure de supprimer des lignes d'une table, mais vous ne voulez pas qu'il le fasse par accident (ou du moins rend les choses plus difficiles). En exigeant qu'il usurpe l'identité d'un autre utilisateur avant d'effectuer la suppression, il doit au moins y penser un peu plus fort, ce qui risque moins de se produire par erreur.

Remarque: Je n'ai jamais eu à faire cela en production. Cela semble être des possibilités logiques.

6
Kenneth Fisher

Vous pouvez autoriser un utilisateur à exécuter un processus stocké étendu ou toute autre opération privilégiée, mais uniquement dans certaines circonstances.

Écrivez une procédure stockée qui contient EXECUTE AS qui effectue l'opération privilégiée, puis accordez à l'utilisateur des autorisations sur cette procédure stockée. De cette façon, ils ne peuvent effectuer cette opération privilégiée que dans le contexte de cette procédure stockée, que vous avez écrite pour effectuer une opération strictement limitée.

3
R Evans

Ajoutant à ce qui a déjà été dit dans les deux autres réponses (par @KennethFisher et @REvans), l'autorisation IMPERSONATE permet également à un utilisateur qui n'est ni dans le rôle de base de données dbo ou sysadmin rôle serveur la possibilité de définir la propriété AUTHORIZATION d'un objet (celui qui a cette propriété, pas tous) à un utilisateur autre qu'eux-mêmes. Par exemple:

CREATE Assembly [AnnoyTsqlPurists]
  AUTHORIZATION [SomeoneElse]
  FROM 0x4D59.........................;

Pour clarifier/modifier ce que les autres ont dit concernant l'élévation limitée des autorisations via EXECUTE AS, il convient de noter que EXECUTE AS n'est pas obligé de faire de telles choses, du moins plus. En utilisant EXECUTE AS est le chemin le plus facile, car il donne à un utilisateur ou à un identifiant la possibilité d'agir comme un autre utilisateur ou identifiant ne contrôle pas le contexte de quand EXECUTE AS peut être émis. Signification, prenez l'exemple de User_A étant accordé IMPERSONATE User_B dans le but de pouvoir faire quelque chose comme TRUNCATE TABLE, puis accordé EXECUTE sur une procédure stockée qui a à la fois le EXECUTE AS User = 'User_B'; et TRUNCATE TABLE déclarations en elle. Ça marche. Cependant, cela n'empêche pas User_A en cours d'exécution EXECUTE AS User = 'User_B'; quand ils le souhaitent, même en dehors de cette procédure stockée spécifique. Et si vous devez accorder à quelqu'un une autorisation plus générale, telle que VIEW SERVER STATE, ils peuvent alors se faire passer pour cet utilisateur "élevé" pour utiliser cette autorisation élevée en dehors de l'application souhaitée la plus probable et plus restreinte de cette autorisation, comme obtenir des données d'un DMV particulier, pas tous DMV qui nécessitent cette autorisation.

Heureusement, il existe un mécanisme qui permet d'être très granulaire et explicite lorsque vous voulez/devez autoriser des utilisateurs non privilégiés à faire des "trucs" de niveau supérieur: module signature. En utilisant cette approche, vous configurez une connexion et/ou un utilisateur (basé sur une clé asymétrique ou basé sur un certificat) qui détient les autorisations souhaitées, mais cette connexion et/ou cet utilisateur ne peut pas être emprunté car il ne peut pas se connecter. Ensuite, vous associez la connexion et/ou l'utilisateur à un ou plusieurs modules (procédure stockée, fonction (hors TVF en ligne), déclencheur ou assemblage) via ADD SIGNATURE. Enfin, accordez EXECUTE sur le ou les modules aux utilisateurs non privilégiés. Désormais, les utilisateurs non privilégiés n'ont pas accès à la source des autorisations élevées.

Pour plus de détails, veuillez consulter mes deux réponses suivantes (et leurs liens vers encore plus de réponses), également ici sur DBA.SE:

2
Solomon Rutzky