Citrix ADC SSL Bewertung optimieren – Stand November 2022

image_pdfimage_print

Dieser Artikel baut auf folgenden Beiträgen auf:
NetScaler SSL Bewertung optimieren
Citrix ADC SSL Bewertung optimieren – Stand Februar 2020
welche diverse Basisschritte beschreiben. Dieser Artikel beschreibt lediglich die Erstellung einer neuen Cipher Gruppe mit aktuellen Cipher Suites

Eine neue Cipher Gruppe kann entweder im ADC direkt oder via ADM verteilt werden mit folgenden Befehlen:

add ssl cipher PIT-SECURE-20220601
bind ssl cipher PIT-SECURE-20220601 -cipherName TLS1.3-AES256-GCM-SHA384 -cipherPriority 1
bind ssl cipher PIT-SECURE-20220601 -cipherName TLS1.3-AES128-GCM-SHA256 -cipherPriority 2
bind ssl cipher PIT-SECURE-20220601 -cipherName TLS1.2-ECDHE-RSA-AES256-GCM-SHA384 -cipherPriority 3
bind ssl cipher PIT-SECURE-20220601 -cipherName TLS1.2-ECDHE-RSA-AES128-GCM-SHA256 -cipherPriority 4
bind ssl cipher PIT-SECURE-20220601 -cipherName TLS1.2-DHE-RSA-AES256-GCM-SHA384 -cipherPriority 5
bind ssl cipher PIT-SECURE-20220601 -cipherName TLS1.2-DHE-RSA-AES128-GCM-SHA256 -cipherPriority 6

Im Anschluss müssen die Ciphers auf den vServern ersetzt werden wie exemplarisch mit einem Citrix Gateway aufgezeigt:

unbind ssl vserver nsgw-vsrv-gateway.domain.pit -cipherName CIPHER-PIT-AEAD
bind ssl vserver nsgw-vsrv-gateway.domain.pit -cipherName PIT-SECURE-20220601

Zu guter Letzt folgt wie immer das Testing und die Dokumentation.

Viel Spass beim Nachbau :-)

PRTG – Citrix ADM für zentrales ADC Performance Monitoring nutzen

image_pdfimage_print

Im einem der letzten Beiträge habe ich ein Powershell Modul vorgestellt, mit welchem man Daten vom Citrix ADM abgreifen kann.

Basierend auf diesem Modul habe ich bei uns einen PRTG Custom Sensor erstellt, welcher die wichtigsten Performance Daten aus dem ADM ausliest:

Dazu müssen erst einmal die Parameter von PRTG sowie das Modul selbst eingelesen und eine Verbindung zur Appliance hergestellt werden:

# Get parameter from PRTG
param (
[string]$server,
[string]$domain,
[string]$username,
[string]$password
)

# Import ADM PS module
$CustomSensors="C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML\"
Import-Module $CustomSensors\PRTGCustomCitrixADM.psm1

# Create the ADM session
$ADMHost = "https://"+$server
$ADMSession = Connect-ADM -ADMHost $ADMHost -CredUser $username -CredPW $password

Damit dies funktioniert, muss der entsprechende Benutzer von PRTG auf dem ADM Leserechte haben. Weiter gehe ich nicht auf jede Zeile ein, dies kann im Script selbst nachgelesen werden. Hier beschreibe ich vor allem die wichtigsten Punkte, wie das auslesen der Performance-Daten sowie das Sortieren nach Appliance:

# Get the Instances from the ADM
$ADCInstance = Invoke-ADMNitro -ADMSession $ADMSession -OperationMethod GET -ResourceType ns
# Create the variable only with the NS parameters
$ADCInstance2 = $ADCInstance | Select-Object ns
# For troubleshooting
#$ADCInstance2.ns | FT hostname, ns_mgmt_cpu_usage, ns_cpu_usage, vm_memory_usage, diskperusage, disk0_used, disk1_used, ns_tx, model_id -AutoSize
$ADCInstances = $ADCInstance2.ns
# Sort output based on hostname
$ADCInstances2 = $ADCInstances | Sort-Object hostname

Da das Web GUI von PRTG nicht nach Channel ID sondern nach Alphabet sortiert, habe ich für die Channel-Namen jeweils noch einen eigenen Index erstellt. A0 ist reserviert für den „Overall Health“ Status (weiter unten beschrieben). Anschliessend kriegt jede Appliance einen eigenen Buchstaben und innerhalb einer Appliance wird hochgezählt:

$ChannelLetterIndex = 65    # Start index with 65 for ASCII 'A'
ForEach ($Instance in $ADCInstances2){

    #region returnvariables
    $ChannelLetterIndex = $ChannelLetterIndex + 1      # Increase letter index by one for each appliance instance
    $RetChannelLetter = [char]($ChannelLetterIndex)

Im PRTG werden Prozentwerte nur in ganzen Zahlen angezeigt, daher werden die entsprechenden Werte gerundet:

    $RetMgmtCPU = [math]::Round($Instance.ns_mgmt_cpu_usage)
    $RetCPU = [math]::Round($Instance.ns_cpu_usage)
    $RetRAM = [math]::Round($Instance.vm_memory_usage)

Die prozentuale Bandbreiten-Auslastung wird anhand der Werte sowie der Model ID berechnet. Da diese im Test oft exponentielle Werte lieferte und diese nicht gerundet werden können, musste dies via Umwandlung in einen String gemacht werden:

    #region bwcalculation
    # Calculate the percentage of the bandwidth usage
    # based on the license and the current bandwith
    # A conversation to string is needed because of the
    # exponential results which needed to be trimmed
    $BWPercentCalc = $null
    $BWPercent = $null

    $BWPercentCalc = $Instance.ns_tx*100/$Instance.model_id
    $BWPercentString = [String]$BWPercentCalc
    If ($BWPercentString.Length -ge 5){
        $SubLength = 5
    }
    Else {
        $SubLength = $BWPercentString.Length
    }
    $BWPercentStringShort = $BWPercentString.Substring(0,$SubLength)
    $BWPercentShort = [Decimal]$BWPercentStringShort
    $RetBWPercent = [math]::Round($BWPercentShort)
    #endregion bwcalculation

Im restlichen Skript wurden die einzelnen Daten mit einem vorgegebenen Wert gegen geprüft und die entsprechenden PRTG Ausgaben definiert.

Zu guter Letzt wird aus allen vorher berechneten Werten ein Channel mit einer Gesamtbewertung der Performance erstellt, welche mit dem hardcoded Index A0 auch ganz oben gelistet wird:

#region returnstring
# Determine return string depends on the several states
If ($returnState.State -contains 2) {
    $RetString = $AlertString
    $RetHealth = 0
}
ElseIf ($returnState.State -contains 1) {
    $RetString = $WarningString
    $RetHealth = 50    
}
Else {
    $RetString = "OK"
    $RetHealth = 100    
}
#endregion

#region health
# Channel for overall health
$retXml += "  <result>`n"
$retXml += "    <channel>A0 Overall health</channel>`n"
$retXml += "    <value>$RetHealth</value>`n"
$retXml += "    <unit>Count</unit>`n"
$retXml += "    <limitMode>1</limitMode>`n"
$retXml += "    <limitMinError>49</limitMinError>`n"
$retXml += "    <limitErrorMsg>$AlertString</limitErrorMsg>`n"
$retXml += "    <limitMinWarning>99</limitMinWarning>`n"
$retXml += "    <limitWarningMsg>$WarningString</limitWarningMsg>`n"
$retXml += "  </result>`n"
#endregion health

Das Script muss nun in den Custom Sensors Ordner von PRTG gelegt werden und der Sensor kann entsprechend eingerichtet werden:

Parameter gem. Script-Beschreibung, Securitykontext vom Gerät

Das Resultat sieht dann wie folgt aus:

Viel Spass beim Nachbauen :-)

PRTG – ADM Events überwachen

image_pdfimage_print

Im einem der letzten Beiträge habe ich ein Powershell Modul vorgestellt, mit welchem man Daten vom Citrix ADM abgreifen kann.

Basierend auf diesem Modul habe ich bei uns einen PRTG Custom Sensor erstellt, welcher die Events aus dem ADM ausliest:

Dazu müssen erst einmal die Parameter von PRTG sowie das Modul selbst eingelesen und eine Verbindung zur Appliance hergestellt werden:

# Get parameter from PRTG
param (
[string]$server,
[string]$domain,
[string]$username,
[string]$password
)

# Import ADM PS module
$CustomSensors="C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML\"
Import-Module $CustomSensors\PRTGCustomCitrixADM.psm1

# Create the ADM session
$ADMHost = "https://"+$server
$ADMSession = Connect-ADM -ADMHost $ADMHost -CredUser $username -CredPW $password

Damit dies funktioniert, muss der entsprechende Benutzer von PRTG auf dem ADM Leserechte haben. Weiter gehe ich nicht auf jede Zeile ein, dies kann im Script selbst nachgelesen werden. Hier beschreibe ich vor allem die wichtigsten Punkte, wie das auslesen der Events:

# Get the events from the ADM
$ActiveEvents = Invoke-ADMNitro -ADMSession $ADMSession -OperationMethod GET -ResourceType active_event
# Create the variable only with the active events content
$ActiveEvents2 = $ActiveEvents | Select-Object active_event

Es sollen im PRTG nicht alle ADM Meldungen gleich einen Alarm auslösen, daher habe ich div. Arrays für Ausschlüsse vorbereitet, welche bei Bedarf genutzt werden können:

# Prepare a device_entity_name exlusion list for PRTG outputs
# Add each device in quota with a comma (except the last line)
$DeviceExcludeList = $null
$DeviceExcludeList = @(
    "entity1",
    "entity.domain.pit"
)

# Prepare a failureobj exlusion list for PRTG outputs
# Add each failure object in quota with a comma (except the last line)
$FailureObjectExcludeList = $null
$FailureObjectExcludeList = @(
    "object1",
    "object2"
)

# Prepare a message exlusion list for PRTG outputs
# Add each message in quota with a comma (except the last line)
$MessageExcludeList = $null
$MessageExcludeList = @(
    "192.168.99.99"
)

Da auch vServer und Services vom ADC welche wieder hochkommen einen „Critical Event“ darstellen, habe ich diese beim Aufbereiten ausgeklammert:

    If ($Event.severity -eq "Critical"){
        # Filter out 'entityup' messages from critical state
        If ($Event.category -ne "entityup"){
            $RetState = $returnStateCritical
            $Events += [PSCustomObject]@{Severity=$Event.severity;SourceIP=$Event.source;SourceHost=$Event.hostname;Category=$Event.category;Entity=$Event.device_entity_name;State=[Int64]$RetState}
            $RetCritical = $RetCritical + 1
        }
    }

Innerhalb der „Major Events“ werden im ersten Schritt die vorher definierten Ausschlüsse gegengeprüft und mittels Variable $DeviceAlarm die weitere Verarbeitung bestätigt oder gestoppt:

        # Filter out known entities, failure objects etc. from major state
        # Set variable $DeviceAlarm, if the device isn't filtered
        
        $DeviceAlarm = $null
        
        ForEach ($ExcludedDevice in $DeviceExcludeList) {
            $Entity = $Event.device_entity_name
            If ($DeviceAlarm -or ($DeviceAlarm -eq $null)) {
                If ($Entity -notlike "*$ExcludedDevice*") {
                    $DeviceAlarm = $true
                }
                Else{
                    $DeviceAlarm = $false
                }
            }
        }
        
        If ($DeviceAlarm){
            ForEach ($ExcludedFO in $FailureObjectExcludeList) {
                $Entity = $Event.failureobj
                If ($DeviceAlarm -or ($DeviceAlarm -eq $null)) {
                    If ($Entity -notlike "*$ExcludedFO*") {
                        $DeviceAlarm = $true
                    }
                    Else{
                        $DeviceAlarm = $false
                    }
                }
            }
        }
        
        If ($DeviceAlarm){
            ForEach ($ExcludedMessage in $MessageExcludeList) {
                $Entity = $Event.message
                If ($DeviceAlarm -or ($DeviceAlarm -eq $null)) {
                    If ($Entity -notlike "*$ExcludedMessage*") {
                        $DeviceAlarm = $true
                    }
                    Else{
                        $DeviceAlarm = $false
                    }
                }
            }
        }

Falls ein „Major Event“ nicht durch einen Ausschluss gefiltert wurde, wird die Eventliste entsprechend aufbereitet. In diesem Schritt werden Meldungen von Services („svc“ im Namen) oder Service Groups („svg“ im Namen) zu einer Warnung herunter gestuft. Dies weil definiert wurde, dass im PRTG erst ein Alarm erscheint, wenn der komplette vServer und nicht ’nur‘ ein Service DOWN ist:

        # If device isn't excluded, add to monitoring array
        # Services (svc) or service groups (svg) returns a warning instead an alarm
        If ($DeviceAlarm){
            If (($Event.device_entity_name -like "*svc*") -or ($Event.device_entity_name -like "*svg*")) {
                $RetState = $returnStateWarning
                $Events += [PSCustomObject]@{Severity=$Event.severity;SourceIP=$Event.source;SourceHost=$Event.hostname;Category=$Event.category;Entity=$Event.device_entity_name;State=[Int64]$RetState}
                $RetWarning = $RetWarning + 1
           }
            Else {
                $RetState = $returnStateCritical
                $Events += [PSCustomObject]@{Severity=$Event.severity;SourceIP=$Event.source;SourceHost=$Event.hostname;Category=$Event.category;Entity=$Event.device_entity_name;State=[Int64]$RetState}
                $RetMajor = $RetMajor + 1
            }
        }

Im restlichen Skript wurden die einzelnen Daten mit einem vorgegebenen Wert gegen geprüft und die entsprechenden PRTG Ausgaben definiert.

Das Script muss nun in den Custom Sensors Ordner von PRTG gelegt werden und der Sensor kann entsprechend eingerichtet werden:

Parameter gem. Script-Beschreibung, Securitykontext vom Gerät

Das Resultat sieht dann wie folgt aus:

Viel Spass beim Nachbauen :-)

PRTG – Zertifikate mittels ADM überwachen

image_pdfimage_print

Im einem der letzten Beiträge habe ich ein Powershell Modul vorgestellt, mit welchem man Daten vom Citrix ADM abgreifen kann.

Basierend auf diesem Modul habe ich bei uns einen PRTG Custom Sensor erstellt, welcher die Ablaufdaten aus der SSL Zertifikatsübersicht ausliest:

Dazu müssen erst einmal die Parameter von PRTG sowie das Modul selbst eingelesen und eine Verbindung zur Appliance hergestellt werden:

# Get parameter from PRTG
param (
[string]$server,
[string]$domain,
[string]$username,
[string]$password
)

# Import ADM PS module
$CustomSensors="C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML\"
Import-Module $CustomSensors\PRTGCustomCitrixADM.psm1

# Create the ADM session
$ADMHost = "https://"+$server
$ADMSession = Connect-ADM -ADMHost $ADMHost -CredUser $username -CredPW $password

Damit dies funktioniert, muss der entsprechende Benutzer von PRTG auf dem ADM Leserechte haben. Weiter gehe ich nicht auf jede Zeile ein, dies kann im Script selbst nachgelesen werden. Hier beschreibe ich vor allem die wichtigsten Punkte, wie das auslesen der Zertifikate:

# Get the certificates from the ADM
Invoke-ADMNitro -ADMSession $ADMSession -OperationMethod GET -ResourceType ns_ssl_certkey
$ActiveCerts = Invoke-ADMNitro -ADMSession $ADMSession -OperationMethod GET -ResourceType ns_ssl_certkey

Das Ablaufdatum konnte nicht einfach so verwendet werden, daher musste ich mittels einer Funktion dieses erst in einen String umwandeln und dann entsprechend sortiert wieder zurück geben:

# Function ConvertTo-DateTime
# Converts the dates from the certificates to a standardized format
Function ConvertTo-DateTime([string] $datetime) {
    # Removes double spaces
    $datetime2 = $datetime -replace '\s+',' '
    # Create an array and use the space as separator
    $arr = $datetime2 -split ' '
    # Reorder and create a readable date
    $validdate = $arr[3] +"-"+ $arr[0] +"-"+ $arr[1] +" "+ $arr[2]
    # Return the value
    return $validdate
}

Nun konnte ich jedes Zertifikat einzeln in ein Array schreiben mit den entsprechenden Common Names und Ablaufdaten:

# Create array with all the certification information
ForEach ($Cert in $ActiveCerts2.ns_ssl_certkey){
    
    $CertSubject = ($Cert.subject -split "," | ConvertFrom-StringData).CN
    $CertIssuer = ($Cert.issuer -split "," | ConvertFrom-StringData).CN
    $CertValidTo = ConvertTo-DateTime $Cert.valid_to
    # For troubleshooting
    #Write-Host $CertValidTo
    $Certs += [PSCustomObject]@{Host=$Cert.hostname;Subject=$CertSubject;Status=$Cert.status;Expiredate=$CertValidTo;IssuerCA=$CertIssuer}

}

Im restlichen Skript wurden die einzelnen Daten mit einem vorgegebenen Wert gegen geprüft und die entsprechenden PRTG Ausgaben definiert.

Das Script muss nun in den Custom Sensors Ordner von PRTG gelegt werden und der Sensor kann entsprechend eingerichtet werden:

Parameter gem. Script-Beschreibung, Securitykontext vom Gerät
Als primären Channel die bald ablaufenden Zertifikate, Intervall 12h und sofortiger DOWN Status auswählen

Das Resultat sieht dann wie folgt aus:

Viel Spass beim Nachbauen :-)

PRTG – Citrix ADM für zentrale ADC Überwachung nutzen

image_pdfimage_print

Es ist schon ein paar Tage her, da habe ich über PRTG Custom Sensoren für ADC geschrieben. Diese haben bisher mehr oder weniger gut in unserer Umgebung funktioniert. Für mich zeigten sich dabei jedoch mit der Zeit folgende Nachteile:

  • Jeder ADC, jedes ADC HA Paar muss im PRTG konfiguriert werden
  • Ist ein LB/CS vServer im DOWN Status, bleibt der PRTG Sensor rot, bis der vServer entweder wieder UP oder manuell deaktiviert ist (reaktivieren nicht vergessen)
  • Die Sensoren lieferten teils falsche/unvollständige Daten

Da wir sowieso eine ADM Appliance im Einsatz haben, suchte ich nach Möglichkeiten diese als Datenquelle anzusteuern. Mein erster Ansatz mit SNMP Traps scheiterte an der Tatsache, das PRTG dies nur einmalig als Alarm anzeigt und im nächsten Intervall wieder auf Status grün wechselt, falls nicht ein weiterer Trap gesendet wurde. Diese Option war daher für uns unbrauchbar.

Nach ein paar Recherchen bin ich auf ein Powershell Modul von Kenny Baldwin gestossen, welches mittels Nitro REST eine ADM Appliance mit div. Befehlen ansteuern kann. Das Original kann man auf GitHub herunterladen.

Das Modul hat ursprünglich vorgesehen, dass bei Benutzung die Anmeldedaten manuell eingegeben werden sollen. Für die Nutzung mit PRTG habe ich daher diesen Teil ein wenig angepasst, so dass die Daten aus dem PRTG Sensor übernommen werden können:

    param (
    [Parameter(Mandatory = $true)]
    [string]$ADMHost,
    [Parameter(Mandatory = $true)]
    [string]$CredUser,
    [Parameter(Mandatory = $true)]
    [string]$CredPW,
    [Parameter(Mandatory = $false)]
    [int]$Timeout = 900
    )

Nun kann das Modul zusammen mit den späteren Custom Sensoren im PRTG Custom Sensor Ordner gespeichert und ggf. verteilt werden.

M365 JSON lesbar machen

image_pdfimage_print

Es gibt Szenarien in denen der Zugriff für M365 Clouddienste gesondert behandelt werden müssen. Zum Beispiel in einer Citrix ADC/NetScaler Konfiguration in einer hybriden Exchange Konfiguration. Microsoft stellt dafür ein JSON zur Verfügung, mit welchem z.B. eine Palo Alto Firewall automatisch die Firewall Regeln pflegen kann:

Auszug der JSON

Leider ist dies nicht überall möglich, wie in meinem Fall mit dem Citrix ADC/NetScaler. Und wenn wir uns die JSON anschauen, sind in den x Zeilen sämtliche Quell IP Adressen gelistet, aber nicht praktikabel um weiter zu verwenden.

Ich habe mir deshalb die Zeit genommen und ein kleines Script erstellt, welches:

  • Die JSON in eine lokale, temporäre Datei schreibt
  • Diese Datei ausliest
  • Die IPv4 Adressen sortiert und ohne Duplikate in eine CSV Datei schreibt
Auszug der CSV-Datei

Aus dieser Datei können nun die IP Adressen relativ einfach herauskopiert und weiter verwendet werden.

Ich hoffe dies hilft dem einen oder anderen IT Guy weiter. :-)

Citrix Hypervisor – Snapshots für bestimmte VMs verwalten

image_pdfimage_print

Als ich am Backup-Skript tüftelte kam mir noch so ein Gedanke: „warum aus dem einen vollen Skript nicht noch zwei einzelne machen, welche man z.B. bei Produktupdates nutzen kann?“

So sind am gleichen Abend noch zwei weitere Skripte entstanden:

Dieses kann man nutzen um bei einer Gruppe von VMs basierend auf dessen Tag z.B. „Citrix“ Snapshots zu erstellen. Die VMs müssen lediglich vorher mit Tags versehen worden sein:

Nach dem Erstellen der Snapshot können die Arbeiten getätigt werden, z.B. Updates aller Citrix Virtual and Desktop Komponenten. Wenn die Arbeiten erfolgreich erledigt wurden, können die Snapshot mit folgendem Skript wieder entfernt werden:

Achtung: im Gegensatz zum Backup-Skript werden hier stur alle Snapshots bei VMs mit definiertem Tag gelöscht, ohne den Zeitstempel des Erstellens zu beachten.

Citrix Hypervisor (XenServer) Backup Skript

image_pdfimage_print

Guten morgen allerseits
Da man wegen der aktuellen ausserordentlichen Lage (Corona-Virus) kann man kaum was machen, da habe ich mir mal ein wenig Gedanken gemacht, wie ich meine kleine Testumgebung einfach sichern kann.
Im geschäftlichen Umfeld gibt es div. Backup-Anbieter. Für meine Testumgebung wollte ich dafür jedoch kein Geld ausgeben und wollte auf Basis eines älteren Artikels ein komplettes Skript bauen und bin dabei auf was gestossen, was ich bisher immer ignoriert hatte…

Weiterlesen

Citrix ADC SSL Bewertung optimieren – Stand Februar 2020

image_pdfimage_print

Im ursprünglichen Artikel bin ich auf die Basis-Schritte eingegangen, wie man bei Qualys die SSL Bewertung auf einen guten Stand bringen kann.

Da die Test-Routinen jeweils an die neusten Erkenntnisse angepasst werden, waren meine Bewertungen auf ein B gesunken, was für mich nicht hinnehmbar war. Hier möchte ich euch die Schritte beschreiben, wie ich wieder auf eine A+ Bewertung gekommen bin.

Weiterlesen

SMTP Relay mit ACL auf Citrix ADC konfigurieren

image_pdfimage_print

Vor knapp zwei Jahren erstellte ich hier einen Artikel, wie man grundsätzlich einen SMTP Relay mit NetScaler konfigurieren kann (hier). Im Rahmen einer Datacenter Migration kam das Thema ACL für diesen Relay auf. Im genannten Artikel wurde sauber beschrieben, wie man den Exchange auf den ADC als Quelle konfigurieren kann. Wie kann man nun aber die Quellen seitens Loadbalancer einschränken?

Weiterlesen

Advertisment ad adsense adlogger