Capítulo 5. Seguridad de servidores

Cuando un sistema es usado como un servidor en una red pública, se convierte en un objetivo para ataques. Por esta razón, es de suma importancia para el administrador fortalecer el sistema y bloquear servicios.

Antes de extendernos en problemas particulares, debería revisar los siguientes consejos generales para mejorar la seguridad del servidor:

5.1. Asegure los servicios con TCP Wrappers y xinetd

Los TCP wrappers proporcionan control de acceso a una variedad de servicios. La mayoría de los servicios modernos de redes, tales como SSH, Telnet y FTP, hacen uso de TCP wrappers, que montan guardia entre las peticiones entrantes y los servicios solicitados.

Los beneficios ofrecidos por TCP wrappers son mejorados cuando se usan en conjunto con xinetd, un super servicio que proporciona acceso adicional, conexión, enlace, redirección y control de la utilización de recursos.

SugerenciaSugerencia
 

Es una buena idea utilizar reglas de cortafuegos IPTables conjuntamente con TCP wrappers y xinetd para crear redundancia dentro de los controles de acceso a servicios. Consulte el Capítulo 7 para más información sobre la implementación de cortafuegos con comandos IPTables.

Se puede encontrar más información sobre la configuración de TCP wrappers y xinetd en el capítulo llamado TCP Wrappers yxinetd en el Manual de referencia de Red Hat Enterprise Linux.

Las siguientes subsecciones asumen que ya se tiene un conocimiento básico de cada tópico y se enfoca en opciones de seguridad específicas.

5.1.1. Mejorar la seguridad con TCP Wrappers

Los TCP wrappers son capaces de mucho más que simplemente negar el acceso a servicios. Esta sección ilustra cómo se pueden usar para enviar pancartas de conexión, avisar sobre ataques desde hosts particulares y mejorar la funcionalidad de conexión. Para una lista detallada de la funcionalidad y el lenguaje de control de los TCP wrappers, consulte la página del manual de hosts_options.

5.1.1.1. Los TCP Wrappers y las pancartas de conexión

Una buena forma de disfrazar qué sistema esta ejecutando el servidor, es enviando una pancarta intimidante a las conexiones clientes para un servicio. Esto también permite dejarle saber al atacante que el administrador del sistema está vigilante. Para implementar una pancarta de TCP wrapper para un servicio, utilice la opción banner.

Este ejemplo implementa una pancarta para vsftpd. Para comenzar, debe crear un archivo de pancartas. Este puede estar en cualquier lugar en el sistema, pero debe tener el mismo nombre que el demonio. Para este ejemplo, se nombrará al archivo /etc/banners/vsftpd.

Los contenidos del archivo se veran así:

220-Hello, %c
220-All activity on ftp.example.com is logged.
220-Act up and you will be banned.

La señal %c proporciona una variedad de información del cliente, tal como el nombre de usuario y del host, o el nombre del usuario y la dirección IP para hacer la conexión aún más intimidante. El Manual de referencia de Red Hat Enterprise Linux tiene una lista de otras señales disponibles con los TCP wrappers.

Para que esta pancarta sea presentada a las conexiones entrantes, añada la siguiente línea al archivo /etc/hosts.allow:

vsftpd : ALL : banners /etc/banners/

5.1.1.2. TCP Wrappers y las advertencias de ataques

Si un host particular o red ha sido atrapada tratando de atacar el servidor, se pueden usar los TCP wrappers para advertir de ataques subsecuentes desde esa máquina o red a través de la directiva spawn.

En este ejemplo, se asume que el cracker desde la red 206.182.68.0/24 ha sido atrapado intentando atacar el servidor. Colocando la siguiente línea en el archivo /etc/hosts.deny, se niega el intento de conexión y se registra a un archivo especial.

 ALL : 206.182.68.0 : spawn /bin/ 'date' %c %d >> /var/log/intruder_alert

La señal %d suministra el nombre del servicio que el atacante estaba tratando de acceder.

Para permitir la conexión y registrarla, coloque la directiva spawn en el archivo /etc/hosts.allow.

NotaNota
 

Puesto que la directiva spawn ejecuta cualquier comando del shell, puede crear un script especial para notificar al administrador o ejecutar una cadena de comandos en el evento de que un cliente particular intente conectarse al servidor.

5.1.1.3. TCP Wrappers y el mejoramiento de la conexión

Si ciertos tipos de conexión son de mayor preocupación que otros, se puede subir el nivel de conexión para ese servicio a través de la opción severity.

En este ejemplo, se asume que cualquiera que esté intentando conectarse al puerto 23 (el puerto de Telnet) en un servidor FTP, es un cracker. Para resaltar esto, coloque una bandera emerg en los archivos de registro en vez de la bandera por defecto, info, y niegue la conexión.

Para hacer esto, coloque la línea siguiente en /etc/hosts.deny:

in.telnetd : ALL : severity emerg

Esto usará la facilidad de conexión por defecto authpriv, pero subirá el nivel de prioridad del valor por defecto de info a emerg, lo cual coloca los mensajes de conexión directamente a la consola.

5.1.2. Aumento de la seguridad con xinetd

El super servidor xinetd es otra herramienta útil para controlar el acceso a sus servicios subordinados. Esta sección se enfocará en cómo se puede usar xinetd para colocar un servicio trampa y controlar la cantidad de recursos otorgados que cualquier servicio xinetd pueda usar para así frustrar posibles ataques de DoS. Para una lista de las opciones disponibles, consulte las páginas man para xinetd y xinetd.conf.

5.1.2.1. Colocando una Trampa

Una característica importante de xinetd es la habilidad de añadir hosts a una lista global de no_access. A los hosts en esta lista se les negará conexiones a los servicios manejados por xinetd por un tiempo determinado o hasta que se reinicie xinetd. Esto se logra usando el atributo SENSOR. Esta técnica es una forma fácil de bloquear máquinas que intenten escanear un puerto del servidor.

El primer paso en configurar un SENSOR es seleccionar un servicio que usted planea no utilizar. Para este ejemplo, se utilizará Telnet.

Modifique el archivo /etc/xinetd.d/telnet y cambie la línea flags para que muestre lo siguiente:

	      flags           = SENSOR

Agregue la línea siguiente entre llaves:

	      deny_time       = 30

Esto negará al host el acceso al puerto por 30 minutos. Otros valores aceptables para el atributo deny_time son FOREVER, lo que mantiene el bloqueo hasta que se reinicie xinetd, y NEVER, lo que permite la conexión y la conecta.

Finalmente, la última línea debería mostrar lo siguiente:

	      disable         = no

Aún cuando el uso de SENSOR es una buena forma de detectar y detener conexiones de máquinas dañinas, tiene dos desventajas:

  • No funcionará contra escaneos sigilosos.

  • Un atacatante que sabe que usted está ejecutando SENSOR puede montar un ataque de rechazo de servicio (DoS) en contra de cualquier host falsificando sus direcciones IP y conectándose al puerto prohibido.

5.1.2.2. Control de recursos del servidor

Otra característica importante de xinetd, es su habilidad para controlar la cantidad de recursos bajo su control que puede utilizar.

Esto se hace a través de las siguientes directivas:

  • cps = <number_of_connections> <wait_period> — Indica el número de conexiones permitidas al servicio por segundo. Esta directiva acepta solamente valores enteros.

  • instances = <number_of_connections> — Indica el número total de conexiones permitidas al servicio. Esta directiva acepta bien sea un valor entero o UNLIMITED.

  • per_source = <number_of_connections> — Indica las conexiones permitidas a un servicio por cada máquina. Esta directiva acepta un valor entero o UNLIMITED.

  • rlimit_as = <number[K|M]> — Indica la cantidad de espacio de direcciones de memoria que el servicio puede ocupar, en kilobytes o megabytes. Esta directiva acepta valores enteros o UNLIMITED.

  • rlimit_cpu = <number_of_seconds> — Indica la cantidad de tiempo en segundos que un servicio puede ocupar el CPU. Esta directiva acepta un valor entero o UNLIMITED.

Usando estas directivas puede ayudar a prevenir que cualquier servicio xinetd sobresature el sistema, resultando en un rechazo de servicio.