Sesión 1 – Unidad 5 – Desarrollo de Software Libre I IPTABLES (Firewall) El propósito de un cortafuegos (firewall) es controlar el flujo de datos que salen o entran por una interface de red. Se construye mediante un filtro de paquetes, que es un código que lee el encabezado de un paquete de red que recibe una interface (e.g. lo, eth0 o ppp0) y luego decide si aceptarlo, rechazarlo o redirigirlo antes de alcanzar un proceso local (daemon). En Linux, el filtro de paquetes es parte del núcleo. A partir de la versión del núcleo 2.4 se reescribió completamente y pasó a llamarse iptables, reemplazando al antiguo ipchains. El Firewall deLinux iptables Existen varias aplicaciones de cortafuegos (firewall) para Linux, pero independientemente de cuál e use, el corazón de todos estos programas es una sola aplicación bastante poderosa que está integrada en el mismo Kernel de sistema operativo, su nombre: iptables. Pero ¿por qué es mportante un firewall? Porque su propósito es controlar el flujo de datos que salen o entran por na interfaz de red. Este se construye mediante un filtro de paquetes, que es un código que lee el encabezado de un paquete de red que recibe e inmediatamente decide si aceptarlo, rechazarlo o redirigirlo antes de alcanzar un proceso local (demonio: ssh, vsftpd...). En Linux, el filtro de paquetes s parte del núcleo. Independiente del sistema operativo, un firewall es un programa que se ejecuta n un Gateway, Bridge, PC, Laptop o teléfono inteligente ©Unidad de e-Learning 2015 1 Sesión 1 – Unidad 5 – Desarrollo de Software Libre I capaz de filtrar los paquetes de red entrantes, salientes y reenviarlos a un proceso previamente definido. iptables puede dar una sensación falsa de seguridad. No existe red completamente segura, aunque esta herramienta es considerada de primera línea para la defensa de la información, es necesario disponer de otros mecanismos de vigilancia ante actividades extrañas para mantener el sistema seguro. Filtro de datos El núcleo parte con una tabla que contiene tres listas básicas de reglas llamadas “cadenas” (chain): INPUT, OUTPUT y FORWARD, respectivamente (entrada, salida y redirección). Cuando un paquete entra a una interfaz de red, el núcleo examina primero el destino del paquete y decide que ruta tomar (INPUT o FORWARD). Luego el paquete es examinado en la cadena, en donde la decisión de desechar (DROP) o aceptar (ACCEPT) el paquete es tomada. Si la decisión es aceptada, el paquete continúa hacia el destino, siendo recibido por algún proceso local (demonio). En cambio, si la decisión es desechar, el paquete es descartado completamente, muriendo en el lugar, antes de alcanzar un proceso local. Una cadena es entonces una lista de reglas de control. Cada regla dice, “Si el encabezado del paquete es de esta manera, aplico tal acción sobre él”. La regla puede estar compuesta de una o múltiples condiciones. Si cualquiera de las condiciones de la regla no se cumple, la próxima regla es consultada. ©Unidad de e-Learning 2015 2 Sesión 1 – Unidad 5 – Desarrollo de Software Libre I Reglas específicas Las opciones más comunes son: taller~ # iptables -L Chain INPUT (policy ACCEPT) Target prot opt source destination Chain FORWARD (policy ACCEPT) Target prot opt source destination Chain OUTPUT (policy ACCEPT) Target prot opt source destination Agregando reglas Supongamos que queremos añadir una regla que permita que cualquier usuario pueda conectarse al puerto 22. Recuerde que el puerto 22 es designado por defecto al protocolo SSH. Por supuesto, un buen administrador de sistemas tomará otras medidas de seguridad, inclusive cambiar el puerto ©Unidad de e-Learning 2015 3 Sesión 1 – Unidad 5 – Desarrollo de Software Libre I 22 por uno totalmente inesperado, esto puede lograrlo modificando el archivo sshd_config pero como este es solamente un ejemplo, continuaremos con el número de puerto por defecto. Examinemos el comando: -I Ingresamos una nueva regla INPUT Especificamos a qué cadena pertenece esta regla (paquetes entrantes) -i Establecemos la interfaz de red que recibirá el paquete (eth0) -p Protocolo (tcp, udp) --dport Puerto de destino (22 en el ejemplo SSH) -j Salto para la toma de una decisión (para el ejemplo es aceptado) Como el lector puede comprobar, las reglas no son tan complejas (aunque existen algunas que requieren de un vasto conocimiento sobre el tema). Lógicamente, estas reglas se pueden reforzar para mayor seguridad. A continuación veremos una variación de la regla anterior, en esta ocasión solo permitiremos que una determinada dirección IP, pueda acceder al puerto 22. En la primer regla ingresada, se agregó la opción -s que significa cuál es la dirección IP origen del paquete, es decir la dirección IP del host que se permitirá el acceso al puerto 22. A continuación se agrega otra regla que indica que todas las demás peticiones de conexión hacia SSH serán rechazadas. Incluso se puede determinar que la conexión al puerto 22 solo podrá ser realizada desde una dirección MAC específica (la complejidad de las reglas depende de la paranoia del administrador de sistemas) Nuevamente el lector puede comprobar que estas reglas básicas no son para nada complejas. A continuación escribiremos una regla para descartar peticiones ICMP desde el servidor. A pesar de ser una regla básica, puede salvar al equipo de un ataque puesto que el atacante pensará que la dirección IP a la que está realizando ping no ha sido asignada, o que el equipo que la posee está desconectado. taller ~ # iptables -A INPUT -p icmp --icmp-type echo-request -j DROP Los únicos cambios notables son la opción –icmp-typey echo-request, que son las peticiones de tipo ICMP y la acción que se ha determinado como respuesta (en el ejemplo: no se hace nada). ©Unidad de e-Learning 2015 4 Sesión 1 – Unidad 5 – Desarrollo de Software Libre I Una regla en la cadena OUTPUT tiene la misma secuencia de comandos que convergen en una decisión (-jACCEPT, DROP o REJECT), un ejemplo sencillo: taller ~ # iptables -A OUTPUT -p tcp --dport telnet -j REJECT Simplemente le estamos informando a iptables que todas las conexiones salientes para el servicio telnet sean rechazadas. Una regla también puede ser eliminada. Imagine que el administrador se haya equivocado en una regla y esta evite el funcionamiento adecuado de alguno de los servicios. Veamos como deshacernos de una regla: taller ~ # iptables -D INPUT -p icmp --icmp-type echo-request -j DROP Creación de un firewall básico En un cortafuegos no hay que perder el objetivo (filtrar datos). Es necesario aclarar que la única tabla que se ha tratado en este documento, es, en efecto, la tabla de filtro de contenidos, cuyo único propósito es permitir o denegar el envío de información para acceder a un servicio. Para estudiar un poco la tabla nat le invitamos a estudiar el video (paso a paso) “Linux como Router”. También es necesario aclarar que las reglas que ingresamos a iptables solo están presentes mientras la computadora esté funcionando, esdecir que una vez que la computadora se reinicie o apague, estas reglas se borrarán. Obviamente Linux posee muchas alternativas para que estas reglas no se borren. Mencionamos algunas de ellas: Escribir estas reglas de manera íntegra al archivo rc.local del SO Linux Debian. Esto hará que las reglas de iptables se ejecuten cada vez que arranque del sistema. Crear un Bash Script con las reglas de iptables, otorgar permisos de ejecución copiar la ruta de este archivo en rc.local. Instalar algún módulo persistente que mantenga las reglas aunque la computadora se apague. Cualquiera de las anteriores es válida. En este documento estudiaremos la tercera alternativa (la instalación de una herramienta persistente), la cual conseguimos con la siguiente instrucción: ©Unidad de e-Learning 2015 5 Sesión 1 – Unidad 5 – Desarrollo de Software Libre I Instalación: #apt-get install netfilter-persistent Iniciar el servicio de Persisencia de iptables. #/etc/init.d/netfilter-persistent start Al momento de agregar reglas podemos emitir el comando netfilter-persistent save Para mayor información de la paquetería netfilter-persistent consultar http://manpages.ubuntu.com/manpages/wily/man8/netfilterpersistent.8.html Lo primero es definir las reglas necesarias para los servicios que vamos a ofrecer, partiendo de una decisión muy importante: Permitimos todo y bloqueamos los servicios que no utilizaremos o Bloqueamos todo y permitimos solo los servicios que utilizaremos. Evidentemente la segunda opción es la más acertada: bloquear todo y solamente liberar lo que necesitamos. Para conseguir este propósito ingresamos las reglas a continuación: (estas reglas no permitirán entrada de información, por eso debemos permitir que nuestra propia computadora tenga permisos para entrar datos, así como también aceptar paquetes de peticiones que se originen en la misma) Iniciamos ahora con las reglas para los servicios que ofrecemos En la última regla aplicamos el flag –m conntrack, esta regla es especial porque crea un registro que mantiene información de cada conexión y toda la información necesaria para esa conexión, esto es realmente útil para las conexiones FTP. ©Unidad de e-Learning 2015 6 Sesión 1 – Unidad 5 – Desarrollo de Software Libre I El administrador puede definir, además, algunas restricciones (bloquear ip, dar acceso solo a ciertas ip a servicios específicos,entre otros). Ahora solo resta guardar las reglas que se han especificado: #netfilter-persistent save Hasta este punto el lector notará que iptables no es tan complejo (no obstante existen reglas que sí lo son). Siempre es importante conocer las bases de herramientas útiles como esta, una vez que hemos ganado un poco de conocimiento es recomendable (mientras el estudio continua) apoyarse de otras herramientas que facilitan la inserción de reglas en iptables, una de ellas (muy gentil y cómoda de usar) es firehol (http://firehol.org/) cuyo eslogan es “iptables para humanos”. Le invitamos a que estudie la documentación, notará la gran diferencia que existe. No olvide la importancia de conocer las bases de iptables en crudo, esto puede informar al administrador sobre alguna regla mal escrita que esté causando alguna incomodidad en el servidor. Actividad de evaluación Nombre de la actividad Tipo de actividad Objetivo Instruccines Fecha de entrega Criterios de evaluación Quiz Individual Evaluar los conocimientos adquiridos por el estudiante. Responder un quiz de 10 preguntas respecto a lo expuesto esta semana en el aula virtual. Domingo, último día a las 23:59 horas Respuestas correctas, nivel de comprensión en las preguntas abiertas. ©Unidad de e-Learning 2015 7