Kürzlich habe ich EXECUTE AS LOGIN verwendet, um zu überprüfen, ob eine bestimmte Person eine Tabellenfunktion in einer unserer Datenbanken verwenden kann oder nicht. Die Tests zeigten, dass er konnte, aber er meldete wiederholt einen Fehler.
Die Person verwendet Login 'WEB', um eine Verbindung zur Datenbank herzustellen, und sie hat den Benutzer 'WEB' in dieser Datenbank, der mit Login 'WEB' verknüpft ist. Daher habe ich die folgenden Skripte ausprobiert:
-- part 1
EXECUTE AS USER = 'WEB'
GO
SELECT
USER_NAME() AS 'user_name'
,SUSER_NAME() AS 'suser_name'
,SUSER_SNAME() AS 'suser_sname'
,SYSTEM_USER AS 'system_user'
GO
REVERT
GO
und
-- part 2
EXECUTE AS LOGIN = 'WEB'
GO
SELECT
USER_NAME() AS 'user_name'
,SUSER_NAME() AS 'suser_name'
,SUSER_SNAME() AS 'suser_sname'
,SYSTEM_USER AS 'system_user'
GO
REVERT
GO
Der erste Teil war in Ordnung mit dem Ergebnis von:
WEB | WEB | WEB | NETZ
Das zweite Ergebnis war jedoch etwas verwirrend:
dbo | WEB | WEB | NETZ
Was ist der Unterschied zwischen EXECUTE AS USER und EXECUTE AS LOGIN, der den zweiten zum Scheitern bringt? Außerdem ist der erste natürlich die Datenbankebene und der zweite der Identitätswechsel auf Serverebene, was mir bekannt ist und was die Situation hier nicht erklärt.
quelle
Antworten:
Ein Mitglied einer
sysadmin
Gruppe wird immer zugeordnetdbo
, auch wenn es einen expliziten Benutzer in der Datenbank hat. Es sieht also so aus, als ob das LoginWEB
Mitglied von istsysadmin
und daher im zweiten FallUSER_NAME()
korrekt zurückgegebendbo
wird.quelle
sysadmin
Mitglied darstellen kann, wenn er dies wünscht. Daher ist die Berichtsanwendung ein De-facto-Systemadministrator. Dh. Dies ist ein möglicher Angriffsvektor für die Erhöhung von Berechtigungen. Er kann von einem Hacker oder wahrscheinlicher von Ihren Mitarbeitern verwendet werden.WEB
und vonWEB
dieser entfernt wurde,sysadmin
wird die Tür geschlossen. Aber es lohnt sich trotzdem zu überprüfen.