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:~#
© 2002 Antonio Villalón Huerta