Proyecto Fin de Carrera 8. Departamento de Ingenierı́a Telemática Automatización del Firewall Para hacer que los cambios realizados sean permanentes, hay que configurar el sistema para que cargue los módulos modificados y creados al arrancar la máquina. Existe un fichero de configuración llamado ”iptables-config” que se encuentra en /etc/sysconfig que permite decirle a Netfilter cuales son los módulos que deben cargarse al inicio en el sistema cuando se arranca el servicio iptables. La configuración de este fichero es bien sencilla, escribimos: IPTABLES MODULES=” n f d e f r a g i p v 4 n f c o n n t r a c k n f c o n n t r a c k i p v 4 x t l 7 s t a t e xt ndpicontrol xt ndpi ” Además, es importante poder realizar toda la instalación del firewall de golpe parcheando el kernel con los módulos modificados del Connection Tracking System. Para ello, vamos a construir el script ”install-redBorder-Stronghold.sh” para que nos facilite la tarea. Vamos a ir viendo paso a paso lo que debemos escribir en el script para conseguir automatizar el funcionamiento del firewall en un entorno productivo. El script en su totalidad puede ser consultado en el anexo 12.15. Lo primero que debemos hacer si queremos convertir nuestro sistema operativo en un firewall de capa 7 es instalar las dependencias necesarias para obtener las fuentes del kernel: [ root@redBorder−S t r o n g h o l d ]# yum i n s t a l l rng−t o o l s . i 6 8 6 [ root@redBorder−S t r o n g h o l d ]# yum i n s t a l l rpm−b u i l d redhat −rpm−c o n f i g u n i d e f [ root@redBorder−S t r o n g h o l d ]# yum i n s t a l l g c c p a t c h u t i l s xmlto a s c i i d o c e l f u t i l s −l i b e l f −d e v e l e l f u t i l s −d e v e l z l i b −d e v e l b i n u t i l s −d e v e l newt−d e v e l python−d e v e l a u d i t −l i b s −d e v e l b i s o n f l e x hmaccalc p e r l −E x t U t i l s −Embed Para facilitar los cambios en las versiones del kernel nos definimos una variable en el script que guarde la versión actual del kernel, en teorı́a la más reciente. En caso de que salga otra versión nueva, siempre que se haga un update la variable tomará el valor correcto: KERNEL VERSION=$ ( uname −r | s e d ” s / . i 6 8 6 / / ” ) Habiendo instalado todas las dependencias que requiere el proceso de preparación de las fuentes del kernel, lo siguiente que hay que hacer es descargarnos el paquete rpm que contiene las fuentes del repositorio oficial de CentOS: [ root@redBorder−S t r o n g h o l d ]# wget h t t p : / / v a u l t . c e n t o s . o r g / 6 . 5 / u p d at e s / S o u r c e / SPackages / k e r n e l −$ (KERNEL VERSION ) . s r c . rpm Instalamos el paquete rpm que nos hemos descargado: [ root@redBorder−S t r o n g h o l d ]# rpm −i v h k e r n e l −$ (KERNEL VERSION ) . s r c . rpm 127 Proyecto Fin de Carrera Departamento de Ingenierı́a Telemática Antes de preparar las fuentes es preciso hacer que el sistema genere una clave gpg usando rng-tools. De otra manera, el proceso de preparación de las fuentes se quedará eternamente bloqueado en el último paso. Siendo un poco más especı́fico, el sistema necesita generar números aleatorios grandes para generar claves criptográficas robustas. El kernel requiere de una seguridad alta y por tanto de claves robustas que no pueden ser generadas a partir de la fecha del sistema. Es aquı́ donde entra en juego rng-tools, que si recordamos fue instalado al principio. Decirle al sistema que no utilice la fecha y que use el servicio rngd se hace de la siguiente manera: [ root@redBorder−S t r o n g h o l d ]# rngd −r / dev /urandom Ahora sı́ estamos en condiciones de iniciar el proceso de preparación de las fuentes del kernel y las vamos a alojar, como ya es habitual, en /usr/src. [ root@redBorder−S t r o n g h o l d ]# cd rpmbuild /SPECS [ root@redBorder−S t r o n g h o l d SPECS]# rpmbuild −bp k e r n e l . s p e c [ root@redBorder−S t r o n g h o l d SPECS]# cp −R . . / BUILD/ k e r n e l −$ (KERNEL VERSION) / l i n u x −$ (KERNEL VERSION ) . i 6 8 6 / u s r / s r c Lo siguiente que debemos hacer es parchear el kernel para disponer de las nuevas capacidades: [ root@redBorder−S t r o n g h o l d ]# cd p r o j e c t / redBorder−ndpi / patch [ root@redBorder−S t r o n g h o l d patch ]# cp ndpi − 2 . 6 . 3 2 . patch / u s r / s r c [ root@redBorder−S t r o n g h o l d patch ]# cd / u s r / s r c [ root@redBorder−S t r o n g h o l d s r c ]# patch −p0 < ndpi − 2 . 6 . 3 2 . patch El parche ndpi-2.6.32 se construye estableciendo las diferencias a nivel de código entre las fuentes del kernel originales y las fuentes del kernel modificadas. La construcción del parche no forma parte de la instalación pero es preciso indicar cómo se hace: [ root@redBorder−S t r o n g h o l d ]# d i f f −Nru / u s r / s r c / l i n u x −d p i p r o j e c t . o r i g / u s r / s r c / l i n u x −d p i p r o j e c t > ndpi . patch [ root@redBorder−S t r o n g h o l d ]# c a t ndpi . patch | patch −p0 −−dry−run Donde linux-dpi project.orig es un enlace simbólico a las fuentes del kernel modificadas, probadas y funcionales. El segundo comando con la opción –dry-run es para comprobar que el parche se aplicarı́a de forma correcta. Una vez aplicado el parche, es preciso volver a compilar las fuentes del kernel. En este punto, se puede configurar también los módulos que queremos que se carguen con el kernel: [ root@redBorder−S t r o n g h o l d ]# cd / u s r / s r c / l i n u x −KERNEL VERSION . i 6 8 6 / && make menuconfig && make Cuando termina la compilación copiamos los módulos del kernel modificados en la la carpeta ”extra” y las librerı́as dinámicas de iptables en el directorio /lib/xtables-1.4.7. Esta copia se realiza a través del script auxiliar ”insert new modules.sh”, el cual puede ser consultado en el anexo 12.16: [ root@redBorder−S t r o n g h o l d ]# cd p r o j e c t / redBorder−ndpi / patch [ root@redBorder−S t r o n g h o l d patch ]# . / i n s e r t n e w m o d u l e s . sh 128 Proyecto Fin de Carrera Departamento de Ingenierı́a Telemática En este punto ya hemos terminado con Netfilter, tanto en el espacio de usuario como en el espacio del kernel, y queda solamente instalar nDPI con las modificaciones realizadas. Para ello vamos a copiar las fuentes modificadas en /usr/src y vamos a realizar todo el proceso de instalación a través del script install ndpi.sh que puede ser consultado en el anexo 12.3: [ root@redBorder−S t r o n g h o l d patch ]# mkdir −p / u s r / s r c / redBorder−ndpi [ root@redBorder−S t r o n g h o l d patch ]# cd [ root@redBorder−S t r o n g h o l d ]# cd p r o j e c t / redBorder−ndpi [ root@redBorder−S t r o n g h o l d redBorder−ndpi ]# cp −R h t t p . c / u s r / s r c / redBorder−ndpi [ root@redBorder−S t r o n g h o l d redBorder−ndpi ]# cp −R nDPI/ / u s r / s r c / redBorder−ndpi cp −R h t t p . c / u s r / s r c / redBorder−ndpi [ root@redBorder−S t r o n g h o l d redBorder−ndpi ]# cd / u s r / s r c / redBorder−ndpi /nDPI [ root@redBorder−S t r o n g h o l d nDPI]# . / i n s t a l l n d p i . sh 129 Proyecto Fin de Carrera Departamento de Ingenierı́a Telemática palabra 130