Benutzer mit den meisten Antworten
Proxyaccount für xp_cmdShell scheint nicht zu funktionieren

Frage
-
Hallo Gemeinde,
nach sehr langer Abstinenz und verzweifelter Suche nach den "klassischen" NG bin ich dann doch endlich hier gelandet, weil ich ein Problem habe, dass ich nicht ganz nachvollziehen kann:
Umgebung:
Microsoft Windows Server 2003 x64
SQL Server 2005 Enterprise x64Wir müssen für xp_cmdShell einen Proxyaccount einrichten um Sicherheitsrichtlinien einzuhalten.
Der SQL Server Dienst / Agent Dienst läuft unter einem Service-Account [Domain\ServiceAccount]
Als Proxyaccount verwenden wir den Account [Domain\ProxyAccount]Beide Accounts haben differenzierte Zugriffsrechte auf das Dateisystem des Servers - ist ja auch der primäre Hintergrund dieser Aktion!
Folgende Routine habe ich ablaufen lassen, um den Proxyaccount einzurichten:
EXEC
sp_xp_cmdshell_proxy_account 'Domain\ProxyAccount','Passwort'
Die Überprüfung hat ergeben, dass der User ##xp_cmdshell_proxy_account## angelegt wurde.
Als "normaler" User starte ich nun folgende Commands:
DECLARE @stmt nvarchar(2000)
SET @stmt = 'SET USERNAME'
EXEC xp_cmdShell @stmtNun erwarte ich, dass als Ergebnis folgende Zeile ausgegeben wird:
USERNAME = domain\proxyaccountTja - und genau da liegt das Problem, es wird nämlich ausgegeben:
USERNAME = domain\serviceaccountKann mir jemand einen Tipp geben, ob - und was - ich da noch was übersehen habe?
Herzlichen Dank für Eure Unterstützung
Uwe Ricken
- db Berater GmbH -
http://www.db-berater.de
db Berater GmbH
Antworten
-
Hallo Uwe,
Die Umgebungsvariablen sind nicht unbedingt zuverlässig,
dass hängt davon ab, wie der Prozess unter Windows erzeugt wirdBevor ich mir hier einen Proxy einrichte, um zu überprüfen,
ob USERNAME (u. a.) in solchen Fällen stimmt, verwende bitte malxp_cmdshell 'whoami.exe'
Gruß Elmar
- Als Antwort markiert Robert BreitenhoferModerator Montag, 9. August 2010 15:55
-
Servus Elmar,
BINGO - genau darauf bin ich gerade eben auch gestossen. Ich habe es aber auf eine etwas umständlichere Art und Weise heraus bekommen.
Ich habe einfach ein Verzeichnis anlegen lassen und anschließend überprüft, wer der Owner ist.
Es ist tatsächlich so, dass die Umgebungsvariable USERNAME einen "falschen" Wert herausgibt.Ich vermute, dass das "Prehandle" tatsächlich unter dem Account der SQL Engine erzeugt wird und dessen Umgebungsvariablen verwendet.
Nachdem ich den von Dir verwendeten Befehl (den kannte ich noch nicht!) ausgeführt habe, kam das richtige Ergebnis [Domain\Proxyaccount] heraus.
Herzlichen Dank für Deine Informationen - haben mir den richtigen Weg gezeigt.
Uwe Ricken Microsoft Certified Database Administrator SQL Server 2008 db Berater GmbH http://www.db-berater.de- Als Antwort markiert Robert BreitenhoferModerator Montag, 9. August 2010 15:55
Alle Antworten
-
Hallo Uwe,
schön, dass Deine Suche erfolgreich war und Du die Foren gefunden hast,
die NG werden (leider) zu Gunsten der Foren aufgegeben:
http://www.microsoft.com/germany/community/news/newsgroup_nntp_microsoft-foren.mspxEinzige naheliegende Erklärung wäre, dass der "normale Benutzer"
nicht ganz so normal ist und zur sysadmin Rolle gehört, siehe Beschreibung
zu xp_cmdshell und dort xp_cmdshell-Proxykonto. Was sagt ein:Gruß ElmarSELECT IS_SRVROLEMEMBER(N'sysadmin')
-
Hallo Uwe,
schön, dass Deine Suche erfolgreich war und Du die Foren gefunden hast,
die NG werden (leider) zu Gunsten der Foren aufgegeben:
http://www.microsoft.com/germany/community/news/newsgroup_nntp_microsoft-foren.mspxEinzige naheliegende Erklärung wäre, dass der "normale Benutzer"
nicht ganz so normal ist und zur sysadmin Rolle gehört, siehe Beschreibung
zu xp_cmdshell und dort xp_cmdshell-Proxykonto. Was sagt ein:SELECT IS_SRVROLEMEMBER(N'sysadmin')
Hallo Elmar,danke für die Info. Den von Dir benannten Hinweis kenne ich auch schon. Ich habe einen normalen Domain Account als Login und User hinzugefügt. Folgende Statements lasse ich laufen:
Statement / Ergebnis
-- Wer bin ich. Dient nur zur Kontrolle, da ich einmal als sysadmin und einmal normaler User bin
SELECT suser_sname(), IS_SRVROLEMEMBER('sysadmin')
domain\uwe_ricken 0Man kann erkennen, dass der Login keine besonderen Rechte hat. Ist auch nur in der Rolle public vorhanden!
Ich kann auch garantieren, dass der Account nicht in der lokalen Administratorengruppe auf dem Server
-- Mal sehen, was die Umgebungsvariable USERNAME ausgibt
EXEC master..xp_cmdShell 'SET USERNAME'OUTPUT: USERNAME = ServiceAccount des SQL Agent / SQL Engine
-- gut, dann versuchen wir mal, aus dem Verzeichnis zu lesen, in dem der Proxy-Account Leseberechtigungen besitzt
EXEC master..xp_cmdShell 'DIR C:\*.*'OUTPUT: Access is denied
Diese Felhlermeldung ist natürlich korrekt, da ja der Serviceaccount nicht die erforderlichen Berechtigungen besitzt. Zur Kontrolle habe ich auch noch einmal überprüft, ob der Proxyaccount existiert und ob die Berechtigungen korrekt sind.
Ich kann keine Fehler feststellen. Ev. muss ich das noch einmal auf meinem eigenen Rechner prüfen. Hier in einer Bankenumgebung ist alles sehr restriktiv!
db Berater GmbH -
Hallo Uwe,
Die Umgebungsvariablen sind nicht unbedingt zuverlässig,
dass hängt davon ab, wie der Prozess unter Windows erzeugt wirdBevor ich mir hier einen Proxy einrichte, um zu überprüfen,
ob USERNAME (u. a.) in solchen Fällen stimmt, verwende bitte malxp_cmdshell 'whoami.exe'
Gruß Elmar
- Als Antwort markiert Robert BreitenhoferModerator Montag, 9. August 2010 15:55
-
Servus Elmar,
BINGO - genau darauf bin ich gerade eben auch gestossen. Ich habe es aber auf eine etwas umständlichere Art und Weise heraus bekommen.
Ich habe einfach ein Verzeichnis anlegen lassen und anschließend überprüft, wer der Owner ist.
Es ist tatsächlich so, dass die Umgebungsvariable USERNAME einen "falschen" Wert herausgibt.Ich vermute, dass das "Prehandle" tatsächlich unter dem Account der SQL Engine erzeugt wird und dessen Umgebungsvariablen verwendet.
Nachdem ich den von Dir verwendeten Befehl (den kannte ich noch nicht!) ausgeführt habe, kam das richtige Ergebnis [Domain\Proxyaccount] heraus.
Herzlichen Dank für Deine Informationen - haben mir den richtigen Weg gezeigt.
Uwe Ricken Microsoft Certified Database Administrator SQL Server 2008 db Berater GmbH http://www.db-berater.de- Als Antwort markiert Robert BreitenhoferModerator Montag, 9. August 2010 15:55
-
Hallo Uwe,
Zeit gespart, denn gerade wollte ich mich dransetzen ;-)
Als Hintergrund-Information:
Die Übergabe des Environments wird bei CreateProcess (und seinen Derivaten)
über den lpEnvironment Parameter festgelegt.
Anscheinend wird beim SQL Server die ursprüngliche Umgebung übergeben.Gruß Elmar