Debian server beheer

Log files: problemen herkennen en oplossen

Bij het analyseren van de log files maak je veel gebruik van tools als grep, sort, cut en uniq. Deze staan uitgelegd in het hoofdstuk Debian basics.

auth.log

In /var/log/auth.log wordt bijgehouden wie met succes inlogt en vanaf welk ip adres ze dat doen. Je kunt er doorheen bladeren om te zien wie er bijvoorbeeld met ssh inlogt. Je ziet dan een heleboel regels zoals onderstaande:

Jun 15 15:41:40 server1 sshd[14482]: Accepted password for user1 from 10.11.12.13 port 55724 ssh2 Jun 18 07:30:01 server1 sshd[22723]: Failed password for invalid user xyz from 10.11.12.13 port 60004 ssh2

Maar met een slimme zoekopdracht maak je het jezelf veel makkelijker.

grep "ssh2$" /var/log/auth.log | sed -e 's/^.* for //g' -e 's/port.*$//g' | sort | uniq -c

4 user1 from 10.11.12.13 4 invalid user abc from 10.11.12.13 4 invalid user xyz from 10.11.12.13 8 user2 from 10.11.12.13 4 root from 10.11.12.14 42 root from 10.11.12.13 7 user3 from 10.11.12.13 10 uers3 from 10.11.12.13

Dit geeft je een keurig lijstje van geldige en ongeldige logins met ssh2. Eerst zoekt grep in auth.log naar regels die eindigen met ssh 2. Vervolgens gebruik je sed om de regels op te schonen. De eerste zoekopdracht wist het begin van de regel tot en met ' for ' en de tweede zoekopdracht wist 'port' tot en met het eind van de regel (om precies te zijn niet wissen maar vervangen door niks). Sort sorteert de regels en unic -c telt hoe vaak elke regels voorkomt en maakt daar een mooi tabelletje van.

Als je de toegang tot ssh beperkt hebt tot bepaalde ip-adressen zie je als het goed is alleen die ip-adressen in deze tabel. Zie je ook andere adressen, controleer dan je firewall en hosts.deny/allow.

Met deze output kun je allerlei leuke dingen doen. Je kunt het bijvoorbeeld aan jezelf laten mailen:

grep "ssh2$" /var/log/auth.log | sed -e 's/^.* for //g' -e 's/port.*$//g' | sort | uniq -c | mail -s 'ssh login bewaker' jan@2ha.nl

Gooi er nog wat crontab tegenaan en je kunt jezelf elk uur laten mailen wie er in je server geweest is. Als je zo paranoïde bent...

syslog: postfix en dovecot het stilzwijgen opleggen

postfix en dovecot schrijven heel veel meldingen naar syslog. Elke poging om mail te ontvangen of verzenden leidt tot meerdere regels log. Dat maakt het des te moeilijker om belangrijke problemen op te sporen. Daarom gaan we als eerste postfix en dovecot vertellen alléén foutmeldingen in syslog te zetten.

cp /etc/rsyslog.conf /etc/rsyslog.conf.backup nano /etc/rsyslog.conf

Zoek de regel "*.*;auth,authpriv.none -/var/log/syslog" (bij mij stond die op regel 57) en pas die alsvolgt aan:

*.*;auth,authpriv.none;mail.none;mail.error -/var/log/syslog

Tenslotte nog de syslog deamon herstarten:

/etc/init.d/rsyslog restart

Daarna schrijft postfix alleen nog maar foutmeldingen naar /var/log/syslog. Alle andere meldingen én foutmeldingen gaan naar /var/log/mail.log. Dit maakt je syslog al een heel stuk overzichtelijker.

syslog bekijken

Een snelle manier om syslog te bekijken is met tail

tail /var/log/syslog

Je krijgt dan standaard de laatste 20 regels van syslog te zien. Dat aantal kun je simpel aanpassen. Om de laatste 40 regels te zien

tail -40 /var/log/syslog

Je kunt ook 'live' meekijken in syslog met de -f optie:

tail -f /var/log/syslog

Als je genoeg gezien hebt sluit je tail af met control+z. Met grep kun je zoeken in de syslog. Normaal is grep hoofdlettergevoelig, daarom gebruik je de -i optie om zowel "error" als "Error" te vinden op deze manier:

grep -i "error" /var/log/syslog

Als je een bepaald specifiek probleem op wilt lossen kun je beide opties combineren:

tail -f /var/log/syslog | grep -i "mijnzoekterm"

Vergeet niet dat je net zoveel terminal sessies naar je server kunt openen als je wilt. Je kunt dus in de ene tail -f laten draaien om de foutmeldingen te volgen en in de andere proberen het probleem op te lossen.

Fail2ban logfiles

Fail2ban slaat zijn meldingen op in /var/log/fail2ban.log. Je kunt met de volgende opdracht laten zien welke ip-adressen in de afgelopen week geblokkeerd zijn:

grep " Ban " /var/log/fail2ban.log | cut -f5,7 -d" " | sort | uniq -c | sort

1 [ssh] 192.87.139.155 5 [sasl] 12.236.34.135 6 [sasl] 77.231.181.146 6 [sasl] 95.17.250.169

Dit zijn alleen de bans uit het laatste logfile. Fail2ban slaat oudere logfiles op onder de namen fail2ban.log.2.gz, fail2ban.log.3,gz, enz. Om al die bestanden ook mee te pakken gebruik je zgrep en voeg je een * toe aan de bestandsnaam:

zgrep " Ban " /var/log/fail2ban.log* | cut -f5,7 -d" " | sort | uniq -c | sort

Je krijgt een vergelijkbare uitvoer maar dan van de bans van de laatste vijf weken in plaats van alleen de laatste week.

IP-adressen waar je te veel last van hebt kun je blokkeren met de firewall.

mail.log

Als je klachten krijgt over spam verstuurd vanaf jouw server kan het handig zijn om snel te kunnen zien aan wie er mail verstuurd is. Gebruik daarvoor:

grep "postfix/smtp.*to=.*status=sent" mail.log mail.log.1 | sed 's/^.*.*$//' | sort | uniq -c | sort -n

Hiermee bekijk je mail.log en mail.log.1 zodat je tenminste een week terug kijkt. Wil je een maand terugkijken dan doe je:

zgrep "postfix/smtp.*to=.*status=sent" mail.log* | sed 's/^.*.*$//' | sort | uniq -c | sort -n

In dit geval gebruiken we zgrep omdat die ook zoekt in gecomprimeerde (.gz) bestanden. Beide opdrachten geven je een overzicht van alle adressen die mail ontvingen vanaf je server en hoeveel berichten ze kregen:

8 info@ergens.nl 16 info@ergensanders.nl

Je kunt natuurlijk de logs ook doorzoeken op een specifiek e-mailadres:

zgrep info@ergens.nl mail.log*

Je krijgt dan alle regels uit de logs van de laatste mand waarin info@ergens.nl voorkomt.

Log files leegmaken

Soms kan het handig zijn om een log file leeg te maken zodat je de nieuwe foutmeldingen verzamelt. De simpelste manier om een bestand leeg te maken is:

> /home/lisa/logs/apache2/error.log

Dit maakt van error.log een leeg bestand, Apache schrijft daar vrolijk verder met nieuwe foutmeldingen.