19.14. O ``Super-Servidor'' inetd

Contribuído por Chern Lee.

19.14.1. Visão Geral

O inetd(8) é chamado de ``Super-Servidor Internet'' porque ele gerencia conexões para diversos daemons. O inetd atua como um servidor gerenciador para outros daemons. Quando uma conexão é recebida pelo inetd, ele determina para qual daemon a conexão é destinada e executa o daemon correspondente e a ele delega o socket. Executar uma instância do inetd reduz a carga no sistema de forma geral, comparado a se executar cada daemon individualmente.

Primariamente, o inetd é usado para executar outros daemons, mas diversos protocolos simples são tratados diretamente, como chargen, auth e daytime.

Esta seção vai abordar as configurações básicas do inetd através de seus parâmetros de linha de comando e seu arquivo de configuração /etc/inetd.conf.

19.14.2. Configurações

O inetd é inicializado através do sistema /etc/rc.conf. A opção inetd_enable é ajustada para ``NO'', por padrão, mas é muitas vezes ativada pelo sysinstall com o perfil de segurança médio. Colocando:

inetd_enable="YES"
or
inetd_enable="NO"
no /etc/rc.conf pode ativar ou desativar a execução do inetd na inicialização do sistema.

Adicionalmente, parâmetros de linha de comando podem ser passados para o inetd através da opção inetd_flags.

19.14.3. Opções de Linha de Comando

Sinopse do inetd:

inetd [-d] [-l] [-w] [-W] [-c máximo] [-C taxa] [-a endereço | nome-do-sistema] [-p nome do arquivo] [-R taxa] [arquivo de configuração]

-d

Ativa a depuração.

-l

Ativa o registro das conexões bem sucedidas.

-w

Ativa o encapsulamento TCP para serviços externos (ativado por padrão).

-W

Ativa o encapsulamento do TCP para serviços internos que são embutidos no inetd (ativado por padrão).

-c máximo

Especifica o número máximo padrão de invocações simultâneas de cada serviço; o padrão é ilimitado. Pode ser anulado em cada serviço com o parâmetro max-child.

-C taxa

Especifica o número máximo padrão de vezes que um serviço pode ser invocado a partir de um único endereço IP em um minuto; o padrão é ilimitado. Pode ser cancelado, por serviço, com o parâmetro max-conexões-por-ip-por-minuto.

-R taxa

Especifica o número máximo de vezes que um serviço pode ser invocado em um minuto; o padrão é 256. Uma taxa de 0 permite um número ilimitado de invocações.

-a

Especifica um único endereço IP para ser unido. Alternativamente, um nome de sistema pode ser especificado, e neste caso, o endereço IPv4 ou IPV6 que corresponder àquele nome é usado. Habitualmente um nome de sistema é especificado quando o inetd é executado dentro de um jail(8), e neste caso, o nome do sistema corresponde ao ambiente do jail(8).

Quando o é usado o nome do sistema e união com ambos endereços IPv4 e IPv6 é desejada, uma entrada com o tipo apropriado de protocolo para cada união é exigida para cada serviço, no /etc/inetd.conf. Por exemplo, um serviço baseado em TCP precisaria de duas entradas, uma usando ``tcp4'' para o protocolo e outra usando ``tcp6''.

-p

Especifica um arquivo alternativo para armazenar o ID do processo.

Estas opções podem ser passadas ao inetd usando a opção inetd_flags no /etc/rc.conf. Por padrão, o inetd_flags é ajustado para ``-wW'', que ativa o encapsulamento TCP para os serviços inetd internos e externos. Para usuários novatos, estes parâmetros geralmente não precisam ser modificados ou mesmo incluídos no /etc/rc.conf.

Nota: Um serviço externo é um daemon fora do inetd, que é invocado quando uma conexão é recebida para ele. Por outro lado, um serviço interno é um que o inetd possui os meios de fornecer por si próprio.

19.14.4. inetd.conf

A configuração do inetd é controlada através do arquivo /etc/inetd.conf.

Quando uma modificação é feita no /etc/inetd.conf, o inetd pode ser forçado a reler seu arquivo de configuração enviando um sinal HangUP ao processo inetd, como mostrado:

Exemplo 19-4. Enviando um Sinal HangUP ao inetd

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

Cada linha do arquivo de configuração especifica um daemon individual. Comentários no arquivo são precedidos por um ``#''. O formato do /etc/inetd.conf é o seguinte:

nome-do-serviço
tipo-de-socket
protocolo
{wait|nowait}[/max-de-filhos[/max-de-conexões-por-ip-por-minuto]]
usuário[:grupo][/classe-de-login]
programa-servidor
argumentos-do-programa-servidor

Uma entrada de exemplo para o daemon ftpd usando IPv4:

ftp     stream tcp     nowait root    /usr/libexec/ftpd       ftpd -l
nome-do-serviço

Este é o nome do serviço do daemon em questão. Ele precisa corresponder ao serviço listado no /etc/services. Isto determina qual porta o inetd precisa escutar. Se um novo serviço está sendo criado, ele precisa ser colocado primeiro no /etc/services.

tipo-de-socket

Pode ser stream, dgram, raw, ou seqpacket. stream precisa ser usado para daemons TCP baseados em conexão, enquanto dgram é usado para daemons usando o protocolo de transporte UDP.

protocolo

Um dos seguintes:

Protocolo Descrição
tcp, tcp4 TCP IPv4
udp, udp4 UDP IPv4
tcp6 TCP IPv6
udp6 UDP IPv6
tcp46 Ambos TCP IPv4 e v6
udp46 Ambos UDP IPv4 e v6
{wait|nowait}[/max-de-filhos[/max-de-conexões-por-ip-por-minuto]]

wait|nowait indica se o daemon invocado pelo inetd é capaz de lidar com seu próprio socket ou não. Sockets do tipo dgram precisam usar a opção wait, enquanto daemons de sockets tipo stream, os quais geralmente são multi-threaded, devem usar a opção nowait. wait geralmente repassa múltiplos sockets para um único daemon, enquanto nowait dispara um daemon filho para cada novo socket.

O número máximo de daemons filho que o inetd pode disparar pode ser ajustado usando a opção max-de-filhos. Se um limite de dez instâncias de um daemon em particular é necessária, um /10 deve ser colocado após a opção nowait.

Além de max-de-filhos, outra opção pode ser ativada para limitar o número máximo de conexões a partir de um único lugar para um daemon em particular. O max-conexões-por-ip-por-minuto faz justamente isto. Um valor de dez nesta opção limitaria qualquer endereço IP a se conectar a determinado serviço a dez tentativas por minuto. Isto é útil para evitar consumo de recursos intencional ou não e ataques de Negação de Serviço (Denial of service - DoS) para a máquina.

Neste campo, wait ou max-de-filhos e max-conexões-por-ip-por-minuto são opcionais.

Um daemon multi-threaded do tipo stream sem qualquer limites max-de-filhos ou max-conexões-por-ip-por-minuto seria simplesmente: nowait.

O mesmo daemon com um limite máximo de dez daemons seria: nowait/10

Adicionalmente, a mesma configuração com um limite de vinte conexões por endereço IP por minuto e um limite total máximo de dez daemons filhos seria: nowait/10/20.

Estas opções são todas utilizadas pela configuração padrão do daemon fingerd, como visto aqui:

finger stream tcp     nowait/3/10 nobody /usr/libexec/fingerd fingerd -s
usuário

O usuário é o nome do usuário através do qual o daemon específico deve ser executado. Mais freqüentemente, daemons rodam com o usuário root. Por propósito de segurança, é comum encontrar alguns servidores rodando como o usuário daemon, ou o usuário com menos privilégios, nobody.

programa-servidor

O caminho completo do daemon a ser executado quando uma conexão é recebida. Se o daemon é um serviço a ser fornecido internamente pelo inetd, então internal deve ser utilizado.

argumentos-do-programa-servidor

Este funciona em conjunto com program-servidor especificando os argumentos, iniciando com o argv[0], passado ao daemon no momento da invocação. Se meudaemon -d é a linha de comando, meudaemon -d seria o valor de argumentos do programa servidor. Novamente, se o daemon é um serviço interno, use internal aqui.

19.14.5. Segurança

Dependendo do perfil de segurança selecionado durante a instalação, muitos daemons do inetd podem ser ativados por padrão. Se não há necessidade aparente para um daemon em particular, desative-o! Coloque um ``#'' na frente do daemon em questão e envie um sinal de hangup para o inetd. Alguns daemons como o fingerd, podem ser totalmente indesejáveis, porque eles fornecem muita informação para um atacante.

Alguns daemons não são conscientes com a segurança e possuem longos ou inexistentes tempos de expiração (timeouts) para tentativas de conexão. Isto permite um atacante enviar conexões lentamente para um daemon em particular, saturando os recursos disponíveis. Pode ser uma boa idéia colocar limitações ip-por-minuto e max-filhos em certos daemons.

Por padrão, o encapsulamento TCP é ativado. Consulte a página de manual hosts_access(5) para mais informações sobre como colocar restrições TCP em vários daemons invocados pelo inetd.

19.14.6. Miscelânea

daytime, time, echo, discard, chargen, e auth são todos serviços fornecidos internamente pelo inetd.

O serviço auth fornece serviços de identidade (ident, identd) de rede, e é configurável até certo ponto.

Consulte a página de manual inetd(8) para informações mais aprofundadas.

Este, e outros documentos, podem ser obtidos em ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Para perguntas sobre FreeBSD, leia a documentação antes de contatar <questions@FreeBSD.org>.
Para perguntas sobre esta documentação, envie e-mail para <doc@FreeBSD.org>.