Neues vom Citrix Application Delivery Controller (Netscaler ADC)

Eigentlich ist das ganze nur ein kleines Update zum Citrix Application Delivery Controller „GUI Login Bug“ bei einem Passwort mit Anführungszeichen bzw. einem Escape Zeichen (“ / “ „). 🙂

Da ein wenig Zeit vorhanden war und unsere eigenen Citrix ADCs schon länger nicht mehr aktualisiert wurden, habe ich das schnell in Angriff genommen und dabei folgendes in den Release Notes für den Citrix ADC in der Version 12.1 51.16 gefunden:

Citrix ADC GUI

After an upgrade from Citrix ADC 11.1 build 56.x to Citrix ADC 12.1 build 49.x, the login to Citrix ADC GUI fails. The issue occurs if the password contains an escape sequence, such as „“ or “ „.
[# NSHELP-18178, 716920]

Citrix Application Delivery Controller Release Notes 12.1 51.16

Beim Lesen ist weiterhin folgender, allerdings erfreulicher, Known Issue für die Netscaler ADC VPX aufgefallen, der den Application Delivery Controllern in den Versionen 12.1 51.16, 12.0 60.10 und 11.1 61.7 VMware vMotion Support mit Einschränkungen erteilt:

Citrix ADC VPX Appliance

Support for VMware vMotion
From this release, you can migrate a Citrix ADC VPX instance by using VMware vMotion. The vMotion feature does not support Citrix ADC VPX instances configured to use SR-IOV and PCI passthrough interfaces. Supported interfaces are E1000 and VMXNET3.
For more information, see Install a Citrix ADC VPX instance on VMware ESX topic: https://docs.citrix.com/en-us/netscaler/12-1/deploying-vpx/install-vpx-on-esx.html
[# NSHELP-15343, TSK0690477]

Release Notes des ADCs in den Versionen 12.1 51.16, 12.0 60.10 und 11.1 61.7

Citrix ADC Classic Policies in Advanced Polcies umwandeln

Mit dem Release 13.0 (vermutlich Q2 2019) werden voraussichtlich am Citrix ADC die seit Version 12.0.41.16 bzw. 12.0.56.20 veralteten Classic Policies entfernt und durch Advanced Policies ersetzt.

Getreu dem Motto „Was du heute kannst besorgen, schiebe gleich auf Morgen!“, ach nein, „Wenn nicht jetzt, wann dann?“ geht es heute einmal darum, am eigenen Citrix Application Delivery Controller die deprecated Classic Policies, soweit es geht, durch die Advanced Policies zu ersetzen. Glücklicherweise stellt Citrix dafür das CLI Tool „nspepi“ bereit. Als erstes mal ein kleiner Überblick, was denn alles an Klassik verschwindet (CTX234821):

  • Classic Named (policy) expression
  • Application Firewall Classic policy
  • Compression Classic policy
  • Classic Cache Redirection policy
  • Content Switching Classic policy
  • SSL Classic policy
  • Classic Audit SYSLOG policy
  • Classic Audit NSLOG policy
  • Classic AAA Pre-authentication policy
  • Classic Authorization policy
  • Classic Traffic Management Session policy
  • Classic Tunnel Traffic policy
  • Classic VPN Traffic policy
  • Classic VPN Session policy
  • Trace Classic expression
  • SYS.EVAL_CLASSIC_EXPR Classic function

Eine Möglichkeit wäre jetzt mit „nspepi“ Expression für Expression von Hand umzustellen:

nspepi -e "REQ.HTTP.HEADER Host CONTAINS 'autodiscover.domain.tld'"
> "HTTP.REQ.HEADER(\"Host\").CONTAINS(\"autodiscover.domain.tld\")"
Citrix ADC nspepi Expression
Citrix ADC nspepi Expression

Um nicht alle Expressions von Hand durchgehen zu müssen, lässt sich „nspepi“ zum Glück auch mit einer kompletten ADC Konfiguration „ns.conf“ befüttern:

cp /nsconfig/ns.conf /var/tmp/ns_classic.conf
nspepi -f /var/tmp/ns_classic.conf
> WARNING: Total number of warnings due to bind commands: 9
> WARNING: Line numbers which has bind command issues: 210, 211, 212, 213, 311, 324, 325, 326, 327
> OUTPUT: New configuration file created: new_ns_classic.conf
> OUTPUT: New warning file created: warn_ns_classic.conf
Citrix ADC nspepi ns.conf
Citrix ADC nspepi ns.conf

Derzeit können am Netscaler Gateway / Unified Gateway Advanced Policies nur per nFactor (AAA vServer) und Authentication Profil angebunden werden. Daher habe ich in meinem Fall die „new_ns_classic.conf“ runtergeladen, die vier neuen Policies für meine AAA vServer rausgepickt und im Namen um „_ADV_“ ergänzt. Im nächsten Step wurden dann die an den vServer / global gebundenen Basic Policies entfernt und durch die Advanced Policies ersetzt.

add authentication policy LDAPS_ADV_POL_Exchange -rule "HTTP.REQ.HEADER(\"Host\").CONTAINS(\"outlook.domain.tld\") || HTTP.REQ.HEADER(\"Host\").CONTAINS(\"autodiscover.domain.tld\")" -action LDAPS_SRV_Exchange
add authentication policy LDAPS_ADV_POL_Exchange_UPN -rule "HTTP.REQ.HEADER(\"Host\").CONTAINS(\"outlook.domain.tld\") || HTTP.REQ.HEADER(\"Host\").CONTAINS(\"autodiscover.domain.tld\")" -action LDAPS_SRV_Exchange_UPN
add authentication policy LDAPS_ADV_POL_Exchange_401 -rule TRUE -action LDAPS_SRV_Exchange
add authentication policy LDAPS_ADV_POL_Exchange_UPN_401 -rule TRUE -action LDAPS_SRV_Exchange_UPN 

unbind authentication vserver vs_aaa_EXCHANGE_auth_form01 -policy LDAPS_POL_Exchange
unbind authentication vserver vs_aaa_EXCHANGE_auth_form01 -policy LDAPS_POL_Exchange_UPN
unbind authentication vserver vs_aaa_EXCHANGE_auth_basic -policy LDAPS_POL_Exchange_401
unbind authentication vserver vs_aaa_EXCHANGE_auth_basic -policy LDAPS_POL_Exchange_UPN_401

bind authentication vserver vs_aaa_EXCHANGE_auth_form01 -policy LDAPS_ADV_POL_Exchange -priority 100 -gotoPriorityExpression NEXT
bind authentication vserver vs_aaa_EXCHANGE_auth_form01 -policy LDAPS_ADV_POL_Exchange_UPN -priority 110 -gotoPriorityExpression END
bind authentication vserver vs_aaa_EXCHANGE_auth_basic -policy LDAPS_ADV_POL_Exchange_401 -priority 100 -gotoPriorityExpression NEXT
bind authentication vserver vs_aaa_EXCHANGE_auth_basic -policy LDAPS_ADV_POL_Exchange_UPN_401 -priority 110 -gotoPriorityExpression END 

Damit das Gateway auch auf die Advanced Policies umgestellt werden kann benötigen wir einen weiteren (nicht adressierbaren) AAA vServer, ein Authentication Profile sowie die passende Advanced Policy. Ebenfalls kan ein Blick in diese beiden Dokumente auch nicht schaden:

add authentication policy LDAPS_ADV_POL_UGW -rule TRUE -action LDAPS_SRV_UGW
add authentication policy LDAPS_ADV_POL_UGW_UPN -rule TRUE -action LDAPS_SRV_UGW_UPN
 
add authentication vserver vs_aaa_UGW SSL 0.0.0.0 -maxLoginAttempts 5 -failedLoginTimeout 10
set ssl vserver vs_aaa_UGW -sslProfile ns_default_ssl_profile_frontend
bind ssl vserver vs_aaa_UGW -certkeyName Gateway_Cert
 
add authentication authnProfile aaa_auth_prof_UGW -authnVsName vs_aaa_UGW -AuthenticationHost aaa.domain.tld
 
bind authentication vserver vs_aaa_UGW -policy LDAPS_ADV_POL_UGW -priority 100 -gotoPriorityExpression NEXT
bind authentication vserver vs_aaa_UGW -policy LDAPS_ADV_POL_UGW_UPN -priority 110 -gotoPriorityExpression END
 
unbind vpn vserver UG_VPN_GN-Gateway -policy LDAPS_POL_UGW
set vpn vserver UG_VPN_GN-Gateway -authnProfile aaa_auth_prof_UGW

Damit der Content Switch vom Unified Gateway eine Verbindung zum soeben erstellten AAA vServer erlaubt, muss die CSW Policy des UGW noch um „|| HTTP.REQ.URL.CONTAINS(„nf/auth“)“ erweitert werden.

set cs policy UG_CSPOL_Gateway -rule "is_vpn_url || HTTP.REQ.URL.PATH.SET_TEXT_MODE(IGNORECASE).STARTSWITH(\"/Citrix\") || HTTP.REQ.URL.CONTAINS(\"nf/auth\")"

P.S.: Obacht.. Damit die Authentifizierung über UPN am ADC Unified Gateway auch am Storefront funktioniert, muss das „SSO Name Attribute“ auf „samAccountName“ konfiguriert werden. Dann validiert der ADC den UPN, holt sich den samAccountName und meldet „sich“ damit am Storefront an.

set authentication ldapAction LDAPS_SRV_UGW_UPN -ssoNameAttribute samAccountName

Citrix ADC Management GUI Login Passwort

Ein kleiner Bug in der Netscaler Citrix ADC Management GUI Anmeldung bei Passwörtern mit Anführungszeichen.

Da setzt man mal schnell einen Netscaler Citrix ADC zum Testen auf, erstellt eine LDAP Policy, damit sich ein Active Directory User anmelden kann und stellt am Ende fest, dass ein Login an der Management GUI nicht möglich ist. Fällt natürlich auch erst recht spät auf, da das meiste per SSH in der CLI eingerichtet wurde. Praktischerweise hatte das generierte Passwort neben dem scheinbar problematischen Anführungszeichen („) auch noch ein Dollarzeichen ($) sowie einen Slash (/). Leider waren die beiden zuletzt genannten Zeichen meine Hauptverdächtigen, sodass ich das Passwort doch glatt dreimal ändern musste. 🙂

Update: Betroffen sind zumindest die Versionen 12.0 und 12.1 (ältere habe ich im Moment nicht im Zugriff). In einem Ticket bei Citrix wurde bestätigt, dass der Support Engineer das Problem nachstellen konnte.

Update 2: Der Bug wurde bestätigt (#0716920) und wird nächstes Jahr mit 13.x gefixt sowie in 12.0 und 12.1 portiert.

Es betrifft hier nicht nur externe Netscaler Citrix ADC Administratoren / Nutzer, die z.B. vom Active Directory kommen, sonder auch lokale Netscaler Citrix ADC Benutzer.

Hier noch das aaad.debug Log bei Anmeldung eines Active Directory Users (ns_adm) mit Anführungszeichen im Passwort:

Fri Nov 16 13:16:48 2018
/home/build/rs_121_49_14_RTM/usr.src/netscaler/aaad/ldap_drv.c[770]: receive_ldap_user_search_event 1-7260: User search succeeded, attempting user authentication(Bind) for <ns_adm>
Fri Nov 16 13:16:48 2018
/home/build/rs_121_49_14_RTM/usr.src/netscaler/aaad/naaad.c[5013]: register_timer 1-7260: setting timer 41823
Fri Nov 16 13:16:48 2018
/home/build/rs_121_49_14_RTM/usr.src/netscaler/aaad/ldap_drv.c[1450]: receive_ldap_user_bind_event 1-7260: Got user bind event.
Fri Nov 16 13:16:48 2018
/home/build/rs_121_49_14_RTM/usr.src/netscaler/aaad/ldap_common.c[439]: ns_ldap_check_result 1-7260: checking LDAP result. Expecting 97 (LDAP_RES_BIND)
Fri Nov 16 13:16:48 2018
/home/build/rs_121_49_14_RTM/usr.src/netscaler/aaad/ldap_common.c[477]: ns_ldap_check_result 1-7260: ldap_result found expected result LDAP_RES_BIND
Fri Nov 16 13:16:48 2018
/home/build/rs_121_49_14_RTM/usr.src/netscaler/aaad/ldap_common.c[301]: ns_show_ldap_err_string 1-7260: LDAP error string: <<80090308: LdapErr: DSID-0C090400, comment: AcceptSecurityContext error, data 52e, v1db1>>
Fri Nov 16 13:16:48 2018

aaad.debug Log

Leider wird hier nur der LDAP Error Code 49 bzw. „80090308: LdapErr: DSID-0C090400, comment: AcceptSecurityContext error, data 52e, v1db1“ ausgegeben. Diese beiden Codes lassen leider nur auf einen gültigen Benutzer mit ungültigem Passwort schließen. Hier war ich dann verwundert, dass der Login via SSH / Konsole problemlos vonstatten ging.

LdapErr 52e / Active Directory LDAP Error 49:

Invalid credentials: Returned when a valid username is supplied but an invalid password/credential is supplied. If this error is received, it will prevent most other errors from being displayed.

LdapErr 52c

P.S.: Anmeldungen mit einem Benutzer und Anführungeszeichen im Passwort funktionieren tadellos am Unified Gateway oder auch am AAA vServer für z.B. Outlook WebApp (OWA) / Outlook Anywhere (OA) / Microsoft Server ActiveSync (EAS).