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?
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.
TRUNCATE
et utilise EXECUTE AS
pour que le SP s'exécute en tant qu'utilisateur que j'ai créé.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.
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.
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: