Der SQL Server-Agent beachtet die Berechtigungen "Ausführen als" nicht

7

Ich habe ein merkwürdiges Berechtigungsproblem. Kürzlich ist etwas passiert, das dazu geführt hat, dass vorhandene SQL Server-Agent-Jobs, die für die Ausführung als bestimmter Benutzer konfiguriert wurden, nicht mehr funktionieren. Sie arbeiteten zuvor; Sie werfen jetzt grundlegende Berechtigungsfehler aus (z. B. SELECT-Berechtigung verweigert).

Hier ist ein spezifischer Testfall. Der Benutzer johndoehat die sysadminRolle auf Serverebene. Die folgende Abfrage funktioniert einwandfrei, wenn sie johndoein SQL Server Management Studio ausgeführt wird:

select * from TableA into TableB

Wenn ich jedoch genau dieselbe Abfrage in einen einstufigen SQL Server-Agent-Job einfüge, wobei dieser Schritt so konfiguriert ist, dass er als Benutzer ausgeführt johndoewird, wird der folgende Fehler angezeigt.

Als Benutzer ausgeführt: johndoe. Die SELECT-Berechtigung wurde für das Objekt 'TableA', Datenbank 'MyDatabase', Schema 'dbo' verweigert. [SQLSTATE 42000] (Fehler 229). Der Schritt ist fehlgeschlagen.

Irgendwelche Vorschläge, was diese scheinbar spontane Veränderung verursacht haben könnte?

dlh
quelle
Etwas abseits der Mauer - hat Johndoe die entsprechenden Berechtigungen / Gruppenmitgliedschaften msdb, um Agent-Jobs auszuführen?
Simon Righarts
Erhalten Sie den gleichen Fehler für alle Agent-Jobs oder nur für diejenigen, die für die Ausführung als Johndoe konfiguriert sind? Ich würde einen neuen Benutzer erstellen, ihn der Sysadmin-Rolle hinzufügen und das gleiche Experiment versuchen. Versuchen Sie zumindest, das SQL Server Agent Service-Konto als möglichen Schuldigen auszuschließen.
Craig Efrein
Folgen Sie meiner ursprünglichen Frage ... Das Problem verschwand so mysteriös, wie es schien. Ich denke, etwas wurde aktualisiert oder neu gespeichert, aber ich kann nicht sagen, was.
dlh

Antworten:

3

Haben Sie überprüft, welcher SQL-Benutzer die Abfrage tatsächlich ausführt? Abhängig von der Berechtigungsstufe erlaubt SQL Agent dem Benutzer möglicherweise, sich als Konto einer höheren Ebene auszugeben.

Erstellen Sie einen Job mit dem T-SQL-Schritt:

SELECT ORIGINAL_LOGIN(), SUSER_NAME(), USER_NAME();

Erstellen Sie eine Protokollausgabe in einer Tabelle oder Textdatei und überprüfen Sie, welcher Benutzer die endgültige Abfrage tatsächlich ausführt. Wenn es nicht der Benutzer ist, von dem Sie denken, dass er es sein sollte, müssen Sie zurückverfolgen, um herauszufinden, woher der Identitätswechsel kommt.

Ich habe Probleme mit CRM Dynamics-Datenbanken mit gefilterten Ansichten festgestellt, in denen bestimmte CRM-Benutzer ihre gefilterten Daten sehen können. Wenn der Job einen Systemkonto-Identitätswechsel verwendet, werden keine Daten zurückgegeben, da das Systemkonto als CRM-Benutzer nicht vorhanden ist.

Stuart Moore
quelle
1

Als Benutzer ausgeführt : johndoe

Der EXECUETE AS-Kontext ist ein Benutzerkontext , kein Anmeldekontext . Als solches fällt es unter die Einschränkungen des EXECUTE AS-Sandboxing, siehe Erweitern des Datenbankidentitätswechsels durch Verwenden von EXECUTE AS :

Wenn Sie sich als Principal ausgeben, indem Sie die EXECUTE AS USER-Anweisung verwenden, oder innerhalb eines Moduls mit Datenbankbereich, indem Sie die EXECUTE AS-Klausel verwenden, ist der Umfang des Identitätswechsels standardmäßig auf die Datenbank beschränkt.

Insbesondere würde es keine von der Gruppenmitgliedschaft auf Serverebene abgeleitete Berechtigung erben, es sei denn, die Datenbank ist als vertrauenswürdig markiert . Sie können entweder [MyDatabase]als vertrauenswürdig markieren (wodurch jedes db_owner-Mitglied [MyDatabase]eines De-facto-Mitglieds von sysadmin mit allen Auswirkungen wird) oder dem Benutzer [johndoe] in explizit Berechtigungen erteilen [MyDatabase].

Remus Rusanu
quelle