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 valorUNLIMITED
(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 valorUNLIMITED
.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 valorUNLIMITED
.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 valorUNLIMITED
.
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.