SEGURIDAD EN LA RED

Anuncio
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
S EGURIDAD EN LA RED
7.1 SSH
Sus siglas abrevian Secure Shell, y es un protocolo cliente/servidor que sirve para acceder a
interfaces de comando en máquinas remotas a través de una red IP. Es similar a Telnet, sólo que
toda la conexión está encriptada, para evitar que el tráfico entre los extremos (incluyendo
autenticación) circule en texto simple por la red.
Hay una implementación gratuita para Linux llamada OpenSSH, y viene con las fuentes de SuSE. Si
durante la instalación se marcaron las opciones de Red – Servidor, seguramente estará instalado y
en funcionamiento.
SSH opera sobre TCP típicamente en el puerto 22 del servidor, y en su modo más simple, el cliente
se conecta con el servidor, quien se identifica y entre ambos negocian una clave para encriptar la
comunicación.
OpenSSH provee de las siguientes utilidades, entre otras:
o ssh: cliente SSH, que reemplaza a rlogin y telnet.
o scp: que hace las veces de rcp y permite copiar archivos entre 2 máquinas.
o sftp: un cliente de FTP seguro.
o sshd: servidor SSH.
o sftp-server: servidor FTP seguro.
7.1.1 Clientes
Veremos la sintaxis básica y de uso más frecuente de los clientes SSH. Para iniciar una sesión de
shell en una máquina remota debemos usar ssh:
ssh [-l login_name] hostname | user@hostname
Esto indica que podemos iniciar sesión en un host remoto escribiendo, por ejemplo:
usuario@tierra:~ > ssh 12.168.0.122
Módulo VII: Seguridad en la red
1
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
En caso de querer especificar el nombre de usuario, podemos anteponerlo al nombre de host o IP
en el parámetro –l o bien utilizar la sintaxis con @:
usuario@tierra:~ > ssh [email protected]
Si deseamos copiar un archivo a través de la red, lo indicado sería scp:
scp [-r] [[user@]host1:]file1 [...] [[user@]host2:]file2
El parámetro –r permite copiar el contenido de los subdirectorios. Veremos un ejemplo más
adelante.
Por último, muchas veces (cuando no se conocen los nombres de los archivos a copiar, por
ejemplo) es conveniente una transferencia FTP. Para ello, SSH dispone de sftp:
sftp [user@]host
Una vez conectados, el comando help muestra una lista de los comandos disponibles, similares a
los de cualquier cliente FTP.
La configuración del cliente ssh se encuentra en /etc/ssh/ssh_config, se recomienda utilizar los
valores por defecto, y de ser necesario modificarlos al invocar el ejecutable en el shell.
Los comandos vistos tienen muchas funciones más que las tratadas en este documento, como ser
compresión y ejecución por lotes (batch), por lo que es recomendable buscar más información
sobre su uso en las páginas de manual correspondientes.
7.1.2 Servidor
El demonio sshd controla el funcionamiento de ssh, scp y sftp, este último al iniciar sftpserver cuando es necesario. Se controla por medio del script rcsshd, y la configuración se
encuentra en /etc/ssh/sshd_config.
Los parámetros por defecto son suficientes para el funcionamiento normal y seguro del servidor.
Destacaremos sin embargo el parámetro PermitRootLogin que posibilita el control sobre la
admisión del usuario root a través de este protocolo.
7.1.3 Funcionamiento
Para que una conexión SSH sea posible, debe estar en la máquina destino el demonio o servidor
SSH ejecutandose. En SuSE este demonio ejecuta por defecto al iniciar el sistema en los niveles 3 y
5.
Al iniciar por primera vez, el demonio genera dos pares de claves (keys). Cada par está compuesto
por una clave privada y una pública, que permite afirmar que este protocolo está basado en clave
pública. Para garantizar la seguridad de la comunicación via SSH, sólo el administrador del sistema
Módulo VII: Seguridad en la red
2
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
puede ver los archivos que contienen las claves privadas. Estas son necesarias exclusivamente para
el demonio local, y nunca deben ser reveladas.
Por otro lado, están las claves públicas, con la extensión .pub, que son enviadas al cliente y que son
legibles por cualquier usuario.
La conexión es iniciada por el cliente. Luego intercambian identificación, comparan el protocolo,
versión de software y evitan la conexión a un puerto del cliente incorrecto. Esto último es necesario
debido a que es un hijo del proceso original del demonio el que responde a la petición y puede
haber de este modo muchas conexiones simultáneas.
Paso siguiente el servidor manda sus claves públicas: una que lo identifica (host key), y una llamada
“de sesión” (session key) que cambia cada hora. El cliente genera una clave simétrica, la encripta
con ambas claves públicas del servidor y la envía (SSHv1) para que ambas partes utilicen esta clave
para encriptar el resto de la comunicación. Una vez finalizada esta fase de negociación comienza el
inicio de sesión en el host remoto, típicamente hará falta un nombre de usuario y password.
La versión 2 de SSH, entre otras cosas, requiere que la clave simétrica sea generada entre las dos
puntas de la conexión, para evitar ataques de replay (cuando el tráfico de red es capturado, aún
encriptado, guardado y posteriormente enviado de vuelta).
Luego del primer contacto con un servidor, el cliente conserva la clave pública del servidor (host
key) en el archivo ~/.ssh/known_hosts junto con su dirección IP para evitar ataques del tipo
“hombre en el medio” (man in the middle) que tratan de impostar un servidor para engañar al
cliente. El servidor impostor no podrá contar con la clave pública almacenada en known_hosts y en
caso de hacerlo, a menos que posea la clave privada del servidor verdadero estará impedido de
entender la comunicación.
Es recomendable entonces guardar las claves públicas y privadas del servidor almacenadas en
/etc/ssh externamente con un doble propósito: detectar alteraciones y para utilizarlas luego de una
nueva instalación.
7.1.4 Autenticación por clave pública
El método de nombre de usuario y password tiene algunos inconvenientes. Por ejemplo, un
password tiene que ser largo, lo más aleatorio posible y contener caracteres alfanuméricos y algún
símbolo especial para ser más seguro; pero un password así es difícil de recordar. Por otro lado, un
password que transita la red aún encriptado puede ser capturado si el host destino (donde se ejecuta
el servidor SSH) se encuentra comprometido. Finalmente, este método presenta dificultades cuando
una contraseña (la de root, por ejemplo) tiene que ser compartida entre varias personas, puesto que
hay que avisar a todos de los cambios y es difícil auditar el uso de la cuenta, dado que el sistema no
permite distinguir entre los usuarios de la cuenta.
Módulo VII: Seguridad en la red
3
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
A raíz de esto, SSH soporta autenticación por clave pública: en lugar de depender del mecanismo
de autenticación del servidor, SSH puede usar claves criptográficas, que son más seguras que las
contraseñas, y solucionan todos los problemas mencionados.
Estas claves criptográficas son cadenas de bits generadas de forma tal que sean únicas, y que por
esta propiedad, pueden considerarse como prueba de identidad. El esquema sigue siendo de clave
asimétrica, por lo que al generar una identidad en SSH se obtiene una clave pública y una privada, y
esta última está en general encriptada y protegida por una contraseña larga o passphrase.
Para utilizar este sistema, en primer lugar, hay que generar las claves:
usuario@tierra:~ > ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/usuario/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/usuario/.ssh/id_dsa.
Your public key has been saved in /home/usuario/.ssh/id_dsa.pub.
The key fingerprint is:
74:b5:62:1f:a2:de:a3:ab:15:b5:30:7b:89:49:03:ce usuario@tierra
Luego hay que colocar la clave pública en la cuenta remota. Supongamos que usuario tiene en la
máquina sol una cuenta llamada remoto. Hay que poner la clave pública de usuario en tierra
dentro de ~/.ssh/authorized_keys en sol. Este archivo contiene todas las claves públicas de
las identidades autorizadas para iniciar sesión en la cuenta de remoto@sol.
Es un buen momento para ejemplificar el uso de scp, con el que copiaremos la clave pública
recientemente generada.
usuario@tierra:~ > scp ~/.ssh/id_dsa.pub remoto@sol:~/usuario.pub
The authenticity of host 'hermano (12.168.0.122)' can't be established.
RSA key fingerprint is 6c:cd:cf:e6:73:93:ee:d7:4c:ce:e5:bf:ec:c0:17:c4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'sol,12.168.0.122' (RSA) to the list of known hosts.
remoto@sol's password:
id_dsa.pub
100% 605
0.0KB/s
00:00
usuario@tierra:~ > ssh -l remoto sol
remoto@sol's password:
Last login: Tue Jun 21 10:21:38 2004 from 12.148.10.123
-*- If Linux doesn't have the solution, you have the wrong problem -*remoto@sol:~ > cat usuario.pub >> .ssh/authorized_keys
remoto@sol:~ > rm usuario.pub
remoto@sol:~ > logout
Módulo VII: Seguridad en la red
4
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
La próxima vez que se utilice ssh para ingresar a remoto@sol desde usuario@tierra, se pedirá
la passphrase de la clave privada en primer lugar, y de fallar, el password. La clave pública de una
identidad del lado del cliente, además de estar en id_dsa.pub, puede estar en identity, siempre
dentro del directorio ~/.ssh.
Este esquema de autenticación es más seguro que el de usuario/contraseña porque:
1. Tiene 2 componentes secretos: la clave privada y la passphrase.
2. Ninguno de estos componentes viaja por la red. Es posible probar la posesión de ellos
sin revelarlos, y esto es lo que el protocolo hace.
3. Las claves criptográficas generadas son extremadamente difíciles de adivinar. En caso de
poder obtener la clave privada encriptada, hay que adivinar la passphrase, que por ser
(supuestamente) larga y compleja es también un gran obstáculo.
Ahora que tenemos este nuevo mecanismo, caemos en cuenta de que cada vez que necesitamos
utilizar ssh o scp hay que escribir una frase bastante más larga que la contraseña. Para asistirnos en
este paso, está la utilidad ssh-agent, que mantiene la clave privada de una identidad (añadida
previamente con ssh-add) en memoria mientras dure la ejecución de este agente.
Por ejemplo, para el caso visto anteriormente:
usuario@tierra:~ > ssh-agent bash
usuario@tierra:~ > ssh-add usuario
Enter passphrase for /home/usuario/.ssh/id_dsa:
Identity added: /home/usuario/.ssh/id_dsa (/home/usuario/.ssh/id_dsa)
usuario@tierra:~ > ssh remoto@sol
Last login: Tue Jun 21 11:16:53 2004 from 12.148.10.123
-*- If Linux doesn't have the solution, you have the wrong problem -*remoto@sol:~ > logout
El primer comando inicia una sesión de bash bajo el agente ssh. Luego se pueden agregar las claves
con ssh-add, y el agente las registra mientras dure la sesión (o subshell) abierta. Como
consecuencia del registro, no necesitamos escribir la passphrase más que una vez para cualquier host
que requiera la identidad cuya clave privada se encuentra en ~/.ssh/id_dsa. Esto incluye los
clientes ssh, scp y sftp. Si tuvieramos más de una identidad, bastaría con agregarla del mismo
modo.
Se recomienda la lectura de las páginas de manual de ssh-keygen, ssh-agent y ssh-add para
abarcar el resto de las opciones de estas utilidades.
Módulo VII: Seguridad en la red
5
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
7.2 KERBEROS
Durante 1983 en el M.I.T. (Massachussetts Institute of Technology) comenzó el proyecto Athena
con el objetivo de crear un entorno de trabajo educacional compuesto por estaciones gráficas, redes
de alta velocidad y servidores; el sistema operativo para implementar este entorno era Unix 4.3BSD,
y el sistema de autenticación utilizado en el proyecto se denominó Kerberos en honor al perro de
tres cabezas que en la mitología griega vigila la puerta de entrada a Hades, el infierno.
Hasta que se diseñó Kerberos, la autenticación en redes de computadores se realizaba
principalmente de dos formas: o bien se aplicaba la autenticación por declaración (Authentication
by assertion), en la que el usuario es libre de indicar el servicio al que desea acceder (por ejemplo,
mediante el uso de un cliente determinado), o bien se utilizaban contraseñas para cada servicio de
red. Evidentemente el primer modelo proporciona un nivel de seguridad muy bajo, ya que se le
otorga demasiado poder al cliente sobre el servidor; el segundo modelo tampoco es muy bueno: por
un lado se obliga al usuario a ir tecleando contínuamente su clave, de forma que se pierde demasiado
tiempo y además la contraseña está viajando contínuamente por la red. Kerberos trata de mejorar
estos esquemas intentando por un lado que un cliente necesite autorización para comunicar con un
servidor (y que esa autorización provenga de una máquina confiable), y por otro eliminando la
necesidad de demostrar el conocimiento de información privada (la contraseña del usuario)
divulgando dicha información.
Kerberos se ha convertido desde entonces en un referente obligatorio a la hora de hablar de
seguridad en redes. Se encuentra disponible para la mayoría de sistemas Unix, y está especialmente
recomendado para sistemas operativos distribuidos, en los que la autenticación es una pieza
fundamental para su funcionamiento: si conseguimos que un servidor logre conocer la identidad de un
cliente puede decidir sobre la concesión de un servicio o la asignación de privilegios especiales.
Muchos otros esquemas de autenticación diseñados posteriormente, como KryptoKnight,
SESAME o Charon se basan en mayor o menor medida en Kerberos.
El uso de Kerberos se produce principalmente en el login, en el acceso a otros servidores (por
ejemplo, mediante rlogin) y en el acceso a sistemas de ficheros en red como NFS.
7.2.1 Arquitectura de Kerberos
Un servidor Kerberos se denomina KDC (Kerberos Distribution Center), y provee de dos
servicios fundamentales: el de autenticación (AS, Authentication Service) y el de tickets (TGS,
Ticket Granting Service). El primero tiene como función autenticar inicialmente a los clientes y
proporcionarles un ticket para comunicarse con el segundo, el servidor de tickets, que
proporcionará a los clientes las credenciales necesarias para comunicarse con un servidor final que
es quien realmente ofrece un servicio. Además, el servidor posee una base de datos de sus clientes
Módulo VII: Seguridad en la red
6
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
(usuarios o programas) con sus respectivas claves privadas, conocidas únicamente por dicho
servidor y por el cliente al que pertenece.
La arquitectura de Kerberos está basada en tres objetos de seguridad: Clave de Sesión, Ticket y
Autenticador.
La clave de sesión es una clave secreta generada por Kerberos y expedida a un cliente para uso
con un servidor durante una sesión; no es obligatorio utilizarla en toda la comunicación con el
servidor, sólo si el servidor lo requiere (para encriptar los datos) o si el servidor es un servidor de
autenticación. Las claves de sesión se utilizan para minimizar el uso de las claves secretas de los
diferentes agentes: éstas últimas son válidas durante mucho tiempo, por lo que es conveniente para
minimizar ataques utilizarlas lo menos posible.
El ticket es un testigo expedido a un cliente del servicio de tickets de Kerberos para solicitar los
servicios de un servidor; garantiza que el cliente ha sido autenticado recientemente. Este ticket
incluye el nombre del cliente, para evitar su posible uso por impostores, un periodo de validez y una
clave de sesión asociada para uso de cliente y servidor. Kerberos siempre proporciona el ticket ya
cifrado con la clave secreta del servidor al que se le entrega.
El autenticador es un testigo construido por el cliente y enviado a un servidor para probar su
identidad y la actualidad de la comunicación; sólo puede ser utilizado una vez. Este autenticador
contiene, cifrado con la clave de la sesión, el nombre del cliente y un timestamp. Estos últimos se
usan como pruebas de frescura, con dos propósitos: evitar reenvíos de viejos mensajes capturados
en la red o la reutilización de viejos tickets obtenidos de zonas de memoria del usuario autorizado, y
a la vez poder revocar a los usuarios los derechos al cabo de un tiempo.
Módulo VII: Seguridad en la red
7
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
7.2.2 Problemas de Kerberos
A la vista de todo lo comentado en los puntos anteriores puede darnos la impresión de que
Kerberos es la panacea de los sistemas de autenticación. Sin embargo, y aunque se trate de un
sistema robusto, no está exento de ciertos problemas, tanto de seguridad como de implementación,
que han hecho que este sistema no esté todo lo extendido que podría.
Uno de los principales problemas de Kerberos es que cualquier programa que lo utilice ha de ser
modificado para poder funcionar correctamente, siguiendo un proceso denominado “kerberización”.
Esto implica obviamente que se ha de disponer del código fuente de cada aplicación que se desee
kerberizar, y también supone una inversión de tiempo considerable para algunas aplicaciones más o
menos complejas que no todas las organizaciones se pueden permitir.
El problema anterior es simplemente de implementación; no afecta para nada a la seguridad -o
inseguridad- del protocolo. Un problema que sí está relacionado con la seguridad de Kerberos es la
gran centralización que presenta el sistema. Para un correcto funcionamiento se ha de disponer en
todo momento del servidor Kerberos, de forma que si la máquina que lo alberga falla, la red se
convierte en inutilizable; obviamente esto es una contradicción con lo que nos dice la teoría de
sistemas distribuidos, donde se recalca el uso de la distribución para mantener la disponibilidad del
sistema, intentado que si un equipo falla el resto pueda seguir funcionando, si no a pleno rendimiento,
al menos correctamente. Por si esto no fuera suficiente, otro ejemplo de la centralización de
Módulo VII: Seguridad en la red
8
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
Kerberos reside en el hecho de que casi toda la seguridad reside en el servidor que mantiene la base
de datos de claves, de forma que si éste se ve comprometido, la red entera está amenazada.
Otro potencial problema de seguridad es el uso de timestamps como pruebas de frescura en
Kerberos. Esto obliga a que todas las máquinas que ejecutan servicios autenticados mantengan sus
relojes mínimamente sincronizados (con desfases máximos de pocos minutos), con todo lo que esto
implica. Además ese tiempo global ha de ser accesible a todas las estaciones; aunque en el diseño
no se asume que todas mantengan la hora exacta, sí que se les obliga a mantenerse dentro de los
márgenes si desean solicitar tickets, para lo que se necesitan servidores de tiempo con los que los
clientes puedan sincronizar periódicamente sus relojes, por ejemplo cada vez que arrancan.
Todos estos problemas, y algunos más que se han ido solucionando en diferentes versiones del
sistema, han propiciado que el uso de Kerberos no esté muy extendido; en la mayoría de redes es
suficiente con un protocolo de comunicación cifrado para mantener una mínima seguridad, de forma
que el complejo modelo de Kerberos se ve sustituido a ese efecto por programas tan simples y
transparentes como SSH.
7.2.3 Cliente Kerberos en SuSE
En SuSE, la configuración de un cliente Kerberos es sencilla de realizar desde YaST2, bajo la
categoría de Servicios de Red.
Módulo VII: Seguridad en la red
9
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
Una vez configurado correctamente, todas las aplicaciones que utilicen PAM para autenticación
podrán hacer uso de Kerberos, como por ejemplo, telnet, ftp, login, y otros.
7.3 FIREWALL
Un firewall o cortafuegos es un sistema o grupo de sistemas que hace cumplir una política de
control de acceso entre dos redes. De una forma más clara, podemos definir un cortafuegos como
cualquier sistema (desde un simple router hasta varias redes en serie) utilizado para separar –en
cuanto a seguridad se refiere– una máquina o subred del resto, protegiéndola así de servicios y
protocolos que desde el exterior puedan suponer una amenaza a la seguridad. El espacio protegido,
denominado perímetro de seguridad, suele ser propiedad de la misma organización, y la
protección se realiza contra una red externa, no confiable, llamada zona de riesgo.
Evidentemente la forma de aislamiento más efectiva para cualquier política de seguridad consiste en
el aislamiento físico, es decir, no tener conectada la máquina o la subred a otros equipos o a Internet
(figura 7.1 (a)). Sin embargo, en la mayoría de organizaciones los usuarios necesitan compartir
Módulo VII: Seguridad en la red
10
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
información con otras personas situadas en muchas ocasiones a miles de kilómetros de distancia,
con lo que no es posible un aislamiento total. El punto opuesto consistiría en una conectividad
completa con la red (figura 7.1 (b)), lo que desde el punto de vista de la seguridad es muy
problemático: cualquiera, desde cualquier parte del mundo, puede potencialmente tener acceso a
nuestros recursos. Un término medio entre ambas aproximaciones consiste en implementar cierta
separación lógica mediante un cortafuegos (figura 7.1 (c)).
Figura 7.1: (a) Aislamiento. (b) Conexión total. (c) Firewall entre la zona de riesgo y el perímetro
de seguridad.
Antes de hablar de cortafuegos es casi obligatorio dar una serie de definiciones de partes o
características de funcionamiento de un firewall; por máquina o host bastión (también se
denominan gates) se conoce a un sistema especialmente asegurado, pero en principio vulnerable a
todo tipo de ataques por estar abierto a Internet, que tiene como función ser el punto de contacto de
los usuarios de la red interna de una organización con otro tipo de redes. El host bastión filtra tráfico
de entrada y salida, y también esconde la configuración de la red hacia fuera.
Por filtrado de paquetes entendemos la acción de denegar o permitir el flujo de tramas entre dos
redes (por ejemplo la interna, protegida con el firewall, y el resto de Internet) de acuerdo a unas
normas predefinidas. El filtrado también se conoce como screening, y a los dispositivos que lo
implementan se les denomina chokes; el choke puede ser la máquina bastión o un elemento
diferente.
Físicamente, en casi todos los cortafuegos existen al menos un choke y una máquina bastión, aunque
también se considera firewall a un simple router filtrando paquetes, es decir, actuando como
Módulo VII: Seguridad en la red
11
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
choke; desde el punto de vista lógico, en el cortafuegos suelen existir servidores proxy para las
aplicaciones que han de atravesar el sistema, y que se situan habitualmente en el host bastión.
También se implementa en el choke un mecanismo de filtrado de paquetes, y en alguno de los dos
elementos se suele situar otro mecanismo para poder registrar y detectar la actividad sospechosa.
Los firewalls son cada vez más necesarios en nuestras redes, pero todos los expertos recomiendan
que no se usen en lugar de otras herramientas, sino junto a ellas; cualquier cortafuegos, desde el
más simple al más avanzado, presenta dos gravísimos problemas de seguridad: por un lado,
centralizan todas las medidas en un único sistema, de forma que si éste se ve comprometido y el
resto de nuestra red no está lo suficientemente protegido el atacante consigue amenazar a toda la
subred simplemente poniendo en jaque a una máquina. El segundo problema, relacionado con éste,
es la falsa sensación de seguridad que un cortafuegos proporciona: generalmente un administrador
que no disponga de un firewall va a preocuparse de la integridad de todas y cada una de sus
máquinas, pero en el momento en que instala el cortafuegos y lo configura asume que toda su red es
segura, por lo que se suele descuidar enormemente la seguridad de los equipos de la red interna.
Esto, como acabamos de comentar, es un grave error, ya que en el momento que un pirata acceda a
nuestro cortafuegos –recordemos que es un sistema muy expuesto a ataques externos–
automáticamente va a tener la posibilidad de controlar toda nuestra red.
7.3.1 SuSEFirewall 2
SuSE empaca dos firewalls de filtrado de paquetes con iptables, el Personal-firewall y el
SuSEFirewall 2. El primero de ellos está cayendo en desuso, por lo que no nos referiremos a él en
este documento. El segundo se configura desde YaST, de una manera muy sencilla que no requiere
conocimiento alguno de iptables. Se encuentra bajo la categoría de Seguridad y Usuarios.
Módulo VII: Seguridad en la red
12
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
El primer paso es bastante claro, especificar las interfaces internas y externas.
Módulo VII: Seguridad en la red
13
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
Luego vienen los servicios que se desean brindar para dejar los puertos abiertos. En el campo de
Servicios adicionales se pueden especificar manualmente números de puertos para dejar abiertos. Se
destacan el 1863 de MSN Messenger y el 631 de CUPS.
Módulo VII: Seguridad en la red
14
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
Este paso contiene decisiones importantes, entre las que destacamos: reenviar tráfico y usar
enmascaramiento (es más seguro no usarlo, y poner proxys) y proteger todos los servicios en
ejecución, para que una máquina externa sólo pueda acceder a los servicios especificados en el paso
anterior.
Módulo VII: Seguridad en la red
15
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
Finalmente están las opciones de registro. La configuración es tan sencilla como limitada. Todo esto
se traduce en un conjunto de reglas de filtrado con iptables. Por esto veremos a continuación el
manejo de las reglas mismas, para poder crear un filtro que se ajuste más a necesidades específicas.
7.3.2 Filtrado de paquetes con iptables
El filtrado de paquetes se realiza por medio de la aplicación iptables. Ella nos permite manejar
todos los datagramas que pasan por la máquina, según el siguiente esquema:
Módulo VII: Seguridad en la red
16
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
La primera decisión de ruteo (routing decision) tendrá en cuenta si el paquete está destinado al host
local o si debe ser reenviado. El camino a seguir será el de la izquierda o el de la derecha,
respectivamente.
Podemos ver que las cadenas PREROUTING de las tablas mangle y nat son recorridas antes de
la decisión de encaminamiento, por lo que ésta puede verse alterada dependiendo del manejo que se
produzca en las mencionadas cadenas.
La tabla mangle está destinada para cambiar o establecer el TTL y TOS de un paquete, y también
permite marcar el datagrama de modo tal que pueda ser reconocido por las herramientas de
encaminamiento de iproute2.
Módulo VII: Seguridad en la red
17
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
La tabla nat se usa para Network Address Translation, que incluye DNAT, SNAT y Masquerading.
Finalmente la tabla filter es la que veremos en detalle y su propósito es realizar el filtrado de
paquetes. Las acciones en esta tabla serán ACCEPT, REJECT y DROP.
Siendo que iptables fue introducido en el capítulo anterior, veremos a continuación las opciones
de las acciones de la tabla filter. Cabe destacar que la opción de búsqueda “-i”, que especifica la
interfaz de entrada del paquete (eth0, ppp2, etc.), sólo vale para las cadenas FILTER e INPUT,
mientras que la opción “-o”, que se compara con la interfaz de salida del paquete (eth1, eth0, ppp0,
etc.) sólo tiene significado en FORWARD y OUTPUT. Esto es debido al esquema de
encaminamiento.
Las acciones ACCEPT y DROP no poseen parámetros. Cuando un paquete satisface una regla
cuya acción es ACCEPT, es dejado pasar y no sigue recorriendo las reglas de la cadena ni de la
tabla actual. Notese, que sin embargo, en otra tabla se puede descartar un paquete previamente
aceptado.
Cuando un datagrama cumple con una regla cuya acción es DROP, este es bloqueado. Esto significa
que no recorrerá ninguna otra regla en la cadena presente ni en otras de la tabla actual ni las demás.
El paquete es descartado en el acto, y para el host es como si no existiese.
La acción REJECT tiene una opción, --reject-with, que establece la respuesta a mandar al host
que originó el paquete que estamos rechazando. La acción realiza lo mismo que DROP, excepto
que previamente enviará la respuesta especificada (por defecto port unreachable - “puerto
inalcanzable”). Las respuestas válidas son: icmp-net-unreachable, icmp-host-unreachable,
icmp-port-unreachable, icmp-proto-unreachable, icmp-net-prohibited,
icmphost-prohibited, echo-reply y tcp-reset.
Por ejemplo, la siguiente regla rechaza los paquetes destinados al puerto TCP 22 (SSH) de los hosts
internos (FORWARD) y envía como respuesta un paquete TCP RST, utilizado para cerrar
adecuadamente las conexiones:
iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset
Hay una condición de búsqueda adicional de mucho valor en un firewall: “state". Linux lleva una
tabla donde guarda información de cada conexión (connection tracking) TCP, UDP, ICMP, FTP
y otros. Son de especial interés los estados ESTABLISHED y RELATED, que indican paquetes de
una conexión ya establecida y paquetes de una conexión relacionada con otra ya establecida.
Por ejemplo, la siguiente regla permite a nuestro servidor web responder a conexiones ya
establecidas y relacionadas.
Módulo VII: Seguridad en la red
18
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
iptables -A OUTPUT -p tcp --sport 80 -m state --state RELATED,ESTABLISHED j ACCEPT
Para finalizar, iptables nos da la posibilidad de registrar en syslog todo lo que sucede en su
ambiente. Esto se realiza por medio de la acción LOG, que tiene los siguientes parámetros posibles:
o --log-level, con el que se puede especificar la prioridad para syslog
o --log-prefix, que permite anteponer una frase al registro, por ejemplo, “PAQUETES
DESCARTADOS”.
o --log-tcp-sequence, para registrar el número de secuencia TCP
o --log-tcp-options, que muestra los campos del encabezado TCP
o --log-ip-options, que muestra los campos del encabezado IP
Por ejemplo, la siguiente regla registra todos los paquetes que provengan de un DNS con prioridad
info y el prefijo DNS-INPUT. Además registra los campos del encabezado IP.
iptables -A INPUT -p udp --sport 53 -j LOG --log-level info --log-prefix
"DNS-INPUT " --log-ip-options
Iptables no inserta espacio entre el prefijo y el resto del mensaje, por lo que se hace necesario
colocarlo manualmente.
La totalidad de iptables está cubierto en un excelente tutorial (en inglés) que se puede encontrar en
http://iptables-tutorial.frozentux.net/iptables-tutorial.html#LOGTARGET y su lectura está altamente
recomendada para aquellos que deseen comenzar a experimentar con filtrado de paquetes.
7.3.3 Ejemplo de reglas de filtrado en un bastión
Ya contamos con los conocimientos necesarios para revisar un sencillo script de filtrado de paquetes
destinado a proteger sólo una máquina conectada a Internet.
#!/bin/sh
IPTABLES=”/usr/sbin/iptables”
echo -n Aplicando Reglas de Firewall...
## FLUSH de reglas
Módulo VII: Seguridad en la red
19
Facultad de Cs. Exactas y Tecnología
Depto. de Electricidad, Electrónica y Computación
Ing. en Computación
Curso: Administración Avanzada de Linux
$IPTABLES -F
$IPTABLES -X
$IPTABLES -Z
$IPTABLES -t nat -F
## Establecemos politica por defecto: DROP
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
##
## Debemos decir de manera explicita qué es lo que queremos abrir
# Operar en localhost sin limitaciones
IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
# Este es el servicio que ofrece la maquina a internet, por tanto todo
paquete entrante se acepta para
# ese puerto y los salientes vinculados se aceptan.
$IPTABLES -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -m tcp --sport 80 -m state --state
RELATED,ESTABLISHED -j ACCEPT
# Permitimos que la maquina pueda salir a la web
$IPTABLES -A INPUT -p tcp -m tcp --sport 80 -m state --state
RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
# Y tambien a webs seguras
$IPTABLES -A INPUT -p tcp -m tcp --sport 443 -m state --state
RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
# Reglas necesarias para FTP pasivo y activo. Se permiten conexiones
entrantes YA establecidas
$IPTABLES -A INPUT -p tcp -m tcp --sport 20:21 -m state --state
RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -m tcp --dport 20:21 -j ACCEPT
$IPTABLES -A INPUT -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m
state --state ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -m tcp --dport 1024:65535 -m state --state
NEW,RELATED,ESTABLISHED -j ACCEPT
# Permitimos la consulta a un primer DNS
$IPTABLES -A INPUT -s 211.95.64.39 -p udp -m udp --sport 53 -j ACCEPT
$IPTABLES -A OUTPUT -d 211.95.64.39 -p udp -m udp --dport 53 -j ACCEPT
# Permitimos la consulta a un segundo DNS
$IPTABLES -A INPUT -s 211.95.79.109 -p udp -m udp --sport 53 -j ACCEPT
$IPTABLES -A OUTPUT -d 211.95.79.109 -p udp -m udp --dport 53 -j ACCEPT
# Barrera de respaldo por si cambiamos a modo ACCEPT temporalmente
# Con esto protegemos los puertos reservados y otros well-known
$IPTABLES -A INPUT -p tcp -m tcp --dport 1:1024 -j DROP
$IPTABLES -A INPUT -p udp -m udp --dport 1:1024 -j DROP
$IPTABLES -A INPUT -p tcp -m tcp --dport 1723 -j DROP
$IPTABLES -A INPUT -p tcp -m tcp --dport 3306 -j DROP
$IPTABLES -A INPUT -p tcp -m tcp --dport 5432 -j DROP
echo " OK . Verificar lo que se aplica con: $IPTABLES -L -n"
# Fin del script
Módulo VII: Seguridad en la red
20
Descargar