Abrir um computador para acesso pela rede envolve muitos riscos de segurança. Algumas aplicações foram escritas para proteger o sistema contra diversos tipos de ataques. Alguns desses porém podem ser bastante frágeis, ou não conseguem distinguir entre máquinas seguras a partir das quais a requisição de um determinado serviço será aceito e máquinas inseguras cujas solicitações serão rejeitadas. Já comentamos rapidamente os serviços finger e tftp acima. Deve-se limitar o acesso a estes serviços somente a máquinas confiáveis, o que é impossível com a configuração usual, pois o programa inetd disponibiliza um serviço a todos os cliente ou a nenhum.
Uma ferramenta útil nestes casos é o servidor tcpd,9.4 um servidor de observação. Para os serviços TCP que se deseje monitorar ou proteger, ele deverá ser acionado ao invés do programa servidor. O programa tcpd registra todas as requisições através do servidor de mensagens do sistema denominado syslog, verifica se a máquina remota tem permissão de usar este serviço e somente se a resposta for positiva executará o real servidor do serviço. Cabe ressaltar que esta funcionalidade não está disponível para serviços baseados em UDP.
Por exemplo, para observar o serviço finger, deve-se alterar a linha correspondente no arquivo inetd.conf para
Sem a adição de qualquer controle de acesso, o cliente não perceberá qualquer diferença de um serviço finger usual, exceto pelo fato de que todas as requisições serão registradas pelo syslog.
O controle de acesso é implementado através de dois arquivos denominados /etc/hosts.allow e /etc/hosts.deny. Eles contêm informações que permitem e negam o acesso, respectivamente. Quando o servidor tcpd manuseia uma requisição para um serviço, como por exemplo uma chamada ao finger a partir de um cliente chamado itabaiana.cvirtual.com.br, ele pesquisa nos arquivos hosts.allow e hosts.deny (nesta ordem) buscando uma entrada que coincida com o serviço e com a máquina cliente. Caso uma entrada seja encontrada no arquivo hosts.allow, o acesso será permitido, independente de qualquer referência no arquivo hosts.deny. Caso alguma entrada seja encontrada no arquivo hosts.deny, a requisição será rejeitada e a conexão encerrada. Caso nenhuma entrada seja encontrada, a requisição será aceita.
Registros nos arquivos de acesso têm a seguinte aparência:
lista_de_serviços é uma relação de nomes de serviços existentes no arquivo /etc/services ou a palavra chave ALL. Para definir todos os serviços exceto finger e tftp, use ``ALL EXCEPT finger, tftp''.
lista_de_máquinas é uma lista de nomes de máquinas ou endereços IP, ou as palavras chave ALL, LOCAL, ou UNKNOWN. ALL significa qualquer máquina, enquanto LOCAL é utilizado para qualquer máquina cujo nome não contenha um ponto.9.5 UNKNOWN significa qualquer máquina cujo nome ou endereço não seja localizado. Um nome começando com um ponto significa todas as máquinas de um determinado domínio. Por exemplo, .cvirtual.com.br faz com que a máquina itabaiana.cvirtual.com.br tenha acesso ao serviço. Há ainda o uso de endereços IP para redes e subredes. Por favor consulte a página de manual hosts_access(5) para maiores detalhes.
Para evitar o acesso aos serviços finger e tftp para todas as máquinas, exceto as máquinas locais, deve ser criado o arquivo /etc/hosts.deny com o seguinte conteúdo, deixando o arquivo /etc/hosts.allow vazio:
O campo opcional comando pode conter um comando que pode ser acionado quando a entrada coincidir. Isso é útil para configurar armadilhas que exponham intrusos em potencial:
Os argumentos %h e %d são expandidos para o nome da máquina cliente e o nome do serviço pelo programa tcpd, respectivamente. Por favor consulte a página de manual do hosts_access(5) para maiores detalhes.