In diesem Blogbeitrag werden zwei möglichen Vorgehensweisen beschrieben, wie Sie die TSL-verschlüsselte Kommunikation zwischen den SQL-Servern und den Delivery Controllern einrichteten können. Dieser Beitrag ergänzt und veranschaulicht den offiziellen Citrix Artikel „How to Enable Secure SQL Database Connection String with XenDesktop“
Voraussetzungen
Standardmäßig wird die Kommunikation zwischen den MS SQL Server Servern und den Delivery Controllern nicht durch Zertifikate gesichert.
Auf dem SQL-Server, sowie auf allen weiteren Controllern sollen Server-Zertifikate installiert werden, mit denen die Kommunikation zwischen den Citrix Diensten und der SQL Datenbank verschlüsselt werden kann. Für die Kommunikation wird weiterhin den Port 1433 verwenden.
Wie bereits erwähnt, gibt es mehrere Möglichkeiten die Kommunikation zu verschlüsseln. Welche Option für Sie passend ist, hängt davon ab, ob die Infrastruktur bereits existiert (Option 1) oder erst aufgebaut werden soll (Option 2).
Erzwingen der Verschlüsselung für jeden Citrix-Dienst auf dem Controller - Option 1
Die als Option 1 genannte Vorgehensweise ist für die bereits existierenden und aktiv genutzten Umgebungen besonders geeignet. In diesem Fall werden alle einzelnen SQL-Verbindungen, die jeder Citrix-Dienst aufbaut, separat konfiguriert.
Die Verschlüsselung muss auf jedem Delivery Controller aktiviert werden und kann zusätzlich auf dem SQL-Server erzwungen werden. Auf jedem Delivery Controller sollen die Verbindungszeichenfolgen durch einen weiteren Parameter Encrypt=True ergänzt werden. Auf dem SQL-Server kann die Option Force Encryption aktiviert werden. Es wäre jedoch wünschenswert, die SQL-Server so konfigurieren, dass diese nur über eine verschlüsselte Kommunikation mit den Clients sprechen.
Erzwungene Verschlüsselung auf dem SQL-Server (Forcing Encryption)
Die Option setzt nur die Konfiguration auf dem SQL-Server voraus. In diesem Fall werden alle eingehenden SQL-Verbindungen von einem beliebigen Client verschlüsselt. Die Aktivierung der Option Force Encryption ist eine zwingende Voraussetzung.
Konfigurationsschritte - Option 1
- ein Zertifikat auf dem SQL Server installieren
- dem SQL-Dienst die Leseberechtigung für das Zertifikat erteilen
- SQL Netzwerk Konfiguration anpassen, Zertifikat anbinden
- SQL Netzwerk Konfiguration anpassen, Verschlüsselung erzwingen
- Auf dem Delivery Controller:
- alle bestehende DB-Verbindungen trennen
- die DB-Verbindungen erneut initiieren
Konfigurationsschritte auf dem SQL Server
Auf jedem SQL-Server soll ein Zertifikat installiert werden, dessen Name (Common Name) dem FQDN des SQL-Servers entspricht. Falls in Ihrer Infrastruktur eine hochverfügbare SQL-Instanz verwendet wird, soll der Zertifikat-Name dementsprechend sein (z.B. Availability Group Listener Name, Cluster Name). Für diesen Zweck ist ein SAN- Zertifikat besonders geeignet.
Im folgenden Beispiel wird ein Zertifikat von der internen Zertifizierungsstelle abgerufen. Wenn Sie bereits ein Computer-Zertifikat von einer internen CA erhalten haben, soll dieses in dem Ordner Eigene Zertifikate / Zertifikate installiert werden.
1.1. Starten Sie die MMC-Konsole (Start > Ausführen > mmc) und fügen Sie das Zertifikate Snap-In hinzu (Datei > Snap-In hinzufügen > Zertifikate > Computerkonto).
Navigieren Sie zum Ordner Eigene Zertifikate / Zertifikate > rechte Maustaste >Alle Aufgaben > Neues Zertifikat anfordern
1.2. Weiter
1.3. Weiter
1.4. Computer auswählen > Enroll
1.5. Der Wizard ist abgeschlossen.
1.6. Nachdem Sie das Zertifikat erfolgreich angefordert oder installiert haben, sollen Sie dem SQL-Dienst die Leserechte auf dem privaten Schlüssel zuweisen.
2.2. Zertifikat auswählen > Alle Aufgaben > Private Schlüssel verwalten >
2.3. Klicken Sie auf Hinzufügen
2.4. Geben Sie den Namen des SQL-Services-Konto ein. (Im meinem Fall Service_SQL)
2.5. Weisen Sie die Leseberechtigung zu.
In weiteren Schritten muss das installierte Zertifikat an den Datenbankmodul-Dienst im SQL Server Configuration Manager gebunden werden.
3.1. Starten Sie den SQL Server Configuration Manager
3.2. Klappen Sie "SQL Server Network Configuration" aus und klicken Sie mit der rechten Maustaste auf "Protokolle für ". Wählen Sie "Eigenschaften"
3.3. Wählen Sie das Zertifikat aus der Dropdown-Liste auf der Registerkarte "Zertifikat" aus.
3.4. Merken Sie sich das Ablaufdatum Ihres Zertifikats und tauschen Sie dieses rechtzeitig aus.
4.1. Der nächste Schritt erzwingt die verschlüsselte Kommunikation.
Klicken auf die Registerkarte Flags
4.2. Wählen Sie Yes und bestätigen Sie die Konfiguration durch die Betätigung des Apply Buttons
4.3. Um die Änderung zu aktivieren, soll der SQL Server Dienst neu gestartet werden.
4.4. Neustart SQL Server Dienst durchführen
Hinweis: nach diesem Schritt wird die Kommunikation zwischen den Controllern und der DB unterbrochen.
An dieser Stelle ist die Konfiguration auf dem SQL-Server abgeschlossen.
Konfigurationsschritte auf dem Delivery Controller
Die weiteren Schritte sollen auf jedem Delivery Controller durchgeführt werden. Die unter den Punkten 5.3 und 5.4 eingegebenen Befehlsketten sind dieselbe, die bei der Citrix Datenbank-Migration verwendet werden.
5.1. Starten Sie den PowerShell ISE-Editor mit administrativen Berechtigungen.
5.2. Wenn Sie den Befehl Get-BrokerDBConnection eingeben können Sie die bestehende Konfiguration verifizieren:
5.3. Auf dem Citrix Delivery Controller sollen zuerst die bestehenden Datenbank-Verbindungen zwischen DDCs und der Datenbank getrennt werden.
## Kommunikation zwischen DDCs und der Datenbank trennen:
Set-ConfigDBConnection -DBConnection $null
Set-AcctDBConnection -DBConnection $null
Set-AnalyticsDBConnection -DBConnection $null # 7.6 and newer
Set-AppLibDBConnection -DBConnection $null # 7.8 and newer
Set-OrchDBConnection -DBConnection $null # 7.11 and newer
Set-TrustDBConnection -DBConnection $null # 7.11 and newer
Set-HypDBConnection -DBConnection $null
Set-ProvDBConnection -DBConnection $null
Set-BrokerDBConnection -DBConnection $null
Set-EnvTestDBConnection -DBConnection $null
Set-SfDBConnection -DBConnection $null
Set-MonitorDBConnection -DataStore Monitor -DBConnection $null
Set-MonitorDBConnection -DBConnection $null
Set-LogDBConnection -DataStore Logging -DBConnection $null
Set-LogDBConnection -DBConnection $null
Set-AdminDBConnection -DBConnection $null -force
So sehen die Ergebnisse aus:
Wir überprüfen die Kommunikation erneut:
5.4. Im nächsten Schritt initiieren wir eine Datenbank-Verbindung.
Der Schlüssel Encrypt=True sorgt für die verschlüsselte Kommunikation zwischen den Controllern und der Datenbank.
## Ersetzen Sie durch den neuen SQL-Server und die Instanz, falls vorhanden
## Ersetzen Sie durch den Namen Ihrer wiederhergestellten Datenbank
## Beispiel:
### $ServerName=”PrinzipalSQLServerDNSName.domain.com”
### $DBName =”CitrixSitekonfigurationDatenbank”
### $LogDBName = “CitrixProtokollierungDatanbank”
### $MonitorDBName = “CitrixMonitoringDatanbank”
### $FailoverPartner = “MirrorSQLDNSname.domain.com”
##
$ServerName=”sql2017.demo.lab”
$DBName =” CitrixDemoSite”
$LogDBName = “CitrixDemoLog”
$MonitorDBName = “CitrixDemoMon”
$cs=”Server=$ServerName;Initial Catalog=$DBName;Integrated Security=True;Encrypt=True”
$csLogging= “Server=$ServerName;Initial Catalog=$LogDBName;Integrated Security=True;Encrypt=True”
$csMonitoring = “Server=$ServerName;Initial Catalog=$MonitorDBName;Integrated Security=True;Encrypt=True”
Set-AdminDBConnection -DBConnection $cs
Set-ConfigDBConnection -DBConnection $cs
Set-AcctDBConnection -DBConnection $cs
Set-AnalyticsDBConnection -DBConnection $cs
Set-HypDBConnection -DBConnection $cs
Set-ProvDBConnection -DBConnection $cs
#Set-PvsVmDBConnection -DBConnection $cs
Set-BrokerDBConnection -DBConnection $cs
Set-EnvTestDBConnection -DBConnection $cs
Set-LogDBConnection -DBConnection $cs
Set-LogDBConnection -DataStore Logging -DBConnection $null
Set-LogDBConnection -DBConnection $null
Set-LogDBConnection -DBConnection $cs
Set-LogDBConnection -DataStore Logging -DBConnection $csLogging
Set-MonitorDBConnection -DBConnection $cs
Set-MonitorDBConnection -DataStore Monitor -DBConnection $null
Set-MonitorDBConnection -DBConnection $null
Set-MonitorDBConnection -DBConnection $cs
Set-MonitorDBConnection -DataStore Monitor -DBConnection $csMonitoring
Set-AppLibDBConnection –DBConnection $cs # 7.8 and newer
Set-SfDBConnection -DBConnection $cs
So können die Ergebnisse aussehen:
5.5. Wenn wir den Befehl Get-BrokerDBConnection erneut eingeben, sieht die Kommunikation wie folgt aus:
Konfigurationsschritte – Option 2
Wiederholen Sie auf dem Datenbank-Server die obere Schritte von 1 bis 4.
- ein Zertifikat auf dem SQL Server installieren
- dem SQL-Dienst die Leseberechtigung für das Zertifikat erteilen
- SQL Netzwerk Konfiguration anpassen, Zertifikat anbinden
- SQL Netzwerk Konfiguration anpassen, Verschlüsselung erzwingen
- Auf dem Delivery Controller: starten Sie den Konfigurations-Wizard auf dem frisch installierten Delivery Controller.
Ergebnisse überprüfen
Ob die Konfiguration erfolgreich war können Sie mit den folgenden Befehlen verifizieren.
$cs = Get-BrokerDBConnection
Test-BrokerDBConnection "$cs;Encrypt=True" | fl
Wenn die Konfiguration korrekt war, wird folgendes angezeigt:
ServiceStatus : OK
ExtraInfo : {}
Option 2 - Alternative zu Windows PowerShell
Wie sie sicherlich wissen, werden die oberen PowerShell-Befehle lediglich zwecks Registry-Änderung einsetzt. Nach Bedarf können die Registry-Werte auch manuell geändert werden.
Die folgende Vorgehensweise hat möglicherweise eigene Befürworter, wird aber von Hersteller nicht empfohlen.
Die Werte der Zeichenfolge ConnectionString sollen wie folgt ergänzt werden:
- Ist: Server=SQLServerName;Initial Catalog=CitrixDBSiteName;Intergrated Security=True
- Soll: Server=SQLServerName;Initial Catalog=CitrixDBSiteName;Intergrated Security=True;Encrypt=True
Pfad zur SiteDB:
HKLM\SOFTWARE\Citrix\DesktopServer\DataStore\Connections\Controller\ConnectionString
Pfade zu weiteren DBs/Diensten:
Mögliche Probleme
Nach dem Start der Studio-Konsole wird es folgende Meldung angezeigt: The License Server Has Been Upgraded (CTX210780) . Ignorieren Sie diese Meldung
Weiter schlägt das System ein automatisches Upgrade vor. Der Vorgang wird mit der Meldung "The service instance is already registered with the configuration service", abgebrochen.
Lösung (CTX200446):
1. Starten Sie den PowerShell Konsole mit administrativen Berechtigungen.
2. Folgende Befehle sollen auf jedem Controller ausgeführt werden
asnp citrix*
Get-ConfigRegisteredServiceInstance -ServiceType "Broker" | Unregister-ConfigRegisteredServiceInstance
Get-BrokerServiceInstance | Register-ConfigServiceInstance
3. Deliver Controll neu starten