Asegurando un Linux recién instalado

Por Barry O'Donovan

Traducción al español por Raúl González Duque
el día 20 de Noviembre de 2004

Introducción

Desde la perspectiva de un profesional en la seguridad informática, hay bastantes distribuciones populares de Linux que son inseguras "recién instaladas", y muchos de los paquetes que se ponen a disposición del usuario ya están desfasados cuando estos los quieren utilizar. Dado que la seguridad de nuestro pc y mas concretamente la de la información que se almacena en este son de importancia prioritaria, hay una lista de pasos que se deberían seguir a la hora de instalar Linux para asegurar nuestro sistema operativo así como para ayudarnos a identificar intentos de comprometer esta seguridad o ataques que hayan tenido éxito.

Los pasos a seguir se indican en la siguiente lista, y cada uno de ellos se comenta en detalle en las secciones siguientes.

  1. Instalación y configuración de un cortafuegos efectivo
  2. La actualización (automática) de todos los paquetes instalados
  3. Parar y deshabilitar todos los servicios innecesarios
  4. Localizar y borrar/modificar los ejecutables SUID/SGIDs innecesarios
  5. Logwatch y Tripwire

1. Instalación y configuración de un cortafuegos

Un firewall debidamente configurado es además de la primera línea de defensa la más importante. Cualquier atacante potencial (remoto) que no pueda traspasar tu cortafuegos será incapaz de explotar las posibles vulnerabilidades de los servicios que este protege.

El cortafuegos debería iniciarse antes de que te conectes a internet por primera vez. Configuralo para denegar todos los paquetes entrantes a excepción de aquellos en estado establecido (ESTABLISHED) o relacionado (RELATED). Esto te proporcionará máxima protección mientras llevas a cabo el resto de los pasos para asegurar tu distribución. Una vez que hayas completado todos los pasos requeridos puedes configurar el cortafuegos según tus necesidades.

Ya comenté los conceptos básicos de iptables, el cortafuegos integrado en el kernel de Linux, con una serie de configuraciones de ejemplo para varios escenarios en "Usando netfilter/iptables como cortafuegos" en el número #103 de la Gaceta. Te recomiendo encarecidamente que leas este artículo y lo utilices para completar la información necesaria para llevar a cabo este paso.

2. Actualizar todos los paquetes instalados

Una distribución Linux estándar puede incluir perfectamente más de 1,000 paquetes y muchos de estos pueden tener nuevas versiones cuando vayas a instalarlos. La mayor parte de estas actualizaciones consistirán en nuevas características y correcciones de errores, pero algunas también incluirán parches para vulnerabilidades, y algunas de estas vulnerabilidades pueden ser importantes. El asegurarse de que todos los paquetes instalados estén en sus versiones mas recientes no es solo algo de lo que preocuparse a la hora de la instalación sino que se debería tener en cuenta a lo largo de toda la vida útil de nuestra nueva instalación. Esto puede llevarnos bastante tiempo pero afortunadamente existen algunas utilidades que pueden hacer esto por nosotros automáticamente. Las dos aplicaciones más utilizadas son APT (Advanced Package Tool) y Yum (Yellowdog Updater, Modified).

Algunas distribuciones tienen sus propias utilidades para este propósito y en ese caso puede que te sea más sencillo utilizar las herramientas por defecto de tu distribución. Por ejemplo las distribuciones RedHat y Fedora vienen con up2date y la distribución Debian utiliza APT.

Si quieres o tienes que instalar la herramienta por ti mismo te recomendaría APT que puede ser utilizada con cualquier distribución Linux basada en RPM. También tendrás que localizar algún repositorio que contenga los paquetes nuevos/actualizados para tu distribución desde los que APT los pueda descargar e instalar. Una búsqueda rápida en internet con el nombre de tu distribución y 'apt' o 'apt-get' debería ser suficiente para localizar el binario de APT en formato RPM y un repositorio. Echa un vistazo a los enlaces al final del artículo para ver algunos sitios web útiles y direcciones de repositorios.

Una vez que tengas APT instalado y los repositorios añadidos (normalmente en /etc/apt/sources.list o similar), su uso es trivial y requiere de solo dos comandos (a ejecutar como root):

$ apt-get update
$ apt-get upgrade
El primer comando descarga la información mas actual de los paquetes del repositorio y el segundo utiliza esta información para descargar e instalar nuevas versiones de paquetes ya instalados si estas están disponibles. Estos comandos deberían ejecutarse cada cierto tiempo para asegurarnos de que nuestro sistema esté siempre actualizado.

Si quieres máxima protección deberías intentar utilizar siempre repositorios oficiales que contenga paquetes firmados; esto es más sencillo de hacer si usas alguna de las aplicaciones para actualizaciones automáticas que vienen con las distribuciones mas populares. Cuando descargues paquetes individuales y archivos de internet, intenta utilizar siempre md5sum (c.f. man md5sum). Un MD5SUM o suma de control MD5 es un resumen de un archivo y la mayoría de los sitios de los que descargar archivos publican las sumas de control de los archivos que tienen disponibles para descargar; comparalos con los que generes de los archivos descargados para asegurarte de que no hayas descargado una versión del archivo/paquete que incluya algún troyano.

Por último, deberías considerar seriamente el suscribirte a la lista de correo de tu distribución. Estas suelen ser listas con poco tráfico que te informarán por correo siempre que se libere algún paquete que corrija alguna vulnerabilidad.

3. Parar y deshabilitar todos los servicios innecesarios

En muchas distribuciones Linux nada más instalar tendrás bastantes servicios/demonios configurados para ejecutarse cada vez que arranques tu máquina. Algunos incluirán demonios HTTP (servidor web), POP3/IMAP (e-mail), un servidor de bases de datos, etc. Algunos de estos son innecesarios para muchos usuarios y pueden ofrecer rutas por las que infiltrarse en tu nuevo sistema operativo a un atacante potencial. Deberías examinarlos uno por uno y parar y deshabilitar todos aquellos que no necesites.

Las distribuciones mas comunes y populares probablemente contarán con una aplicación gráfica para configurar estos servicios; prueba a buscar en los menús Configuración o Sistema de tu aplicación de escritorio.

En los sistemas RedHat, la utilidad de línea de comandos para configurar los servicios se llama chkconfig. Para obtener una lista del estado actual de todos los servicios instalados, ejecuta (como root):

$ chkconfig --list
lo cual hará que aparezca algo parecido a esto:
iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
sendmail        0:off   1:off   2:on    3:on    4:on    5:on    6:off
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
 ...             ...     ...     ...     ...     ...     ...     ...
 ...             ...     ...     ...     ...     ...     ...     ...
smb             0:off   1:off   2:off   3:off   4:off   5:off   6:off
squid           0:off   1:off   2:off   3:off   4:off   5:off   6:off
xinetd based services:
        chargen-udp:    off
        rsync:          off
        chargen:        off
          ...           ...
          ...           ...
        sgi_fam:        on

Los números (0 a 6) que preceden a los dos puntos representan el "nivel de ejecución" del sistema donde los dos de verdadero interés serán 3 y 5; si tu sistema arranca en consola (sin interfaz gráfica) entonces se ejecuta en nivel 3 y viceversa si arranca una interfaz gráfica corre en nivel 5.

Para activar un servicio (por ejemplo squid) en los niveles de ejecución 2,3,4 y 5 ejecutaríamos (como root):

$ chkconfig --level 2345 squid on
y para deshabilitar un servicio (por ejemplo sshd) en los niveles 3 y 5 ejecutaríamos (como root);
$ chkconfig --level 35 sshd off

Si no sabes qué hace alguno de los servicios que tengas activados intenta buscar información en internet o usar el comando man con el nombre del servicio como palabra clave (man -k). Algunas de las versiones gráficas puede que te ofrezcan una explicación sobre qué es cada servicio.

El comando chkconfig activará/desactivará los servicios la próxima vez que arranques tu pc pero no tendrá ningun efecto sobre si un servicio sigue ejecutándose o no hasta que reinicies. Bajo RedHat, se utiliza el comando service para eso de la siguiente forma:

$ service nombre_servicio start
$ service nombre_servicio stop
$ service nombre_servicio restart
$ service nombre_servicio status
donde nombre_servicio será el que nos indique chkconfig --list.

Puedes ejecutar netstat -l después de deshabilitar todos los servicios innecesarios para asegurarte de que has acabado con todos (este comando comprueba qué sockets están escuchando esperando conexiones). Para cada uno de los servicios que aún estén ejecutándose, asegurate de que están configurados correctamente (y de la forma más restrictiva posible) y que el cortafuegos los proteja.

4. Localizar y borrar/modificar los ejecutables SUID/SGIDs innecesarios

Un ejecutable SUID (set user ID, establecer identificador de usuario) o SGID (set group ID, establecer identificador de grupo) es aquel que permite a un usuario ordinario ejecutarlo con privilegios mayores de los que tiene por defecto. Un ejemplo común es el binario passwd el cual, entre otras cosas, permite a un usuario normal cambiar su contraseña. Estas contraseñas están almacenadas en un archivo que solo puede ser alterado (y algunas veces leído) por el usuario root y, por lo tanto, los usuarios que no sean root no deberían ser capaces de cambiar sus contraseñas. Los permisos de acceso para este ejecutable son:
-r-s--x--x  1 root root 18992 Jun  6  2003 /usr/bin/passwd
Como puedes ver, el bit de dueño está establecido a 's' en lugar del 'x' normal, haciendo que el binario sea SUID; es decir, cuando un usuario ordinario ejecuta passwd, se ejecutará con los privilegios del dueño del archivo - en este caso el usuario root.

Muchos de los ejecutables SUID/SGID son necesarios, como el ejecutable passwd ya comentado. Sin embargo muchos otros no lo son. Los programas SUID/SGID pueden ser aprovechados por usuarios locales maliciosos para ganar privilegios en tu sistema. Ejecuta los siguientes comandos como root para encontrar todos estos ejecutables:

find / \( -perm -4000 -o -perm -2000 \)
o si quieres una lista mas detallada:
find / \( -perm -4000 -o -perm -2000 \) -exec ls -ldb {} \;

Ahora deberíamos recorrer cada uno de los elementos de la lista intentado reducir el número de los archivos cuyo dueño sea el usuario root o que estén en el grupo root a lo mínimo imprescindible bien borrando los binarios SUID/SGID innecesarios y/o borrando el bit SUID/SGID.

Los paquetes que contengan ejecutables SUID/SGID y que no vayas a usar pueden eliminarse buscando primero el paquete con, por ejemplo, rpm -q --whatprovides /usr/sbin/kppp y después desinstalándolo con rpm -e package-name.

El bit SUID/SGID puede eliminarse con, por ejemplo, chmod -s /usr/sbin/kppp. El ejecutable podrá iniciarse entonces por el usuario root cuando lo necesitemos.

5. Logwatch y Tripwire

Aunque hagamos todo lo que podamos para asegurar nuestro sistema, la realidad es que por mucho que nos empeñemos nunca estaremos completamente seguros. Una mejor estrategia que simplemente confiar en que no pase nada, es asegurarnos de que sepamos si nuestro sistema ha sido comprometido y en el caso de que lo sea, cuándo.

Un programa de detección de intrusos que muchas veces se subestima es Tripwire (http://www.tripwire.org/). Este programa comprueba los archivos de tu sistema de manera periódica para ver si alguno de ellos ha sido modificado. Si alguno se ha modificado y no debería haberlo sido, Tripwire generará un informe para que puedas tomar decisiones según esta información. Tripwire requiere de un poco de tiempo para ser configurado de manera apropiada pero el esfuerzo merece la pena; Tripwire me ayudó a identificar una intrusión en un servidor que administraba hace un par de años. En el artículo del próximo mes hablaré sobre la instalación y configuración de Tripwire.

Una fuente de información inestimable sobre lo que está ocurriendo en tu pc son los archivos de registro (que normalmente se encuentran en /var/log). Todos los registros que se llevan a cabo en un sistema Linux se manejan por el demonio syslogd y su archivo de configuración /etc/syslog.conf. El archivo de configuración especifica sobre qué subsistemas se deben grabar los mensajes (por ejemplo cron, daemon, mail, etc), qué niveles de mensajes registrar (por ejemplo debug, info, warn, etc) y qué hacer con esos mensajes (añadirlo a un archivo de registro, enviarlo a la impresora, etc). Si quieres cambiar la configuración por defecto encontrarás bastante información en las páginas de manual (syslogd(8), syslog.conf(5), syslog(2), syslog(3) y mas).

Syslog permite también el registro remoto; guardando tus archivos de registro en otros pcs de la red. La ventaja de esto es que si tu sistema queda comprometido por alguien serán incapaces de borrar sus pasos de tus archivos de registro haciendo mas sencillo el buscar su origen y las acciones que llevaron a cabo.

Desafortunadamente hay demasiada información en los diferentes archivos de registro para que el usuario medio lo pueda asimilar por lo que recurrimos a Logwatch. Logwatch (http://www.logwatch.org/), según lo describen sus autores, "procesa tus archivos de registro para un determinado periodo de tiempo y crea un informe analizando las áreas que especifiques, con tanto detalle como requieras."

Logwatch está instalado por defecto en las distribuciones más comunes y normalmente generará por defecto informes diarios enviándolos al correo electrónico del usuario root. Dado que estos informes son normalmente muy cortos deberían ser leídos cada día. Resaltarán, dependiendo de la configuración, informacion del tipo intentos de login inválidos, conexiones de red a varios demonios como SSHD, posibles escaneos de puertos, etc. Su archivo de configuración suele estar situado en /etc/log.d/conf/logwatch.conf y está bien documentado con comentarios que te ayudarán en la configuración.

Hay otros sistemas de detección de intrusos que podrías querer considerar, como Snort - http://www.snort.org/, puedes encontrarlos facilmente con una búsqueda rápida en internet.

Observaciones Finales

La seguridad no es algo que consideras a la hora de la instalación y de lo que te olvidas después; al contrario debe ser algo que esté siempre en tu cabeza en todo lo que hagas; ya sea al asegurarte de que tu sistema esté actualizado, asegurarte de que usas políticas adecuadas para las contraseñas, determinar a quién proporcionas acceso a tu sistema y con qué nivel de acceso, leer tus logs, comprobar los registros de tripwire, leer la lista de seguridad de tu distribución Linux, etc. Hay un viejo dicho que se adapta a la seguridad informática bastante bien: "Una cadena es tan fuerte como su eslabón mas débil". Un solo fallo por tu parte a la hora de aplicar esfuerzo y concentración a la tarea puede crear un agujero de seguridad y echar a perder todo el trabajo.

Este artículo cubre los procedimientos más basicos e importantes que todo usuario debería aplicar. Siempre hay mas cosas que se pueden hacer pero cada persona tendrá que valorar la ventaja potencial contra el tiempo y esfuerzo que le suponga.

Algunos pequeños consejos para finalizar:

Enlaces

APT Otras Utilidades de Seguridad

 


Barry O'Donovan se graduó en la Universidad Nacional de Irlanda, Galway con un Bachelor con honores en ciencias de la computación y matemáticas. Actualmente está terminando un doctorado en ciencias de la computación con el Laboratorio de Ocultación de Información, en la University College de Dublin, Irlanda en el área de las marcas de agua de audio.

Barry lleva usando Linux desde 1997 y su distribución actual es Fedora Core. Es miembro del Grupo de Usuarios de Linux Irlandés. Cuando no está haciendo su doctorado normalmente se le puede encontrar en el pub local o corriendo en el parque.

Copyright © 2004, Barry O'Donovan. Publicado bajo la Open Publication license

Publicado en el Número 105 de la Gaceta de Linux, Agosto 2004