Conceitos básicos
TCP Wrapper pode ser visto como uma camada adicional de proteção, permitindo criar listas de controle de acesso (ACLs) específicas para cada serviço compilado com suporte a biblioteca libwrap.
TCP Wrapper é baseado em uma abordagem por endereçamento de "host / rede" (host-based) permitindo uma granulação das permissões, ou negações, baseado no IP do host ou da rede de origem da requisição.
No
Debian 6, o executável
/usr/sbin/tcpd (TCP Wrapper Daemon) é instalado, por padrão, pelo pacote "tcpd" e a biblioteca "libwrap" pelo pacote "libwrap0".
# dpkg -p libwrap0
# dpkg -p tcpd
Para saber se um serviço oferece suporte para "libwrap", utilizamos o comando
ldd (1) - List Dynamic Dependencies – sobre o daemon do serviço.
Por exemplo:
/usr/sbin/sshd é o daemon do serviço SSH no Debian 6.
Para confirmarmos o suporte a "libwrap.so.0" em SSHD, utilizamos o seguinte comando:
# type -P sshd | xargs ldd | fgrep libwrap
Saída:
libwrap.so.0 => /lib/libwrap.so.0 (0xb7685000)
Confirmado!
Funcionamento
Um serviço como SSHD, normalmente não é ativado por xinetd, então, o suporte para TCP Wrapper é compilado diretamente com a opção durante a compilação (--with-libwrap), para tornar o suporte interno ao programa.
Observe que isso implica em uma mudança no código do programa, que passa a ter acesso às funções da biblioteca "libwrap". Através de
/usr/sbin/tcpd, é feita a leitura das regras de ACL TCP Wrapper, contidas em
/etc/hosts.allow e
/etc/hosts.deny.
Observe o esquema seguinte:
O Host (H) deseja conectar-se ao servidor SSH via TCP na porta (P).
O servidor SSH tem o suporte libwrap ativado internamente, então uma consulta aos arquivos em
/etc/hosts.allow e
/etc/hosts.deny é feita, via tcpd, levando em conta as seguintes situações:
- A não existência dos arquivos /etc/hosts.allow e /etc/hosts.deny é tratada como se ambos existissem e estivessem vazios;
- A procura por uma regra pára, quando uma que combina é encontrada;
- O acesso é garantido quando uma regra combinar com uma requisição (daemon, cliente) existente em /etc/hosts.allow, que é lido primeiro;
- O acesso é negado quando uma regra combinar com uma requisição (daemon, cliente) existente em /etc/hosts.deny, lido após hosts.allow.
Se a requisição (daemon, cliente) não for localizada em ambos arquivos, então o acesso é GARANTIDO, ou seja, a política padrão para TCP Wrapper é ACEITAR a requisição se não houver uma regra contrária.