Como posso configurar o /etc/syslog.conf
arquivo para salvar informações de log iptables
em um arquivo específico.
Quero salvar essas informações separadamente, para poder extrair o que quero com facilidade e rapidez.
Como posso configurar o /etc/syslog.conf
arquivo para salvar informações de log iptables
em um arquivo específico.
Quero salvar essas informações separadamente, para poder extrair o que quero com facilidade e rapidez.
Respostas:
Dê uma olhada na página de manual para iptables
. Ele mostra um destino chamado LOG
que pode fazer o que você deseja.
Defina o nível de log para LOG
4.
# DROP everything and Log it
iptables -A INPUT -j LOG --log-level 4
iptables -A INPUT -j DROP
Configure syslog.conf
para gravar essas mensagens em um arquivo separado.
# /etc/syslog.conf
kern.warning /var/log/iptables.log
Reinicie o syslogd.
Debian / Ubuntu
$ sudo /etc/init.d/sysklogd restart
Fedora / CentOS / RHEL
$ sudo /etc/init.d/syslog restart
NOTA: Esse método de registro é chamado de prioridades fixas. Eles são números ou nomes (1,2,3,4, ..) ou (DEBUG, WARN, INFO etc.).
Se por acaso você estiver usando rsyslog
, poderá criar um filtro com base em propriedades da seguinte forma:
# /etc/rsyslog.conf
:msg, contains, "NETFILTER" /var/log/iptables.log
:msg, contains, "NETFILTER" ~
Em seguida, adicione o switch thils às regras do iptables que você deseja registrar:
–log-prefix NETFILTER
Como alternativa, você também pode registrar as mensagens usando este tipo de filtro de propriedade:
:msg, startswith, "iptables: " -/var/log/iptables.log
& ~
:msg, regex, "^\[ *[0-9]*\.[0-9]*\] iptables: " -/var/log/iptables.log
& ~
NOTA: Este segundo método não requer nenhuma alteração iptables
.
/var/log/iptables
e também em /var/log/messages
. Eu quero apenas uma cópia desses dados emiptables.log
Isso pressupõe que o seu firewall já cria logs, como qualquer firewall sensato. Para alguns exemplos, ele requer uma mensagem identificável, como "NETFILTER" no exemplo de slm.
crie um arquivo em rsyslog.d
vim /etc/rsyslog.d/10-firewall.conf
Isso funciona no CentOS 7. Não sei como verificar se ele veio do firewall, além de procurar IN e OUT ... O CentOS é estranho. Não use isso, a menos que a próxima versão não funcione.
# into separate file and stop their further processing
if ($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
& ~
}
Isso funciona no CentOS 7 e verifica também o conteúdo da mensagem (substitua "Shorewall" pelo que você tiver na mensagem da regra -j LOG):
# into separate file and stop their further processing
if ($msg contains 'Shorewall') and \
($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
& ~
}
Isso funciona em outros (Ubuntu, Debian, openSUSE). E esta é a melhor maneira de fazê-lo. Nenhuma pesquisa por seqüências de caracteres na mensagem:
# into separate file and stop their further processing
if ($syslogfacility-text == 'kern') and \\
($msg contains 'IN=' and $msg contains 'OUT=') \\
then -/var/log/firewall
& ~
E aqui está o que uma máquina openSUSE padrão possui (que eu acho que toda distribuição deve ter e está faltando) (a diferença parece ser apenas "parar" em vez de "& ~"; nem todos os sistemas suportam as duas sintaxes):
if ($syslogfacility-text == 'kern') and \
($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
stop
}
E para todas as opções acima, não esqueça também o arquivo logrotate.d:
vim /etc/logrotate.d/firewall
contendo:
/var/log/firewall {
rotate 7
size 500k
postrotate
# before using this, run the command yourself to make sure
# it is right... the daemon name may vary
/usr/bin/killall -HUP rsyslogd
endscript
}