Palestra - Segurança da Informação - Softwarein Legal
Configuração do filtro TCP Wrappers no Linux
1. 1 Filtro TCP Wrapper - tcpd Luiz Arthur
Verificação da configuração do filtro TCP Wrappers (tcpd)
Servidores Linux, como o Slackware, implementam um recurso conhecido como
TCP wrappers, uma técnica projetada para proteger serviços implementados
usando-se o superdaemon de ligação entre redes (inetd ou xinetd).
O TCP wrappers é implementado usando-se dois arquivos, um que controla o
que é especificamente aceito na rede (/etc/hosts.allow) e outro que especifica
negativas das redes (/etc/hosts.deny).
Muitos programas têm a capacidade de oferecer suporte a TCP wrapper,
incluindo FTP e telnet, assim como outros protocolos conhecidos, porém outros
como HTTP e o X Windows System usam seus próprios sistemas de logon e
controle de acesso.
Alguns aplicativos de código fonte aberto possuem suporte incorporado para
tcp_wrappers. Um bom exemplo é o Samba, cujo controle de tcp_wrappers é
efetuado usando-se instruções de controle dentro de seu arquivo de configuração.
Os dois parâmetros que efetuam tal controle são hosts allow e hosts deny.
A configuração padrão do Linux não inclui regras e, portanto, permite que todas
as comunicações ocorram. O comportamento padrão do tcp_wrappers é negar
acesso a serviços definidos em hosts.deny, a menos que haja uma regra
especifica em hosts.allow para permitir isso. Cada regra é avaliada do inicio ao
fim, de modo que uma regra posterior possa substituir uma regra anterior.
2. 2 Filtro TCP Wrapper - tcpd Luiz Arthur
O software de encapsulamento TCP wrapper conhecido também como tcpd é
executado pelo inetd ou xinetd. Usar tcpd em um sistema Linux é fácil porque as
entradas no arquivo /etc/inetd.conf já apontam para o programa tcpd.
As seguintes entradas são do arquivo /etc/inetd.conf em um sistema Linux:
ftp stream tcp nowait root /usr/sbin/tcpd vsftpd
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
shell stream tcp nowait root /usr/sbin/tcpd in.rshd -L
login stream tcp nowait root /usr/sbin/tcpd in.rlogind
talk dgram udp wait root /usr/sbin/tcpd in.talkd
Como mostra este exemplo, o caminho para tcpd é usado em lugar do caminho de
cada daemon de serviço da rede. Então, quando o inetd recebe uma solicitação
para um serviço ele inicia o tcpd. O tcpd então registra a solicitação do serviço,
verifica a informação de controle de acesso, e (se autorizada) inicia o daemon
real para manipular a solicitação.
O programa tcpd executa duas funções básicas: registrar solicitações para
serviços de rede, e fornecer um mecanismo de controle de acesso para
estes serviços.
Solicitações de registro para serviços de rede específicos é uma função de
monitoramento útil, especialmente se você estiver procurando intrusos.
3. 3 Filtro TCP Wrapper - tcpd Luiz Arthur
O tcpd usa a facilidade authpriv do syslogd para registrar suas mensagens
(para maiores informações procure pelo arquivo /etc/syslog.conf).
Normalmente as mensagens de registro geradas pelo tcpd são armazenadas em
/var/log/secure.
Jun 3 17:25:40 darkstar login[4547]: ROOT LOGIN on `tty6'
Jun 6 12:06:08 darkstar in.telnetd[6587]: connect from 10.0.0.1 (10.0.0.1)
May 9 14:05:27 darkstar vsftpd[5458]: connect from 192.168.73.10 (192.168.73.10)
May 9 14:10:50 darkstar vsftpd[5467]: connect from 192.168.73.6 (192.168.73.6)
O arquivo /var/log/secure, não apresenta somente arquivos do tcpd, mas
também mensagens para login. Mas podemos ver na segunda mensagem de 6 de
junho que houve um acesso ao serviço telnetd feito pela máquina 10.0.0.1 e
nas duas últimas linhas são apresentadas acessos ao servidor vsftpd vindo da
rede 192.168.73.0.
Se o tcpd apenas registrasse acessos ele já seria muito útil. Mas o real poder
desta ferramenta é sua habilidade para controlar acesso a serviços de rede.
Arquivos de controle de acesso tcpd
Dois arquivos definem controles de acesso para o tcpd:
O arquivo /etc/hosts.allow, lista os hosts que estão autorizados a acessar os
serviços do sistema;
O arquivo /etc/hosts.deny lista os hosts aos quais são negados o serviço.
4. 4 Filtro TCP Wrapper - tcpd Luiz Arthur
Se estes arquivos não forem encontrados (não estiverem no sistema) ou
estiverem em branco, o tcpd irá permitir a todo host ter acesso ao sistema, e
simplesmente registra a solicitação de acesso.
Quando os arquivos estão presentes no sistema, o tcpd lê o arquivo
/etc/hosts.allow primeiro e depois lê o arquivo /etc/hosts.deny. O tcpd pára
assim que encontra uma combinação para host e o serviço em questão. Então, o
acesso dado pelo arquivo /etc/hosts.allow não pode ser anulado pelo arquivo
/etc/hosts.deny.
O formato de entradas de ambos os arquivos é o mesmo:
services : clients [: shell-comand]
service - é uma lista separada por vírgula, de serviços de rede ou a palavra-
chave ALL:ALL é usada para indicar todos os serviços da rede. Caso contrário,
cada serviço individual é identificada por seu nome de processo, que é o nome
segue no arquivo /etc/inetd.conf.
clients – é uma lista separada por vírgula de nomes de host, nome de domínio, o
endereço IP, e a palavra LOCAL. Alternativamente, pode ser a palavra chave ALL
para especificar todos os hosts.
shell-command - é um comando de shell opcional que o tcpd executa quando
uma comparação ocorre.
5. 5 Filtro TCP Wrapper - tcpd Luiz Arthur
Alguns exemplos podem ilustrar a variedade e modos válidos nos quais podem ser
descritos services e clients em uma entrada de controle de acesso tcpd.
ALL : LOCAL, .empresa.com.br
in.ftpd, in.telnetd : micro1.rede.com
A palavra-chave ALL no campo services indica que a primeira regra se aplica a
todos os serviços de rede. No campo clients, a palavra LOCAL indica que todos
os nomes de hosts sem uma parte de domínio são aceitas, e .empresa.com.br
compara todos os nomes de hosts neste domínio. A segunda regra dá acesso ftp
e telnet a usuários ao sistema remoto chamado de micro1.rede.com.
A sintaxe de um arquivo de controle de acesso tcpd padrão pode ser um pouco
mais complicada, tal como segue:
imapd, ipopd3 : 172.5.4.
ALL EXCEPT impad, ipopd3: ALL
A palavra EXCEPT é usada para excluir itens de uma lista e também pode ser
usada no lado clients de uma regra de acesso. Por exemplo:
ALL: .empresa.com.br EXCEPT gateway.empresa.com.br
6. 6 Filtro TCP Wrapper - tcpd Luiz Arthur
A primeira regra colocada em um arquivo de controle do TCP wrapper é a regra
ALL:ALL em /etc/hosts.deny, tal regra nega todos os serviços, mas uma regra
melhor é bloquear todos os serviços não definidos explicitamente é criar a ultima
entrada em /etc/hosts.allow como ALL:ALL:DENY eliminando a necessidade de
um arquivo /etc/hosts.deny.
Tipos de entradas do hosts deny e allow:
Endereço IP: 192.168.0.100 corresponde a um IP único;
193.168.0. corresponde à rede inteira 192.168.0.0 se uma
poção é deixada de lado toda a porção a direita é tratada como
zero
Nome do host: segurança.dominio.com.br corresponde a qualquer solicitação
do host segurança.dominio.com.br
.dominio.com.br corresponderia a qualquer solicitação de
qualquer coisa dentro do domínio dominio.com.br
Rede/Máscara da rede: 192.168.0.0/255.255.255.0 corresponderia a tudo
na rede de classe C 192.168.0.0.
Netgroups NIS (YP): Tudo com @ como caractere à esquerda é tratado
como netgroups NIS
7. 7 Filtro TCP Wrapper - tcpd Luiz Arthur
Note que, quando são usados nomes de domínio ou nomes de hosts, as falhas de
DNS podem causar problemas no acesso às máquinas, por isso é recomendado
usar endereços IPs.
É possível utilizar o operador EXCEPT para permitir excluir determinados clientes
de uma correspondência.
# vi /etc/hosts.allow
sshd: .dominio.com.br EXCEPT bad.dominio.com.br
in.telnetd: 192.168.0.6, 10.0.0.0/255.0.0.0 EXCEPT 10.0.0.5
portmap: 192.168.0.100
ALL:ALL:DENY
Caracteres curinga TCP Wrappers:
Caracteres curinga
ALL Corresponde a todos
KNOWN Corresponde a um host cujo nome e endereço são conhecidos (via
serviços de nome).
LOCAL Qualquer nome que não contenha ponto.
PARANOID Corresponde a um host cujo nome não corresponde ao endereço
(colocando-se ALL:PARANOID em /etc/hosts.allow seria negado
acesso a todas as máquinas cujo IP não corresponde ao seu IP)
UNKNOWN Quando um nome de host ou endereço é desconhecido porque não
pode ser resolvido usando-se as chamadas de sistema que
implementam resoluções de nome.
8. 8 Filtro TCP Wrapper - tcpd Luiz Arthur
Um outro recurso interessante do TCP wrappers é que ele pode executar
comandos quando uma condição é correspondida.
Por exemplo, você pode colocar a seguinte linha no seu arquivo /etc/hosts.deny
para enviar um e-mail para administrador@dominio.com.br toda vez que há
falha de conexão:
# vi /etc/hosts.deny
ALL:ALL : spawn (/bin/echo Alerta de segurança no host: %a no serviço %d na
‘date’ | tee –a /var/log/security_Alert | mail administrador@dominio.com.br)
Se algo não corresponde a nenhuma das regras em /etc/hosts.allow e
corresponde à condição ALL:ALL em /etc/hosts.deny deverá ser escrito:
Alerta de segurança no host: %a no serviço %d na data
E está enviando isso para /var/log/security_Alert assim como enviando por
e-mail as informações para administrador@dominio.com.br . O %a e %d dentro
do comando gerado com spawn são expansões disponíveis em TCP wrappers.
9. 9 Filtro TCP Wrapper - tcpd Luiz Arthur
Expansões de TCP Wrapper
Expansão Descrição
%a Endereço do host cliente
%A Endereço do host servidor
%c Todas as informações de clientes disponíveis
%d Informações de processos daemon
%h Nome do host ou endereço se não houver nome disponível
%H Node do servidor ou endereço
%n Nome do host do cliente
%N Nome do host do servidor
%p ID de processo daemon
%s Todas as informações de servidor disponíveis
%u Nome de usuário do cliente
Extensões de linguagem de controle de acesso opcionais
Se o tcpd for compilado com PROCESS_OPTIONS habilitado no Makefile, a sintaxe
da linguagem de controle de acesso é alterada e estendida. A sintaxe de comando
estendida é:
services : clients : option : option
10. 10 Filtro TCP Wrapper - tcpd Luiz Arthur
O campo services e o campo clients são definidos exatamente do mesmo modo
com eles estavam na sintaxe Wrapper original. O campo option é novo e assim é
o fato de múltiplas opções serem permitidas para cada regra. Há várias opções
possíveis, sendo algumas:
allow – Permite o serviço solicitado.
deny - Nega o serviço solicitado.
spawn shell-command – Executa o comando shell como um processo filho.
twist shell-command – Executa o comando shell ao invés do serviço solicitado.
keepalive – Envia mensagens keepalive ao cliente. Se o cliente não responder, a
conexão é fechada.
liger seconds – Especifica quanto tempo o sistema deve tentar entregar dados
depois do servidor fechar a conexão.
rfc931[timeout] – Usa o protocolo IDENT para procurar o nome de usuário do
cliente. Timeout (intervalo) define quantos segundos o servidor deve esperar
pela resposta do cliente.
banners path – Exibe os conteúdos de um arquivo de mensagens para o cliente
sendo path o caminho ao arquivo de banner.
11. 11 Filtro TCP Wrapper - tcpd Luiz Arthur
nice [number] – ajusta o valor de nice para o processo de serviço de rede. O
valor nice é usado para calcular uma prioridade de execução. O valor padrão é
10.
umask mask – Ajusta um valor de umask para arquivos criados pelo processo
iniciado pelo tcpd.
user user[.group] – Executa o processo de serviço de rede com o ID de usuário
de ID de grupo especificados indiferente ao que está definido em
/etc/inetd.conf.
setenv name value – ajusta uma variável de ambiente para o ambiente do
momento de execução do processo.
Com a sintaxe nova, não há nenhuma necessidade de ter dois arquivos, pois a
opção ALLOW e DENY podem existir em único arquivo.
Usando as opções ALLOW e DENY, este comando:
ALL: .empresa.org EXCEPT micro1.empresa.org
pode ser reescrito como:
ALL: micro1.empresa.org :DENY
ALL: .empresa.org : ALLOW
12. 12 Filtro TCP Wrapper - tcpd Luiz Arthur
O exemplo de comando shell que usa a sintaxe original é quase a mesma:
in.rsh : ALL : spawn (safe_finger -l @%h | mail -s %d - %h root) & : DENY
Uma variação mais interessante no tema de comando shell vem de usar a opção
twist. Em vez de passar um comando ao shell para execução, o comando twist
executa um programa para o cliente – mas não o programa que o cliente espera.
Por exemplo:
in.ftpd : ALL: twist /bin/echo 421 FTP não é permitido para %h : DENY
Neste caso, quando o sistema remoto tenta iniciar o daemon FTP, echo é iniciado
no lugar. O programa echo então envia a mensagem ao sistema remoto e termina
a conexão.