Este documento se encuentra disponible también en formato PDF

Recomendaciones en nivel de sistema


Subseccion

Recomendaciones en nivel de sistema

Las configuraciones establecidas por defecto en muchos sistemas operativos no son las más adecuadas desde el punto de vista de seguridad. Además, el desconocimiento y la desinformación de los responsables de estos equipos es motivo frecuente de problemas de seguridad. En este apartado vamos a comentar diversas medidas que se deberían adoptar en los sistemas para evitar gran parte de estos problemas.

Configuración de equipos Unix

Actualización y control de fallos

Los ataques con más éxito en los sistemas informáticos se basan en aprovechar vulnerabilidades en el software que no ha sido actualizado a la última versión facilitada por el fabricante, o que no ha sido parcheado convenientemente. Esto afecta tanto al software de red de grandes máquinas y sistemas operativos, como al software de PC de usuarios.

Esta tarea es laboriosa porque supone mantenerse al día de la evolución de los productos, así como conocerlos a fondo para poder configurarlos correctamente. La mayoría de los vendedores mantienen listas con los parches recomendados (Sun, IRIX, etc...). A la hora de instalar un parche, se recomienda comprobar la firma digital, si existiera, y el checksum para verificar que se trata de una copia válida. El MD5 comprueba la integridad y la no alteración del paquete, y la firma PGP la autenticidad de su autor.

Es muy importante estar al día y revisar el software que se utiliza, especialmente aquel que tenga que ver con la conectividad a Internet, administración de servicios de red, etc... y actualizarlo o parchearlo con las últimas actualizaciones disponibles. A menudo no resulta buena idea utilizar la última versión disponible, sino la penúltima, ya que al ritmo al que se lanzan nuevas versiones de productos, la última, con casi toda seguridad, no habrá sido puesta a prueba en su fase de diseño ni ha sido suficientemente validada por los usuarios. A veces, merece la pena esperar un período de tiempo, aunque eso sí, no con la primera versión del producto.

Por último, comentar que no es suficiente con instalar la última versión o actualización disponible, sino que es necesario configurarla convenientemente, de manera que se cierren los resquicios que puedan dejar las instalaciones por defecto. Esta corrección es importante no sólo en los sistemas operativos, sino también en el software en general.

Directivas generales

En esta sección, daremos algunas ideas a los administradores sobre la configuración de los equipos Unix. Algunas de las directivas generales a la hora de configurar un sistema teniendo en cuenta la seguridad se pueden sintetizar en los siguientes puntos:

  • La presencia de archivos .rhosts y /etc/hosts.equiv merece especial cuidado, pues garantizan el acceso a la máquina sin necesidad de autenticación. Si no es necesario el uso de comandos r (aconsejado en capítulos anteriores, e insistentemente por IRIS-CERT), no se necesita la presencia de estos archivos al no ser una alternativa segura a telnet. Se recomienda usar clientes ssh, ampliamente descritos ya en este documento.

  • Se puede establecer qué terminales son seguros, y por lo tanto desde qué terminales se puede conectar el usuario root. En los terminales declarados como no seguros el usuario antes de llegar a ser root, necesitará conectarse utilizando una cuenta sin privilegios en el sistema y después utilizar el comando "su" para cambiar a root, lo que añade un nivel extra de seguridad.
  • Desactivar IP forwarding y source routing. Es especialmente importante en el caso de estar usando una Sun como host bastión o como "dual-homed".

  • Es importante deshabilitar la posibilidad de ejecución de código en pila de usuario, lo que evitará algunos problemas de "buffer-overflow" (pero no todos). En el caso de máquinas Solaris lo podemos hacer incluyendo en el fichero de especificación del sistema "/etc/system" las líneas:
    set noexec_user_stack=1
    set noexec_user_stack_log=1
    

    y reiniciando a continuación.

  • Evitar que el correo del root se almacene sin que nadie lo lea. Para ello establezca un archivo ".forward" en el home del root para redirigir el correo a una cuenta real en el sistema. Así mismo, sería necesario asegurarse que estos archivos, si existen en los directorios home de los usuarios, no ejecuten ningún comando.

  • Desactivar la ejecución de comandos en los dispositivos montables por los usuarios.

  • Separar las máquinas de los usuarios de aquellas que ofrecen algún servicio a la comunidad (servidores), y restringir en la medida de lo posible el acceso a las mismas.

  • El administrador debe prevenir posibles escuchas en la red. Un "sniffer" escucha todo lo que pasa por una puerta ethernet, incluyendo contraseñas de cuentas de usuario, de superusuario, claves de POP, etc.. Para evitarlo, se recomienda el uso de Shell Seguro (ssh) (http://www.ssh.org/) u otros métodos de cifrado de contraseñas.

  • Revisar el path de la cuenta root en los ficheros de inicio (.login, .cshrc, .profile, ...). El comando path o la variable de entorno PATH definen los directorios de búsqueda de los ejecutables. El directorio ".", es decir, el actual, nunca debe aparecer en el path del root.

Seguridad en sistemas de archivos

El aspecto más vulnerable en la protección de archivos son los modos de acceso SUID y SGID. Se aconseja realizar frecuentemente una auditoría de los mismos, monitorizando los cambios, puesto que son ficheros especialmente explotados por intrusos potenciales. Algunas sugerencias son:

  • Los sistemas Unix/Linux proporcionan otras maneras de limitar el acceso a varios recursos del sistema a usuarios que no sean el usuario root, como las cuotas de disco, la limitación de los recursos del sistema por proceso y/o usuario, y la protección para los subsistemas restringiendo el acceso a las colas de procesos batch y de impresión para los usuarios no autorizados.

  • Si no hay mas remedio que usar NFS, se debe configurar de la forma más restrictiva posible. En el fichero /etc/exports se especifica a quién se exporta y cómo se exporta un sistema de ficheros (de sólo lectura, sin permiso de escritura al root, etc.). El comando "showmount" permite verificar que el fichero de configuración /etc/exports es correcto.

  • Establecer en el /etc/profile una umask para los usuarios lo más restrictiva posible (022, 033 ó incluso 077). La máscara del root debe ser 077.

  • No usar Samba en la medida de lo posible. Si es necesaria su utilización, se debe configurar muy restrictivamente el fichero /etc/smb.conf.

  • Asegúrese de que todos los ficheros que cuelgan del directorio /dev son ficheros especiales y que del mismo modo no existen archivos de dispositivo fuera de la estructura de /dev.

  • Considere eliminar el acceso a lectura de todos aquellos archivos que no necesiten tener dicho acceso. También es aconsejable revisar los ficheros y directorios escribibles por todo el mundo.

  • Asegúrese de que el usuario root es el propietario de los directorios /etc, /usr/etc, /bin, /usr/bin, /sbin, /usr/sbin, /tmp y /var/tmp. Además, los directorios /tmp y /var/tmp deben tener el sticky bit establecido.

  • AUSCERT recomienda que todos los archivos ejecutados por el usuario root deben ser propiedad de dicho usuario, no ser escribibles ni por el grupo ni por otros (es decir, con modo 755 o mejor) y localizados en un directorio donde cada directorio en el path sea propiedad del usuario root. En este sentido, una práctica general consistiría en examinar la protección de los ficheros y directorios antes y después de instalar software o de ejecutar utilidades de verificación.

  • Es recomendable comparar las versiones de programas en el sistema con una copia válida de las mismas (por ejemplo del CD-ROM). Hay que tener especial cuidado con las copias de seguridad, pues pueden contener ficheros alterados o Caballos de Troya.

  • Los Caballos de Troya pueden tener el mismo "standard checksum" y timestamp que la versión original. Por esto, el comando de UNIX sum(1) y el timestamp asociado a los programas no es suficiente para determinar si estos han sido alterados o reemplazados. El uso de cmp(1), MD5, Tripwire y otras utilidades para generar un checksum criptográfico son necesarios para detectar estos caballos de troya.

Filtrado de servicios en equipos Unix

Para evitar riesgos innecesarios, se deben configurar TODAS las máquinas de una organización para que ofrezcan únicamente los servicios que se tenga en mente ofrecer y no otros. Esto disminuirá considerablemente el riesgo de que estas máquinas sean atacadas aprovechando servicios completamente descuidados y que en muchas ocasiones no se es consciente que se están ofreciendo.

Es necesario asegurarse de que no existen debilidades en los archivos de configuración de los servicios ofrecidos y que los servicios se ofrezcan sólo al conjunto de usuarios para los cuales se diseñó.

Servicios dependientes de inetd

El archivo inetd.conf contiene una lista con todos los servicios que el demonio inetd4.1 invoca cuando recibe una petición sobre un socket.

Por defecto, a la hora de instalar el sistema operativo, se establece un archivo inetd.conf con gran cantidad de servicios activados por defecto, que en la grandísima mayoría de los casos no son necesarios. Es completamente necesario revisar este archivo con el fin de comentar las líneas de todos aquellos servicios que no sean necesarios explícitamente, y que en muchas ocasiones son causa de ataques y vulnerabilidades.

Nuestra recomendación es comentar todos los servicios que se lanzan desde el inetd.conf anteponiendo un carácter ¨#äl principio de cada una de las líneas. Una vez hecho esto, se pueden descomentar (quitando el carácter "#") aquellos servicios que sean necesarios en esa máquina en concreto.

Para que los cambios realizados en este archivo de configuración tengan efecto, recuerde reiniciar el proceso inetd.

Puesto que en muchos casos, cuando se ofrece un servicio, éste está dirigido a un sector de la comunidad de Internet, es muy útil contar con algún mecanismo que permita rechazar conexiones dependiendo de su origen y/o de su ident, y que proporcione además, una monitorización del acceso. En este contexto, recomendamos la instalación de tcp_wrapper (http://www.rediris.es/cert/doc/docu_rediris/wrappers.es.html), que se puede descargar en el FTP de RedIRIS. El tcp_wrapper (tcpd) actúa de intermediario transparente en las conexiones TCP, añadiendo un nivel extra de registro de conexiones, control de acceso y acciones configurables por conexión.4.2

Servicios dependientes de RPC

En general, los clientes de los servicios dependientes de RPC (Remote Procedure Control) hacen una llamada al gestor de RPC (rpcbind en Solaris, portmap en Linux, pero siempre el puerto 111/tcp), para averiguar donde están los servicios de cada procedimiento.

Esta información se puede ver como usuario, con el comando "rpcinfo -p", que implementa una llamada al procedimiento remoto 'dump'. Si alguno de los servicios que aparecen al ejecutar este comando no son necesarios, será imprescindible desactivarlos en los scripts de inicialización del sistema, lugar desde donde son lanzados.

En cuanto al tcp_wrapper, no puede usarse para controlar el acceso a estos servicios, pero si se puede usar para controlar y registrar el acceso al gestor RPC. Para hacerlo, es necesario tratar rpcinfo/portmap como un servidor independiente que implementa un servicio en el puerto 111. En Linux, portmap ya está compilado de esta manera, por lo que el acceso se puede controlar directamente con los archivos hosts.allow y hosts.deny. En Solaris, se requiere compilar una versión especial del rpcbind y enlazarlo con la biblioteca libwrap.a (Solaris: /usr/local/lib/libwrap.a, Linux: /usr/lib/libwrap.a).

Servicios arrancados en los scripts de inicio del sistema operativo

Aparte de los servicios dependientes de RPC y de los dependientes de inetd, comentados con anterioridad, en el proceso de instalación del sistema operativo en una máquina se activan una serie de servicios por defecto que se ejecutan desde el /etc/rc* correspondiente (por ejemplo el smtp, o el domain) que en la mayoría de los casos no son necesarios. Si éste es el caso, recomendamos que sean desactivados y que se modifiquen los scripts de inicio para que en subsiguientes arranques de la máquina no se vuelvan a lanzar.

Política de contraseñas

Sin duda, uno de los métodos más habituales usados por los hackers para comprometer un sistema es el robo de contraseñas. Robando un nombre de usuario y su contraseña correspondiente, un intruso puede, reduciendo las probabilidades de ser detectado, ganar acceso a un sistema, modificarlo, y usarlo como lanzadera para atacar a otros sistemas. La mayoría de los sistemas no tienen ningún mecanismo de control de las contraseñas que utilizan sus usuarios y en la mayoría de los casos existe por lo menos una contraseña en el sistema que puede ser fácil de descubrir, comprometiendo la seguridad del sistema completo.

La protección de las contraseñas es uno de los principios más importantes en seguridad, por lo que es necesario que las organizaciones posean una política de contraseñas bien definida.

Las técnicas utilizadas por los crackers para obtener contraseñas ajenas son muy variadas (desde aprovechar vulnerabilidades en ciertas aplicaciones hasta utilizar "Caballos de Troya", usualmente enmascarados en el programa /bin/login). Si un intruso obtiene un fichero passwd de una máquina ajena, normalmente realiza una copia del mismo a otra máquina y ejecuta programas crackeadores contra él, que son relativamente rápidos y que realizan ataques de fuerza bruta, de diccionario o híbridos sobre las contraseñas robadas.

A continuación daremos algunas directivas a tener en cuenta por los administradores de sistemas o responsables de seguridad para implementar una política de contraseñas adecuada en sus organizaciones.

Contraseñas débiles

  • La primera directiva, y en nuestra opinión la más importante, es desarrollar una guías que ayuden a los usuarios a la hora de escoger contraseñas lo suficientemente robustas para que no sean vulnerables a los ataques de diccionario o de fuerza bruta que suelen realizar la mayoría de las utilidades diseñadas para romper contraseñas. Estas medidas vienen ampliamente descritas en multitud de documentos por lo que no creemos necesario que sean repetidas aquí, pero a modo de ejemplo: no se deben escoger palabras del diccionario, palabras de estén relacionadas con el usuario (nombre de la mujer o marido, domicilio, fecha de nacimiento, etc...), utilizar contraseñas con una longitud mínima de 8 caracteres, no usar el nombre de usuario o una variante, como el nombre de usuario al revés, etc.

  • Informar a los usuarios de que no almacenen información sobre su cuenta/contraseña en archivos de texto en ningún sistema.

  • Si se tiene más de una cuenta en distintos sistemas no es aconsejable utilizar la misma contraseña en todas, pues si la contraseña quedara comprometida en una máquina, lo quedaría igualmente en el resto.

  • Cuando se utiliza el servicio de finger (puerto 79 tcp/udp) para interrogar a un servidor, a menudo éste revela más información sobre sí mismo y sus usuarios de la que sería deseable (el shell que está utilizando cada usuario, su directorio personal, el grupo al que pertenece, y lo que en este caso es más importante, el nombre del usuario en la máquina, con lo que el atacante ya poseería la mitad de la información que necesita para entrar en un sistema). Debido a que además suele proporcionar información sobre la hora del último login, un atacante podría confeccionar patrones de trabajo de los distintos usuarios. En definitiva, se trata de información demasiado valiosa para distribuirla sin control, por lo que es aconsejable eliminar este servicio de las máquinas si no es estrictamente necesario su uso.

  • Utilizar con cierta frecuencia programas tipo crack para chequear la robustez de las contraseñas del sistema y de esta forma encontrar claves débiles forzando el cambio de las mismas. Es mejor que nosotros conozcamos antes que el atacante la debilidad de nuestras contraseñas.

  • Establecer un política de cambios periódicos de contraseñas (sobre todo en las máquinas más importantes y las de cuentas privilegiadas). Además es aconsejable no reutilizar contraseñas antiguas.

Cuentas sin contraseña o contraseñas por defecto.

  • Cambiar todos las contraseñas instalados por defecto en el proceso de instalación del sistema operativo.

  • Escanear el fichero de contraseñas (/etc/shadow o /etc/passwd) periódicamente en busca de cuentas con UID igual a 0 (reservada para el usuario root).

  • Revisar el fichero de contraseñas en busca de cuentas nuevas de las que no se tiene conocimiento y que en la mayoría de los casos son indicativo de intrusión.

  • No permitir la existencia de cuentas sin contraseña.

  • Eliminar cuentas de usuarios que se hayan dado de baja en la organización o que no se estén utilizando.

  • Es aconsejable el uso de programas como "noshell"
    (ftp://ftp.rediris.es/mirror/coast/tools/unix/noshell) que permiten al administrador obtener información adicional sobre intentos de conexión a cuentas canceladas o bloqueadas en una máquina. Utilizando este mecanismo, cada intento de conexión queda registrada, mediante correo electrónico o syslogd, dando información sobre el usuario remoto, la dirección IP, el día y la hora del intento de login y el tty utilizado en la conexión.

Contraseñas reutilizables

  • Reducir o eliminar la transmisión de contraseñas reutilizables en texto claro sobre la red. De esta forma se evitará que las contraseñas sean capturadas por lo que se denomina "packet sniffers"4.3.

    Utilice contraseñas de un sólo uso (one-time passwords)(S/Key, Secure Net Key, Secure ID, etc...) para el acceso autenticado desde redes externas o para acceder a recursos sensibles como routers, servidores de nombres, etc.

  • Si se trata de sistemas UNIX, recomendamos el uso del fichero /etc/shadow, o lo que es igual, un segundo fichero que contiene las contraseñas cifradas y es sólo accesible por el usuario root, quedando el /etc/passwd con una "x" en el lugar donde deberían aparecer las contraseñas cifradas. La mayoría de sistemas Linux, por ejemplo, vienen con PAM configurado. PAM (Pluggable Authentication Modules) es un método mucho más potente de gestión de seguridad y contraseñas que se adapta perfectamente a cualquier entorno UNIX.

  • Si su sistema tiene la posibilidad de aplicar una serie de reglas en la introducción de palabras clave, es aconsejable que lo utilice. Por ejemplo, en el caso de un sistema Solaris, en el archivo /etc/default/passwd, o en un sistema con PAM, en el fichero /etc/pam.conf, se pueden establecer algunos valores por defecto, como son el número mínimo de caracteres que debe tener un contraseña, el máximo período de tiempo en el cual es válida, el mínimo período antes de que la contraseña pueda cambiarse, etc.

Política de cuentas

Desde el punto de vista de la seguridad, el fichero /etc/passwd tiene una importancia vital. Si tiene acceso a este archivo, lo puede alterar para cambiar el contraseña de cualquier usuario, o incluso tener privilegios de superusuario cambiando su UID a 0.

Entre las recomendaciones que podemos dar para establecer una política adecuada de cuentas y grupos en un sistema podemos destacar:

Administración

  • Del mismo modo que alentamos a las organizaciones para que posean una política de contraseñas bien definida, es necesario que también dispongan de un formulario para el registro de usuarios bien definido, donde se incluya una sección, que deberá ser firmada por el beneficiario, aceptando las condiciones y responsabilidades que supone tener una cuenta en el sistema. Se deberá contemplar también la posibilidad de acreditación por parte de los mismos.

  • Asegurarse de que existen copias de seguridad del área de disco de usuarios siempre que esto sea posible y se dispongan de los medios para hacerlo.

  • Considere el agrupar los directorios de los usuarios de una forma lógica, especialmente si espera tener muchos usuarios en el sistema.

  • Monitorice los registros en busca de intentos "su" no autorizados o fallidos.

  • Compruebe frecuentemente los intentos de conexión no autorizados.

  • Establezca una política de asignación de cuotas de disco a usuarios y grupos, así como la preparación de procedimientos de comprobación de los mismos con el fin de controlar que ningún usuario sobrepase el límite de espacio asignado.

Cuentas especiales

  • Evitar la existencia de cuentas compartidas.

  • Evitar la existencia de cuentas "guest" o de invitados. En este sentido, como varios sistemas instalan cuentas para invitados por defecto, será pues necesario desactivar o eliminar del sistema este tipo de cuentas.

  • Usar grupos específicos para restringir qué usuarios pueden utilizar el comando "su".

  • Comprobar el archivo de contraseñas del sistema una vez haya terminado el proceso de instalación del sistema operativo a fin de asegurarse de que todas las cuentas predeterminadas tienen contraseñas inválidas o han sido desactivadas o eliminadas.

  • Eliminar todas las cuentas que permiten únicamente la ejecución de un comando (por ejemplo "sync"). Si se permiten este tipo de cuentas, el administrador deberá cerciorarse de que ninguno de los comandos que ejecutan acepta entradas de línea de comandos y de que no permiten ningún tipo de escape al shell que pueda permitir acceder a un shell de forma externa.

Usuario root

  • La contraseña de root ha de ser especial, por lo que es necesario seleccionarla con cuidado, guardarla en lugar seguro y modificarla a menudo.

  • Restringir el número de usuarios en el sistema que tienen acceso a esta cuenta.

  • Evitar la existencia de archivos .rhosts en el directorio base del usuario root (normalmente /, o en Linux, /root/).

  • Evitar la existencia del "." en el path de búsqueda del usuario root y de los administradores.

  • Hacer uso de rutas completas para ejecutar órdenes como root.

  • Evitar entrar por telnet como root a las máquinas, para así evitar la intercepción del contraseña en texto en claro, que daría a un intruso acceso total al sistema. Queda entonces doblemente marcado como importante el uso de ssh como herramienta indispensable para entrar en las máquinas remotamente.

Configuración de servicios más usuales

En este apartado vamos a comentar la configuración de algunos de los servicios más usuales que son ofrecidos por las organizaciones, sin entrar en detalle, pues estos temas ya se tratan en los Grupos de Trabajo correspondientes.

Configuración del sistema de correo

El servicio de correo es uno de los más fáciles de configurar en la actualidad, aunque paradójicamente sigue siendo uno de los más problemáticos en lo que a seguridad se refiere. En principio podemos clasificar los equipos en función de su papel en la transferencia del correo, en:

Equipos de usuario
: Sistemas que leen y almacenan localmente el correo de uno o varios usuarios. Estos equipos suelen ejecutar un ``lector de correo'' o agente de usuario para obtener los correos. Suelen ser Pc's con Eudora, Outlook, Netscape o sistemas multiusuarios Unix con mh, pine, mutt, etc. En cualquier caso, para la lectura y almacenamiento de los correos en equipos Unix no es necesario que exista un proceso escuchando en el puerto 25 (SMTP), ni en los puertos de lectura de correo (110 (POP3) o 141(IMAP)).

Equipos de almacenamiento de correo
: Equipos en los que se almacena el correo a la espera de ser leído desde los equipos de usuario. Para ello suelen emplear el protocolo pop3 (puerto 110), y en algunos casos emplean imap (141). Para la recepción de correo suelen ejecutar el programa sendmail en el puerto 25, aunque también es posible emplear otros programas, como smap/smapd del fwtk (firewall-toolkit), para no tener que ejecutar sendmail.

Equipos de intercambio de correo
: Son los encargados de transferir el correo entre Internet y las organizaciones. Estos equipos deben tener un registro MX en el DNS, y tener establecido su direccionamiento inverso. Además en el router se debe filtrar el tráfico de la organización para que sólamente se produzcan accesos al puerto 25 de las servidores que están definidos en el DNS como MX (Mail eXchanger). Deben ejecutar sendmail, Postfix o un programa similar escuchando continuamente en el puerto 25.

La configuración de este servidor es crucial para el buen funcionamiento del servicio de correo. Se debe instalar la versión más actual del programa sendmail (el suministrado en muchos S.O., salvo Linux o FreeBSD, suele ser bastante antiguo) y configurarlo adecuadamente para que no pueda ser empleado para la distribución de correo basura (SPAM).

Consulte http://www.rediris.es/mail para más información sobre como configurar el servicio de correo en las organizaciones afiliadas a RedIRIS.

En los equipos de almacenamiento, procure que las cuentas de correo no estén vinculadas directamente a una cuenta del sistema, o que ésta esté bloqueada salvo que sea necesaria. Evite la circulación de las claves en claro mediante el uso de APOP, desactive las cuentas de los usuarios que han dejado de pertenecer a la organización, sustituyendo las cuentas por alias a sus nuevas direcciones de correo.

Configuración del DNS

El servicio de DNS es crucial para la conexión a Internet. Sin embargo en muchas organizaciones no está configurado adecuadamente. Como en el correo, la configuración de este servicio ha sido explicada en el Grupo de Trabajo correspondiente, pero sin embargo creemos que se debe destacar:

1.
Tener una versión actualizada del servidor de nombres: Es conveniente actualizar a una versión moderna del servidor. Las últimas versiones son más seguras y permiten establecer filtros y limitaciones en las transferencias de zonas, actualizaciones no solicitadas de datos, etc.

2.
Tener configurado el direccionamiento inverso: Muchas instituciones no tienen establecido el direccionamiento inverso para los equipos, lo que dificulta muchas veces el acceso a determinados servicios o la monitorización en los registros.

3.
Denegar el acceso a las zonas a otros servidores: Es conveniente que los servidores DNS estén configurados para permitir las transferencias de zona solamente a los servidores que estén definidos como secundarios; así se evita el que se pueda obtener información sobre la topología y configuración de la red desde el exterior.

4.
No poner configuraciones de equipos en el DNS: Es posible indicar en los registros de DNS qué sistema operativo, arquitectura hardware, e incluso qué servicios se están ejecutando en la máquina. Esta información se puede emplear para atacar desde fuera de la organización.

5.
Configuración en los clientes: En los filtrados de puertos (con tcp_wrapper) o en listas de acceso (en ficheros hosts.allow y hosts.deny), emplear nombres cualificados por completo y no sólo el nombre del equipo, para evitar que un equipo de otra organización que se llama igual pueda tener acceso al sistema.

6.
Aspectos generales de configuración: Como norma general, se debe cumplir que:
  • No se deben configurar los servidores de DNS para que reenvíen las peticiones (hagan ``forward'') a equipos de RedIRIS.
  • No se deben configurar DNS como secundarios de otra organización, salvo autorización explícita de la otra parte.
  • A ser posible se deben tener dos servidores, primario y secundario, en una misma organización, y por tanto tener especificados ambos equipos como servidores de nombres en la configuración de todos los equipos.

Configuración de los servidores WWW

Los equipos servidores WWW son susceptibles a varios tipos de ataques. Algunas medidas para evitarlos:

1.
Dimensione el equipo adecuadamente, para evitar que se produzcan ataques de denegación de servicio (DoS).
2.
Instale una versión actualizada del servidor WWW.

3.
Salvo que sea necesario, deniegue el uso de CGI's que no sean los empleados por los administradores, elimine los CGI's de prueba, que suelen tener vulnerabilidades de seguridad, y desactive las extensiones del servidor (PHP, Server-Side Includes, servlets de java, etc.) salvo que sean necesarios.

4.
En caso de que los usuarios deban programar CGI's, adviértales de los fallos más comunes que pueden existir y como solucionarlos
(ftp://ftp.cert.org/pub/techtips/cgimetacharacters).

5.
No comparta las páginas de los servidores mediante un sistema de ficheros; emplee un sistema de replicación (wget, mirror, etc.) para realizar el intercambio de las páginas.

Configuración de los servidores FTP

Lo servidores de FTP se han empleado en muchas ocasiones para el almacenamiento de software ilegal, propiciando el abuso de este servicio y muchas veces la sobrecarga de procesamiento de los servidores. Unas recomendaciones generales sobre este servicio son:

1.
Instalar una versión del servidor actualizada, y fiable: Las versiones del servidor FTP que vienen con los sistemas operativos comerciales suelen tener pocos parámetros de configuración, y también varios fallos de seguridad. Aún en el caso de que no se vaya a emplear el equipo como servidor de FTP, instale una versión actual de ProFTPd o wuFTPD, que proporcionan bastantes opciones a la hora de configurar el número máximo de conexiones, orígenes de la conexión,etc.

2.
En caso de que no se emplee el servicio de FTP anónimo, deshabilitarlo. En caso de que se emplee, salvo que sea necesario no permitir que el usuario FTP tenga permisos de escritura en ningún directorio, y en caso de que tenga que escribir, mantener este directorio en otro sistema de ficheros y evitar que el usuario tenga permisos de lectura y/o creación de directorios, para evitar la creación de repositorios de programas pirateados (http://www.rediris.es/cert/doc/docu_rediris/ftpconfig.es.html).

3.
No emplear el servicio de FTP para la transmisión de documentos o ficheros importantes entre equipos, pues las claves de conexión se transmiten en claro. Use en su lugar scp, un reemplazo de rcp que viene con el paquete ssh.

Servidores de ficheros

Hace algunos años era frecuente el empleo de servidores de ficheros en los sistema Unix para la compartición de software entre las diversas estaciones de trabajo. En la actualidad es frecuente encontrar sistemas de ficheros en red, de los que el más conocido es el soporte de NetBios sobre IP (Windows 3.11/9x/ME/NT/2000 principalmente, pero también Unix con Samba). Su incorporación a la red se debe hacer tomando algunas medidas de seguridad.

Servidores NFS

El acceso NFS es frecuente en entornos Unix puros, aunque existen clientes y servidores para Windows 9x/NT/2000 y Novell Netware. Algunos puntos que hay que comprobar a la hora de configurar un servidor NFS deben ser:

1.
Emplear servidores/clientes de NFS recientes. Inicialmente los servidores de NFS empleaban UDP como protocolo de transporte, pudiendo alterarse fácilmente las conexiones y realizar ataques simulando ser tanto el origen como el destino de las conexiones. La versión 3 del protocolo NFS permite usar TCP y emplea claves criptográficas para evitar la suplantación de los equipos.

2.
No exportar directorios con permisos de escritura. Salvo que sea estrictamente necesario, exportar los sistemas de ficheros con permisos de sólo lectura, de forma que no se pueda escribir en ellos. En caso de que se tengan que exportar sistemas de ficheros con permisos de escritura (directorios personales de usuarios, por ejemplo), no exporte jerarquías de directorios que contengan binarios. En las estaciones clientes evitar montar sistemas de ficheros con permiso de ejecución.

3.
Restringir los accesos. No exportar ficheros de configuración, indicar en las opciones de exportación qué equipos son los que pueden montar los recursos, y emplear para ello las direcciones IP o los nombres DNS **COMPLETOS**, para evitar suplantaciones de los equipos.

Servidores NetBios

NetBios se puede emplear sobre diversos protocolos de transporte. Su utilización original empleaba un protocolo denominado NetBEUI, que no permite el enrutado de los paquetes. Sin embargo, ahora mismo NetBios se emplea sobre TCP/IP, en servidores Windows y Unix. Algunos problemas de seguridad que tiene este protocolo son:

  • Recomendamos, con toda rotundidad, que Windows 9x/ME se considere comprometido desde el mismo momento en que se arranca. Ninguna versión de Windows 9x/ME debería ser jamás utilizada en cualquier ordenador de una red donde algún recurso necesite ser asegurado.

  • En sistemas NT/2000 es preciso tener instaladas las últimas versiones de los parches existentes (Service Packs), ya que las primeras implementaciones de los servidores tienen diversos problemas que abren la puerta a ataques de denegación de servicio (DoS).

  • Evitar la exportación de sistemas de ficheros que contengan ejecutables con permisos de escritura, tanto para evitar la suplantación de los binarios como para evitar la proliferación de virus.

  • En los servidores NT/2000 tener restringido y especificado siempre el acceso al grupo Todos y después permitir los accesos en función de los grupos de usuario. Hay que tener en cuenta que si estos servicios están abiertos a todo el mundo es posible acceder a ellos desde cualquier dirección IP.

  • En servidores NT/2000 emplear como sistema de ficheros NTFS, ya que permite especificar derechos individuales a los usuarios. Por ello recomendamos no emplear FAT.

  • En el caso de exportar directorios particulares de usuarios, emplear un sistema de cuotas en el servidor, ya sea mediante la instalación del parche correspondiente (Service Pack 4 o superior en NT), empleando las utilidades de Windows 2000, o empleando un equipo Unix con Samba y cuotas de disco, para evitar que un usuario pueda llenar la partición.

  • Si se emplea Samba, procurar que las claves de acceso no sean las mismas que las de las cuentas de usuarios en los equipos. Emplear, si es posible, un servidor de autenticación externo (PDC) para evitar que las claves puedan ser obtenidas mediante un sniffer de red o por alguno de los virus y troyanos que estén apareciendo cada vez con más frecuencia en entornos Windows.

Monitorización de archivos de registro

En Unix existen diversos mecanismos para que quede constancia de toda la actividad de un proceso. El más simple de estos mecanismos es que el proceso en cuestión vaya escribiendo una especie de registro de todo lo que hace en un fichero (lo normal es llamar a estos registros "logs", aunque hay palabras en castellano de sobra, como "registros" o "históricos").

Este método tendría sus limitaciones:

  • si dos procesos escriben sus informes simultáneamente al mismo fichero el resultado final puede ser confuso.
  • no nos sirve de mucho si queremos almacenar, a medida que se producen, copias de estos informes en otra máquina distinta.
  • en algunos casos no nos basta con llevar un registro: hay situaciones de emergencia que deben avisarse inmediatamente.
  • lo ideal es que estos ficheros no puedan ser modificados por cualquiera (o poco valor tendrían como registro fiable), pero interesa que cualquier programa tenga capacidad de generarlos, lo cual es una contradicción.

Para solucionar estas limitaciones se creó el sistema 'syslog' de Unix. Está compuesto por lo siguiente:

  • Un proceso privilegiado (syslogd), capaz de generar ficheros de log y avisos bassándose en determinadas configuraciones hechas por el administrador.

  • Un servicio TCP/IP (514/udp), que permite enviar mensajes syslog de una máquina a otra.

  • Un fichero de configuración (/etc/syslog.conf).

Configuración

El fichero /etc/syslog.conf permite especificar qué acciones se llevan a cabo cuando un determinado programa solicita registrar una actividad. Syslog clasifica las actividades a registrar según dos parámetros: subsistema (facility) y severidad.

El subsistema depende de quién ha generado el informe: el núcleo, sistema de correo, news, etc. La severidad indica la prioridad que se le asigna a cada uno de los mensajes, desde los de depuración (debug) hasta los de emergencia y/o pánico. Consulte la página de manual de ``syslogd.conf'' para más información.

El fichero de configuración permite asignar acciones por subsistema y severidad. Por ejemplo:

		mail.info			/var/log/mail
		mail.err			/var/log/mail-errores
		kern.crit			root
		kern.emerg			*
		auth.info			/var/log/auth
		auth.info			@otramaquina
Esto significa:

  • Los informes relacionados con correo, que tengan severidad ``informativa'' o mayor se almacenan en el fichero /var/log/mail.

  • Si tienen severidad ``error'' o mayor, se almacenan en otro fichero
    /var/log/mail-errores.

  • Si se produce un mensaje crítico del sistema, no esperamos a almacenarlo en ningún sitio; se escribe inmediatamente un mensaje a `root' donde quiera que esté, para que sepa lo que pasa.

  • Si ese mensaje es además del tipo ``emergencia'', no sólo avisaremos a root sino a todos los usuarios (es lo que pasa cuando se hace un shutdown, por ejemplo).

  • Los informes de seguridad, de severidad ``info'' o mayor, no sólo se guardan en el fichero /var/log/auth sino que además se mandan a la máquina ``otramaquina'' (ésto asume que hay un syslog corriendo en ``otramaquina'', que el puerto 514/udp de la misma está accesible y que ese syslog está a su vez configurado).

Particularidades

  • Se deben utilizar tabuladores y no espacios en el fichero /etc/syslog.conf.

  • Si se genera un informe que no esté previsto en el fichero de configuración, syslog lo volcará a la consola.

  • Los ficheros donde vamos a volcar estos logs deben estar creados de antemano, aunque estén vacíos.

  • El valor de severidad 'notice' no se puede combinar con otros, debe aparecer solo en una línea.

  • El comodín * equivale a todos los subsistemas excepto `mark'.

Uso desde programas

Los programas en C usan llamadas al sistema para acceder a syslog. Sin embargo, los scripts también pueden hacerlo. Si son en Perl, la forma más fácil es usar el módulo Perl Sys::Syslog (man Sys::Syslog).

Tanto en Perl como desde el shell se puede usar el programa logger:

		logger -p mail.err Error entregando mensaje.
que enviará dicho informe como subsistema 'mail' y severidad 'err'.

Existen otras opciones (ver man logger).

Rotación de ficheros de registro

El problema de almacenar registros históricos o logs es que éstos crecen, y tarde o temprano llenan el disco. Para evitar esto, se recurre a la rotación de logs.

Ejemplo de fichero rotado mensualmente:

1.
Antes de empezar:
  • /var/log/milog se crea vacío.
2.
Al primer mes:
  • /var/log/milog se renombra como /var/log/milog.1
  • /var/log/milog se "vacía" de nuevo (se copia /dev/null sobre él).

3.
Al segundo mes:
  • /var/log/milog.1 se renombra como /var/log/milog.2
  • /var/log/milog se renombra como /var/log/milog.1
  • /var/log/milog se "vacía" de nuevo.
Por supuesto, almacenaremos un número limitado de meses (o semanas, o días), o ésto no serviría de nada. Además, los registros de meses (semanas, días) anteriores se pueden comprimir.

Hacer esto tiene su truco. No se puede borrar impunemente un fichero que está abierto por un proceso (syslogd, en este caso), mejor dicho, no se debe, ya que los resultados no serán los que nos imaginamos.

La manera correcta de vaciar un fichero abierto es:

		cp /dev/null <fichero>

Otros aspectos relacionados

Algo más sobre los aspectos de seguridad: cuando se almacenan registros con finalidad informativa (estadísticas, etc) suele bastar con almacenarlos en la misma máquina donde se generan. Cuando se almacenan por motivos de seguridad, sin embargo, nos interesa preservar una copia en otra máquina. El motivo es que si hay una intrusión en la primera máquina podrán borrar o modificar los registros, pero esas mismas actividades quedarán registradas en la segunda, avisando así a los operadores.

Normalmente, la máquina que reciba los logs (loghost) no debe recibir otra cosa (para no ser susceptible de ataques) ni debe poder recibir logs desde fuera de la red local (para evitar ataques por saturación). Para evitar consultas al DNS cada vez que se genere un informe, la dirección IP de esta máquina debe estar en el fichero /etc/hosts de las máquinas que manden informes.

Comprobación de integridad

Una vez que se ha accedido a un sistema es frecuente modificar los binarios de algunos servicios y programas del sistema operativo para permitir su acceso posterior. Así mismo se pueden modificar los ficheros de configuración de los servicios para hacerlos más vulnerables. Para evitar esto se suele emplear herramientas de comprobación de integridad. Estos programas funcionan en dos fases; primero se crea la base de datos de integridad, empleando varios algoritmos criptográficos para obtener una ``huella dactilar'' de cada uno de los ficheros. En una fase posterior se comprueban periódicamente los ficheros existentes en el sistema de ficheros con las firmas que ha generado este programa, pudiendo así averiguar si se ha producido alguna modificación en los mismos.

Existen varias herramientas que permiten realizar esta comprobación de integridad. La más conocida es quizá Tripwire. Este programa permite emplear varios algoritmos criptográficos a la hora de generar la base de datos (MD2, MD4, MD5, SHA, Snefru, CRC-32), para evitar que un atacante pueda modificar los ficheros. La ultima versión de Tripwire disponible de uso general es la versión 1.3, disponible en el servidor FTP de Rediris. Desde el año pasado la Universidad de Purdue transfirió la licencia a la empresa Tripwire Security System, que ha desarrollado una nueva versión, la 2.0 disponible también para entornos Windows NT. Sin embargo, y dado que las diferencias son mínimas con respecto a la versión 1.3, emplearemos ésta como referencia.

Instalación de Tripwire

Tripwire está disponible en el repositorio de programas de seguridad de RedIRIS (ftp.rediris.es/soft/rediris/cert) en código fuente para los sistemas Unix. Así mismo está compilado en formato de paquete para algunas distribuciones Linux. La compilación no suele dar problemas y una vez instalado se emplea el fichero de configuración /usr/local/bin/tw/tw.config para indicar qué ficheros se deben comprobar.

Configuración de Tripwire

Un ejemplo sería:

/root                   R
/                       R
/vmlinuz                R
/boot                   R
/etc                    R
/etc/inetd.conf         R
/etc/rc.d               R
/etc/exports            R
/etc/mtab               L
/etc/motd               L
/etc/group              R     
/etc/passwd             L
/usr                    R
/usr/local              R
/dev                    L-am
/usr/etc                R
=/home                  R
/var/spool              L
/var/log                L
/var/spool/cron         L
/var/spool/mqueue       L
/var/spool/mail         L
/sbin                   R
=/proc                  E
=/tmp
=/cdrom

Como se ve, cada una de las entradas está formada por un identificador del directorio o fichero que se debe monitorizar y despues una serie de flags. Tripwire por defecto viene con una serie de identificadores predefinidos (R, L, E, etc.) para indicar distintas situaciones, como por ejemplo el que los ficheros sean de sólo lectura (R), ficheros de log (L), o ficheros que se deben excluir (E), etc. Consulte la página del manual para ver las distintas opciones de Tripwire.

Una vez definido el fichero de configuración se debe ejecutar el comando tripwire con la opción de crear la base de datos (tripwire -initialize). De esta forma Tripwire calculará los hash (las huellas) de cada uno de los ficheros y almacenará la información en los ficheros de la base de datos. Una vez generada la base de datos se debe almacenar en un dispositivo de sólo lectura (como un CD-ROM) o copiada a otro equipo para evitar que un intruso pueda modificarla. En sistemas con dispositivos removibles donde se pueda bloquear físicamente la escritura (disquetes), se puede copiar ahí la base de datos y después protegerlos contra escritura (en las unidades ZIP el bloqueo se realiza a nivel software, por lo que esta medida no es válida).

De esta forma es posible lanzar un proceso periódicamente que compruebe la integridad de los ficheros para evitar modificaciones, y actualizar manualmente la base de datos cuando se actualice el sistema operativo o se apliquen parches a éste.

Seguimiento de procesos

En gran parte de los sistemas Unix es posible ejecutar procesos de ``accounting'' o ``contabilidad'' para ir registrando el uso de los recursos de los equipos por parte de los usuarios y los procesos. La forma de configurar el sistema para que realize estos métodos de ``accounting'' suele depender mucho del sistema operativo del equipo, ya que suele realizarlo el núcleo (kernel) de éste, volcándose a ficheros cada cierto período de tiempo y realizando un procesamiento estadístico de estos datos. Antiguamente los procesos de accounting solían requerir bastante tiempo de procesamiento y eran difíciles de configurar y administrar. Sin embargo en la actualidad, la activación del accounting se suele realizar por la ejecución de un script en el arranque del sistema y la utilización de otro script para realizar las estadísticas durante la noche.

Las principales ventajas que tiene este sistema es poder analizar qué procesos se están ejecutando en el sistema, así como los usuarios que los realizan, pudiendo ver si algún usuario está ejecutando algún proceso en segundo plano o se ha producido algún ataque de saturación contra un servidor. Consulte la documentación del sistema operativo para ver cómo activar estos procesos de ``accounting''.

Actualizaciones de software

Sería conveniente dar algunas recomendaciones que permitan a los administradores disponer de un sistema automatizado para la recogida, instalación y notificación de parches. Algunas de estas recomendaciones se pueden resumir en los siguientes puntos:

  • Actualización de los sistemas, tan pronto sea posible, a la última versión facilitada por el fabricante.
  • Aplicación de todos los parches ``recomendados'' hasta el momento para esa versión del sistema operativo. Sería aconsejable la utilización de un script que se conectase al servidor FTP del fabricante concreto y aplicase los parches necesarios de forma automática.

    Mantenga correctamente parcheados los sistemas utilizando algunos de los siguientes métodos:

    1.
    Parcheado incremental. Utilización de un script que periódicamente aplique los parches necesarios desde la última aplicación, sin intervención humana y con notificación al administrador.
    2.
    Obtener una lista de parches necesarios (incremental), después decidir qué parches son realmente necesarios para el sistema concreto y aplicarlos. Hay parches que aunque se recomiendan para una versión de un sistema operativo concreto, si no se posee un determinado software o paquete instalado, no es necesario aplicarlo. También ocurre al contrario, hay parches necesarios para una determinada versión de software instalado que no se incluyen en los parches recomendados para esa versión del S.O.

Para aquellos administradores que dispongan de máquinas Solaris, se puede obtener un sistema de recogida automática de parches en:

http://www.um.es/alfonso/


Footnotes

... inetd4.1
El proceso inetd es un ``superservidor configurable'', empleado para escuchar en varios puertos simultáneamente y lanzar el programa adecuado para cada servicio. Para más información, consulte las páginas de manual de este comando.
... conexión.4.2
En servidores que generan una carga elevada y que tienen su propio sistema de control de acceso y de históricos no es necesario el empleo de tcp_wrapper.
... sniffers"4.3
Herramientas de monitorización y de red que permiten leer toda la información que circula por un segmento de la red, pudiendo así obtener las claves de acceso a las sesiones de terminal(telnet), ftp, http y servicios más comunes


IRIS CERT