[OpenBSD]

[Anterior: Marcado de paquetes] [Contenido] [Siguiente: Rendimiento]

PF: Registros de bitácora


Índice de contenidos


Introducción

Cuando PF registra un paquete, se envía una copia de la cabecera del paquete a la interfaz pflog(4), junto con algunos datos adicionales tales como la interfaz por la que ha transitado el paquete, la acción que PF adoptó (permitir o bloquear), etc. La interfaz pflog(4) permite que las aplicaciones en espacio de usuario reciban los datos de registro PF del núcleo. Si PF está activado cuando el sistema arranca, el demonio pflogd(8) se inicia. De forma predeterminada pflogd(8) escucha en el interfaz pflog0 y escribe todos los registros de bitácora en el fichero /var/log/pflog.

Registro de paquetes

Para registrar los paquetes que pasan a través de PF, debe usarse la palabra-clave log. La palabra clave log hace que se registren todos los paquetes que concuerden con la regla. En el caso de que la regla cree estado, solo se registra el primer paquete visto (o el que hace que se cree el estado).

Las opciones que pueden pasarse a la palabra-clave log son:

all
Hace que todos los paquetes concordantes, no solo el paquete inicial, serán registrados. Útil para reglas que crean estado.
to pflogN
Hace que todos los paquetes concordantes sean registrados por la interfaz pflog(4) especificada. Por ejemplo, cuando se utiliza spamlogd(8) todo el tráfico SMTP puede ser registrado por PF en una interfaz pflog(4) dedicada. El demonio spamlogd(8) puede entonces ser configurado para que escuche en esa interfaz. Esto permite mantener a la bitácora de registro principal de PF libre de tráfico SMTP que no precisaría ser registrado. Utilice ifconfig(8) para crear interfaces pflog(4). La interfaz de registro predeterminado pflog0 se crea automáticamente.
user
Hace que el identificador de usuario y de grupo de UNIX al que pertenece el socket del origen/destino del paquete (cualquier socket local) sea registrado junto con la información de bitácora estándar.

Las opciones se dan entre paréntesis después de la palabra-clave log; pueden pasarse varias opciones separadas por una coma o un espacio.

pass in log (all, to pflog1) on $ext_if inet proto tcp to $ext_if port 22 keep state

Interpretación de un fichero de registro

El fichero de registro grabado por pflogd se encuentra en formato binario, y no se puede leer usando un editor de texto. Hay que usar tcpdump para ver el registro.

Para poder leer el fichero de registro:

# tcpdump -n -e -ttt -r /var/log/pflog

Nótese que el uso de tcpdump para leer el fichero pflog no ofrece una visión en tiempo real. Para obtener una visión en tiempo real de los paquetes registrados, hay que usar la interfaz pflog0:

# tcpdump -n -e -ttt -i pflog0

NOTA: Cuando se examinan los registros, hay que tener un cuidado especial con la descodificación verbosa del protocolo por parte de tcpdump (activada mediante la opción -v en la línea de órdenes). Los descodificadores del protocolo de tcpdump no tienen un historial de seguridad perfecto. En teoría, existe la posibilidad de un ataque retardado a través de las cargas útiles (payloads) parciales de los paquetes registrados por el dispositivo de registro. En la práctica se recomienda trasladar los ficheros de registro desde la máquina de cortafuegos a otra máquina antes de examinarlos de esta forma.

También hay que tener un cuidado adicional al asegurar el acceso a los registros. pflogd registra 96 bytes del paquete en el fichero de registro en el modo predeterminado. El acceso a los registros podría pemitir acceso parcial a cargas útiles de paquetes sensibles (como los nombres de usuario y contraseñas de telnet(1) o ftp(1)).

Filtrado de la salida de registro

Como pflogd efectúa los registros en formato binario de tcpdump, se pueden usar todas las funcionalidades de tcpdump para revisar los registros. Por ejemplo, para ver solamente los paquetes que concuerden con un cierto puerto:

# tcpdump -n -e -ttt -r /var/log/pflog port 80

Esto se puede refinar aún más limitando la cantidad de paquetes que mostrará a los que concuerden con una combinación de un cierto anfitrión y puerto:

# tcpdump -n -e -ttt -r /var/log/pflog port 80 and host 192.168.1.3

Se puede aplicar la misma idea cuando se lee desde la interfaz pflog0:

# tcpdump -n -e -ttt -i pflog0 host 192.168.4.2

Nótese que esto no tiene ningún impacto sobre qué paquetes se registran en el fichero de registro de pflogd. Las órdenes anteriores sólo muestran los paquetes que están siendo registrados en ese momento.

Además de usar las reglas de filtrado estándar de tcpdump(8), el lenguaje de filtrado de tcpdump se ha extendido para que pueda leer la salida de pflogd:

Ejemplo:

# tcpdump -n -e -ttt -i pflog0 inbound and action block and on wi0

Esto muestra el registro, en tiempo real, de los paquetes entrantes que han sido bloqueados en la interfaz wi0.

Registro de paquetes con syslog

Hay muchas situaciones en las que es deseable tener los registros del cortafuegos en formato ASCII (texto simple) y/o enviarlos a un servidor de registros remoto. Todo esto se puede conseguir con un pequeño guión (script), algunos cambios menores en los ficheros de configuración de OpenBSD y syslogd(8), el servicio (demonio) de registro de bitácoras. Syslogd realiza los registros en formato ASCII y también puede efectuar los registros en un servidor de registros remoto.

Hay que crear el siguiente guión de ejecución:

/etc/pflogrotate

	#!/bin/sh
	PFLOG=/var/log/pflog
	FILE=/var/log/pflog5min.$(date "+%Y%m%d%H%M")
	pkill -ALRM -u root -U root -t - -x pflogd
	if [ -r $PFLOG ] && [ $(stat -f %z $PFLOG) -gt 24 ]; then
	   mv $PFLOG $FILE
	   pkill -HUP -u root -U root -t - -x pflogd
	   tcpdump -n -e -ttt -r $FILE | logger -t pf -p local0.info
	   rm $FILE
	fi

Editar la tarea de cron del usuario root:

# crontab -u root -e

Añadir las dos siguientes líneas:

# rotate pf log file every 5 minutes
0-59/5 * * * * /bin/sh /etc/pflogrotate

Añadir la siguiente línea a /etc/syslog.conf:

local0.info     /var/log/pflog.txt

Si también se quiere efectuar los registros en un servidor de registros remoto, hay que añadir la línea:

local0.info     @syslogger

Hay que asegurarse de que el anfitrión syslogger se encuentre definido en el fichero hosts(5).

Crear el fichero /var/log/pflog.txt para que syslog pueda escribir registros en él y darle los mismos permisos que al fichero pflog:

# touch /var/log/pflog.txt
# chmod 600 /var/log/pflog.txt

Para que syslogd tenga constancia de estos cambios hay que reiniciarlo:

# kill -HUP $(cat /var/run/syslog.pid)

Ahora todos los paquetes registrados son enviados a /var/log/pflog.txt. Si se añade la segunda línea, también se envían al anfitrión de registros remotos syslogger.

Ahora, el guión /etc/pflogrotate procesa y luego elimina /var/log/pflog, de modo que ya no es necesaria la rotación de pflog por newsyslog(8), y debe ser desactivada. Sin embargo, /var/log/pflog.txt sustituye a /var/log/pflog y hay que activar su rotación. Para ello hay que realizar los siguientes cambios en el fichero /etc/newsyslog.conf:

    #/var/log/pflog       600    3    250    *    ZB "pkill -HUP -u root -U root -t - -x pflogd"
    /var/log/pflog.txt    600    7    *      24

Ahora PF realizará los registros en formato ASCII en el fichero /var/log/pflog.txt. Y /etc/syslog.conf enviará los registros a un servidor remoto si ha sido configurado para que lo haga. El registro no es inmediato, y puede tardar entre 5 y 6 minutos (el intervalo de la tarea de cron) antes de que los paquetes registrados aparezcan en el fichero.

[Anterior: Marcado de paquetes] [Contenido] [Siguiente: Rendimiento]


[back] www@openbsd.org
$OpenBSD: logging.html,v 1.11 2011/03/13 07:16:15 ajacoutot Exp $