Sichere Kommunikation zwischen MS SQL und Desktop Delivery Controller

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

 

SQL 443 DDC

 

 

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

  1. ein Zertifikat auf dem SQL Server installieren
  2. dem SQL-Dienst die Leseberechtigung für das Zertifikat erteilen
  3. SQL Netzwerk Konfiguration anpassen, Zertifikat anbinden
  4. SQL Netzwerk Konfiguration anpassen, Verschlüsselung erzwingen
  5. Auf dem Delivery Controller:

 

 

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

001 Secure SQL DDC

1.2. Weiter

002 Secure SQL DDC

1.3. Weiter

003 Secure SQL DDC

1.4. Computer auswählen > Enroll

004 Secure SQL DDC

1.5. Der Wizard ist abgeschlossen.

005 Secure SQL DDC

1.6. Nachdem Sie das Zertifikat erfolgreich angefordert oder installiert haben, sollen Sie dem SQL-Dienst die Leserechte auf dem privaten Schlüssel zuweisen.

006 Secure SQL DDC

 

2.2. Zertifikat auswählen > Alle Aufgaben > Private Schlüssel verwalten >

007 Secure SQL DDC

2.3. Klicken Sie auf Hinzufügen

008 Secure SQL DDC

2.4. Geben Sie den Namen des SQL-Services-Konto ein. (Im meinem Fall Service_SQL)

009 Secure SQL DDC

010 Secure SQL DDC

2.5. Weisen Sie die Leseberechtigung zu.

011 Secure SQL DDC

 

 


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

101 Secure SQL DDC

3.2.  Klappen Sie "SQL Server Network Configuration" aus und klicken Sie mit der rechten Maustaste auf "Protokolle für ". Wählen Sie "Eigenschaften"

102 Secure SQL DDC

3.3. Wählen Sie das Zertifikat aus der Dropdown-Liste auf der Registerkarte "Zertifikat" aus.

103 Secure SQL DDC

3.4. Merken Sie sich das Ablaufdatum Ihres Zertifikats und tauschen Sie dieses rechtzeitig aus.

104 Secure SQL DDC

 


4.1. Der nächste Schritt erzwingt die verschlüsselte Kommunikation.

Klicken auf die Registerkarte Flags

105 Secure SQL DDC

4.2. Wählen Sie Yes und bestätigen Sie die Konfiguration durch die Betätigung des Apply Buttons

106 Secure SQL DDC

4.3. Um die Änderung zu aktivieren, soll der SQL Server Dienst neu gestartet werden.

107 Secure SQL DDC

4.4. Neustart SQL Server Dienst durchführen

Hinweis:  nach diesem Schritt wird die Kommunikation zwischen den Controllern und der DB unterbrochen.

108 Secure SQL DDC

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.

400 PSh Console

5.2. Wenn Sie den Befehl Get-BrokerDBConnection eingeben können Sie die bestehende Konfiguration verifizieren:

401 Get BrokerDBConnection

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:

402 Disconnect DB

Wir überprüfen die Kommunikation erneut:

402 2 Disconnect DB

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:

403 Connect DB

5.5. Wenn wir den Befehl Get-BrokerDBConnection erneut eingeben, sieht die Kommunikation wie folgt aus:

404 Get BrokerDBConnection

 

Konfigurationsschritte – Option 2

Wiederholen Sie auf dem Datenbank-Server die obere Schritte von 1 bis 4.

  1. ein Zertifikat auf dem SQL Server installieren
  2. dem SQL-Dienst die Leseberechtigung für das Zertifikat erteilen
  3. SQL Netzwerk Konfiguration anpassen, Zertifikat anbinden
  4. SQL Netzwerk Konfiguration anpassen, Verschlüsselung erzwingen
  5. 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:

405 Test BrokerDBConnection

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:

 Pfad zur SiteDB:

HKLM\SOFTWARE\Citrix\DesktopServer\DataStore\Connections\Controller\ConnectionString

502 DesktopServer

 501 ConnectionString

Pfade zu weiteren DBs/Diensten:

503 DesktopServer

 

 

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

601 Error License Server

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.

601 Error Studio

 

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