2.2. Seguridad del servidor

Cuando se utiliza un sistema como un servidor en una red pública, se convierte en objetivo para los agresores. Por lo tanto, es de suma importancia para el administrador de sistemas fortalecer el sistema y bloquear los servicios.
Antes de profundizar en aspectos específicos, revise los siguientes consejos generales para mejorar la seguridad del servidor:
  • Mantenga todos los servicios actualizados, para proteger contra últimas amenazas.
  • Use protocolos seguros cuando sea posible.
  • Sirva solamente un tipo de servicio por máquina cuando sea posible.
  • Monitorice cuidadosamente todos los servicios para actividades sospechosas.

2.2.1. Cómo proteger servicios con envolturas TCP y xinetd

Las envolturas TCP proporcionan control de acceso a una variedad de servicios. La mayoría de servicios de red modernos, tales como SSH, Telnet y FTP, hacen uso de envolturas TCP, las cuales montan guardia entre las peticiones entrantes y el servicio solicitado.
Los beneficios que ofrecen las envolturas TCP se mejoran cuando se utilizan junto con xinetd, un súper servidor que proporciona acceso adicional, ingreso, enlace, redirección y control de uso de recursos.

Nota

Es una buena idea usar reglas de cortafuegos de iptables junto con envolturas TCP y xinetd para crear redundancia dentro de controles de acceso de servicios. Consulte, la Sección 2.5, “Cortafuegos” para obtener información sobre implementación de cortafuegos con comandos de iptables.
Las siguientes sub-secciones suponen un conocimiento básico de cada tema y enfoque sobre las opciones de seguridad específicas.

2.2.1.1. Cómo mejorar la seguridad con envolturas TCP

Las envolturas TCP pueden hacer mucho más que negar el acceso a los servicios. Esta sección ilustra cómo se pueden utilizar para enviar pancartas de conexión, advertir de ataques de algún determinado host y mejorar la funcionalidad de registro. Consulte la página de manual hosts_options para obtener mayor información sobre la funcionalidad de envolturas TCP y el lenguaje de control. También puede consultar la página de manual xinetd.conf disponible en http://linux.die.net/man/5/xinetd.conf para obtener información sobre indicadores disponibles que actúan como opciones que se pueden aplicar a un servicio.\n
2.2.1.1.1. Envolturas TCP y pancartas de conexión
Desplegar una pancarta apropiada cuando los usuarios se conectan al servicio es una buena forma de hacer saber a los atacantes de que hay un administrador de sistemas en alerta. Puede también controlar la información sobre el sistema que se presenta a los usuarios. Para implementar una pancarta de envolturas TCP para un servicio, use la opción banner.\n\t\n
Este ejemplo implementa una pancarta para vsftpd. Para comenzar, cree un archivo de pancartas. El archivo puede estar en cualquier parte del sistema, pero debe tener el mismo nombre del demonio. En este ejemplo, el archivo se denomina /etc/banners/vsftpd y contiene la siguiente línea:
220-Hello, %c 
220-All activity on ftp.example.com is logged.
220-Inappropriate use will result in your access privileges being removed.
El símbolo %c ofrece una variedad de información del cliente, tal como el nombre de usuario y el nombre de host o el nombre de usuario y la dirección IP para hacer la conexión mucho más intimidante.
Para desplegar esta pancarta para conexiones entrantes, añada la siguiente línea al archivo /etc/hosts.allow:
 vsftpd : ALL : banners /etc/banners/ 
2.2.1.1.2. Envolturas TCP y Advertencias de ataques
Si se detecta un determinado host o red atacando al servidor, pueden utilizarse las envolturas TCP para advertir al administrador de ataques posteriores de ese host o red mediante la directiva spawn.
En este ejemplo, se asume que el cracker de la red 206.182.68.0/24 ha sido detectado tratando de atacar al servidor. Añada esta línea en el archivo para negar cualquier intento de conexión desde la red y para registrar los intentos en un archivo especial.
 ALL : 206.182.68.0 : spawn /bin/echo `date` %c %d >> /var/log/intruder_alert 
El símbolo %d provee el nombre del servicio al que el atacante está tratando de acceder.
Para permitir la conexión y el ingreso, sitúe la directiva de spawn en el archivo /etc/hosts.allow.

Nota

Puesto que la directiva spawn ejecuta cualquier comando de shell, es una buena idea crear un script especial para notificar al administrador o ejecutar una cadena de comandos en caso de que un cliente particular intente conectarse al servidor.
2.2.1.1.3. Envolturas TCP e ingreso mejorado
Si algunos tipos de conexiones preocupan más que otras, el nivel de registro se puede elevar para ese servicio mediante la opción severity.
Para este ejemplo, se supone que la persona que está intentando conectarse al puerto 23 (el puerto de Telnet) en un servidor FTP es un cracker. Para resaltar esto, sitúe el indicador emerg en los archivos de registro en lugar del indicador predeterminado, info, y niegue la conexión.
Para hacer esto, escriba la siguiente línea en /etc/hosts.deny:
 in.telnetd : ALL : severity emerg 
De esta manera, se utiliza la herramienta predeterminada authpriv, pero se eleva la prioridad del valor predeterminado de info a emerg, la cual envía directamente mensajes de registro a la consola.

2.2.1.2. Cómo mejorar la seguridad con xinetd

Esta sección se centra en el uso de xinetd para establecer el servicio de trampa y al usarlo controlar los niveles de recursos disponibles para un determinado servicio de xinetd. Si establece límites de recurso para servicios puede ayudar a frustrar ataques de Denegación del servicio (DoS). Consulte las páginas de manual para xinetd y xinetd.conf para obtener una lista de las opciones disponibles.
2.2.1.2.1. Cómo establecer una trampa
Un rasgo importante de xinetd es la capacidad de añadir hosts a una lista global de no_access. A los hosts en esta lista se les niegan las conexiones posteriores a servicios administrados por xinetd por un periodo específico de tiempo o hasta que se reinicie xinetd. Puede hacerlo mediante el atributo SENSOR. Esta es una forma fácil de bloquear los hosts que intentan escanear los puertos en el servidor.
El primer paso para configurar el SENSOR es seleccionar el servicio que no piensa utilizar. Para este ejemplo, se utiliza Telnet.
Edite el archivo /etc/xinetd.d/telnet y cambie la línea flags para que se lea:
flags           = SENSOR
Añada la siguiente línea:
deny_time       = 30
Así, niega otros intentos de conexión al puerto por ese host por 30 minutos. Otros valores aceptables para el atributo deny_time son FOREVER, el cual mantiene el bloqueo hasta que se inicie xinetd y NEVER, el cual permite la conexión y la conecta.
Por último, la línea se lee:
disable         = no
Así se habilita la trampa misma.
El uso de SENSOR es una buena forma de detectar y detener las conexiones de hosts no deseables, hay dos inconvenientes:
  • No funciona con escáner invisible
  • Un agresor que sepa que SENSOR se está ejecutando, puede montar un ataque de Denegación del servicio contra determinados hosts falsificando sus direcciones IP y conectándose al puerto prohibido.
2.2.1.2.2. Cómo controlar recursos de servidor
Otra funcionalidad importante de xinetd es su habilidad de establecer límites de recursos para servicios bajo su control.
Lo hace mediante las siguientes directivas:
  • cps = <number_of_connections> <wait_period> — Limita la tasa de conexiones entrantes. Esta directiva toma dos argumentos:
    • <number_of_connections> — El número de conexiones a manejar por segundo. Si la tasa de conexiones entrantes es mayor que ésta, el servicio se inhabilitará temporalmente. El valor predeterminado es cincuenta (50).
    • <wait_period> — El número de segundos de espera antes de volver a habilitar el servicio después de que ha sido desactivado. El intervalo predeterminado es de diez (10) segundos.
  • instances = <number_of_connections> — Especifica el número total de conexiones permitidas para el servicio. Esta directiva acepta ya sea un valor entero o un valor UNLIMITED (ILIMITADO).
  • per_source = <number_of_connections> — Especifica el número de conexiones permitidas a un servicio por cada host. Esta directiva acepta un valor entero o un valor UNLIMITED.
  • rlimit_as = <number[K|M]> — Especifica la cantidad de espacio de dirección de memoria que el servicio puede ocupar en kilobytes o megabytes. Esta directiva acepta un valor entero o un valor UNLIMITED.
  • rlimit_cpu = <number_of_seconds> — Especifica la cantidad de tiempo en segundos que un servicio puede ocupar la CPU. Esta directiva acepta el valor entero y el valor UNLIMITED.
Con el uso de estas directivas se puede ayudar a evitar que cualquier servicio xinetd sobrecargue el sistema y que resulte en una negación del servicio.