Como proteger serviços de rede usando TCP Wrappers no Linux
Neste artigo explicaremos o que são wrappers TCP e como configurá-los para restringir o acesso a serviços de rede executados em um servidor Linux. Antes de começarmos, porém, devemos esclarecer que o uso de wrappers TCP não elimina a necessidade de um firewall devidamente configurado.
Nesse sentido, você pode pensar nesta ferramenta como uma lista de controle de acesso baseada em host, e não como a medida de segurança definitiva para o seu sistema. Ao usar um firewall e wrappers TCP, em vez de preferir um ao outro, você garantirá que seu servidor não fique com um único ponto de falha.
Compreendendo hosts.allow e hosts.deny
Quando uma solicitação de rede chega ao seu servidor, os wrappers TCP usam hosts.allow
e hosts.deny
(nessa ordem) para determinar se o cliente deve ter permissão para usar um determinado serviço .
Por padrão, esses arquivos estão vazios, todos comentados ou não existem. Assim, tudo é permitido através da camada TCP wrappers e seu sistema depende do firewall para proteção total. Como isso não é desejado, pelo motivo exposto na introdução, certifique-se de que ambos os arquivos existam:
ls -l /etc/hosts.allow /etc/hosts.deny
A sintaxe de ambos os arquivos é a mesma:
<services> : <clients> [: <option1> : <option2> : ...]
onde,
- serviços é uma lista separada por vírgulas de serviços aos quais a regra atual deve ser aplicada.
clientes representam a lista de nomes de host ou endereços IP separados por vírgula afetados pela regra. Os seguintes curingas são aceitos:
- ALL corresponde a tudo. Aplica-se tanto a clientes como a serviços.
- LOCAL corresponde a hosts sem ponto final em seu FQDN, como localhost.
- KNOWN indica uma situação em que o nome do host, o endereço do host ou o usuário são conhecidos.
- DESCONHECIDO é o oposto de CONHECIDO.
- PARANOID faz com que uma conexão seja interrompida se pesquisas reversas de DNS (primeiro no endereço IP para determinar o nome do host, depois no nome do host para obter os endereços IP) retornarem um endereço diferente em cada caso.
Você pode querer ter em mente que uma regra que permite acesso a um determinado serviço em /etc/hosts.allow
tem precedência sobre uma regra em /etc/hosts.deny
que proíbe isto. Além disso, se duas regras se aplicarem ao mesmo serviço, apenas a primeira será considerada.
Infelizmente, nem todos os serviços de rede suportam o uso de wrappers TCP. Para determinar se um determinado serviço os suporta, faça:
ldd /path/to/binary | grep libwrap
Se o comando acima retornar saída, ele poderá ser encapsulado em TCP. Um exemplo disso são sshd e vsftpd, conforme mostrado aqui:
Como usar TCP Wrappers para restringir o acesso aos serviços
Ao editar /etc/hosts.allow
e /etc/hosts.deny
, certifique-se de adicionar uma nova linha pressionando Enter após a última linha não vazia.
Para permitir acesso SSH e FTP apenas a 192.168.0.102 e localhost e negar todos os outros, adicione estas duas linhas em /etc/hosts.deny
:
sshd,vsftpd : ALL
ALL : ALL
e a seguinte linha em /etc/hosts.allow
:
sshd,vsftpd : 192.168.0.102,LOCAL
#
hosts.deny This file contains access rules which are used to
# deny connections to network services that either use
# the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
# The rules in this file can also be set up in
# /etc/hosts.allow with a 'deny' option instead.
#
# See 'man 5 hosts_options' and 'man 5 hosts_access'
# for information on rule syntax.
# See 'man tcpd' for information on tcp_wrappers
#
sshd,vsftpd : ALL
ALL : ALL
#
hosts.allow This file contains access rules which are used to
# allow or deny connections to network services that
# either use the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
# See 'man 5 hosts_options' and 'man 5 hosts_access'
# for information on rule syntax.
# See 'man tcpd' for information on tcp_wrappers
#
sshd,vsftpd : 192.168.0.102,LOCAL
Essas alterações ocorrem imediatamente, sem a necessidade de reinicialização.
Na imagem a seguir você pode ver o efeito de remover a palavra LOCAL
da última linha: o servidor FTP ficará indisponível para localhost. Depois de adicionarmos o curinga novamente, o serviço ficará disponível novamente.
Para permitir todos os serviços para hosts cujo nome contém example.com
, adicione esta linha em hosts.allow
:
ALL : .example.com
e para negar acesso ao vsftpd para máquinas em 10.0.1.0/24, adicione esta linha em hosts.deny
:
vsftpd : 10.0.1.
Nos dois últimos exemplos, observe o ponto no início e no final da lista de clientes. É utilizado para indicar “TODOS os hosts e/ou clientes onde o nome ou o IP contém essa string”.
Este artigo foi útil para você? voce tem alguma pergunta ou comentario? Sinta-se à vontade para nos enviar uma mensagem usando o formulário de comentários abaixo.