Guía de Seguridad en Red
Licencia y Garantía
Este documento se presenta sin ningún tipo de garantía. El uso de esta guía así como de sus consejos se encuentran bajo tu completa y exclusiva responsabilidad. El autor no se responsabiliza de los daños que se puedan ocasionar al seguir esta guía, sean del tipo que sean.
- Los bugs y las imprecisiones en el texto están garantizadas (incluyo las faltas y errores gramaticales), sobre todo en esta primera versión.
La última versión de este documento la puedes encontrar aquí
Copyright Jesús Sutil (chacal) 2005 - versión 1.0
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled \"GNU Free Documentation License\".
Requisitos
Como requisitos para el lector, espero que no sea necesario ninguno, al menos para entender la razón de las medidas tomadas, otra cosa sería ponerlas en práctica, para la cual se necesita un cierto manejo en el uso de un sistema GNU/Linux, puesto que voy a dar por supuesto que tenemos instalado lo que necesitamos, y en cuanto a las configuraciones, tampoco voy a hacer demasiado hincapié puesto que cualquiera con ayuda de la documentación del programa pertinente, podrá llevarla a cabo.
Prólogo
La seguridad, está tomando mayor importancia día a día, puesto que cada vez hay más conexiones a Internet y más prolongadas, y los servidores caseros, que están permanentemente conectados a la red, proliferan como setas. Y eso sin contar con los grandes servidores, aunque eso ya es otra historia puesto que muchos de ellos están detrás de un firewall implementado directamente en hardware, y estos no se cansan tanto. A estos se les suele llamar firewalls perimetrales, puesto que normalmente son los que cubren los primeros accesos de la red, a causa de su mayor robustez, por lo que muchas veces el peligro está dentro.
Al hablar de seguridad en red, nos referimos a seguridad remota es decir sin que el atacante tenga acceso físico al equipo atacado, porque entonces no hay seguridad que valga. Por lo tanto este aspecto no lo voy a tratar, no porque no sea interesante, sino porque tirando del cable de la luz o simplemente pulsando el botón de apagado, no hay mucho que hacer, salvo proteger la bios con contraseña para que la secuencia de arranque no permita al intruso arrancar otros sistema etc, etc, pero aún así, contra un destornillador todo está perdido, y eso si el ordenador no es pequeño, porque entonces sobra hasta el destornillador.
Introducción
A lo largo de esta guía, vamos a ver los principales aspectos a tener en cuenta a la hora de proteger un sistema. Vamos a usar un sistema GNU/Linux como banco de pruebas, es decir como equipo atacado, y en el vamos a probar y comprobar los distintos medios (software) que tenemos para proteger el equipo.
Hoy día al hablar de seguridad muchos lo asocian a un firewall, y la verdad que nada más lejos de la realidad. Es cierto que un firewall ayuda, pero no lo es todo. Los firewalls se deberían de poner como último recurso, esto no quiere decir que no se pongan, sino que se tienen que poner después de haber configurado correctamente la red. Un error que causa muchos disgustos es el dejar TODA la responsabilidad en cuanto a la seguridad a un firewall, y más cuando se trata de una red grande.
Nunca está de más dar un toque de atención, y recordar que por mucha seguridad que instalemos, si usamos passwords del tipo 12345, todo nuestro esfuerzo será en vano.
Reconociendo en entorno
Lo primero que vamos a hacer es echar un vistazo a la seguridad intrínseca de un sistema UNIX-like en nuestro caso GNU/Linux.
Antes de nada, dejar clara una cosa, el uso de la cuenta de administrador (root) queda restringida a tareas de administración. Lo normal si necesitamos permisos de root para realizar una tarea es utilizar \'su\' el cual abre un shell con identificadores distintos.
Una tarea común a realizar por root es la administración de usuarios y grupos. Comprender esto es fundamental. Aquí entran en juego varios archivos del sistema, y todos se encuentran bajo \'/etc\'. Esto archivos son passwd, shadow y group principalmente.
/etc/passwd
-
Cada línea de este fichero contiene la información relativa a un usuario. Y está estructurado de la siguiente forma:
nombre:clave encriptada:UID:GID:nombre completo:dirección personal:intérprete
un ejemplo típico podría ser este:
pepito:a$Zkjbh23JHu$432%&/:502:502:Pepito Grillo:/home/pepito:/bin/bash
/etc/shadow
-
Con \'shadow\' conseguimos una forma más segura de almacenar las contraseñas, un sistema que implemente shadow, no tendrá las contraseñas en /etc/passwd como vimos en el apartado anterior, sino que las tendrá en /etc/shadow, y en /etc/passwd se sustituirá la contraseña por una \"x\", quedándonos de la siguiente manera.
pepito:x:502:502:Pepito Grillo:/home/pepito:/bin/bash
El uso de shadow se ha extendido rápidamente por motivos de seguridad en los sistemas Unix-like, consiguiendo que además de no ser legible por todo el mundo, las claves shadow nos proporcionan opciones adicionales como expiración de claves.
/etc/group
-
Cada usuario, pertenece a uno o más grupos, y cada fichero tiene un grupo propietario. Los usuarios pueden pertenecer a uno o más grupos añadiendo sus nombres de usuario a los grupos que se requiera en /etc/group. Este archivo está estructurado de la siguiente forma
nombre de grupo:clave:GID:otros miembros
El campo clave, no se suele utilizar, pero sirve para poder usar una clave y así acceder a un determinado grupo. Esto suele estar deshabilitado para evitar escalado de privilegios, en este caso se pone el campo clave con un \'*\'.
-
Nota: en una clave no puede existir el carácter asterisco, por lo tanto si añadimos un asterisco a esa clave, ese usuario quedará deshabilitado.
/etc/gshadow
-
De forma análoga al shadow para los usuarios, también existe un shadow para los grupos, en este caso se llama \'gshadow\'
/etc/securetty
-
En este fichero se encuentran una lista con los tty desde los cuales root puede loguearse. Ya hemos comentado antes, que no es recomendable usar la cuenta de root, salvo para tareas de administración. Mi consejo es deshabilitarla, es decir NO permitir que root entre directamente en el sistema, es mucho mejor entrar como usuario, y una vez dentro hacer su o sudo.
Llegados a este punto, podemos plantearnos serias dudas en cuanto a la seguridad se refiere. Hace unos años no importaba que el archivo /etc/passwd pudiera ser leído por cualquiera, puesto que reventarlos era algo bastante difícil. La única forma era un ataque por diccionario o fuerza bruta. Por fuerza bruta, lo que hacemos es probar todas las combinaciones de palabras desde \'00000\' a \'zzzzz\', esto puede ser útil contra contraseñas de pocos caracteres, pero según llegamos a 7, se hace casi imposible usar este método. El ataque por diccionario, consiste en lo mismo pero con unas palabras ya definidas. ¿Como hacemos esto?, para esta ardua labor existen varios programas, entre ellos el que más me gusta es John the Ripper, el cual cifra y compara todas las palabras que le metamos por diccionario o en modo incremental con el password cifrado que nosotros queramos.
John the Ripper ofrece muchas opciones, y es muy rápido. Aunque parezca que este tipo de programas solo valen para hacer el mal, un administrador los encontrará muy útiles para buscar leak passwords, es decir contraseñas del tipo \'casa\', \'pepe\',\'12345\', etc. , de esta manera puede poner sobre aviso a ese usuario para que la cambie.
Aquí no voy a explicar el funcionamiento de este crackeador de contraseñas, por la red podéis encontrar numerosos manuales con ejemplos prácticos, pero lo mejor es intentar ponerlos en práctica aunque sea de forma local con las claves de nuestro propio ordenador.
Reconociendo en entorno II - Servidores y características.
Vamos a ver servicios de red típicos, como pueden ser de TFP, http, ssh, telnet ... y los problemas de seguridad intrínsecos que nos pueden plantear.
Telnet
-
Mediante el servicio de Telnet, accedemos remotamente a otra máquina, pudiéndola manejar como si estuviéramos delante de ella.
Este servicio plantea serios problemas de seguridad, sobre todo porque la autentificación de usuarios es a través de texto en claro. Esto permite que cualquiera con un sniffer capture nombres de usuario con sus respectivas contraseñas, con los problemas que eso supone.
Por eso resulta mucho más adecuado usar ssh, aunque si esto no es posible, lo más recomendable es restringir el acceso al puerto telnet (generalmente 23) mediante un firewall.
SSH
-
Al igual que telnet, ssh permite el acceso remoto a otra máquina. Pero en este caso la diferencia radica en la seguridad, puesto que la conexión es por canal seguro, y se encuentra cifrada. Aunque esto tampoco es infalible, y podemos ser víctimas de un replay entre otras. Pero siempre es mucho más seguro que un simple telnet.
FTP
-
(File Transfer Protocol) Este servicio permite transferir datos por la red, pero al igual que vimos con telnet, se pueden plantear problemas de seguridad puesto que las contraseñas también van en claro. Bien es cierto que el servicio ofrecido por un TFP dista mucho del ofrecido por telnet, pero no por ello nos libramos de los problemas de seguridad sobre todo si \'esa\' cuenta tiene permisos de escritura.
En cuanto a los servidores TFP disponibles, yo recomiendo el uso de vsftpd, que para mi es el más seguro. A la hora de configurarlo es recomendable que si lo vamos a usar como servidor multiusuario, es decir, vamos usar cuentas que no sean solo anonymous, prohibamos a los usuarios del sistema usar su login y password. Una guía concreta y detallada sobre la configuración de un servidor TFP con vsftpd, la podemos encontrar aquí
Secure FTP
-
Al igual que ocurría con telnet y ssh, tenemos el homólogo del TFP pero cifrado.
HTTP
-
Este es uno de los servicios más usados por los servidores. Existen muchos servidores, y muy buenos, aunque Apache a pesar de ser un poco más pesado es el más extendido gracias a su integración con php, cgi etc ...
Si fuera necesario, instalaríamos el módulo ssl correspondiente a nuestro servidor para crear un canal cifrado en nuestro servidor web, su uso está ampliamente extendido (como es lógico) en entidades bancarias, tiendas, servidores con información sensible, etc.
SMTP
-
Simple Mail Transfer Protocol, es el servicio de envío de correo. El servidor típico durante mucho tiempo fue el sendmail, actualmente desconozco su estado, pero es bien conocido por sus bugs y su costosa administración. Actualmente hay muchos servidores de correo y muy buenos.
Algo que no me gusta, es que se deje el puerto 25 (generalmente) abierto a todo el mundo y no solo a las máquinas desde las que se accede, esto posibilita el uso ilícito, por ejemplo como servidor fake-mail. Por lo tanto si nuestro servidor va a ser privado, es decir su uso se va a restringir únicamente para nuestra red interna es conveniente crear unas reglas adecuadas a nuestro firewall. Si nuestro servidor de correo va a ser público, podemos conseguir que SOLO los usuarios usen el servidor SMTP, para ello podemos obligarles a mirar su correo mediante POP antes de poder enviar nada, de esta manera conseguimos su IP, y podemos crear un firewall dinámico.
POP-IMAP
-
Post Office Protocol, es el complemento de SMTP, con pop podemos recibir, borrar y listar nuestros mensajes. IMAP, es algo parecido a POP, pero con más características, como por ejemplo descargar los mails sin attachments (archivos adjuntos) etc.
Aquí las contraseñas también van en claro, con el consecuente riesgo que eso conlleva. Para subsanar esto existe POP+SSL.
DNS
-
El DNS, es lo que realmente hace de Internet una palabra, puesto que en caso contrario necesitaríamos la IP del sitio al que queremos acceder. El servidor DNS más usado es BIND. Han aparecido vulnerabilidades críticos en BIND, pero se han resuelto sin mayores problemas, ya hace bastante tiempo que no ha aparecido ninguna. BIND es un servicio simple y rápido. Destacar que las direcciones privadas NO son enrutables, ej: 192.168.* o 10.*.
Samba
-
Este servicio se ha hecho muy popular, puesto que proporciona acceso a los ficheros e impresoras compartidos por sistemas Windows y viceversa. Una característica común en el uso de Samba es montar un servidor como PDC (Controlador Primario de Dominio). Aquí es recomendable usar la opción de cifrado de claves, como venimos comentando en otros puntos.
Existen muchos otros servicios (muchos de ellos obsoletos), como por ejemplo DHCP, NFS etc pero no los vamos a tratar de forma concreta. Solo daré cuenta de que un servidor DHCP, puede llegar a agotar sus recursos disponibles por medio de un ataque DOS.
Siendo paranoico habría que ejecutar los procesos servidor con chroot (los que pueden ...), aunque en algunos no es muy recomendable, pero no voy a entrar en casos concretos, para eso hay que leerse la documentación de cada servidor.
-
Nota: ejecutar un servidor como root y hacerle un chroot, lo podemos calificar casi como de estupidez.
También es lógico ejecutar esos procesos como usuarios NO privilegiados (y menos como root), por ejemplo como nobody. Tampoco hay que caer en la dinámica de hacer que nobody haga todo, puesto que muchas veces, y sobre todo en servidores administrados por varios admin, se usa a nobody (sin saberlo) para todo, convirtiéndolo en un usuario con muchos permisos. (Aunque hay algunos servicios que SI hay que ejecutarlos como root.)
Reconociendo en entorno III - Parches de Seguridad.
Desde hace tiempo, GCC incluye en el compilador las extensiones para compilar aplicaciones con protección extra y evitar así que las aplicaciones escriban en direcciones de memoria que NO deberían escribir.
-
la opción -fstack-protector, -fno-stack-protector habilita y deshabilita la protección.
la opción -fstack-protector-all, -fno-stack-protector-all habilita y deshabilita la protección.
En cuanto a los parches de seguridad disponibles para el Kernel, hay varios, destaco principalmente, el parche Skas, con el que conseguimos \"Separate Kernel Address Space\" es decir un espacio de direcciones separado.
Como comentario, hacer notar que SuSE desde hace tiempo trae de serie el parche skas.
Métodos avanzados de seguridad
De forma intuitiva, lo que voy a proponer, consiste en hacer que cada servicio (servidor), se ejecute con un kernel distinto. Esto lo vamos a conseguir mediante máquinas virtuales.
Existen varios proyectos, pero hay concretamente 2 que para nuestro cometido son mucho más flexibles, y consumen muy pocos recursos. Uno es User-Mode-Linux y el otro es VServer.
Con esto conseguimos aislar mejor cada servicio, teniendo que romper la seguridad de un kernel adicional, y en este podemos incrementar mucho la seguridad, concretamente con UML no necesitamos a root para (casi) nada.
Esta técnica cada día es más usada entre las empresas de hosting para ofrecer servidores virtuales a sus clientes.
-
Nota: La máquina en la que se ponga esto en práctica, necesitará tener unos recursos superiores a los que necesitaría sin usar estos métodos.
Configuración de red
Aquí vamos a ver los archivos típicos de configuración en un sistema GNU/Linux
/etc/inetd.conf
-
Con un man inetd.conf, obtenemos información adicional sobre inetd.
Durante la ejecución, inetd lee su configuración del archivo /etc/inetd.conf.
Para cada entrada (activa) en el archivo de configuración, le corresponde una línea, la cual consta de los siguientes campos.
-
service name/version
socket type
rpc/protocol
wait/nowait[.max]
user[.group]
server program
server program arguments
Como ejemplo, podemos ver una configuración para el puerto discard
-
discard stream tcp nowait root internal
discard dgram udp wait root internal
Por norma general NO es conveniente tener servicios en inetd, así que deshabilitaremos todos los que podamos.
/etc/services
-
En este archivo se definen los números de puerto, el protocolo, y el nombre del servicio asociado.
De forma genérica, se define así: nombre puerto/protocolo alias
Por ejemplo
-
www 80/tcp http # WorldWideWeb HTTP
/etc/hosts.allow y /etc/hosts.deny
-
Con un man hosts_access, obtenemos una gran cantidad de información, suficiente para poder configurar /etc/hosts.allow y /etc/hosts.deny. Aquí vamos a dar darle un vistazo comentando su funcionamiento y características importantes.
Cuando un cliente realiza una petición a un demonio (especificado en inetd), el software de control de acceso consulta estos dos archivos, y la consulta concluye cuando encuentra la primera coincidencia. Las acciones que realiza son:
-
- Acceso permitido cuando una pareja demonio-cliente coincide con una entrada en el archivo /etc/hosts.allow
- Sino, el acceso será denegado cuando una pareja demonio-cliente coincida con una entrada en el archivo /etc/hosts.deny
- En caso de que no se haya cumplido en ninguna de las dos opciones, el acceso será permitido
Al final del /etc/hosts.deny es bastante frecuente encontrarnos con líneas como estas
-
ALL: 0.0.0.0/0.0.0.0
ALL: PARANOID
Con las cuales sin la conexión no ha sido aceptada en /etc/hosts.allow, por defecto el acceso será denegado.
Si no existe archivo de control de acceso, se tratará como que existe un archivo vacío
Logs - Seguridad Pasiva
Esta es una parte fundamental de cualquier sistema que se precie, y un buen administrador debe de revisar a menudo los logs, para comprobar si se ha puesto en juego la integridad del sistema, (y otros aspectos que no vamos a tratar aquí).
En Linux, la herramienta de log es syslogd, el archivo de configuración principal se encuentra en /etc/syslog.conf, en el se indica que se loguea y donde se guardan estos logs. Para núcleo (kernel), el login se hace mediante klogd. Lo normal es que klogd envíe sus mensajes a syslogd, pero no siempre es así, sobre todo en los eventos de alta prioridad, que directamente salen por pantalla. Aunque bueno, esto siempre es configurable a gusto del consumidor.
Y como siempre podemos encontrar información adicional en los respectivos \'man\'.
Como regla general los logs se encuentran dentro del directorio /var/log. Muchos programas, manejan sus propios logs, y suelen crear una carpeta con el nombre del programa dentro de /var/log.
Una cosa muy importante a tener en cuenta en los logs, sean de la naturaleza que sean, es que la configuración que viene por defecto suele estar bien para ir tirando. Pero hay veces que un servicio necesita información adicional, pero ojo, no la vayamos a preparar. Los logs ocupan espacio, y podemos llegar a hacernos un DOS a nosotros mismos, así como llegar a saturar nuestro disco. Por ello hay que saber lo que se hace, y leer detenidamente la documentación de cada uno.
-
Nota: Crear una partición única para logs es una técnica muy empleada, de esta forma en caso de que un proceso de logging se ponga a escribir como un loco sea por la razón que sea, llegará un momento en el que el disco se llene y dejará de escribir. De otra forma, el disco también se puede llenar, pero el problema en si no es el quedarnos sin espacio, sino lo que esto conlleva.
Los logs aunque pueda parecer raro, contienen información valiosa. Hay veces en las que conviene enviar los logs a un servidor aislado que exclusivamente trate nuestros logs. De esta forma si un agresor se hace con nuestra máquina, podríamos seguir teniendo la baza de los logs, es decir, la certeza de que no han sido modificados o borrados, eliminando así cualquier rastro.
Por eso aunque sea más seguro el cifrar los logs, no tiene mucho sentido si en atacante tiene acceso a ellos, puesto que nos da igual no tener logs que tenerlos modificados. Realmente no nos da igual, porque si el atacante modifica los logs, podemos tenerle espiando nuestro sistema indefinidamente sin que nosotros nos demos cuenta. Aún así veo más conveniente el enviarlos a otro servidor.
-
Nota: Por supuesto la transmisión de logs al otro servidor lo haríamos a través de canal seguro. El envío de esos logs, lo podemos hacer a través de tuberías (man mkfifo)
Aunque creo que es evidente, dentro de nuestro sistema lo lógico es que nadie pueda ver nuestros logs, y menos modificarlos, por eso les daremos permisos únicamente a root y su grupo (man chown y man chmod).
-
Nota: Los logs se almacenan en archivos planos de texto, pero con el tiempo esos archivos se vuelven muy extensos. Por ello el sistema los va comprimiendo (y aplicando una rotación de archivos), y les va añadiendo la extensión .1.gz, .2.gz etc. A la hora de hacer scripts para visualizarlos, para ver los que están comprimidos, podemos usar zcat.
Ahora vamos a ver algunos de los log más comunes y útiles para nuestro propósito, y como habilitar otros. Por orden alfabético, nos encontramos con
/var/log/auth.log
-
Este archivo de log, es fundamental, en él se registran los login en el sistema, así como las veces que hacemos \'su\' etc. Los intentos fallidos, se registran en líneas con información del tipo invalid password o authentication failure, lo cual es muy útil a la hora de crear un script que compruebe todos los logs, puesto que con un simple grep \"invalid password\" filtramos las líneas que queremos.
/var/log/kern.log
-
Aquí se almacenan principalmente los logs producidos por klogd.
/var/log/lastlog
-
Este log nos muestra la información sobre el último acceso de un determinado usuario. La forma de ver esto es a través del comando lastlog, en este caso con un simple \'more\' no sirve, puesto que está en formato binario. Cuando hacemos un finger o un who, accedemos a lastlog.
La información contenida aquí es bastante importante, por eso, si tenemos cuentas shell en nuestro servidor, es conveniente no dar permisos para esos comandos, y así evitamos dar información adicional a los usuarios, (como los login de otros usuarios).
/var/log/messages
-
En este log podemos encontrar los logs que llegan con prioridad información o notificación. Lo más llamativo puede ser el log del netfilter.
Si en nuestro sistema se permite (por necesidad claro está) que los usuarios tengan cuenta shell en el servidor y se logueen, deberíamos tener activos tanto el faillog, cuyo log se encuentra normalmente en /var/log/faillog, para poder controlar las cuentas a las que se intenta acceder mediante \"try\'n\'error\" (ensayo y error), porque puede ser que el usuario haya olvidado su contraseña, pero también puede ser que alguien de forma malintencionada esté intentando acceder al sistema con esa cuenta.
En el archivo /etc/login.defs podemos definir que los intentos de log de superusuario se guarden en por ejemplo /var/log/sulog, sin más que editar el /etc/login.defs, y escribir (o descomentar) la línea SULOG_FILE /var/log/sulog, y SYSLOG_SU_ENAB yes. Esto al igual que lo comentado anteriormente, puede ser útil. Y en caso de sufrir múltiples intentos para escalar permisos, podemos bloquear temporalmente esta cuenta.
- Notas (paranoicas de menor a mayor)
1 - Montar una red (honeynet) para cazar a los malos o al menos tenerlos entretenidos un buen rato. Sobre esto hablaremos más adelante.
2 - Llegando a rozar la línea entre la paranoia y la locura, puedes imprimir a la vez que suceden, los logs en papel, de esa manera a pesar de que el intruso los modifique una vez dentro siempre vas a tener las pruebas. (Pobre selva ...)
3 - También podemos crear un liveCD de nuestro sistema y arrancarlo desde ahí, de esta manera la escritura va a ser imposible :S (Esto es un poco fantasía, pero lo he leído varias veces)
4 - Una que me gusta, es el poder tirar todas las conexiones cada vez que ocurre una anomalía. (Se que esto es muy ambiguo, pero solo son ideas).
5 - Cualquier otra fumada que se te ocurra o se le haya ocurrido a otro ...
Controlar a los usuarios
-
Nota: Hay que tener especial cuidado con la shell de nuestros usuarios. Un aspecto importante es la opción historial en bash. Aquí se almacenan procedimientos de otros usuarios, nombres de archivo, etc. En caso de no ser necesario, simplemente porque las tareas que se realizan no lo requieren, se puede deshabilitar.
Controlar a usuarios con una cuenta shell es una tarea un tanto tediosa y pesada. Y aunque creamos tener controlados todos los aspectos posibles (el usuario no puede hacer nada no permitido), hay que tener en cuenta que ese usuario puede consumir mucha CPU, tiempo (y espacio) de disco, memoria, etc. etc., por eso hay que regularlo.
Mediante quote, podemos evitar que los usuarios nos saturen el disco. Para habilitar las quotas, necesitamos tenerlas habilitadas en el kernel, en caso de no tenerlas, toca recompilar.
Para controlar la memoria, el tiempo de acceso a disco y demás opciones, lo podemos hacer con ulimit, pero ya está obsoleta, así que lo hacemos con getrlimit, getusage y setrlimit. Para más información mirar las correspondientes páginas del man.
Herramientas I - Escaneadores de Red
Aunque hay muchos, los más destacables hoy día por sus múltiples funcionalidades que los hacen imprescindibles para cualquier administrador de red son Nesus y NMap (Network MAPper).
Nessus es un escaneador de redes un tanto peculiar, y es que consta de dos partes, cliente y servidor (aunque se pueden instalar los dos en el mismo sistema) y además, se pueden ver informes sobre la vulnerabilidad y como explotarla, pero como no todo es malo, también los hay para saber como evitarla. La parte servidor es la que escanea, y la parte cliente no es más que el interfaz de usuario.
NMap es quizás el escaneador de red más potente que existe, tiene una gran cantidad de opciones de escaneo como escaneo Stealth (lo cual es muy útil para escanear sin ser descubierto) o búsqueda de conexiones semiabiertas. Es ideal para comprobar nuestros sistemas (y a veces los de otro, pero solo por hacer un favor :)
Herramientas II - Herramientas de Detección de Intrusos
Un sistema de detección de intrusos (IDS - Intrusion Detection System), lo que hace es buscar patrones sospechosos previamente definidos. En principio no están diseñados para evitar un ataque solo para preverlo y monitorizarlo, estos son los llamados IDS pasivos. Los que si actúan sobre el \"presunto\" atacante son los IDS activos, estos lo que hacen es tirar la conexión o bloquearla (si es posible).
Como ejemplo de patrón sospechoso, principalmente tenemos un escaneo de puertos sea cual sea su magnitud.
Snort lo que hace es precisamente lo que hemos comentado, rastrea los paquetes que circulan por la red y al encontrar un paquete sospechoso lo loguea, de esa manera tendremos localizado el ataque. Snort puede funcionar como HIDS (Host) o NIDS (Network). Normalmente el uso como NIDS lo llevan a cabo gateways perimetrales que tienen otras funciones como firewall etc, y son configurados como IDS activos, puesto que la conexión tiene que pasar por ellos y de esa forma la pueden bloquear.
La configuración de Snort se puede llevar a cabo de manera fácil junto con mysql para guardar los logs en una base de datos y con ACID (Analisys Console for Intrusion Databases) para poder verlos de una forma cómoda.
Una ventaja de Snort es que tiene gran cantidad de filtros ya definidos, así como actualizaciones en las que se van añadiendo nuevos métodos que van apareciendo.
A la hora de configurar un IDS, hay que tener muy en cuenta la velocidad de la red y el tráfico que soporta, puesto que se puede saturar, y colapsar la red (o el segmento que controla).
PortSentry es un IDS especial con el cual podemos conseguir \"burlarnos\" del atacante. Lo que hace Portsentry es escuchar en un montón de puertos. Es decir que si un atacante nos escanea verá que hay un montón de puertos abiertos, pero NO es cierto, pero a ojos del atacante puede resultar tentador.
Si tenemos un servicio escuchando en un puerto, el Portsentry lógicamente no estará escuchando en ese puerto puesto que ya hay un servicio haciéndolo. Por eso cuanto mayor sea el número de servicios que tiene el servidor menos efectivo será el Portsentry. Por eso también es recomendable tenerlo en un router.
En cualquier caso a priori no se puede determinar que puertos son \"reales\" sin que salte la alarma, y es aquí donde radica el potencial de Portsentry. Si intentamos establece una conexión remota con un puerto abierto por Portsentry, automáticamente lo loguea y tira la conexión. Esto hace que aparezcan muchos logs, aunque si lo pensamos detenidamente nos damos cuenta que ese alguien ya está buscando \"algo más\".
En cambio, si el atacante envía un SYN y nosotros enviamos un SYN-ACK en nos mandará un RESET, y de esta manera no terminará la conexión (Three Way Handshake) y no llegará a existir log. Esta técnica se denomina Stealth Scan, y la podemos llevar a cabo con NMap con la opción \"-sS\".
Pero la historia no acaba aquí, porque Portsentry también puede detectar stealth scan, pero no a nivel de establecimiento de conexión, lo cual lo hace más difícil de detectar, pero aún así Portsentry se porta excepcionalmente bien.
Lo comentado es aplicable a escaneos TCP no a UDP. Comentar también que los escaneos UDP son menos fiables y además bastante más lentos al no ser un protocolo orientado a conexión. Existen muchas más formas de escaneo con los que se puede intentar engañar al IDS para que no loguee el escaneo de puertos, pero sea como sea si tenemos el Portsentry en modo no stealth, no hay forma de diferenciar los realmente abiertos de los que el Portsentry \"abre\", por lo que acabará siendo logueado.
Configurar unas buenas reglas de Firewall (Iptables) siempre es altamente recomendable aunque en el caso del Portsentry pueda interferir negativamente, es decir se puede ver que está el Portsentry activo. Pero con una configuración adecuada se puede subsanar. Básicamente consistiría en abrir los puertos en los que el Portsentry está escuchando.
Herramientas III - Sniffers
Hoy día Snort es uno de los sniffers más usados gracias al éxito que ha tenido con IDS como ya comentábamos en el punto Herramientas II, al ser un solución rápida y barata sobretodo si las comparamos con ISS RealSecure.
Ethereal es un sniffer capaz de reconocer casi todos los protocolos existentes. Tiene una gran potencia gracias a sus filtros que usan el mismo formato que el tcpdump. Comentar que su uso es bastante complejo.
Un sniffer por software necesita de un equipo bastante potente, para que pueda escanear todo lo que pasa.
HoneyNETs - HoneyPOTs
Para \"cazar\" a los malos podemos recurrir a los HoneyPOTs que no son más que ordenadores trampa, que se hacen pasar por sistemas vulnerables o por el servidor al que teóricamente se está lanzando el ataque.
Las configuraciones son múltiples y variadas, pero siempre dependientes de la cantidad de dinero empleada.
Los usos pueden ser muchos, desde guardar/loguear el tráfico de un posible ataque, hasta ralentizarlo.
En linux tenemos honeyd principalmente. Lo que hacen es simular nuevos hosts en la red con determinados servicios, para que se hagan pasar por lo que queramos. Como ya comentaba antes, la creación de honeypot-(nets) depende mucho del dinero invertido, programas como honeyd nos abaratan mucho los costes, pero no dan tanta versatilidad ni potencia como una red real
Una implementación bastante simple pero efectiva es usar un pequeño router de 4 u 8 puertos para segmentar la red en subredes, de esta forma podemos usar el router como firewall para esa pequeña red, y dentro de esa red poner un honeypot con los puertos típicos abiertos mediante NAT en el router. Después en los otros ordenadores, abrimos los servicios que necesitemos en puertos elevados, de esa forma cualquier escaneo que a priori no conozca los puertos será logueado.
A la hora de instalar un honeypot, podemos hacer que sea mucho más \"dulce\" simulando además que es un sistema operativo totalmente diferente o lleno de bugs conocidos, para lograr entretener más al atacante.
Si nuestra red en muy extensa viene muy bien centralizar los logs en una colmena, para que en caso de tener que hacer uso de ellos no sea una tarea excesivamente tediosa el tener que ir recolectando logs de todos los honeypots.
Copias de Seguridad
La copias de seguridad hay que acostumbrarse a hacerlas periódicamente. Por ejemplo cada 3 meses en un formato óptico (cds, dvds) y cada mes en una réplica (otros discos duros). Las cintas a pesar de ser más lentas tampoco están mal si la disponibilidad en caso de fallo no es inmediata.
Si eres de los que te preguntas, ¿por qué hacer copias de seguridad?, la respuesta es, \"por lo que pueda pasar\". Esto es un poco como la ley de Murphi, nunca pasa nada hasta que pasa. Ya sea por un \"rm *\" de forma accidental desde un mal sitio (por no poner otros parámetros...), pasando por un apagón o porque al disco duro le llegó la hora o como venimos viendo, por un ataque.
Para este propósito podemos usar bacula, con el cual podemos centralizar el backup. Esto es especialmente útil en redes heterogéneas.
¿Qué hacer si somos atacados?
Esto es una decisión que tiene que tener en cuenta muchos factores, pero sobre todo saber si ese ataque se sigue produciendo en ese momento o ya ha finalizado.
Si el ataque se está produciendo, es posible identificar al atacante, y también es recomendable sobre todo a la hora de tomar acciones legales contra el agresor. Pero lo más acuciante es comprobar la integridad del sistema y hasta el punto al que ha llegado la incidencia. Una vez hecho esto hay que parchear el agujero de seguridad, ya sea con una actualización (en caso de no existir actualización, reportarlo) o tirando el servicio hasta que se pueda actualizar.
En caso de no poder actualizar y no poder prescindir del servicio, habría que iniciar el servicio con un mínimo de opciones (si es posible) y optar por bloquear la IP del atacante y si pertenece a un ISP identificado, quizás convenga bloquear el rango completo de IP\'s de ese ISP, especialmente si el ataque viene desde otro país con un idioma distinto al que damos desde ese servicio, puesto que el número de clientes potenciales desde esas IP\'s será bajo y hay más posibilidades de librarnos de un segundo ataque.
Si el ataque ya se ha producido, tenemos que jugar con lo que tenemos que normalmente son los logs. Y digo \"normalmente\" porque no siempre los tenemos. Por este motivo toman un especial sentido las HoneyNETs.
Tomar medidas legales no siempre puede resultar adecuado, sobretodo en el caso de una empresa que haga gala de la seguridad, lo cual llevaría a una publicidad muy poco adecuada.
A tener en cuenta a la hora de conectar un PC a la red
Conectar un PC a Internet entraña sus riesgos. Normalmente un ordenador personal no está encendido las 24 horas como lo está un servidor por lo tanto la probabilidad de sufrir un ataque es menor. Pero esto no quiere decir que podamos descuidar la seguridad.
Si alguien toma el control del sistema y no nos damos cuenta, todo lo que se haga desde nuestro PC es como si lo hubiéramos hecho nosotros, lo cual puede traer desagradable sorpresas.
Si usamos un sistema \"unix-like\" tampoco hay que volverse paranoico con estos temas si el uso que le damos va a ser de PC de sobremesa.
A pesar de que la seguridad en sistema linux medianamente bien configurado es bastante alta, sigue sin ser un sistema adecuado para guardar información sensible. Para guardar información sensible, de forma simple y rápida, se puede recurrir al cifrado, ¡pero OJO! no dejemos las claves en el ordenador, si es posible las movemos a un CD o un lápiz USB.
NOTAS
- En un PC de escritorio es muy común usar programas p2p. En el funcionamiento normal de este tipo de programas podemos suponer que son seguros. Pero nos tenemos que dar cuenta de que nuestra IP estará visible para cientos de usuarios, y siempre hay alguno que se aburre lo suficiente como para realizar ataques indiscriminadas por ssh a todos aquellos que por ejemplo usan el amule. Por lo tanto repito lo que comentaba al principio de la problemática de tener passwords débiles y/o servicios innecesarios.
- También es muy común el uso de sudo o similares para dar privilegios a los usuarios. Desde mi punto de vista es totalmente desaconsejable puesto que normalmente sudo == password débiles
Conclusiones
Con esta guía pretendo dar una visión general sin entrar en demasiados detalles sobre métodos de seguridad en red con los que es estoy más familiarizado, concretamente con sistemas unix-like y más concretamente debian. La idea principal que quiero dejar patente es que la seguridad no es algo secundario y de lo que se pueda prescindir, sino que es muy necesario.
En estas breves conclusiones voy a comentar un par de aspectos por los que he pasado de puntillas en el resto de la guía.
- Un aspecto por el que no he pasado es el de los antivirus, y no lo he hecho por la simple razón de que no existen. Esta afirmación es un tanto arbitraria e incierta, porque si existen virus para sistemas Unix-like, pero tal y como está diseñado su impacto sería mínimo. De hecho el término virus en Unix se confunde con el de troyano. No obstante existen potentes antivirus para sistemas Unix-like por ejemplo el ClamAV, aunque su uso común es para buscar en busca de virus en un gateway que da salida a una red con sistemas NO Unix-like.
- Otro tipo de ataque del cual no he hecho una mención explícita, es un ataque DOS (Denial Of Service - Denegación de Servicio). La problemática de estos ataques es que son casi imposibles de evitar sin tener ningún tipo de secuelas, ya sea carga de cpu, una reducción del ancho de banda etc. Son un tipo de ataques muy molestos porque no tienen solución directa, es decir que cualquier sistema los puede sufrir, otra cosa es que ese sistema que lo sufre sea capaz de aguantar la embestida sin colgarse.
Referencias
Sería imposible llegar a nombrar todas las fuentes de información que directa o indirectamente he consultado, o he encontrado por el camino, durante todo el tiempo que estado escribiendo esta guía. Por lo tanto estas Referencias más bien se van a convertir en agradecimientos a todos aquellos que colaboran en la gran comunidad que se ha formado en torno a la red. Sobre todo a la comunidad OPEN SOURCE.
- Inicie sesión o regístrese para enviar comentarios
- 21897 lecturas
