Nach einem Vorfall steht im Access-Log alles: was angefragt wurde, wann, woher und was der Server geantwortet hat. Das Problem ist nie zu wenig Material, sondern eine Million Zeilen davon. Diese Befehle kürzen es ein.
Wer am meisten anfragt
sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
Was er angefragt hat
sudo grep " 203.0.113.42 " /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -30
Ein Scan ist in dieser Liste offensichtlich: Dutzende Pfade, jeder einmal angefragt, die meisten 404. Ein Mensch, der surft, sieht völlig anders aus.
Was ERFOLG hatte — die eigentliche Frage
sudo awk '$9 ~ /^(200|301|302)$/ {print $1, $7}' /var/log/nginx/access.log \
| grep -E 'wp-login|xmlrpc|/admin|\.php' | sort | uniq -c | sort -rn | head -20
Eine Wand aus 404ern ist Rauschen. Eine 200 auf einem Pfad, den Sie nicht kennen, ist die Zeile zum Innehalten — besonders ein POST auf eine Datei im Upload-Verzeichnis.
Nur POSTs
sudo awk '$6 ~ /POST/ {print $1, $7, $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
Wann es passiert ist
sudo grep "203.0.113.42" /var/log/nginx/access.log | awk -F'[\\[\\]]' '{print $2}' | cut -d: -f1-2 | uniq -c
Und wie ein geglückter Upload aussieht
sudo awk '$7 ~ /uploads/ && $9 == 200 {print}' /var/log/nginx/access.log | grep -i '\.php' | head
Kopieren Sie die Logs woanders hin, bevor Sie anfangen. Die Rotation läuft, und ein ausgelasteter Server überschreibt die Spuren binnen eines Tages — meist genau bevor Sie herausgefunden haben, wonach Sie suchen.