none
Proxyaccount für xp_cmdShell scheint nicht zu funktionieren RRS feed

  • 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 x64

    Wir 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 @stmt

    Nun erwarte ich, dass als Ergebnis folgende Zeile ausgegeben wird:
    USERNAME = domain\proxyaccount

    Tja - und genau da liegt das Problem, es wird nämlich ausgegeben:
    USERNAME = domain\serviceaccount

    Kann 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
    Montag, 2. August 2010 16:55

Antworten

  • Hallo Uwe,

    Die Umgebungsvariablen sind nicht  unbedingt zuverlässig,
    dass hängt davon ab, wie der Prozess unter Windows erzeugt wird

    Bevor ich mir hier einen Proxy einrichte, um zu überprüfen,
    ob USERNAME (u. a.) in solchen Fällen stimmt, verwende bitte mal

    xp_cmdshell 'whoami.exe'
    

    Gruß Elmar

    Dienstag, 3. August 2010 13:14
    Beantworter
  • 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
    Dienstag, 3. August 2010 14:28

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.mspx

    Einzige 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')
    
    Gruß Elmar

    Montag, 2. August 2010 18:19
    Beantworter
  • 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.mspx

    Einzige 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')
    
    
    Gruß Elmar

     


    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                   0

    Man 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
    Dienstag, 3. August 2010 12:27
  • Hallo Uwe,

    Die Umgebungsvariablen sind nicht  unbedingt zuverlässig,
    dass hängt davon ab, wie der Prozess unter Windows erzeugt wird

    Bevor ich mir hier einen Proxy einrichte, um zu überprüfen,
    ob USERNAME (u. a.) in solchen Fällen stimmt, verwende bitte mal

    xp_cmdshell 'whoami.exe'
    

    Gruß Elmar

    Dienstag, 3. August 2010 13:14
    Beantworter
  • 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
    Dienstag, 3. August 2010 14:28
  • 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

    Dienstag, 3. August 2010 14:41
    Beantworter