[OpenBSD]

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

PF: Logging


Conteúdo


Introdução

Quando um pacote é logado, uma cópia do cabeçalho do pacote é enviada para a interface pflog(4) junto com dados adicionais como a interface que o pacote foi transmitido, a ação que o PF tomou (pass ou block), etc. A interface pflog(4) permite que aplicações em espaço de usuário recebam dados de log do PF vindos do kernel. Se o PF estiver habilitado quando o sistema iniciar, o serviço pflogd(8) é iniciado. Por padrão pflogd(8) escuta a interface pflog0 e escreve todos os dados de log no arquivo /var/log/pflog.

Logando Pacotes

Para logar pacotes atravessando o PF, a palavra-chave log deve ser usada em regras NAT/rdr e filtragem. Perceba que o PF pode logar apenas pacotes que estejam sendo liberados ou bloqueados; você não pode criar uma regra que apenas logue os pacotes.

A palavra-chave log faz com que todos os pacotes que combinem com a regra sejam logados. No caso da regra estar criando estado, apenas o primeiro pacote (o que faz com que o estado seja criado) será logado.

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

all
Faz com que todos os pacotes, e não apenas o primeiro, sejam logados. É útil para regras que criam estado.
to pflogN
Faz com que todos os pacotes que combinem com a regra sejam logados na interface pflog(4) especificada. Por exemplo, quando estiver usando spamlogd(8) todo o trafego SMTP pode ser logado numa interface pflog(4) dedicada pelo PF. O serviço spamlogd(8) pode então ser configurado para escutar nesta interface. Isto mantém o arquivo principal de log do PF limpo de trafego SMTP que de alguma forma não precisa ser logado. Use ifconfig(8) para criar interfaces pflog(4). A interface de log padrão pflog0 é criada automaticamente.
user
Faz com que além da informação padrão de log, o user-id e group-id Unix do usuário dono do socket de origem/destino do pacote (independente de ser local) sejam logados também.

As opções devem ser informadas entre parênteses após a palavra 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

Lendo um Arquivo de Log

O arquivo de log escrito pelo pflogd é em formato binário e não pode ser lido utilizando um editor de texto. O tcpdump deve ser utilizado para ver os logs.

Para ver o arquivo de log:

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

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

# tcpdump -n -e -ttt -i pflog0

NOTA: Quando estiver examinando logs, um cuidado especial deve ser tomado com a opção verbose do decodificador de protocolos do tcpdump (ativada pela opção -v). Os decodificadores de protocolos do tcpdump não possuem um perfeito histórico de segurança. Pelo menos em teoria, um ataque muito lento pode ser possível utilizando-se de partes do payload dos pacotes que são logados pelo dispositivo de log. É prática recomendada mover os arquivos de log fora da máquina do firewall antes de examiná-los desta maneira.

Um cuidado adicional deve existir com a segurança no acesso aos logs. Por padrão, pflogd irá registrar 96 bytes do pacote no arquivo de log. O acesso aos logs pode prover acesso parcial a payloads de pacotes com informações sensíveis (como nomes de usuário e senhas telnet(1) ou ftp(1)).

Filtrando a Saída de Log

Como pflogd loga em formato tcpdump binário, toda a gama de atributos do tcpdump pode ser utilizada quando estiver examinando os logs. Por exemplo, para ver apenas pacotes que combinem com 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 host e porta:

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

A mesma idéia pode ser aplicada quando lendo 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 pacotes que são logados no arquivos do pflogd; o comando acima mostra apenas pacotes conforme eles são logados.

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

Exemplo:

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

Isso mostra o log, em tempo real, de pacotes entrantes que foram bloquados na interface wi0.

Logando Pacotes Através do Syslog

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

Crie o seguinte script:

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

Edite o cron 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 quiser logar num servidor remoto, insira a linha:

local0.info     @syslogger

Certifique-se de que syslogger esteja definido no arquivo hosts(5).

Crie o arquivo /var/log/pflog.txt para que o syslog possa logar nele e de as mesmas permissões do arquivo pflog.

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

Avise o syslogd sobre a alteração, reinciando-o:

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

Todos pacotes logados agora são enviados para /var/log/pflog.txt. Caso a segunda linha tenha sido adicionada eles também são enviados para o host remoto syslogger.

O script /etc/pflogrotate agora processa e deleta /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 subistitui /var/log/pflog e sua rotação deve ser ativada. Altere /etc/newsyslog.conf da seguinte forma: #/var/log/pflog 600 3 250 * ZB /var/run/pflogd.pid /var/log/pflog.txt 600 7 * 24

Agora o PF loga em /var/log/pflog.txt no formato ASCII. Se estiver configurado em /etc/syslog.conf, também logará num servidor remoto. O log não é imediato podendo ser necessário no máximo 5-6 minutos (o intervalo da tarefa no cron) para que eles apaceçam no arquivo.

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


[voltar] www@openbsd.org
$OpenBSD: logging.html,v 1.11 2007/12/01 10:39:11 tobias Exp $