¿Cómo puedo configurar el archivo syslog.conf para registrar mensajes de iptables en un archivo separado?

10

¿Cómo puedo configurar el /etc/syslog.confarchivo para guardar la información de registro iptablesen un archivo específico?

Quiero guardar esta información por separado, para poder extraer lo que quiero fácil y rápidamente.

Una oferta
fuente
¿Está utilizando syslog.conf o rsyslog.conf?
slm

Respuestas:

13

syslog

Echa un vistazo en la página del manual para iptables. Muestra un objetivo llamado LOGque puede hacer lo que quieras.

Ejemplo

  1. Establezca el nivel de registro para LOG4.

    # DROP everything and Log it
    iptables -A INPUT -j LOG --log-level 4
    iptables -A INPUT -j DROP
    
  2. Configure syslog.confpara escribir estos mensajes en un archivo separado.

    # /etc/syslog.conf
    kern.warning     /var/log/iptables.log
    
  3. Reinicie syslogd.

    Debian / Ubuntu

    $ sudo /etc/init.d/sysklogd restart
    

    Fedora / CentOS / RHEL

    $ sudo /etc/init.d/syslog restart
    

NOTA: Este método de registro se denomina prioridades fijas. Son números o nombres (1,2,3,4, ..) o (DEPURACIÓN, ADVERTENCIA, INFORMACIÓN, etc.).

rsyslog

Si por casualidad lo está utilizando rsyslog, puede crear un filtro basado en propiedades de esta manera:

# /etc/rsyslog.conf
:msg, contains, "NETFILTER"       /var/log/iptables.log
:msg, contains, "NETFILTER"     ~

A continuación, agregue el interruptor a sus reglas de iptables que desea registrar:

–log-prefix NETFILTER

Como alternativa, también puede registrar los mensajes utilizando este tipo de filtro de propiedades:

:msg, startswith, "iptables: " -/var/log/iptables.log
& ~
:msg, regex, "^\[ *[0-9]*\.[0-9]*\] iptables: " -/var/log/iptables.log
& ~

NOTA: Este segundo método no requiere ningún cambio en iptables.

Referencias

slm
fuente
En este caso, la información se guardará en /var/log/iptablesy también en /var/log/messages. Solo quiero una copia de estos datos eniptables.log
Abid
1
Agregué mi propia respuesta para cubrir también la pregunta de Abid, más la configuración de logrotate que faltaba. el "stop" o "& ~" evita que los mensajes continúen bajando las reglas de rsyslog para llegar a / var / log / messages también.
Peter
6

Esto supone que su cortafuegos ya crea registros, como debería hacerlo cualquier cortafuego sano. Para algunos ejemplos, requiere un mensaje identificable, como "NETFILTER" en el ejemplo de slm.

hacer un archivo en rsyslog.d

vim /etc/rsyslog.d/10-firewall.conf

Esto funciona en CentOS 7. No sé cómo verificar que proviene del firewall, aparte de buscar IN y OUT ... CentOS es extraño. No use esto a menos que la próxima versión no funcione.

# into separate file and stop their further processing
if  ($msg contains 'IN=' and $msg contains 'OUT=') \
then {
    -/var/log/firewall
    & ~
}

Esto funciona en CentOS 7 y también verifica el contenido del mensaje (reemplace "Shorewall" con lo que tenga en el mensaje de su regla -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
    & ~
}

Esto funciona en otros (Ubuntu, Debian, openSUSE). Y esta es la mejor manera de hacerlo. No buscar cadenas en el mensaje:

# into separate file and stop their further processing
if  ($syslogfacility-text == 'kern') and \\
($msg contains 'IN=' and $msg contains 'OUT=') \\
then    -/var/log/firewall
    &   ~

Y esto es lo que tiene una máquina openSUSE predeterminada (que creo que todas las distribuciones deberían tener y falta) (la diferencia parece ser solo "detener" en lugar de "& ~"; no todos los sistemas admiten ambas sintaxis):

if  ($syslogfacility-text == 'kern') and \
    ($msg contains 'IN=' and $msg contains 'OUT=') \
then {
    -/var/log/firewall
    stop
}

Y para todo lo anterior, no olvide un archivo logrotate.d también:

vim /etc/logrotate.d/firewall

que contiene:

/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
}
Peter
fuente