Google Un Poco de IPTables Parte 3: Redireccionando Logs | EL TIPO DE INFORMATICA

viernes, 13 de julio de 2012

Un Poco de IPTables Parte 3: Redireccionando Logs

Siguiendo con lo que ahora se ha convertido en una serie de post de IPTables, voy a hablarles de como manejar los logs de IPTables, configurar cuales eventos que queremos escribir, agregar algún prefijo y redireccionarlos a un archivo especifico en el equipo, ya que por default los logs de IPTables se almacenan en el archivo "/var/log/kern.log". Para esto aplicaremos algunas reglas en IPTables y luego configuraremos nuestro syslog server (utilizaremos Syslog-NG) para indicar que queremos tener un archivo aparte únicamente con los log de IPTables. 

Lo primero que debemos hacer es determinar que tanto queremos que IPTables nos registre, si queremos que registre cada paquete que entre o salga a nuestra red, o si solo queremos que registre los paquetes que hayan sido "Dropeados" o descartados. La opción mas recomendable es logear todo lo que pase por nuestro Firewall, ya sea permitido o bloqueado, ya que esto nos permitirá identificar mas fácil algún problema de conexión, como auditoría en caso de que necesitemos localizar conexiones salientes o entrantes hacia algún sitio especifico o también para generar reportes de uso o ancho de banda. Hay que tener en cuenta que con esta opción nuestro archivo de log crecerá mucho mas rápido, dependiendo de la actividad de nuestra red. Para esto haremos lo siguiente: Supongamos en este ejemplo que nuestro firewall tiene 2 interfaces, la eth0 que esta conectada a Internet y la eth1esta conectada a nuestra red LAN, queremos entonces registrar todo lo que entre o salga hacia Internet, agregamos las siguientes reglas (antes de las demás reglas que hayamos definido para que se registre cada paquete antes de tomar alguna decisión sobre el mismo)

-A FORWARD -o eth0 -j LOG --log-level 7 --log-prefix IPTABLES-BANDWIDTH_OUT: 
-A FORWARD -i eth0 -j LOG --log-level 7 --log-prefix IPTABLES-BANDWIDTH_IN: 

En la primera linea le decimos a IPTables que todos los paquetes que salga desde nuestra red LAN a través de la interfase eth0 (-o eth0) le aplique la acción LOG (-j LOG), esta entrada en el log sera nivel 7 (--log-level 7) y le decimos que agregue el prefijo "IPTABLES-BANDWIDTH_OUT:" (--log-prefix), este prefijo lo utilizaremos mas adelante como filtro para enviar este tipo de eventos hacia un archivo especifico. En este prefijo pueden poner cualquier otra cosa que les haga sentido, de modo que cuando vean un evento en el log con este prefijo sepan de donde viene y como se produjo. En la segunda linea hacemos lo mismo, lo único que decimos que registro todo paquete entrante (-i) por la interface eth0, en este caso serian paquetes provenientes de Internet, y en la parte final del prefijo sustituimos OUT por IN para diferenciar los que son paquetes salientes con los entrantes.

Podemos también registrar los paquetes que han sido descartados, o que no encontraron ninguna regla que coincida permitiendo o denegando el paquete. Como les había mencionado en la entrada anterior sobre IPTables, podemos tener una acción por defecto que se aplicara a los paquetes que no coincidan con ninguna regla, por esto agregamos las siguientes reglas al final de las reglas de cada cadena, por ejemplo, al final de las reglas de INPUT, de modo que luego de que el paquete haya sido evaluado por cada y regla y no coincida, se registre este paquete antes de aplicar la regla default. Por ejemplo, supongamos que tenemos definidas varias reglas en nuestro firewall, una permitirá el trafico HTTP/S y POP3 hacia Internet desde la LAN hacia Internet, luego de estas agregaremos la siguientes reglas para logear todo lo que no se corresponda a lo que hemos definido:

-A FORWARD -p tcp -s LAN -d 0/0 --dport 80 -j ACCEPT
-A FORWARD -p tcp -s LAN -d 0/0 --dport 443 -j ACCEPT
-A FORWARD -p tcp -s LAN -d 0/0 --dport 110 -j ACCEPT
-A FORWARD -j LOG --log-level 7 --log-prefix IPTABLES-FORWARD-DROP:
-A FORWARD -j DROP

Como ven, tenemos aquí las reglas de ejemplo definidas que permiten ciertos paquetes, luego en la cuarta linea indicamos que todo lo que haya llegado a este punto sea logeado y le agregemos el prefijo "IPTABLES-FORWARD-DROP:", así reconoceremos los paquetes con este prefijo y sabremos que fueron descartados en la cadena FORWARD. Esto mismo lo podemos aplicar tambien en INPUT, OUTPUT o cualquier otra que hayamos definido. En el caso de que utilicemos las primeras reglas que registran todo el trafico entrante y saliente, es buena idea también utilizar estas ultimas, así podemos diferenciar cuales eventos corresponden a paquetes bloqueados.

Hasta ahora ya tenemos a IPTables generando logs, pero los estará creando posiblemente en el archivo "kern.log", donde se encontraran también otros tipos de eventos. Ahora veremos como separa los logs de IPTables y almacenarlos en un archivo individual con Syslog-NG.

  • Configuración Syslog-NG

El archivo que crearemos para almacenar el log de IPTables lo llamaremos iptables.log y lo crearemos en /var/log. Con esta informacion, vamos al archivo "/etc/syslog-ng/syslog-ng.conf" y en la sección "#destinations" agregamos la siguiente linea:

destination d_iptables { file("/var/log/iptables.log"); };

Aquí creamos un "destino" que llame "d_iptables" y le indicamos hacia adonde apuntara, que en este caso se nuestro archivo iptables.log (tengan en cuenta que luego del corchete hay un espacio en blanco). Luego nos movemos a la sección "filters" donde crearemos un filtro que nos permitirá separar los eventos de IPTables basándonos en los prefijos que indicamos anteriormente. 

filter f_iptables { match("IPTABLES") ; }'
filter f_not-iptables { not match("IPTABLES") ; };

Aquí agregamos 2 lineas (o filtros), uno que aplicara a los eventos que contengan las palabras IPTABLES (esta palabra la agregamos en cada prefijo) y otro para los eventos que NO contengan estas palabras, el segundo lo utilizamos para evitar que los eventos de IPTables se continúen almacenando en el archivo kern.log. Nos moveremos entonces ya a la sección "log", donde buscaremos el log que define los eventos que se almacenan en el archivo "kern.log" y agregaremos el segundo filtro que creamos, se vera entonces de esta forma:

log {
         source(s_all);
         filter(f_kern);
         filter(f_not_iptables);
         destination(df_kern);
}

Luego agregaremos entonces nuestro nuevo log indicando el destino  filtro que creamos:

log {
         source(s_all);
         filter(f_iptables);
         destination(d_iptables);
}


Al agregar esto salvamos el archivo y reiniciamos el servicio (/etc/init.d/syslog-ng restart). Con esto estaremos recibiendo los eventos de IPTables en el archivo definido. Si queremos ver lo que esta pasando entonces por nuestra red (en caso de que hayan configurado la primera opción de logs) o como va creciendo el archivo de log, podemos ejecutar:

# tail -f /var/log/iptables.log

Para ver solo los que estén siendo descartados por IPTables podemos agregar :

# tail -f /var/log/iptables.log | grep DROP


Bien, hasta aquí mi pequeño tip de IPTables, como siempre, espero que esto les sea de utilidad.

No hay comentarios:

Publicar un comentario