
Sammeln von NetScaler-LOGs in Elasticsearch und Visualisieren in Grafana
Heute haben wir ein ziemlich interessantes Menü, und wenn Sie für einen NetScaler in Ihrer Infrastruktur verantwortlich sind, In diesem Beitrag werden wir sehen, wie wir ihre Protokolle sammeln können, um sie später zu verarbeiten und schließlich ein Dashboard in Grafana zu erstellen, das in Echtzeit angezeigt wird (oder historisch) Die gesammelten Daten.
Also, was ich gesagt habe, Wir können unseren Citrix NetScaler seine Protokolle an Logstash senden lassen, um sie zu verarbeiten und in strukturierte Daten zu unterteilen, was Zeilen aus verschiedenen Protokollen sind. Wir speichern diese Informationen in einem Elasticsearch-Index und dann mit einem Konnektor oder einer "Datenquelle".’ von Grafana werden wir in der Lage sein, auf diese Daten zuzugreifen, um sie in Echtzeit oder in einem bestimmten Zeitraum anzuzeigen (Letzte 24h, Monat…). Und jeder kann das Dashboard basierend auf der Rolle seines NS erstellen, Wenn der Gateway-Dienst die öffentlichen IP-Adressen sieht, die auf, Verkehre… Wenn wir ein Content Switching dito zusätzlich zu den Zielen haben… Wenn wir ein Load Balancing haben, dann analysieren Sie wirklich, wohin die Verbindungen gehen… Letztendlich kann alles, was in einem Protokoll gespeichert ist, ausgenutzt werden, und NetScaler ist ein sehr interessantes Gerät, um zu wissen, was im Inneren passiert, wie z.B. die Anzeige von Authentifizierungen, richtig oder falsch.
Zuerst müssen wir natürlich den Elastic Stack-Teil installiert haben, Was wurde Logstash, Elasticsearch (Englisch) und Kibana; dann wäre es, unseren NetScaler anzuweisen, die Protokolle an Logstash zu senden, zum Hafen unserer Wahl, Wir erfinden einen (seit “System” > “Rechnungsprüfung” > “Syslog-Überwachung”. Denken Sie daran, die Konfiguration auf dem NetScaler zu speichern..
Als Nächstes erstellen Sie eine Datei in Logstash, die Sie aufnehmen müssen, Transformieren und Senden von Daten. Primero escuchar en el puerto UDP indicado en el paso anterior; Sekunde, tratar los logs que recibe y separarlos en distintos campos para ser por último almacenados en nuestro Elasticsearch.
Eingabe { UDP { Typ => "Netscaler" Anschluss => "1517" -Tags => ["Netscaler"] } } Filter { wenn [Art] == "Netscaler" { Begreifen { Übereinstimmung => { "Nachricht" => [ "^<%{POSINT:syslog_pri}>%{RAUM}%{DATE_US:Log_fecha}:%{ZEIT:Log_hora}%{RAUM}%{SYSLOGHOST:NSlog_hostname}%{RAUM}0-PPE-0%{RAUM}:%{RAUM}Verzug%{RAUM}%{WORT:Log_tipo}%{RAUM}%{WORT:Log_evento}%{RAUM}%{INT:Log_id}%{RAUM}0%{RAUM}:%{RAUM}Kontext%{RAUM}%{NUTZERNAME:Benutzer}@%{IPV4:IP_origen}%{RAUM}-%{RAUM}Sitzungs-ID:%{RAUM}%{INT:Session_id}%{RAUM}-%{RAUM}Benutzer%{RAUM}%{NUTZERNAME:Usuario2}%{RAUM}-%{RAUM}Client_ip %{RAUM}%{IPV4:IP_origen2}%{RAUM}-%{RAUM}Nat_ip %{RAUM}\"Zugeordnete IP"%{RAUM}-%{RAUM}Vserver%{RAUM}%{IPV4:vServer_ip}:%{ZAHL:vServer_puerto}%{RAUM}-%{RAUM}Start_time %{RAUM}\"%{DATE_US:Inicio_fecha}:%{ZEIT:Inicio_hora}%{RAUM}\"%{RAUM}-%{RAUM}End_time %{RAUM}\"%{DATE_US:Fin_fecha}:%{ZEIT:Fin_hora}%{RAUM}\"%{RAUM}-%{RAUM}Dauer%{RAUM}%{ZEIT:Duracion}%{RAUM}-%{RAUM}Http_resources_accessed %{RAUM}%{ZAHL:Http_resources_accessed}%{RAUM}-%{RAUM}NonHttp_services_accessed %{RAUM}%{ZAHL:NonHttp_services_accessed}%{RAUM}-%{RAUM}Total_TCP_connections %{RAUM}%{ZAHL:Total_TCP_connections}%{RAUM}-%{RAUM}Total_UDP_flows %{RAUM}%{ZAHL:otal_UDP_flows}%{RAUM}-%{RAUM}Total_policies_allowed %{RAUM}%{ZAHL:Total_policies_allowed}%{RAUM}-%{RAUM}Total_policies_denied %{RAUM}%{ZAHL:Total_policies_denied}%{RAUM}-%{RAUM}Total_bytes_send %{RAUM}%{ZAHL:Total_bytes_send}%{RAUM}-%{RAUM}Total_bytes_recv %{RAUM}%{ZAHL:Total_bytes_recv}%{RAUM}-%{RAUM}Total_compressedbytes_send %{RAUM}%{ZAHL:Total_compressedbytes_send}%{RAUM}-%{RAUM}Total_compressedbytes_recv %{RAUM}%{ZAHL:Total_compressedbytes_recv}%{RAUM}-%{RAUM}Compression_ratio_send %{RAUM}%{ZAHL:Compression_ratio_send}\%%{RAUM}-%{RAUM}Compression_ratio_recv %{RAUM}%{ZAHL:Compression_ratio_recv}\%%{RAUM}-%{RAUM}LogoutMethod%{RAUM}\"%{DATUM:Logout-Methode}\"%{RAUM}-%{RAUM}Gruppe(s)%{RAUM}\"%{DATUM:Gruppe}\"", "^<%{POSINT:syslog_pri}>%{RAUM}%{DATE_US:Log_fecha}:%{ZEIT:Log_hora}%{RAUM}%{SYSLOGHOST:NSlog_hostname}%{RAUM}0-PPE-0%{RAUM}:%{RAUM}Verzug%{RAUM}%{WORT:Log_tipo}%{RAUM}%{WORT:Log_evento}%{RAUM}%{INT:Log_id}%{RAUM}0%{RAUM}:%{RAUM}Kontext%{RAUM}%{NUTZERNAME:Benutzer}@%{IPV4:IP_origen}%{RAUM}-%{RAUM}Sitzungs-ID:%{RAUM}%{INT:Session_id}%{RAUM}-%{RAUM}Benutzer%{RAUM}%{NUTZERNAME:Usuario2}%{RAUM}-%{RAUM}Client_ip %{RAUM}%{IPV4:IP_origen2}%{RAUM}-%{RAUM}Nat_ip %{RAUM}\"Zugeordnete IP"%{RAUM}-%{RAUM}Vserver%{RAUM}%{IPV4:vServer_ip}:%{ZAHL:vServer_puerto}%{RAUM}-%{RAUM}%{GIERIGE DATEN:Nachricht}", "^<%{POSINT:syslog_pri}>%{RAUM}%{DATE_US:Log_fecha}:%{ZEIT:Log_hora}%{RAUM}%{SYSLOGHOST:NSlog_hostname}%{RAUM}0-PPE-0%{RAUM}:%{RAUM}Verzug%{RAUM}%{WORT:Log_tipo}%{RAUM}%{WORT:Log_evento}%{RAUM}%{INT:Log_id}%{RAUM}0%{RAUM}:%{RAUM}Benutzer%{RAUM}%{NUTZERNAME:Benutzer}%{RAUM}-%{RAUM}Client_ip %{RAUM}%{IPV4:IP_origen}%{RAUM}-%{RAUM}%{GIERIGE DATEN:Nachricht}", "^<%{POSINT:syslog_pri}>%{RAUM}%{DATE_US:Log_fecha}:%{ZEIT:Log_hora}%{RAUM}%{SYSLOGHOST:NSlog_hostname}%{RAUM}0-PPE-0%{RAUM}:%{RAUM}Verzug%{RAUM}%{WORT:Log_tipo}%{RAUM}%{WORT:Log_evento}%{RAUM}%{INT:Log_id}%{RAUM}0%{RAUM}:%{RAUM}Quelle%{RAUM}%{IPV4:IP_origen}:%{ZAHL:Puerto_origen}%{RAUM}-%{RAUM}Vserver%{RAUM}%{IPV4:vServer_ip}:%{ZAHL:vServer_puerto}%{RAUM}-%{RAUM}NatIP% (NatIP%){RAUM}%{IPV4:NAT_ip}:%{ZAHL:NAT_puerto}%{RAUM}-%{RAUM}Ziel%{RAUM}%{IPV4:IP_destino}:%{ZAHL:Puerto_destino}%{RAUM}-%{RAUM}Entkoppeln%{RAUM}Zeit%{RAUM}%{DATE_US:Delink_fecha}:%{ZEIT:Delink_hora}%{RAUM}-%{RAUM}Total_bytes_send %{RAUM}%{INT:Total_bytes_enviados}%{RAUM}-%{RAUM}Total_bytes_recv %{RAUM}%{INT:Total_bytes_recibidos}", "^<%{POSINT:syslog_pri}>%{RAUM}%{DATE_US:Log_fecha}:%{ZEIT:Log_hora}%{RAUM}%{SYSLOGHOST:NSlog_hostname}%{RAUM}0-PPE-0%{RAUM}:%{RAUM}Verzug%{RAUM}%{WORT:Log_tipo}%{RAUM}%{WORT:Log_evento}%{RAUM}%{INT:Log_id}%{RAUM}0%{RAUM}:%{RAUM}Quelle%{RAUM}%{IPV4:IP_origen}:%{ZAHL:Puerto_origen}%{RAUM}-%{RAUM}Ziel%{RAUM}%{IPV4:Destino_ip}:%{ZAHL:Destino_puerto}%{RAUM}-%{RAUM}Beginn%{RAUM}Zeit%{RAUM}%{DATE_US:Inicio_fecha}:%{ZEIT:Inicio_hora}%{RAUM}-%{RAUM}Ende%{RAUM}Zeit%{RAUM}%{DATE_US:Fin_fecha}:%{ZEIT:Fin_hora}%{RAUM}-%{RAUM}Total_bytes_send %{RAUM}%{INT:Total_bytes_enviados}%{RAUM}-%{RAUM}Total_bytes_recv %{RAUM}%{INT:Total_bytes_recibidos}", "^<%{POSINT:syslog_pri}>%{RAUM}%{DATE_US:Log_fecha}:%{ZEIT:Log_hora}%{RAUM}%{SYSLOGHOST:NSlog_hostname}%{RAUM}0-PPE-0%{RAUM}:%{RAUM}Verzug%{RAUM}%{WORT:Log_tipo}%{RAUM}%{WORT:Log_evento}%{RAUM}%{INT:Log_id}%{RAUM}0%{RAUM}:%{RAUM}Quelle%{RAUM}%{IPV4:IP_origen}:%{ZAHL:Puerto_origen}%{RAUM}-%{RAUM}Vserver%{RAUM}%{IPV4:vServer_ip}:%{ZAHL:vServer_puerto}%{RAUM}-%{RAUM}NatIP% (NatIP%){RAUM}%{IPV4:NAT_ip}:%{ZAHL:NAT_puerto}%{RAUM}-%{RAUM}Ziel%{RAUM}%{IPV4:IP_destino}:%{ZAHL:Puerto_destino}%{RAUM}-%{RAUM}Entkoppeln%{RAUM}Zeit%{RAUM}%{DATE_US:Delink_fecha}:%{ZEIT:Delink_hora}%{RAUM}Total_bytes_send %{RAUM}%{INT:Total_bytes_enviados}%{RAUM}-%{RAUM}Total_bytes_recv %{RAUM}%{INT:Total_bytes_recibidos}", "^<%{POSINT:syslog_pri}>%{RAUM}%{DATE_US:Log_fecha}:%{ZEIT:Log_hora}%{RAUM}%{SYSLOGHOST:NSlog_hostname}%{RAUM}0-PPE-0%{RAUM}:%{RAUM}Verzug%{RAUM}%{WORT:Log_tipo}%{RAUM}%{WORT:Log_evento}%{RAUM}%{INT:Log_id}%{RAUM}0%{RAUM}:%{RAUM}SPCBId%{RAUM}%{INT:SPCBId}%{RAUM}-%{RAUM}ClientIP% (Englisch){RAUM}%{IPV4:IP_origen}%{RAUM}-%{RAUM}Kundenanschluss%{RAUM}%{ZAHL:Puerto_origen}%{RAUM}-%{RAUM}VserverServiceIP% (Englisch){RAUM}%{IPV4:vServer_ip}%{RAUM}-%{RAUM}VserverServicePort%{RAUM}%{ZAHL:vServer_puerto}%{RAUM}-%{RAUM}ClientVersion%{RAUM}%{DATUM:Client_version}%{RAUM}-%{RAUM}CipherSuite% (Englisch){RAUM}\"%{DATUM:Cipher_suite}\"(%{RAUM}-%{RAUM}Sitzung%{RAUM}Wiederverwendung%{RAUM}-%{RAUM}HandshakeZeit%{RAUM}%{INT:Handshake_time}%{RAUM}Frau)?", "^<%{POSINT:syslog_pri}>%{RAUM}%{DATE_US:Log_fecha}:%{ZEIT:Log_hora}%{RAUM}%{SYSLOGHOST:NSlog_hostname}%{RAUM}0-PPE-0%{RAUM}:%{RAUM}Verzug%{RAUM}%{WORT:Log_tipo}%{RAUM}%{WORT:Log_evento}%{RAUM}%{INT:Log_id}%{RAUM}0%{RAUM}:%{RAUM}SPCBId%{RAUM}%{INT:SPCBId}%{RAUM}-%{RAUM}Name des Ausstellers%{RAUM}\"%{RAUM}%{DATUM:Issuer_name}\"", "^<%{POSINT:syslog_pri}>%{RAUM}%{DATE_US:Log_fecha}:%{ZEIT:Log_hora}%{RAUM}%{SYSLOGHOST:NSlog_hostname}%{RAUM}0-PPE-0%{RAUM}:%{RAUM}Verzug%{RAUM}%{WORT:Log_tipo}%{RAUM}%{WORT:Log_evento}%{RAUM}%{INT:Log_id}%{RAUM}0%{RAUM}:%{RAUM}SPCBId%{RAUM}%{INT:SPCBId}%{RAUM}-%{RAUM}BetreffName%{RAUM}\"%{RAUM}%{DATUM:Subject_name}\"", "^<%{POSINT:syslog_pri}>%{RAUM}%{DATE_US:Log_fecha}:%{ZEIT:Log_hora}%{RAUM}%{SYSLOGHOST:NSlog_hostname}%{RAUM}0-PPE-0%{RAUM}:%{RAUM}Verzug%{RAUM}%{WORT:Log_tipo}%{RAUM}%{WORT:Log_evento}%{RAUM}%{INT:Log_id}%{RAUM}0%{RAUM}:%{RAUM}Kontext%{RAUM}%{NUTZERNAME:Benutzer}@%{IPV4:IP_origen}%{RAUM}-%{RAUM}Sitzungs-ID:%{RAUM}%{INT:Session_id}%{RAUM}-%{RAUM}%{HOSTNAME:FQDN}%{RAUM}Benutzer%{RAUM}%{NUTZERNAME:Usuario2}%{RAUM}:%{RAUM}Gruppe(s)%{RAUM}%{DATUM:Gruppe}%{RAUM}:%{RAUM}Vserver%{RAUM}%{IPV4:vServer_ip}:%{ZAHL:vServer_puerto}%{RAUM}-%{RAUM}%{DATE_US:Datum}:%{ZEIT:Stunde}%{RAUM}:%{RAUM}%{GIERIGE DATEN:Nachricht}", "^<%{POSINT:syslog_pri}>%{RAUM}%{DATE_US:Log_fecha}:%{ZEIT:Log_hora}%{RAUM}%{SYSLOGHOST:NSlog_hostname}%{RAUM}0-PPE-0%{RAUM}:%{RAUM}Verzug%{RAUM}%{WORT:Log_tipo}%{RAUM}%{WORT:Log_evento}%{RAUM}%{INT:Log_id}%{RAUM}0%{RAUM}:%{RAUM}%{GIERIGE DATEN:Nachricht}" ] } } Geoip { Quelle => "IP_origen" Ziel => "Geoip" add_field => [ "[Geoip][Koordinaten]", "%{[Geoip][Länge]}" ] add_field => [ "[Geoip][Koordinaten]", "%{[Geoip][Breite]}" ] } Stumm { konvertieren => [ "[Geoip][Koordinaten]", "schweben" ] konvertieren => [ "Total_bytes_enviados", "Ganze Zahl" ] konvertieren => [ "Total_bytes_recibidos", "Ganze Zahl" ] } } } Ausgabe { wenn ([Art]=="Netscaler"){ ElasticSearch (Englisch) { Index => "netscaler-%{+JJJJ. MM.dd}" hosts=> "DIRECCION_IP_ELASTICSEARCH:9200" } } }
Lassen Sie uns also zum Beispiel die folgende Konfigurationsdatei erstellen: '/etc/logstash/conf.d/netscaler.conf', Ich überlasse Ihnen mein Beispiel unten. Meine Filter sind sehr einfach und die ersten von Logstash, Aber sie funktionieren 😉, wenn Sie also interessiert sind, können Sie sie kopieren, und wenn Sie sie verbessern, geben Sie sie an mich weiter 🙂 Am Ende geben wir in der Ausgabe den Elasticsearch-Server an, an den die Daten gesendet werden sollen, und den Index, wo sie gespeichert werden; Denken Sie daran, dass Sie bei einer Authentifizierung die Parameter "Benutzername" eingeben’ & 'Passwort’ in der Ausgabe. Die Wahrheit ist, dass ich mir den Code jetzt anschaue und er verbessert werden kann, Ich kratzte mich an den Räumen, an die ich mich erinnere… Ich hoffe, du kannst mir verzeihen, aber es funktioniert, zumindest mit den neuesten Versionen wie NetScaler 13.0.
Sobald die Konfigurationsdatei erstellt wurde, Denken Sie daran, den Logstash-Dienst neu zu starten, um ihn neu zu laden. Danach wie immer, Wir werden nach Kibana gehen, und sobald die Daten eintreffen, können wir nach “Management” > “Stack-Verwaltung” > “Kibana” > “Index-Muster” > “Erstellen eines Indexmusters” So erstellen Sie das Indexmuster, Wie ich schon sagte, wie gewöhnlich (In diesem Fall und ohne die Anführungszeichen) 'netscaler-*’ und wir werden die Daten bereits korrekt in Elasticsearch gespeichert haben. Jetzt konnten wir uns von “Entdecken” in unseren NetScaler-Index aufzunehmen und zu visualisieren, dass er Daten sammelt.
Und dann, nach dem Erstellen des Index in Kibana, jetzt sollten wir in unserem Grafana eine “Datenquelle” , die auf unsere Elasticsearch und den NetScaler-Index abzielt. Dann heißt es, Ihrer Fantasie freien Lauf zu lassen, Erstellen eines Dashboards mit verschiedenen Dashboards, mit unterschiedlichen Daten zur Visualisierung, Eins Weltkarte mit eingehenden Verbindungen, Einer des Stils Sankey um Ursprungs-/Ziel-IPs und den gesendeten Datenverkehr anzuzeigen, im Spaltenformat, in Patt um bestimmte Daten einzusehen, z. B. die korrekten Logins, Unrichtig, Die Verbindungen…
Alles kann für Sie genutzt werden, um Ideen aufzugreifen und zu verbessern, Damit können Sie sehen, was in unserem(s) Citrix NetScaler Echtzeit, Einfügen einer automatischen Aktualisierung alle 10 Sekunden ist sehr beeindruckend, Es wird uns auch helfen, die Zusammenfassung eines Tages zu analysieren, oder zu wissen, wenn etwas Seltsames passiert… Wie gewöhnlich, Vielen Dank an alle und noch mehr an diejenigen, die diese Art von Inhalten in sozialen 😉 Netzwerken verbreiten