El demonio
syslogd (
Syslog Daemon) se lanza automáticamente al arrancar un sistema Unix, y es el encargado de guardar informes sobre el funcionamiento de la máquina. Recibe mensajes de las diferentes partes del sistema (núcleo, programas...) y los envía y/o almacena en diferentes localizaciones, tanto locales como remotas, siguiendo un criterio definido en el fichero de configuración
/etc/syslog.conf, donde especificamos las reglas a seguir para gestionar el almacenamiento de mensajes del sistema. Las líneas de este archivo que comienzan por
`#' son comentarios, con lo cual son ignoradas de la misma forma que las líneas en blanco; si ocurriera un error al interpretar una de las líneas del fichero, se ignoraría la línea completa. Un ejemplo de fichero
/etc/syslog.conf es el siguiente:
anita:~# cat /etc/syslog.conf
#ident "@(#)syslog.conf 1.4 96/10/11 SMI" /* SunOS 5.0 */
#
# Copyright (c) 1991-1993, by Sun Microsystems, Inc.
#
# syslog configuration file.
#
# This file is processed by m4 so be careful to quote (`') names
# that match m4 reserved words. Also, within ifdef's, arguments
# containing commas must be quoted.
#
*.err;kern.notice;auth.notice /dev/console
*.err;kern.debug;daemon.notice;mail.crit /var/adm/messages
*.alert;kern.err;daemon.err operator
*.alert root
*.emerg *
# if a non-loghost machine chooses to have authentication messages
# sent to the loghost machine, un-comment out the following line:
#auth.notice ifdef(`LOGHOST', /var/log/authlog, @loghost)
mail.debug ifdef(`LOGHOST', /var/log/syslog, @loghost)
#
# non-loghost machines will use the following lines to cause "user"
# log messages to be logged locally.
#
ifdef(`LOGHOST', ,
user.err /dev/console
user.err /var/adm/messages
user.alert `root, operator'
user.emerg *
)
anita:~#
Podemos ver que cada regla del archivo tiene dos campos: un campo de selección y un campo de acción, separados ambos por espacios o tabuladores. El
campo de selección está compuesto a su vez de dos partes separadas por un punto: una que indica el servicio que envía el mensaje y otra que marca su prioridad, separadas por un punto (
`.'); ambas son indiferentes a mayúsculas y minúsculas. La parte del servicio contiene una de las siguientes palabras clave:
auth,
auth-priv,
cron,
daemon,
kern,
lpr,
mail,
mark,
news,
security (equivalente a
auth),
syslog,
user,
uucp y
local0 hasta
local7; esta parte especifica el `subsistema' que ha generado ese mensaje (por ejemplo, todos los programas relacionados con el correo generarán mensajes ligados al servicio
mail). En segundo lugar, la prioridad está compuesta de uno de los siguientes términos, en orden ascendente:
debug,
info,
notice,
warning,
warn (equivalente a
warning),
err,
error (equivalente a
err),
crit,
alert,
emerg, y
panic (equivalente a
emerg). La prioridad define la gravedad o importancia del mensaje almacenado. Todos los mensajes de la prioridad especificada y superiores son almacenados de acuerdo con la acción requerida.
Además de los términos mencionados hasta ahora, el demonio
syslogd emplea en su fichero de configuración los siguientes caracteres especiales:
- `' (asterisco)
Empleado como comodín para todas las prioridades y servicios anteriores, dependiendo de dónde son usados (si antes o después del carácter de separación `.'):# Guardar todos los mensajes del servicio mail en /var/adm/mail
#
mail.* /var/adm/mail
- ` ' (blanco, espacio, nulo)
Indica que no hay prioridad definida para el servicio de la línea almacenada.
- `,' (coma)
Con este carácter es posible especificar múltiples servicios con el mismo patrón de prioridad en una misma línea. Es posible enumerar cuantos servicios se quieran:# Guardar todos los mensajes mail.info y news.info en
# /var/adm/info
mail,news.=info /var/adm/info
- `;' (punto y coma)
Es posible dirigir los mensajes de varios servicios y prioridades a un mismo destino, separándolos por este carácter:# Guardamos los mensajes de prioridad "info" y "notice"
# en el archivo /var/log/messages
*.=info;*.=notice /var/log/messages
- `=' (igual)
De este modo solo se almacenan los mensajes con la prioridad exacta especificada y no incluyendo las superiores:# Guardar todos los mensajes criticos en /var/adm/critical
#
*.=crit /var/adm/critical
- `!' (exclamación)
Preceder el campo de prioridad con un signo de exclamación sirve para ignorar todas las prioridades, teniendo la posibilidad de escoger entre la especificada (!=prioridad) y la especificada más todas las superiores (!prioridad). Cuando se usan conjuntamente los caracteres `=' y `!', el signo de exclamación `!' debe preceder obligatoriamente al signo igual `=', de esta forma: !=.# Guardar mensajes del kernel de prioridad info, pero no de
# prioridad err y superiores
# Guardar mensajes de mail excepto los de prioridad info
kern.info;kern.!err /var/adm/kernel-info
mail.*;mail.!=info /var/adm/mail
La segunda parte de cada línea del archivo de configuración de
syslogd es el
campo de acción, y describe el destino de los mensajes (dónde se van a guardar o qué programa los va a procesar); este destino puede ser uno de los siguientes:
- Un fichero plano
Normalmente los mensajes del sistema son almacenados en ficheros planos. Dichos ficheros han de estar especificados con la ruta de acceso completa (comenzando con `/').
Podemos preceder cada entrada con el signo menos, `-', para omitir la sincronización del archivo (vaciado del buffer de memoria a disco). Aunque puede ocurrir que se pierda información si el sistema cae justo después de un intento de escritura en el archivo, utilizando este signo se puede conseguir una mejora importante en la velocidad, especialmente si estamos ejecutando programas que mandan muchos mensajes al demonio syslogd.# Guardamos todos los mensajes de prioridad critica en "critical"
#
*.=crit /var/adm/critical
- Un dispositivo físico
También tenemos la posibilidad de enviar los registros del sistema a un dispositivo físico del mismo, típicamente un terminal o una impresora. Así conseguimos, entre otras cosas, que esas entradas permanezcan relativa o totalmente inalteradas (en función de qué dispositivo las reciban). Por ejemplo, podemos tener uno de los terminales virtuales que muchos sistemas Unix ofrecen en su consola `dedicado' a listar los mensajes del sistema, que podrán ser consultados con solo cambiar a ese terminal mediante la combinación de teclas correspondiente:# Enviamos todos los mensajes a tty12 (ALT+F12 en Linux) y todos
# los mensajes criticos del nucleo a consola
#
*.* /dev/tty12
kern.crit /dev/console
- Una tubería con nombre
Algunas versiones de syslogd permiten enviar registros a ficheros de tipo pipe simplemente anteponiendo el símbolo `' al nombre del archivo; dicho fichero ha de ser creado antes de iniciar el demonio syslogd, mediante órdenes como mkfifo o mknod. Esto es útil para debug y también para procesar los registros utilizando cualquier aplicación de Unix, tal y como veremos al hablar de logs remotos cifrados.
Por ejemplo, la siguiente línea de /etc/syslog.conf enviaría todos los mensajes de cualquier prioridad a uno de estos ficheros denominado /var/log/mififo:# Enviamos todos los mensajes a la tuberia con nombre
# /var/log/mififo
#
*.* |/var/log/mififo
- Una máquina remota
Se pueden enviar los mensajes del sistema a otra máquina, de manera a que sean almacenados remotamente, sin más que indicar en el campo de acción el nombre o dirección de dicho sistema precedido por el signo `@'. Esto es útil si tenemos una máquina segura, en la que podemos confiar, conectada a la red, ya que de esta manera se guardaría allí una copia de los mensajes de nuestro sistema, copia que no podría ser modificada en caso de que alguien entrase en la máquina que los está generando. Esto es especialmente interesante para detectar usuarios `ocultos' en nuestro sistema (usuarios maliciosos que han conseguido los suficientes privilegios para ocultar sus procesos o su conexión), ya que una de las principales cosas que hará este tipo de atacantes es eliminar cualquier registro que denote su presencia en la máquina (por ejemplo, sus entradas en wtmp).
En el siguiente ejemplo utilizamos un sistema a priori confiable para enviarle algunos de nuestros registros:# Enviamos los mensajes de prioridad warning y superiores al
# fichero "syslog" y todos los mensajes (incluidos los
# anteriores) a la maquina "secure.upv.es"
#
*.warn /usr/adm/syslog
*.* @secure.upv.es
- Unos usuarios del sistema (si están conectados)
Se especifica la lista de usuarios que deben recibir un tipo de mensajes simplemente escribiendo sus login, separados por comas:# Enviamos los mensajes con la prioridad "alert" a root y toni
#
*.alert root, toni
- Todos los usuarios que estén conectados
Los errores con una prioridad de emergencia se suelen enviar a todos los usuarios que estén conectados al sistema, de manera que se den cuenta de que algo va mal; para ello utilizamos un asterisco en el campo de acción:# Mostramos los mensajes urgentes a todos los usuarios
# conectados, mediante wall
*.=emerg *
Cuando un programa quiere enviar un mensaje al demonio
syslogd utiliza la llamada
syslog(3); al hacerlo, se ha de indicar tanto el servicio como la prioridad del mismo. Evidentemente, esto es válido para el código en C: si queremos enviar registros al demonio para que sean procesados desde un
shellscript podemos utilizar la orden
logger, en la que también podemos indicar ambos parámetros:
luisa:~# logger -p local0.info "Esto es una prueba"
luisa:~# tail -1 /var/adm/messages
May 14 03:53:14 luisa root: Esto es una prueba
luisa:~#