29.14. El “Superservidor” inetd

Escrito por Chern Lee.

29.14.1. Resumen

inetd(8) se conoce como el “Super Servidor de Internet” debido a que gestiona las conexiones de varios dæmones. Los dæmones son programas que proporcionan servicios de red. inetd actúa como un servidor de servidor de gestión de otros dæmones. Cuando inetd(8) recibe una conexión se determina qué dæmon debería responder a dicha conexión, se lanza un proceso que ejecuta dicho dæmon y se le entrega el “ socket”. La ejecución de una única instancia de inetd reduce la carga del sistema en comparación con lo que significaría ejecutar cada uno de los dæmones que gestiona de forma individual.

inetd se utiliza principalmente para lanzar procesos que albergan a otros dæmones pero inetd también se utiliza para gestionar determinados protocolos triviales como chargen, auth y daytime.

Esta sección trata la configuración básica de inetd a través de sus opciones de línea de órdenes y utilizando su fichero de configuración, denominado /etc/inetd.conf.

29.14.2. Configuraciones

inetd se inicializa a través del fichero /etc/rc.conf en tiempo de arranque. La opción inetd_enable posee el valor NO por defecto, pero a menudo la aplicación sysinstall la activa cuando se utiliza la configuración de perfil de seguridad medio. Estableciendo

inetd_enable="YES"
o
inetd_enable="NO"
dentro de /etc/rc.conf se puede activar o desactivar la la ejecución de inetd en el arranque del sistema.

Se pueden además aplicar distintas opciones de línea de órdenes mediante la opción inetd_flags.

29.14.3. Opciones de línea de órdenes

sinopsis de inetd:

inetd [-d] [-l] [-w] [-W] [-c máximo] [-C tasa] [-a dirección | nombre_de_host] [-p nombre_de_fichero] [-R tasa] [fichero de configuración ]

-d

Activa la depuración.

-l

Activa el “logging” de las conexiones efectuadas con écute.

-w

Activa el recubrimiento de TCP para servicios externos (activado por defecto).

-W

Activa el recubrimiento de TCP para los servicios internos, ejecutados directamente por el dæmon inetd (activado por defecto).

-c máximo

Especifica el máximo número de invocaciones simultáneas de cada servicio; el valor por defecto es ilimitado. Se puede sobreescribir para cada servicio utilizando la opción max-child.

-C tasa

Especifica el máximo número de veces que se puede llamar a un servicio desde un dirección IP determinada por minuto; el valor por defecto es ilimitado. Se puede redefinir para cada servicio utilizando la opción max-connections-per-ip-per-minute.

-R tasa

Especifica el máximo número de veces que se puede invocar un servicio en un minuto; el valor por defecto es 256. Un valor de 0 permite un número ilimitado de llamadas.

-a

Especifica una dirección IP a la cual se asocia y sobre la cual se queda esperando recibir conexiones. Puede declararse también un nombre de máquina, en cuyo caso se utilizará la dirección (o direcciones si hay más de una) IPv4 o IPv6 que estén tras dicho nombre. Normalmente se usa un nombre de máquina cuando inetd se ejecuta dentro de un jail(8), en cuyo caso el nombre de máquina se corresponde con el entorno jail(8).

Cuando se desea asociarse tanto a direcciones IPv4 como a direcciones IPv6 y se utiliza un nombre de máquina se necesita una entrada para cada protocolo (IPv4 o IPv6) para cada servicio que se active a través de /etc/inetd.conf. Por ejemplo un servicio basado en TCP necesitaría dos entradas, una utilizando tcp4 para el protocolo IPv4 y otra con tcp6 para las conexiones a través del procolo de red IPv6.

-p

Especifica un fichero alternativo en el cual se guarda el ID del proceso.

Estas opciones se pueden declarar dentro de las variables inetd_flags del fichero /etc/rc.conf. Por defecto inetd_flags tiene el valor -wW, lo que activa el recubrimiento de TCP para los servicios internos y externos de inetd. Los usuarios inexpertos no suelen introducir estos parámetros y por ello ni siquiera necesitan especificarse dentro de /etc/rc.conf.

Nota: Un servicio externo es un dæmon que se ejecuta fuera de inetd y que se lanza cuando se recibe un intento de conexión. Un servicio interno es un servicio que inetd puede servir directamente sin necesidad de lanzar nuevos procesos.

29.14.4. inetd.conf

La configuración de inetd se realiza a través del ficherode configuración /etc/inetd.conf.

Cuando se realiza una modificación en el fichero /etc/inetd.conf se debe obligar a inetd a releer dicho fichero de configuración, lo cual se realiza enviando una señal “HANGUP” al proceso inetd como se muestra a continuación:

Ejemplo 29-4. Envío de una señal HANGUP a inetd

# kill -HUP `cat /var/run/inetd.pid`

Cada línea del fichero de configuración especifica un dæmon individual. Los comentarios se preceden por el caracter “#”. El formato del fichero de configuración /etc/inetd.conf es el siguiente:

service-name
socket-type
protocol
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute]]
user[:group][/login-class]
server-program
server-program-arguments

A continuación se muestra una entrada de ejemplo para el dæmon ftpd para IPv4:

ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l
service-name

Este es el nombre del servicio que proporciona un determinado dæmon. Se debe corresponder con el nombre del nombre de servicio que se declara en el fichero /etc/services. Este fichero determina sobre qué puerto debe ponerse a escuchar inetd. Si se crea un nuevo servicio se debe especificar primero en /etc/services.

socket-type

Puede ser stream, dgram, raw o seqpacket. stream se debe utilizar obligatoriamente para dæmones orientados a conexión (dæmones TCP) mientras que dgram se utiliza en dæmones basados en el protocolo de transporte UDP.

protocol

Uno de los siguientes:

Protocolo Explicación
tcp, tcp4 TCP IPv4
udp, udp4 UDP IPv4
tcp6 TCP IPv6
udp6 UDP IPv6
tcp46 TCP IPv4 e IPv6 al mismo tiempo
udp46 UDP IPv4 e IPv6 al mismo tiempo
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute]]

wait|nowait indica si el dæmon puede gestionar su propio “socket” o no. Los “ sockets” de tipo dgram deben utilizar obigatoriamente la opción wait mientras que los dæmones basados en “sockets” de tipo “stream”, los cuales se implementan normalmente mediante hilos, debería utilizar la opción nowait. La opción wait normalmente entrega varios “ sockets” a un único dæmon, mientras que la opción nowait lanza un dæmon “hijo” por cada nuevo “ socket”.

El número máximo de dæmones “ hijo” que puede lanzar inetd se puede especificar mediante la opción max-child. Si se necesita por ejemplo un límite de diez instancias para un dæmon en particular se puede especificar el valor 10 justo después de la opción nowait.

Además de max-child se puede activar otra opción para limitar en número máximo de conexiones que se aceptan desde un determinado lugar mediante la opción max-connections-per-ip-per-minute. Esta opción hace justo lo que su nombre indica. Un valor de, por ejemplo, diez en esta opción limitaría cualquier máquina remota a un máximo de diez intentos de conexión por minuto. Esto resulta útil para prevenir un consumo incontrolado de recursos y ataques de Denegación de Servicio (“Denial of Service” o DoS) sobre nuestra máquina.

Cuando se especifica este campo las opciones wait o nowait son obligatorias max-child y max-connections-per-ip-per-minute son opcionales.

Un dæmon de tipo “stream” sin la opción max-child y sin la opción max-connections-per-ip-per-minute simplemente especificaría la opción nowait.

El mismo dæmon con el límite máximo de diez dæmones “hijos” sería: nowait/10.

La misma configuración con un límite de veinte conexiones por dirección IP por minuto y un máximo total de diez dæmones “hijos” sería: nowait/10/20.

Todas estas opciones son utilizadas por el dæmon fingerd que se muestra a continuación a modo de ejemplo:

finger stream  tcp     nowait/3/10 nobody /usr/libexec/fingerd fingerd -s
user

Este es el nombre de usuario con el que debería ejecutarse un determinado dæmon. Normalmente los dæmones se suelen ejectar con permisos de root. Por motivos de seguridad, resulta bastante común encontrarse con algunos servidores que se ejecutan bajo el usuario daemon o incluso por el usuario menos privilegiado de todos que es el usuario nobody.

server-program

La ruta completa de la localización del dæmon que se quiere ejecutar cuando se recibe un intento de conexión. Si el dæmon es un servicio proporcionado por el propio inetd se debe utilizar la opcion internal en su lugar.

server-program-arguments

Esto funciona en conjunción con server-program, ya que especifica los argumentos, comenzando por argv[0], que se pasan al dæmon cuando se le invoca. Si la línea de órdenes es mydaemon -d, midæmon -d debería ser el valor de la opción server-program-arguments. Si el dæmon es un servicio interno se debe utilizar la utilizar la opción internal en lugar de la que estamos comentando.

29.14.5. Seguridad

Dependiendo del perfil de seguridad establecido cuando se instaló el sistema FreeBSD varios dæmones de inetd pueden estar desactivados o activados. Si no se necesita un dæmon determinado, no lo active. Especifique un “#” al comienzo de la línea del dæmon que quiere desactivar y envíe una señal hangup a inetd. No se aconseja ejecutar algunos dæmones determinados (un caso típico es fingerd) porque pueden proporcionar información valiosa para un atacante.

Algunos dæmones no presentan ninguna característica de seguridad y poseen grandes o incluso no poseen tiempos de expiración para los intentos de conexión. Esto permite que un atacante sature los recursos de nuestra máquina realizando intentos de conexión a una tasa relativamente baja contra uno de estos ingenuos dæmones. Pueder ser una buena idea protegerse de esto utilizando las opciones max-connections-per-ip-per-minute y max-child para este tipo de dæmones.

El recubrimiento de TCP está activado por defecto tal y como ya se ha comentado anteriormente. Consulte la página del manual de hosts_access(5) para obtener más información sobre cómo aplicar restricciones relacionadas con TCP a los dæmones invocados por inetd.

29.14.6. Varios

daytime, time, echo, discard, chargen y auth son servicios que inetd proporciona de forma interna y propia.

El servicio auth proporciona servicios de identificación a través de la red (ident, identd) y se puede configurar hasta en cierto grado.

Consulte la página del manual de inetd(8) si quiere conocer todos los detalles.

Puede descargar éste y muchos otros documentos desde ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Si tiene dudas sobre FreeBSD consulte la documentación antes de escribir a la lista <[email protected]>.
Envíe sus preguntas sobre la documentación a <[email protected]>.