[OpenBSD]

[Anterior: Marcação de Pacotes] [Conteúdo] [Próximo: Desempenho]

PF: Registro de Dados


Conteúdo


Introdução

Quando um pacote é registrado pelo PF, uma cópia do cabeçalho do pacote é enviado para a interface pflog(8) junto com alguns outros dados adicionais como a interface onde o pacote estava transitando, a ação que o PF tomou (liberou ou bloqueou), etc. A interface pflog(4) permite que aplicativos no espaço de usuário recebam os dados de registro do kernel. Se o PF é ativado quando o sistema é inicializado, o daemon pflogd(8) é carregado. Por padrão, o pflogd(8) escuta na interface pflog0 e escreve todos os dados de registro no arquivo /var/log/pflog.

Registro de Pacotes

Para registrar pacotes atravessando o PF, a palavra-chave log deve ser usada. A palavra-chave log faz com que todos os pacotes que correspondam à regra sejam registrados. No caso onde a regra cria estado, apenas o primeiro pacote (o que faz com que o estado seja criado) será registrado.

As opções que podem ser passadas à palavra-chave log são:

all
Faz com que todos os pacotes correspondidos, e não apenas o primeiro, sejam registrados. É útil para regras que criam estado.
to pflogN
Faz com que todos os pacotes correspondidos sejam registrados na interface pflog(4) especificada. Por exemplo, ao usar o spamlogd(8), todo o tráfego SMTP pode ser registrado pelo PF em uma interface pflog(4) dedicada. O daemon spamlogd(8) pode então ser ordenado a escutar naquela interface. Isso mantém o arquivo de registro principal do PF livre de tráfego SMTP, o qual, fora isso, não precisaria ser registrado. Use o ifconfig(8) para criar interfaces pflog(4). A interface de registro padrão pflog0 é criada automaticamente.
user
Faz com que além da informação padrão de registro, o ID de usuário e o ID de grupo Unix do proprietário do soquete de origem/destino do pacote (independente do soquete ser local) sejam registrados também.

As opções devem ser informadas entre parêntesis após a palavra-chave log; várias opções podem ser informadas separando-as com vírgula ou espaço.

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

Leitura de um Arquivo de Registro

O arquivo de registro escrito pelo pflogd é em formato binário e não pode ser lido com um editor de textos. O tcpdump deve ser utilizado para ver o registro.

Para ver o arquivo de registro:

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

Perceba que o uso do tcpdump(8) para ver um arquivo de registro não mostra a atividade em tempo real. Um monitoramento em tempo real dos pacotes registrados é conseguido usando a interface pflog0:

# tcpdump -n -e -ttt -i pflog0

NOTA: Ao examinar os registros, um cuidado especial deve ser tomado com a loquacidade do decodificador de protocolos do tcpdump (ativada pela opção -v). Os decodificadores de protocolos do tcpdump não possuem um histórico de segurança perfeito. Pelo menos em teoria, um ataque muito lento pode ser possível utilizando-se de partes da carga útil dos pacotes que são registrados pelo dispositivo de registro. É prática recomendada mover os arquivos de registro para fora da máquina do firewall antes de examiná-los dessa maneira.

Cuidado adicional deve existir com a segurança no acesso aos registros. Por padrão, o pflogd registra 160 bytes do pacote no arquivo de registro. Acesso aos registros pode prover acesso parcial à carga útil de pacotes com informações sensíveis (como nomes de usuário e senhas do telnet(1) ou ftp(1)).

Filtragem da Saída de Registro

Como o pflogd registra no formato binário tcpdump, toda a gama de atributos do tcpdump pode ser utilizada ao examinar os registros. Por exemplo, para ver apenas pacotes que correspondam à certa porta:
# tcpdump -n -e -ttt -r /var/log/pflog port 80

Isso pode ser filtrado ainda mais, limitando a exibição de pacotes com certa combinação de máquina e porta:

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

A mesma ideia pode ser aplicada ao ler através da interface pflog0

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

Note que isso não tem nenhum impacto sobre quais pacotes são registrados no arquivo do pflogd; o comando acima apenas mostra pacotes conforme eles são registrados.

Além de usar as regras de filtragem padrão do tcpdump(8), a linguagem de filtragem do tcpdump foi estendida para ler a saída do pflogd:

Exemplo:

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

Isso mostra o registro em tempo real de pacotes de entrada que foram bloqueados na interface wi0.

Registro de Pacotes Através do Syslog

Em muitas situações é desejável possuir os registros do firewall disponíveis em formato texto ASCII e/ou enviá-los a um servidor de registros remoto. Tudo isso pode ser obtido com o uso de um pequeno script shell, algumas pequenas alterações em arquivos de configuração do OpenBSD e com o daemon de registro de dados syslogd(8). O syslogd faz o registro em formato ASCII e também é capaz de fazer o registro em um servidor remoto.

Crie o seguinte script:

/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
	   kill -HUP $(cat /var/run/pflogd.pid)
	   pkill -HUP -u root -U root -t - -x pflogd
	   tcpdump -n -e -s 160 -ttt -r $FILE | logger -t pf -p local0.info
	   rm $FILE
	fi

Edite o arquivo de tarefas agendadas do root:

# crontab -u root -e

Adicione as duas linhas seguintes:

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

Adicione a linha a seguir em /etc/syslog.conf:

local0.info     /var/log/pflog.txt

Se você também quer fazer o registro em um servidor remoto, insira a linha:

local0.info     @syslogger

Certifique-se de que a máquina syslogger esteja definida no arquivo hosts(5).

Crie o arquivo /var/log/pflog.txt para que o syslog possa fazer o registro nele, e dê a ele as mesmas permissões do arquivo pflog.

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

Avise o syslogd sobre as alterações, reiniciando-o:

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

Todos pacotes registrados agora são enviados para /var/log/pflog.txt. Caso a segunda linha tenha sido adicionada, eles também são enviados para a máquina de registro remoto syslogger.

O script /etc/pflogrotate agora processa e exclui /var/log/pflog, assim a rotação do pflog por newsyslog(8) não é mais necessária e deve ser desabilitada. Contudo, /var/log/pflog.txt substitui /var/log/pflog e sua rotação deve ser ativada. Altere /etc/newsyslog.conf da seguinte forma:

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

Agora o PF registra em /var/log/pflog.txt no formato ASCII. Se estiver configurado em /etc/syslog.conf, também registra em um servidor remoto. O registro não é imediato, pode levar cerca de 5-6 minutos (o intervalo da tarefa no cron) antes que os pacotes registrados apareçam no arquivo.

[Anterior: Marcação de Pacotes] [Conteúdo] [Próximo: Desempenho]


[voltar] www@openbsd.org
$OpenBSD: logging.html,v 1.21 2013/12/06 20:52:46 ajacoutot Exp $