[Anterior: Tagging: Marcado de paquetes] [Contenido] [Siguiente: Rendimiento]
El registro de paquetes en PF se realiza mediante pflogd(8), que está a la escucha en la interfaz pflog0 y graba los paquetes en un fichero de registro (generalmente /var/log/pflog) en formato binario de tcpdump(8). Las Reglas de Filtrado en las que se especifican las claves log o log-all registran los paquetes de este modo.
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)).
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.
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 dos pequeños guiones (scripts), algunos pequeños cambios de los ficheros de configuración de OpenBSD, y el dæmon de registro, syslogd(8). Syslogd realiza los registros en formato ASCII y también puede efectuar los registros en un servidor de registros remoto.
Para ello, primero hay que crear un usuario, pflogger, con el intérprete (shell) /sbin/nologin. La forma más sencilla de crear este usuario es con adduser(8).
Después de crear el usuario pflogger, hay que crear los dos siguientes guiones de ejecución:
/etc/pflogrotate
FILE=/home/pflogger/pflog5min.$(date "+%Y%m%d%H%M") kill -ALRM $(cat /var/run/pflogd.pid) if [ $(ls -l /var/log/pflog | cut -d " " -f 8) -gt 24 ]; then mv /var/log/pflog $FILE chown pflogger $FILE kill -HUP $(cat /var/run/pflogd.pid) fi
/home/pflogger/pfl2sysl
for logfile in /home/pflogger/pflog5min* ; do tcpdump -n -e -ttt -r $logfile | logger -t pf -p local0.info rm $logfile done
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
Crear una tarea de cron para el usuario pflogger:
# crontab -u pflogger -e
Añadir las siguientes dos líneas:
# feed rotated pflog file(s) to syslog
0-59/5 * * * * /bin/sh /home/pflogger/pfl2sysl
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:
# touch /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 /var/run/pflogd.pid /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: Tagging: Marcado de paquetes] [Contenido] [Siguiente: Rendimiento]