Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom Bar]
[Photo of the Author]
Javi Polo
Sobre o autor: Sou um sofrido estudante secundarista que leva o catalão para setembro, tenho 18 anos e minha grande paixão é a informática, espero entrar no ano que vem na UIB para fazer I. T. Telemática, e ver se logo me formo em Engenheiro Superior de Informática. Gosto de músicas hardcore e tenho um grupo de música onde toco baixo chamado Niko-Chan's Kingdon. Afora a isso, tenho mais que dizer, tenho uma namorada fabulosa que se chama Xiska O:)

Escreva ao Autor

TCPD e Firewalls usando IPFWADM

[Ilustration]

Resumen: Neste artigo revisamos a grosso modo a configuração dos serviços oferecidos pela inetd e como usar a ferramenta IPFWADM para aumentar a segurança de nosso sistema.




Bom, para começar, temos que deixar claro o que inetd, que é básicamente um daemon que controla os serviços que pode ter numa máquina conectada a internet, mas também que não controla todos por padrão, assim que, dê uma olhada no arquivo /etc/inetd.conf e olhe os serviços que ele dá na sua máquina (os que estão sem comentários, isto é, sem a cerquilha -#- antes). O que se tem que fazer antes, lógicamente, é não dar mais serviços do que os que queremos dar, para evitar assim possíveis brechas de segurança por falha no daemon que não usamos para nada. Uma vez visto o arquivo de então, expliquemos seu funcionamento:

Por exemplo, a linha:
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a

Primeiro que tudo é o nome do serviço (neste caso "ftp", que buscará nele /etc/services a que porta corresponde.

No segundo campo é o tipo de porta que se abre, e pode ser de vários tipos: stream (como no exemplo), dgram, raw, rdm e seqpacket

O terceiro campo é o protocolo a utilizar, que tem de estar definido em /etc/protocols (neste caso é o protocolo TCP)

O quarto campo é para indicar wait/nowait (esperar/não esperar), este campo deve ser sempre nowait, exceto para os sockets do tipo dados (dgram), é nele que especificamos se o servidor de dados é multithread (então indicamos nowait, já que o servidor ao receber uma chamada, lança o processo em um thread -al ser multithread:) - e libera a porta para que inetd possa continuar recebendo mensagens na porta) ou se é singlethread (indicamos wait, já que o servidor atende sempre na mesma porta e não pode lançar em outros processos). Além de, podermos acrescentar uma caixa postal neste campo, por exemplo: nowait.50 (quer dizer, um número separado do wait/nowait por um ponto). Este número representa o número máximo de daemons que pode usar (ou de petições aceitas, conforme se olhe) em 1 minuto. Por default es 40.

O quinto campo indica o nome do usuário com o qual deve executar o daemon, neste caso será como root.

O sexto e os seguintes, são o programa a ser executado seguido dos parâmetros que são passados ao programa. Indicamos aquí que o daemon é executado como tcpd, e como argumentos o daemon in.ftpd com os parâmetros -l -a. Agora chega a parte mais interessante deste primeiro troço do artigo, que é o que engloba o TCPD.

Bom o tcpd é um daemon que filtra as petições, e faz uma ou outra coisa dependendo do daemon a ser usado e do IP que pede o serviço. Isto é feito mediante o /etc/hosts.allow y /etc/hosts.deny

No princípio, usamos /etc/hosts.deny para indicar a quem e a quem não é permitido o acesso, e o /etc/hosts.allow para dizer quem e a quem podemos consentir.

O formato de ambos arquivos é:
daemon: IP[: OPTION1 [: OPTION2 ]]

onde daemon puede ser el daemon a usar, como no exemplo acima, o in.ftpd, ou também pode ser ALL, referindo-se a todos os daemons.

IP puede ser tanto um IP ou uma URL, como uma faixa de IPs (ou de URLs), como qualquer um dos comodines que explico depois.

Para indicar uma faixa de IPs, por exemplo, fazemos assim: `123.32.' Isto englobaria todas as IPs 123.32.XXX.XXX E o mesmo para as URLs: `.ml.org' englobaria todos os subdominios de ml.org

Também podemos determinar uma faixa de IPs da forma tradicional IP/MASCARA De forma que por exemplo, para indicar a faixa 127.0.0.0 a 127.0.255.255 indicaríamos assim: 127.0.0.0/255.255.0.0

Os comodines são:
ALL indica que conincide com qualquer endereço entrado
LOCAL indica que coincide com qualquer nome que tenha um "."
UNKNOWN que coincide com aquelas máquinas das que não se conhece seu nome ou seu IP
KNOWN que coincide com as máquinas que se conhece tanto seu nome como seu IP
PARANOID que coincide com aquelas máquinas na qual seu nome não coincide com seu IP
As opções podem ser:

accept faz com que o que se indicou nessa entrada deve ser aceito na conexão, independente de se estar no hosts.allow ou no hosts.deny Deve ser a última opção da linha.
deny é como a anterior, mas ignorando a conexão.
spawnexecuta u comando shell ( pode ser que se queira executar alguma coisa, toda vez que estabelecemos uma conexão que coincida com a linha), eu por exemplo, faço quando recebo qualquer conexão de fora, e xecuta um som para indicar para informar que alguém tenta conectar com minha máquina.
twisté como o comando spawn, mas cortando a conexão ao ser executado o comando. Também deve ser a última opção da linha.

Para os dois últimos comandos, podemos usar as expansões permitidas ao tcpd. Estas são:

%a endereço da máquina cliente
%c Informação do cliente (pode ser usuario@máquina, ou o que seja, dependendo do cliente)
%d
%h nome ou IP da máquina cliente, o que estiver disponível
%n nome da máquina cliente
%p PID do daemon
%s informação do servidor (daemon@máquina ou só daemon, depende)
%u Nome do usuario cliente
%% É um simples caracter %

Com estas expansões e esses dois comandos podemos fazer muitas coisas, por exemplo, sei que alguém tentava entrar por telnet, e lhe mandava automáticamente um teardrop ao feliz intruso :)

NOTA: Um teardrop é um DoS (Denial of Service, uma forçada para suspender a máquina ou provocar que se reinicie) baseado em aproveitar a falha de defragmentação dos diretórios TCP que temos (tinham, já que muitos tenha sido destruidos) de grande parte dos sistemas Operacionais. A informação é enviada através da InterNet pelo protocolo TCP/IP (usado também em outros tipos de redes, independente da Internet, como por exemplo intranets), o protocolo TCP se encarrega de trocar a informação em pacotes que logo o protocolo IP se encarrega de fazer chegar a seu destino, e uma vez lá, o protocolo TCP comprova que estão todos os pacotes e os junta para recompor a informação original. Estes ataques (e muitos baseados nele), o que faz é aproveitar-se de que em muitos Sistemas Operacionais, não se comprova se o tamanho do pacote antes de juntos era muito pequeno, e ao ser assim a máquina faria um novo pacote na hora de juntá-los. Não estou completamente seguro de que seja assim, evidentemente, aceito todo tipo de contribuição e críticas, tanto positivas como negativas. Finalizando esta "pequena"explanação, continuemos...

Ejemplos:
#hosts.allow 

ALL: 127.0.0.1 #deixa entrar todo os localhost

in.ftpd: ALL: spawn (wavplay /usr/share/sounds/intruso.wav & )
# deixa entrar qualquer um por ftp, mas enviando um
# som wav (para que me cientifique)

in.telnetd:  ALL: twist ( teardrop %h %h )
# manda um teardrop a quem tentar 
# entrar pela telnet

#fin
#hosts.deny

ALL: `.bsa.org'   # não deixa entrar ninguém do domínio bsa.org

in.fingerd: ALL	  # o serviço de finger é fechado para todos:)

#fin

Bem, isto é tudo o que tenho para dizer sobre o tcpd, já os disse que meus conhecimentos não eram muitos. Prova-os, experimente-os e leia-os as páginas do manual ( tcpd, host_access(5) ) Com certeza, desta maneira aprenderás muito mais do que eu os possa ensinar.

Passemos agora ao uso da ferramenta IPFWADM

Primeiro de tudo, é ter o suporte IP Firewalling no kernel ( Networking -> Network firewalls + IP: firewalling ) Em seguida, recompila o kernel e reinicie o computador, passemos a explicar a utilidade desta ferramenta.

Esta ferramente permite entre outras coisas (serão as únicas que centralizarei) gerir a entrada e a saída de pacotes dos protocolos TCP, UDP e ICMP. Em resumo, nós indicamos que os pacotes devem permitir entrar, podendo especificar se vem de uma IP ou grupo de IPs concretos, a um local seguro, com um protocolo seguro, e todas as possíveis opções que podemos fazer, e o mesmo com os pacotes que vão sair.

ipfwadm tem vários parâmetros principais:

  • -A especifica as regras de accounting
  • -I especifica as regras para os pacotes que estão entrando
  • -O especifica as regras para os pacotes que estão saindo
  • -F especifica as regras de reenvio de pacotes
  • -M é para a administração do IP masquerading

Neste artigo só falarei dos parâmetros -I e -O. Para ambos são usados a mesma sintaxe.

Sub-parâmetros dos parâmetros principais são:

  • -a acrescenta uma ou mais regras ao final da lista
  • -i acrescenta uma ou mais regras no início da lista
  • -d apaga uma ou mais regras da lista
  • -l mostra as regras da lista
  • -f apaga as regras da lista
  • -p indicam se os pacotes devem ser aceitos (a), negar (d) ou recusar (r)
  • -c comprova que tipo de regra será seguido por um pacote
  • -h ajuda
Os parâmetros "importantes" são:

-P especifica o protocolo a ser aplicado na regra, pode ser TCP, UDP, ICMP ou all (para indicar qualquer protocolo)
-S especifica o endereço de origem do pacote. O formato é: ENDEREÇO[/MASCARA] [PORTA] Por exemplo, um endereço válido seria 123.32.34.0/255.255.255.250 25 para indicar a faixa de IPs desde 123.32.34.0 a 123.32.34.5
-D especifica o endereço de destino. Tem o mesmo formato que -S

Básicamente estes são os parâmetros fundamentais, para permitir que as informações cheguem a minha máquina, acrescento a regra:

ipfwadm -I -i a -S 127.0.0.1

e para descartar os pacotes que venha desde 123.34.22.XXX indico:

ipfwadm -I -a d -S 123.34.22.0/255.255.255.0

e se quero recusar TODO acesso a porta de netbios, menos para a IP 111.222.123.221, faria assim:

ipfwadm -I -a a -P tcp -S 111.222.123.221 139
ipfwadm -I -a d -P tcp -D 0.0.0.0/0 139

Bem, creio que isto é todo meu artigo, um pouco pobre, mas meus conhecimentos não chegam a mais O:)


Esta website é mantida por Miguel Angel Sepulveda
© Javi Polo 1998
LinuxFocus 1998