Analysierbare NGINX-Accesslog-Dateien mit Trennzeichen

7

Das Standard-NGINX-Format lautet wie folgt:

log_format combined '$remote_addr - $remote_user [$time_local]  '
                '"$request" $status $body_bytes_sent '
                '"$http_referer" "$http_user_agent"';

Welches ist ein bisschen schwer zu analysieren. Ich befürchte, dass die Leute "entweder Anfragen, Verweise oder Benutzeragenten einbringen.

Ich habe darüber nachgedacht, stattdessen Trennzeichen zu verwenden und mein eigenes Format zu verwenden, das |P-,|als Trennzeichen verwendet wird:

log_format parsable '$status |P-,| $time_iso8601 |P-,| $http_host 
|P-,| $bytes_sent |P-,| $http_user_agent |P-,| $http_referer 
|P-,| $request_time |P-,| $request';

Nichts hindert Benutzer jedoch daran, |P-,|in ihre Anforderungen, Verweise oder Benutzeragenten einzugreifen.

Ich habe diesen Artikel über ASCII-getrennten Text gelesen: https://ronaldduncan.wordpress.com/2009/10/31/text-file-formats-ascii-delimited-text-not-csv-or-tab-delimited-text/

Ich denke, das könnte verwendet werden, um diese Probleme zu lösen, aber Benutzer könnten auch ASCII-Trennzeichen in ihre Daten einfügen.

Gibt es eine bewährte Methode zur Lösung dieses Problems?

Kasper Grubbe
quelle
Ich ziehe es vor, JSON zu protokollieren. Es ist einfach zu analysieren und kann an einen Protokollserver wie Graylog oder Kibana weitergeleitet werden.
Mschuett
Ich habe das auch getan, aber da das JSON-Modul in den Ubuntu-Repos nicht standardmäßig integriert ist, habe ich es nicht verwendet. Ich habe getan, was sie hier vorschlagen . Sie erwähnen einen Benutzer, der den Benutzeragenten so einstellt, dass er "ungültigen JSON generiert, aber möglicherweise beziehen sich die Änderungen, auf die @alexeyton verweist, auf die Behebung dieses Problems
Kasper Grubbe

Antworten:

14

Es gibt kein Problem.

Ich befürchte, dass die Leute "entweder Anfragen, Verweise oder Benutzeragenten einbringen.

" wird dargestellt als \x22

Anfrage:

$ curl 'localhost/"?"="' --header 'User-Agent: "'

Zeile im Protokoll:

[27/Mar/2014:16:14:42 +0400] localhost 127.0.0.1 "GET /\x22?\x22=\x22 HTTP/1.1" 200 "-" "\x22" "-" "/index.html"

AKTUALISIEREN

Aus dem Nginx-Änderungsprotokoll

Änderungen mit nginx 1.1.6 17. Oktober 2011

*) Change: now the 0x7F-0x1F characters are escaped as \xXX in an
   access_log.

Änderungen mit nginx 0.7.0 19. Mai 2008

*) Change: now the 0x00-0x1F, '"' and '\' characters are escaped as \xXX
   in an access_log.
   Thanks to Maxim Dounin.
Alexey Ten
quelle
Ich habe in der Dokumentation nicht erwähnt, dass sie solchen Charakteren entkommen. Das ist gut zu wissen. Vielen Dank für Ihre Antwort.
Kasper Grubbe
Bei anderen Charakteren bin ich mir nicht sicher. Das ist ein guter Grund, in Protokollen ein doppeltes Anführungszeichen als Zeichenfolgenbegrenzer zu verwenden.
Alexey Ten
Nun, in diesem Fall könnte ich "als Trennzeichen verwenden. Ich werde versuchen, das Nginx-Projekt über ihre Mailinglisten zu kontaktieren und hier zu aktualisieren.
Kasper Grubbe
@ KasperGrubbe siehe Update
Alexey Ten
Wie kann ich das Entweichen von \ x22 ausschalten?
Kev
1

Denken Sie daran, dass einige Felder vom System generiert werden, damit sie sicher sind. Wenn Sie sicherstellen, dass sich diese Felder links und die hackbaren rechts befinden (http_user_agent sollte am Ende stehen und der http_referer davor sollte die Anforderung davor sein), können Sie sicherstellen, dass die meisten Daten korrekt sind, und indem Sie sie hinzufügen Wenn der Parser mehr Trennzeichen enthält (optional ganz rechts), als möglicherweise ohne Einfügen vorhanden sind, erkennt Ihr Parser Datensätze, die eingefügt wurden.

Außerdem habe ich wieder damit begonnen, ein Tabulatorzeichen als Trennzeichen zu verwenden, da ich glaube, dass jemand, der versucht, es in eine URL einzufügen, am Ende auf% 09 maskiert wird

Sibaz
quelle
Sie konnten Referer auch nicht auf Serverebene protokollieren, es scheint als Option verpasst worden zu sein
MrMesees