Überprüfen Sie, ob ein bestimmter Benutzer über ein bestimmtes Privileg verfügt

16

Wenn ich ein Benutzerpaar und ein Privileg habe, muss ich feststellen, ob ein Benutzer das Privileg auf dem Server hat. In meinem Setup gilt Folgendes:

  • Der Server ist Teil einer Domäne, jedoch kein Domänencontroller
  • Es gibt mehrere Domänen mit Vertrauensbeziehung in der Infrastruktur
  • Manchmal können Benutzer (lokal, Domäne oder aus einer anderen Domäne) einer lokalen Gruppe angehören, indem sie zu einer anderen Gruppe (Domäne oder lokal) gehören, die zu einer lokalen Gruppe gehört, anstatt direkt zur Gruppe zu gehören.

Beispielszenario für den letzten Punkt:

  • Benutzer1 gehört zur Gruppe TeamA in der DomäneA
  • DomaimA \ TeamA ist Mitglied von DomainB \ SpecialAccess
  • DomainB \ SpecialAccess ist Mitglied von DomainB \ DomainAdmins
  • Schließlich gehören DomainB \ DomainAdmins zur lokalen Administratorgruppe
  • Die Gruppe "Lokale Administratoren" verfügt über die Berechtigung "SeRemoteInteractiveLogonRight"

Wenn ich nun auf die Eingabe DomainA \ User1 und SeRemoteInteractiveLogonRight muss ich mit Ja oder Nein antworten. Also öffne ich die lokale Richtlinie auf dem Computer, notiere, welche Gruppen rechts aufgelistet sind, und gehe dann zu den Servermanagern, um zu sehen, was sich bei den Gruppenmitgliedern befindet. Anschließend muss ich die Mitglieder der Gruppen in diesen Gruppen anzeigen lassen und so weiter.

Ich habe das Gefühl, dass es einfacher sein kann. Ich war sehr aufgeregt, als ich das AccessChk-Dienstprogramm fand. Es dauerte ganze drei Minuten, bis ich herausfand , dass es nur direkte Beziehungen auflistet, sodass Benutzer innerhalb einer Gruppe nicht aufgelistet werden.

Jetzt vermute ich, dass es möglich wäre, die Ergebnisse von AccessChk so zu kombinieren, dass ich überprüfen kann, ob ein Benutzer zu einer der von AccessChk zurückgegebenen Gruppen gehört, aber da es sich nicht um eine einzelne Domäne handelt, sondern um mehrere von ihnen Ich bin mir nicht sicher, wie ich das angehen soll. Auch die AccessChk-Ausgabe scheint nicht zwischen einer Gruppe und einem Benutzer zu unterscheiden.

BEARBEITEN : Um nicht in eine XY-Problemfalle zu geraten, muss ich wirklich sicherstellen, dass auf einer Gruppe von Servern keine bestimmten Benutzerkonten, die als IIS-Anwendungspoolidentitäten verwendet werden, über die Berechtigungen SeInteractiveLogonRight oder SeRemoteInteractiveLogonRight verfügen. Ich habe kein Problem mit dem IIS-Teil, aber der letzte Schritt, bei dem ein Konto mit einem Privileg abgeglichen wird, ist etwas, bei dem ich Schwierigkeiten habe, einen einfachen Weg zu finden, dies zu überprüfen. Ich möchte auch die Überprüfung automatisieren, da dies regelmäßig durchgeführt werden muss.

Andrew Savinykh
quelle
6
Das klingt nach einem Job für ... Resultant Set of Policy (RSoP)! technet.microsoft.com/en-us/library/cc758010%28v=WS.10%29.aspx
Davidw
1
@zespri - Meine Antwort war Müll und ich habe es gelöscht. Die Benutzerrechte "SeInteractiveLogonRight" und "SeRemoteInteractiveLogonRight" werden anders gehandhabt als "normale" Berechtigungen, und es sieht so aus, als ob die Berichterstellung darüber problematisch sein wird. Wenn ich eine Lösung für dich finde, poste ich eine andere Antwort, aber im Moment habe ich nichts.
Evan Anderson
1
@Davidw - RSoP ist problematisch, da die Standardeinstellungen der lokalen Sicherheitsrichtlinie nicht in der Ausgabe berücksichtigt werden. Daher werden alle "Nicht konfiguriert" -Einträge nur als "Nicht konfiguriert" angezeigt, und Sie sehen nicht, welchen Principals die lokale Sicherheitsrichtlinie das Recht verleiht. Selbst wenn Sie eine Liste der Principals aus den Gruppenrichtlinien erhalten, müssen Sie die Gruppenmitgliedschaften (möglicherweise auch domänenübergreifend) erweitern, um die Betriebssystemfunktionalität zu replizieren. Dies hat sich tatsächlich als eine viel schwierigere Frage herausgestellt, als ich erwartet hatte.
Evan Anderson
1
@EvanAnderson Genau! Als ich gefragt wurde, wie lange ich wohl brauchen würde, schien es eine einfache Aufgabe zu sein. Und nach ein paar Tagen googeln und verschiedene Dinge ausprobieren ... nichts. Derzeit ist mein Plan ist es , pinvoke GetTokenInformation mit TokenPrivileges Token Informationsklasse Natürlich muss ich zuerst herausfinden , wie halten das Token selbst bekommen. Diese Route scheint momentan die vielversprechendste zu sein.
Andrew Savinykh
@zespri - NtOpenProcessToken () ist wahrscheinlich der beste Weg, um an das Token zu gelangen. ( Siehe leeholmes.com/blog/2006/07/21/… )
Evan Anderson

Antworten:

1

Zugriffstoken enthalten keine Informationen zu Rechten, sondern nur zu Berechtigungen.

Was Sie tun müssen, ist Folgendes:

  • Suchen Sie den IIS-Arbeitsprozess, der Ihrem App-Pool entspricht. Da Sie die Identität des App-Pools kennen, sollte dies einfach sein, indem Sie alle Prozesse mit dem Worker-Prozessnamen auflisten und denjenigen filtern, der die Identität hat. Wenn es mehr als eine gibt, können Sie jede verwenden.
  • Verwenden Sie GetTokenInformation mit der Informationsklasse TokenGroup und nicht das TokenPrivilege für das Prozesstoken. Das Ergebnis gibt Ihnen alle transitiven Gruppen, zu denen auch die Identität gehört. Dies bedeutet auch indirekte.
  • Jetzt können Sie diese Gruppen durchlaufen und LsaEnumerateAccountRights für jede Gruppe aufrufen und die Informationen zusammenstellen. Dies wird Ihnen geben, was Sie wollen.

Das Obige basiert auf dem Vorhandensein des Prozesses (und des Tokens), der der Kontoidentität entspricht. In Ihrem Szenario sollte dies kein Problem sein. In Szenarien, in denen dies ein Problem ist, können Sie versuchen, die Active Directory-Suche für das berechnete Attribut Token-Groups zu verwenden . In diesem Artikel werden einige Lösungsansätze aufgeführt.

Andrew Savinykh
quelle