Best Practice im Citrix Umfeld ist es, Usern, die auf einen Presentation Server zugreifen dürfen, den Zugriff via RDP-Protokoll zu verweigern, da hier u. A. die Citrix Policies nicht ziehen. Das standardmässig von Microsoft vorgeschlagene Vorgehen, den Zugriff auf die Terminalserver durch die lokale Gruppe “Remote Desktop Users” zu steuern funktioniert dann allerdings nicht mehr. Es muss statt dessen eine eigene Gruppe erstellt und gepflegt werden, die den Zugriff über das ICA Protokoll steuern kann. Ich nenne diese Gruppe in unserem Beispiel “CTX_User”. Damit Mitglieder dieser Gruppe auf einen Presentation Server zugreifen können, müssen zwei Bedingungen erfüllt sein.

1. Berechtigung auf dem ICA Protokoll
Screenshot - ICA-Protokoll

2. Das Recht “Log on through terminal services”, etweder lokal, oder besser verteilt via GPO
Screenshot - Policy

Dies gilt für Windows Server 2003. Bei Windows Server 2000 wird das Recht “Log on localy” benötigt. Dabei ist zu beachten, dass bei Aktivierung dieser Policy alle Gruppen referenziert werden müssen, die später in irgendeiner Form via Terminal Services auf den Server verbinden dürfen. Fehlt ein User, oder eine Gruppe in dieser Auflistung, erscheint sonst bei einem Anmeldeversuch folgende Fehlermeldung:
Screenshot - Logon Error

Ein weiterer Tipp an dieser Stelle: Idealerweise verbietet man das Ressource Mapping auf dem RDP Protokoll zumindest für Drucker so früh wie möglich, um das Einschleppen von Druckertreibern zu verhindern. Da normalerweise nur Administratoren via RDP verbinden, die über genügend Rechte zum Installieren von Treibern verfügen, werden sonst alle lokalen Drucker auf dem Terminalserver installiert, was schnell zu einem Wildwuchs in der Treiberlandschaft führt. Weiter Ressourcen können nach Belieben ebenfalls schon hier geblockt werden, s. Screenshot:
Screenshot - RDP-Protokoll

Diese Tasks lassen sich, wie weiter Oben gesehen, bequem über die GUI erledigen. Dies ist jedoch sehr mühsam, wenn man 50+ Server zu betreuen hat. Hier hat Marcel Göertz aus den Niederlanden einen sehr interessanten Artikel verfasst, wie diese Aufgabenstellung mittels WMI viel eleganter zu lösen ist.

Benutzer(Gruppen) mittels WMI berechtigen
In dem Codebeispiel weiter Unten wird der User domain\johndoe auf dem RDP Protokoll als User berechtigt. Dabei ist es wichtig, dass der Code auf der Maschine ausgeführt wird, für die diese Berechtigung gelten soll.

Achtung: Alle Codebeispiele bestehen aus nur einer Zeile, egal wie der Browser dies darstellt! Evtl. vorhandene Zeilenumbrüche müssen mit einem Leerzeichen ersetzt werden.
WMIC /NODE:"." RDPERMISSIONS WHERE TerminalName="RDP-tcp" CALL AddAccount "domain\johndoe",1

Drei Teile dieser Kommandozeile müssen hier erläutert werden:

  • TerminalName=”RDP-tcp”
    Für RDP ist der Name normalerweise RDP-tcp. Falls dieser Name auf deinen Servern anders lautet, muss der Wert angepasst werden.
    Um die Berechtigungen für das ICA Protokoll anzupassen, muss TerminalName=”ICA-tcp” verwendet werden. Konsolenzugang kann mittels TerminalName=”console” gesteuert werden.
  • AddAccount “domain\johndoe”
    Die Funktion “AddAccount” benötigt entweder einen User-, oder Gruppennamen inklusive Domäne. Um Built-In User hinzuzufügen, kann domain mit builtin ersetzt werden, z. B. AddAccount “builtin\Administrator”. Um eine Gruppe hinzuzufügen, kann einfach der Gruppenname verwendet werden, z. B. AddAccount “domain\Domain Admins”.

Ein Beispiel:
WMIC /NODE:"." RDPERMISSIONS WHERE TerminalName="RDP-tcp" CALL AddAccount "domain\Domain Admins",2

  • Vollzugriff, Gast-, oder Userzugriff
    Die abschliessende 2 in dem Beispiel beschreibt die Zugriffsrechte, wobei:

    • 0 : Guest Access
    • 1 : User Access
    • 2 : Full Control

    bedeuten.

ICA/RDP Berechtigungen entfernen
Um Berechtigungen auf einem Protokoll wieder zu entfernen, muss die Syntax etwas angepasst werden.
In diesem Beispiel wird der Built-In Gruppe “Remote Desktop Users” der Zugriff über das ICA Protokoll entzogen:
WMIC /NODE:"." RDACCOUNT WHERE "TerminalName='ICA-tcp' and AccountName='Builtin\\Remote Desktop Users'" CALL Delete

Um die “Domain Users” Gruppe zu entfernen, wird folgender Code benötigt:
WMIC /NODE:"." RDACCOUNT WHERE "TerminalName='ICA-Tcp' and AccountName='domain\\Domain Users'" CALL Delete

Hast du den doppelten Backslash bemerkt? Dieser ist, aus für mich nicht nachvollziehbaren Gründen, leider notwendig. Zumindest bist du jetzt gewarnt 😉

Komplettes Beispiel
Hier ist ein Beispiel für ein dreizeiliges Batch Script, um einen Terminalserver abzusichern.
Mit PsExec, einem genialen Tool aus der PsTools Sammlung von Sysinternals auf allen Remote Servern ausgeführt, ist eine Serverfarm in kürzester Zeit aktualisiert.
Die drei Zeilen machen folgendes:

  • 1. Stellt sicher, dass nur Citrix Administratoren (domain\citrixadmins) den Server via RDP erreichen können
  • 2. Entfernt die Berechtigungen für die “Domain Users” Gruppe
  • 3. Entfernt die Berechtigungen für die “Remote Desktop Users” Gruppe

WMIC /NODE:"." RDPERMISSIONS WHERE TerminalName="RDP-tcp" CALL AddAccount "domain\citrixadmins",2
WMIC /NODE:"." RDACCOUNT WHERE "TerminalName='RDP-tcp' and AccountName='domain\\Domain Users'" CALL Delete
WMIC /NODE:"." RDACCOUNT WHERE "TerminalName='RDP-tcp' and AccountName='Builtin\\Remote Desktop Users'" CALL Delete

Info: Wenn ein, oder mehrere Gruppen die gelöscht werden sollen nicht berechtigt waren, läuft das Script trotzdem, mit einer Meldung ‘no such instance’, weiter.

Der Originalartikel kann übrigens hier nachgelesen werden.

Gruss
Ecki

I recently stumbled across this realy good article about restricting access to the RDP/ICA protocol on a Citrix or terminal server through WMI. You don’t have to be a programmer to understand the code, since it is realy easy to use and implement. With just one line of code it is possible to add/remove a user or group from the ICA/RDP protocol, thus allowing for better security for your servers.

If you have to setup or manage several terminal servers, this article can ease your life.

The article can be found here.

Regards
Ecki