Eu tenho a Máquina A, que é uma instalação pfsense, que envia logs via syslog para uma caixa Ubuntu. O Ubuntu Box terá que reescrever os logs, para substituir, por exemplo, nomes de host e alterar um pouco o formato.
O formato é geralmente o seguinte
Mar 7 00:05:32 hostname service: field1 field2 field3 field4 field5 field6 field7
Gostaria da possibilidade de reescrever hostname, serviço e mudar a ordem dos campos, e filtrar mensagens com determinado valor em determinado campo, pois não são interessantes.
Após a filtragem e tratamento, as mensagens devem ser gravadas em disco em um arquivo de log e enviadas para outra máquina via syslog.
Agora, a parte de registro é trivial - basta configurar o rsyslogd para aceitar as mensagens recebidas e encaminhá-las. No entanto, estou um pouco preso na parte de reescrever. Não sou casado com rsyslogd; qualquer daemon syslog serve.
A pergunta é um pouco vaga, mas vou tentar propor uma possível solução. Para reescrever mensagens
rsyslog
, há vários módulos, um dos quais émmfields
. Ele divide uma mensagem recebida em um determinado caractere (apenas um caractere) em campos e permite o acesso a esses campos. Para uma mensagem comoo separador seria um espaço em branco
e os campos seriam acessíveis como
$!f2
,$!f3
,$!f4
e$!f5
. Infelizmente, o primeiro campo ($!f1
) está sempre vazio porque a mensagem é precedida por um espaço e esse seria o primeiro campo. Assim, para a mensagem acima obtemos$!f1==""
,$!f2=="a=1"
,$!f3=="b=two"
,$!f4=="c=3"
, e$!f5=="d=four"
.rsyslog
vem com outros módulos de modificação de mensagens também, mas na falta de mais detalhes, escolhi este. Armazene o seguinte arquivo como/etc/rsyslog.d/10-so.conf
. Altere o nome de acordo com a ordem de execução desejada, mas mantenha a.conf
extensão.Reinicie
rsyslog
(viasudo systemctl restart rsyslog.service
) e experimente:A saída da segunda
logger
instrução será:Para alterar o nome do host, basta substituir
nos modelos com
Para alterar o syslogtag (o que você chamou de service ), substitua
com
A saída será então:
Veja aqui outras propriedades da mensagem.
Observe que minha abordagem (com
mmfields
) depende de os campos sempre terem a mesma ordem e não permite facilmente reescrever mensagens comoa=1 b=2
(b=1 a=2
reordenar e alterar pares de valor-chave). Para isso, outro módulo pode ser mais adequado.Tanto quanto eu sei, isso pode ser alcançado usando logstash elasticsearch e Kibana. Estou tentando fazer o mesmo e tive mais ou menos sucesso ao configurar uma pilha de alces. Em seguida, use filtros grok no logstash para dividir a mensagem syslog em diferentes campos e use-os para corresponder a um padrão e enviar alertas. Dê uma olhada neste guia , ele pode lhe dar algumas respostas sobre por onde começar.
Esse tipo de configuração já possui filtros integrados para coisas como logs mysql ou logs apache ou nginx para começar. Aqui está uma boa visão geral dos recursos e arquitetura da pilha elk. Eu espero que isso ajude.