12.10. De systeemlogger syslogd configureren

Bijgedragen door Niclas Zeising.

Systeemlogging is een belangrijk aspect van systeembeheer. Het wordt zowel gebruikt voor het opsporen van hardware-problemen als voor software-problemen in het systeem. Het speelt ook zeer belangrijke rol bij het controleren van de beveiliging en het reageren op incidenten. Systeem-daemons die niet in een terminal beheerd worden, loggen gewoonlijk informatie naar een systeemlogfaciliteit of een ander logbestand.

Deze sectie beschrijft hoe de FreeBSD systeemlogger, syslogd(8), te configureren en te gebruiken, en behandelt logrotatie en logbeheer met newsyslog(8). De focus ligt bij het opzetten en gebruiken van syslogd op een lokale machine. Meer geavanceerdere opstellingen die een aparte loghost gebruiken staan in Paragraaf 30.11.

12.10.1. syslogd gebruiken

In de standaardconfiguratie van FreeBSD wordt syslogd(8) gestart tijdens het opstarten. Dit wordt bepaald door de variabele syslogd_enable in /etc/rc.conf. Er zijn vele toepassingsargumenten die het gedrag van syslogd(8) beïnvloeden. Gebruik syslogd_flags in /etc/rc.conf om ze te veranderen. Bekijk syslogd(8) voor meer informatie over de argumenten, en rc.conf(5), Paragraaf 12.3 en Paragraaf 12.7 voor meer informatie over /etc/rc.conf en het deelsysteem rc(8).

12.10.2. syslogd configureren

Het configuratiebestand, standaard /etc/syslog.conf, bepaalt wat syslogd(8) doet met de logregels nadat ze eenmaal ontvangen zijn. Er zijn verschillende parameters om de afhandeling van binnenkomende gebeurtenissen te beheren, waarvan de twee basaalste faciliteit en niveau zijn. De faciliteit beschrijft welk deelsysteem het bericht genereerde, zoals de kernel of een daemon, het niveau beschrijft de ernst van de opgetreden gebeurtenis. Dit maakt het mogelijk om het bericht naar verschillende logbestanden te loggen, of het weg te gooien, afhankelijk van de faciliteit en het niveau. Het is ook mogelijk om actie te nemen afhankelijk van de toepassing dat het bericht verstuurde, en in het geval van loggen op afstand, ook de hostnaam van de machine dat het logbericht genereerde.

Het configureren van syslogd(8) is vrij rechttoe-rechtaan. Het configuratiebestand bevat één regel per actie, de syntaxis van elke regel is een selecteerderveld gevolgd door een actieveld. De syntaxis van het selecteerderveld is faciliteit.niveau dat overeenkomt met logberichten van faciliteit op niveau niveau of hoger. Het is ook mogelijk om een optionele vergelijkingsvlag voor het niveau toe te voegen om meer precies te specificeren wat er gelogd wordt. Er kunnen meerdere selecteerdervelden worden gebruikt voor dezelfde actie, ze worden gescheiden door een puntkomma (;). Het gebruik van * zal met alles overeenkomen. Het actieveld bepaalt waar het logbericht naar toe wordt gezonden, zoals een bestand of een loghost op afstand. Als voorbeeld is hier de standaard syslog.conf van FreeBSD:

# $FreeBSD$
#
#       Spaces ARE valid field separators in this file. However,
#       other *nix-like systems still insist on using tabs as field
#       separators. If you are sharing this file between systems, you
#       may want to use only tabs as field separators here.
#       Consult the syslog.conf(5) manpage.
*.err;kern.warning;auth.notice;mail.crit                /dev/console (1)
*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err   /var/log/messages
security.*                                      /var/log/security
auth.info;authpriv.info                         /var/log/auth.log
mail.info                                       /var/log/maillog (2)
lpr.info                                        /var/log/lpd-errs
ftp.info                                        /var/log/xferlog
cron.*                                          /var/log/cron
*.=debug                                        /var/log/debug.log (3)
*.emerg                                         *
# uncomment this to log all writes to /dev/console to /var/log/console.log
#console.info                                   /var/log/console.log
# uncomment this to enable logging of all log messages to /var/log/all.log
# touch /var/log/all.log and chmod it to mode 600 before it will work
#*.*                                            /var/log/all.log
# uncomment this to enable logging to a remote loghost named loghost
#*.*                                            @loghost
# uncomment these if you're running inn
# news.crit                                     /var/log/news/news.crit
# news.err                                      /var/log/news/news.err
# news.notice                                   /var/log/news/news.notice
!ppp (4)
*.*                                             /var/log/ppp.log
!*
(1)
Komt overeen met alle berichten met een err of hoger, alsook met kern.warning, auth.notice en mail.crit, en stuur deze logberichten naar de console ( /dev/console).
(2)
Komt overeen met alle berichten van de faciliteit mail op niveau info of hoger, en logt de berichten in /var/log/maillog.
(3)
Deze regel gebruikt een vergelijkingsvlag, = om alleen met de berichten op niveau debug overeen te komen en ze op te slaan in /var/log/debug.log.
(4)
Hier volgt een gebruiksvoorbeeld van een programmaspecificatie. Dit zorgt ervoor dat de regels alleen geldig zijn voor het programma in de programmaspecificatie. In dit geval zorgen deze en de volgende regel ervoor dat alle berichten van ppp, maar niet van andere programma's, in /var/log/ppp.log terechtkomen.

Dit voorbeeld toont dat er vele niveaus en deelsystemen zijn. De niveaus zijn, in volgorde van meest naar minst kritisch: emerg, alert, crit, err, warning, notice, info en debug.

De faciliteiten zijn, in geen specifieke volgorde: auth, authpriv, console, cron, daemon, ftp, kern, lpr, mail, mark, news, security, syslog, user, uucp en local0 tot en met local7. Let erop dat andere besturingssystemen andere faciliteiten kunnen hebben.

Met deze kennis is het eenvoudig om een nieuwe regel aan /etc/syslog.conf toe te voegen om alles van de verschillende daemons op niveau notice en hoger naar /var/log/daemon.log te loggen:

daemon.notice                                        /var/log/daemon.log

Bekijk syslog(3) en syslogd(8) voor meer informatie over de verschillende niveaus en faciliteiten. Zie syslog.conf(5) en Paragraaf 30.11 voor meer informatie over syslog.conf, de syntaxis, en geavanceerdere gebruiksvoorbeelden.

12.10.3. Logbeheer en -rotatie met newsyslog

Logbestanden hebben de neiging om snel te groeien en gestadig opgehoopt te raken. Dit leidt tot bestanden die vol zitten met minder direct bruikbare informatie en de harde schijf volmaken. Logbeheer kan gebruikt worden om dit te beheersen. In FreeBSD wordt newsyslog(8) gebruikt om logbestanden te beheren. Dit programma wordt gebruikt om periodiek logbestanden te roteren en te comprimeren en om optioneel ontbrekende logbestanden aan te maken en programma's te signaleren dat logbestanden zijn verplaatst. De logbestanden hoeven niet per sé van syslog afkomstig te zijn; newsyslog(8) werkt met elke log van elk programma. Het is belangrijk om op te merken dat newsyslog normaliter vanuit cron(8) wordt gedraaid en niet een systeem-daemon is. In de standaardconfiguratie wordt het elk uur gedraaid.

12.10.3.1. newsyslog configureren

Om te weten wat het moet doen leest newsyslog(8) zijn configuratiebestand, standaard is dit /etc/newsyslog.conf. Dit configuratiebestand bevat één regel voor elk bestand dat newsyslog(8) beheert. Elke regel noemt de eigenaar van het bestand, rechten, en wanneer dat bestand te roteren, alsook optionele vlaggen die de logrotatie beïnvloeden (zoals compressie) en naar welke programma's een signaal te sturen wanner de log is geroteerd. Als voorbeeld is hier de standaard configuratie in FreeBSD:

# configuration file for newsyslog
# $FreeBSD$
#
# Entries which do not specify the '/pid_file' field will cause the
# syslogd process to be signalled when that log file is rotated.  This
# action is only appropriate for log files which are written to by the
# syslogd process (ie, files listed in /etc/syslog.conf).  If there
# is no process which needs to be signalled when a given log file is
# rotated, then the entry for that file should include the 'N' flag.
#
# The 'flags' field is one or more of the letters: BCDGJNUXZ or a '-'.
#
# Note: some sites will want to select more restrictive protections than the
# defaults.  In particular, it may be desirable to switch many of the 644
# entries to 640 or 600.  For example, some sites will consider the
# contents of maillog, messages, and lpd-errs to be confidential.  In the
# future, these defaults may change to more conservative ones.
#
# logfilename          [owner:group]    mode count size when  flags [/pid_file] [sig_num]
/var/log/all.log                        600  7     *    @T00  J
/var/log/amd.log                        644  7     100  *     J
/var/log/auth.log                       600  7     100  @0101T JC
/var/log/console.log                    600  5     100  *     J
/var/log/cron                           600  3     100  *     JC
/var/log/daily.log                      640  7     *    @T00  JN
/var/log/debug.log                      600  7     100  *     JC
/var/log/init.log                       644  3     100  *     J
/var/log/kerberos.log                   600  7     100  *     J
/var/log/lpd-errs                       644  7     100  *     JC
/var/log/maillog                        640  7     *    @T00  JC
/var/log/messages                       644  5     100  @0101T JC
/var/log/monthly.log                    640  12    *    $M1D0 JN
/var/log/pflog                          600  3     100  *     JB    /var/run/pflogd.pid
/var/log/ppp.log        root:network    640  3     100  *     JC
/var/log/security                       600  10    100  *     JC
/var/log/sendmail.st                    640  10    *    168   B
/var/log/utx.log                        644  3     *    @01T05 B
/var/log/weekly.log                     640  5     1    $W6D0 JN
/var/log/xferlog                        600  7     100  *     JC

Elke regel begint met de naam van het bestand dat geroteerd moet worden, optioneel gevolgd door een eigenaar en groep voor zowel de geroteerde als nieuw aangemaakte bestanden. Het volgende veld, mode is de modus van de bestanden en count geeft aan hoeveel geroteerde logbestanden bewaard moeten worden. De velden size en when vertellen newyslog wanneer het bestand geroteerd moet worden. Een logbestand wordt geroteerd wanneer òfwel de grootte meer is dan de waarde in het veld size, òfwel wanneer de tijd in het veld when is verstreken. * geeft aan dat dit veld genegeerd wordt. Het veld flags geeft newsyslog(8) verdere instructies, zoals hoe het geroteerde bestand te comprimeren of om het logbestand aan te maken als het ontbreekt. De laatste twee velden zijn optioneel en specificeren het PID-bestand van een proces en een naar dat proces te verzenden signaalnummer wanneer het bestand wordt geroteerd. Raadpleeg newsyslog.conf(5) voor meer informatie over alle velden, geldige vlaggen en hoe de rotatietijd te specificeren. Herinner dat newsyslog wordt gedraaid vanuit cron en niet vaker bestanden kan roteren dan dat het gedraaid wordt vanuit cron(8).