Dienstag, 20. Oktober 2009

EXECUTE AS LOGIN mit deaktiviertem Account

Kürzlich habe ich eine weitere Überraschung mit EXECUTE AS LOGIN erlebt. Es ist nämlich durchaus möglich, die Impersonierung auch für einen deaktiviertes oder sogar gelöschtes Login durchzuführen. Hier ein Beispiel:

Ich lege unter Windows einen Benutzer „Test“ an, für den ich dann im SQL Server ein Login erzeuge. Anschließend lege ich für dieses Login einen Benutzer auf der Datenbank Northwind an und erteile ihm SELECT Berechtigungen. Hier das Skript dazu:

use [master]
go
create login [DeepThought\test] from windows
with default_database=[master]
go
use [northwind]
go
create user [DeepThought\test] for login [DeepThought\test]
go
use [northwind]
go
exec sp_addrolemember N'db_datareader', N'DeepThought\test'
go

Der Datenbankbenutzer [DeepThought\test] kann nun auf der Northwind Datenbank zum Beispiel Daten aus Tabellen abfragen. Durch EXECUTE AS LOGIN kann dies auch untetr einem anderen Login überprüft werden, und zwar so:

execute as login='DeepThought\test'
select * from Customers
revert

Die SELECT Anweisung funktioniert ohne Probleme.
Wenn nun das Login deaktiviert wird und dem Login außerdem die Berechtigung zum Anmelden verweigert wird, dann würde man ja vermuten, dass das obige SELECT im Kontext von EXECUTE AS LOGIN nicht mehr funktioniert. Das ist jedoch nicht so! Wenn ich das Login mit diesem Skript außer Kraft setze:

use [master]
go
deny connect sql to [DeepThought\test]
go
alter login [DeepThought\test] disable
go

Dann funktioniert die SELECT Anweisung im Kontext des deaktivierten Logins nach wie vor, obwohl eine Anmeldung in diesem Sicherheitskontext überhaupt nicht möglich ist! Nun könnte man ja argumentieren, dass es nicht darum geht, zu überprüfen, ob sich test überhaupt anmelden darf. EXECUTE AS LOGIN testet einfach, was im Sicherheitskontext der Anmeldung erlaubt wäre, wenn die Anmeldung denn erfolgreich verlaufen wäre. Mich hat es allerdings schon ein wenig verwirrt, denn ich verwende EXECUTE AS oftmals zum Testen und dieses Verhalten finde ich dann doch etwas seltsam.