Mini-COMO FAZER Firewall François-René Rideau, fare@tunes.org Traduzido e Revisado por Conectiva Informática, info@conectiva.com.br, no dia 30 de Março de 1999. v0.3, 22 de Agosto de 1998 Orientações para o uso do ppp sobre uma conexão telnet para tornar o tráfego de rede transparente através de um firewall da Internet. ______________________________________________________________________ Índice geral 1. Material 1.1 RENÚNCIA DE UM DIREITO LEGAL 1.2 Publicidade Legal 1.3 Créditos 2. Introdução 2.1 Prefácio 2.2 Problemas de segurança 2.3 Outros requisitos 2.4 Recebendo o Programa 3. Entendendo o problema 3.1 Dando nomes às coisas 3.2 O Problema 3.3 Dificuldade adicional 4. A solução 4.1 Princípio 4.2 fwprc 4.3 .fwprcrc 5. Travessia Reversa 5.1 Exposição de Razões 5.2 Configurando a ativação automática de correio eletrônico 6. Notas Finais 6.1 Outras montagens 6.2 Manutenção do COMO FAZER ______________________________________________________________________ 11.. MMaatteerriiaall 11..11.. RREENNÚÚNNCCIIAA DDEE UUMM DDIIRREEIITTOO LLEEGGAALL PPoorr mmeeiioo ddeessttaa oo aauuttoorr nneeggaa ttooddaa aa rreessppoonnssaabbiilliiddaaddee ppoorr eessttee pprrooggrraammaa.. SSee oo ttiirroo ssaaiirr ppeellaa ccuullaattrraa,, éé aa vviiddaa.. NNããoo éé mmiinnhhaa ccuullppaa.. SSee vvooccêê nnããoo eenntteennddeerr ooss rriissccooss aaoo ffaazzeerr iissssoo,, nnããoo oo ffaaççaa.. SSee vvooccêê uussaarr eessttee pprrooggrraammaa ee eellee ppeerrmmiittiirr qquuee vvâânnddaallooss sseellvvaaggeennss iinnvvaaddaamm ooss ccoommppuuttaaddoorreess ddaa ssuuaa ccoommppaannhhiiaa ee iissttoo ccuussttaarr sseeuu eemmpprreeggoo ee àà ssuuaa ccoommppaannhhiiaa mmiillhhõõeess ddee ddóóllaarreess,, bbeemm,, iissttoo éé ssóó ppeeddrreeiirraa.. NNããoo vveennhhaa cchhoorraarr ppaarraa mmiimm.. 11..22.. PPuubblliicciiddaaddee LLeeggaall Direitos autorais & cópia; 1998 por François-René Rideau. Este documento pode ser distribuído sujeito aos termos e condições destacadas na licença LDP na <http://metalab.unc.edu/LDP/LICENSE.html>. 11..33.. CCrrééddiittooss Muito embora eu tenha reescrito quase tudo, menos a renúncia dos direitos legais, sou grato a Barak Pearlmutter bap@cs.unm.edu <mailto:bap@cs.unm.edu> pelo seu mini-COMO FAZER Term-Firewall: acho que houve necessidade de um mini-COMO FAZER sobre firewall e acessórios e apesar de suas deficiências seu mini-COMO FAZER foi um modelo e um incentivo. 22.. IInnttrroodduuççããoo 22..11.. PPrreeffáácciioo Porque os usuários e administradores têm limites e competências diferentes, pode acontecer que um usuário possa se achar atrás de um firewall, que ele pode atravessar, mas apenas de uma maneira desastrada. Este mini-COMO FAZER explica de uma maneira genérica e prática como usar as ferramentas padrão Internet através de tais firewalls através do uso de um emulador IP sobre uma sessão telnet. Este focumento é livremente inspirado pelo mini-COMO FAZER Term- Firewall de Barak Pearlmutter bap@cs.unm.edu <mailto:bap@cs.unm.edu>, que se apóia num programa antigo e não mais suportado chamado Term (ainda que tenha sido um grande programa em sua época), bem como em peculiaridades de uma implementação telnet não tão padrão, isto é, muitos fatos obsoletos e não portáteis. 22..22.. PPrroobblleemmaass ddee sseegguurraannççaa Claro que se o administrador de sistemas tiver configurado um firewall, ele deve ter uma boa razão e você pode ter assinado um acordo para não desrespeitá-lo. Por outro lado, o fato de que se poder estabelecer uma conexão com o exterior (o que é um requisito para os programas aqui apresentados funcionarem) significa ser possível acessar sistemas externos, além do fato de ser possível registrar-se neles. Assim tudo é uma questão de usar _c_o_n_v_e_n_i_e_n_t_e_m_e_n_t_e as falhas de segurança legais num firewall e permitir que programas genéricos funcionem com protocolos genéricos, ao contrário dos programas especiais exigidos ou modificados (e recompilados) atravessando muitos proxies de propósito especial que são configurados por um administrador de sistema descuidado e incompetente, ou pela instalação de muitos conversores de propósito especial para acessar cada um dos seus serviços usuais (como correio-eletrônico) através de caminhos suportados pelo firewall (como a rede). Além disso, o uso do emulador IP a nível de usuário tal como o SLiRP deve ainda prevenir atacantes externos de entrarem por uma falha de segurança do firewall de uma outra maneira, a menos que explicitamente permitida. Afinal de contas, o programa apresentado deve ser _r_e_l_a_t_i_v_a_m_e_n_t_e seguro. Porém, tudo depende das circunstâncias nas quais foram configuradas as coisas e não é possível fornecer garantias sobre este programa. Muitas coisas são intrinsecamente inseguras nas conexões da Internet, seja com este programa ou não, por isso não suponha que nada é seguro a menos que tenha boas razões para isso, e/ou usar alguma espécie de criptografia durante todo o tempo. Para resumir, não use este programa a menos que você saiba o que está fazendo. Releia a renúncia a direito legal acima. 22..33.. OOuuttrrooss rreeqquuiissiittooss Supõe-se que você saiba o que está fazendo, que você saiba como configurar uma conexão de rede; que você tenha contas de ambiente de trabalho nos dois lados do firewall; que de alguma forma se possa conectar (ou ssh, ou equivalente) de uma conta para outra; que se possa executar um emulador IP nas duas contas de ambiente de trabalho; que se tenha programas capazes de usar a conexão IP emulada em seu lado. Note que qualquer programa pode usar a conexão, no caso o emulador local é o pppd conversando com o kernel do Linux, outros emuladores, como o Term, precisam de recompilação e ligação com uma biblioteca especial. Falando de emuladores, o pppd pode ser encontrado em qualquer boa distribuição Linux ou servidor ftp, assim como o SLiRP. Se sua conta de ambiente de trabalho remota é somente a nível de usuário, você pode usar o SLiRP para conectar. 22..44.. RReecceebbeennddoo oo PPrrooggrraammaa A maioria dos programas descritos devem estar disponíveis a partir de suas distribuições padrão, possivelmente entre os contribuintes; pelo menos todos, menos os dois últimos que estão disponíveis em pacotes rpm. No caso de se querer buscar os fontes mais recentes ou binários (afinal, uma das pontas da conexão pode não estar executando o Linux) devem ser usados os endereços abaixo: · SLiRP pode ser encontrado em <http://blitzen.canberra.edu.au/slirp> e/ou <ftp://www.ibc.wustl.edu/pub/slirp_bin/>. · zsh pode ser encontrado em <http://www.peak.org/zsh/>. · ppp pode ser encontrado em <ftp://cs.anu.edu.au/pub/software/ppp/>. · fwprc e cotty pode ser encontrado em <http://www.tunes.org/~fare/files/>. 33.. EEnntteennddeennddoo oo pprroobblleemmaa Entender o problema é a metade do caminho para resolvê-lo. 33..11.. DDaannddoo nnoommeess ààss ccooiissaass Para que este programa funcione para você, há que se ter uma idéia de como ele funciona, pois se alguma coisa falhar, se terá uma idéia de onde procurar as causas. O primeiro passo em direção ao entendimento do problema é dar um nome aos conceitos relevantes. Por isso nós chamaremos aqui de "local" a máquina que inicia a conexão, bem como os programas e arquivos daquela máquina. Por outro lado chamaremos de "remoto" o que estiver do outro lado da conexão. 33..22.. OO PPrroobblleemmaa O objetivo é conectar a entrada e saída de um emulador IP local para a saída e entrada de um emulador IP remoto respectivamente. Os emuladores IP interagem somente com canais de comunicação como dispositivos diretos (como o caso comum do pppd) ou o "terminal atual". O caso anterior obviamente não acontece com as sessões telnet. O último é complicado, porque quando se lança o emulador local a partir da linha de comando, o terminal atual é ligado à linha de comando do usuário e não à uma sessão remota. Devemos abrir uma nova sessão (local ou remota) num novo terminal, sincronizar o lançamento e a conexão dos emuladores IP nos dois lados, pois a menor parcela de saída de lixo de uma sessão poderá ser entendida como comandos na outra sessão, o que recursivamente produziria mais lixo. 33..33.. DDiiffiiccuullddaaddee aaddiicciioonnaall Para facilitar o uso, o emulador IP local tem que prover um IP para o kernel de rede, ou seja habilitar o pppd. Porém o pppd é limitado para só aceitar dados através de arquivos /dev ou através do terminal em uso. Ou seja, deve ser um tty e não um par de conectores. Isto é ótimo para o pppd remoto se houver, pois ele pode usar o tty das sessões telnet, mas o pppd local não pode lançar a sessão telnet para conectar-se, conseqüentemente deve haver algum tipo de invólucro ao redor dele. O telnet se comporta _q_u_a_s_e corretamente com um par de conectores, exceto que ainda insistirá em executar controles de entrada e saída no terminal atual, com o qual interferirá. Usar telnet sem um tty também causa condições de uso intenso de recurso, de maneira que toda a conexão falhará nos computadores "lentos". (fwprc 0.1 funcionou perfeitamente num Pentium MMX 233, uma vez em 6 num 6x86-P200+ e nunca funcionará em um 486dx2/66). [Nota: se eu encontrar o autor (provavelmente uma cara da MULTICS , embora tenha havido pessoas de UNIX tolas o suficiente para copiar a idéia) que inventou o princípio dos dispositivos "tty" pelos quais se pode ler e escrever um "mesmo" pseudo arquivo, ao invés de ter pares de conectores, eu o estrangulo!] 44.. AA ssoolluuççããoo 44..11.. PPrriinnccííppiioo O programa complementar de firewall, fwprc, usará um "proxy tty " denominado cotty, que abre dois dispositivos pseudo tty, lança alguns comandos em cada daqueles dispositivos e copia todos os caracteres de saída para o terminal, os quais servem de entrada para outro comando. Um comando será a conexão telnet com o servidor remoto e o outro será o pppd local. O pppd pode então abrir e controlar a sessão telnet através um programa de acesso normal. 44..22.. ffwwpprrcc Eu escrevi um programa muito bem documentado para complementar firewalls chamado fwprc, disponível do meu servidor <http://www.tunes.org/~fare/files/>, junto com cotty (que é requisitado por fwprc 0.2 e posteriores). Ao escrever estas linhas, as versões mais recentes eram fwprc 0.2a e cotty 0.3. O nome "fwprc" foi feito propositadamente ilegível e impronunciável, de maneira que ele possa confundir o administrador de sistema paranóico e incompetente que possa ser o responsável pelo firewall que irrita você (claro que pode haver firewalls legítimos também). CONCURSO: mande-me um arquivo de áudio .au com uma gravação de áudio digital de como você pronuncia "fwprc". A pior entrada ganhará uma atualização gratuita e seu nome na página do fwprc 0.3! Testei o programa em vários ambientes, configurando-o, através de arquivos de recursos. Mas claro, pela lei de Murphy, ele falhará em algum momento. Sinta-se à vontade para contribuir com sugestões e conselhos que tornarão mais fácil a vida de outras pessoas que farão a configuração depois de você. 44..33.. ..ffwwpprrccrrcc O fwprc pode ser personalizado através do arquivo .fwprcrc, feito para ser igual nos dois lados da firewall. Existem várias configurações alternadas para se escolher, porém também indicamos ele como um exercício para o leitor. Para iniciar, copie a seção apropriada de fwprc (o anterior por exemplo) para um arquivo chamado .fwprcrc em seu diretório pessoal. Então substitua os valores variáveis por configurações que se ajustem à sua configuração. Finalmente, copie para a outra máquina e teste. O comportamento padrão é usar o pppd localmente e o slirp remotamente. Para modificar isto, pode-se redefinir a função apropriada no .fwprcrc na linha como: remote_IP_emu () { remote_pppd } Note que o SLiRP é mais seguro que o pppd, e mais fácil de se ter acesso, uma vez que ele não requer que a máquina remota tenha privilégios de superusuário. Uma outra característica segura é que ele abandonará os pacotes que não venham diretamente da máquina conectada (cuja característica se torna um problema ao se tentar rotear uma subrede sobre ela com mascaramento). A funcionalidade básica do SLiRP funciona bastante bem, mas achei que os sinais de soma publicados (como no controle de tempo corrido) eram deficientes. Claro que desde que é um programa gratuito, sinta-se à vontade para programar a fonte de maneira a implementar realmente a característica que você precisa. 55.. TTrraavveessssiiaa RReevveerrssaa 55..11.. EExxppoossiiççããoo ddee RRaazzõõeess Às vezes, só um lado da firewall pode lançar sessões telnet para o outro lado; porém, alguns meios de comunicação são possíveis (tipicamente através do correio-eletrônico). Atravessar o firewall é ainda possível, através da habilitação da capacidade de troca de mensagens em uma conexão telnet a partir do lado certo do firewall para o outro. O fwprc inclui o código para iniciar tais conexões de uma mensagem de correio-eletrônico autenticada via PGP. Tudo o que se precisa é acrescentar fwprc como um filtro do procmail(1) para mensagens (instruções incluídas em fwprc). Note-se porém, que se for lançar o pppd com os privilégios apropriados, você pode precisar criar seu próprio suid para se tornar um superusuário. Instruções inclusas em fwprc. Também o início de sessão autenticada não significa nem remotamente uma conexão segura. Deve-se realmente usar o ssh (talvez sobre o telnet) para conexões seguras. E então, cuidado com o que acontece entre o início da conexão da telnet e o ssh assumindo o comando daquela conexão. 55..22.. CCoonnffiigguurraannddoo aa aattiivvaaççããoo aauuttoommááttiiccaa ddee ccoorrrreeiioo eelleettrrôônniiccoo Caso se esteja dentro de uma área sob um firewall, as mensagens podem estar num servidor central que não tenha filtros procmail ou que não permita sessões telnet. Sem problemas! Pode-se usar o fetchmail(1) em modo servidor para apurar e obter as mensagens do cliente em um sistema Linux, e/ou acrescentar uma tarefa em horário pré-definido para apurar automaticamente a correspondência a cada 1 a 5 minutos por exemplo. O fetchmail enviará as mensagens a um endereço local através do sendmail(8), que terá sido configurado para usar o procmail(1) para entrega. Note que se você executar o fetchmail(1) como um servidor de segundo plano, ele irá evitar qualquer outra instância do fetchmail que se gostaria de executar somente em outro momento, como quando se executa o fwprc. Logicamente também pode-se executar um servidor fetchmail como um outro usuário. Muito freqüentemente a busca de mensagens não será boa nem para o servidor nem para sua máquina. Muito raramente ela significará que se deva esperar para que a mensagem fique pronta e a conexão inversa se estabeleça. Uso uma freqüência de dois minutos para a busca de mensagens. 66.. NNoottaass FFiinnaaiiss 66..11.. OOuuttrraass mmoonnttaaggeennss Há outros tipos de firewalls além daqueles que permitem conexões telnet. Contanto que um fluxo contínuo de pacotes possam atravessar uma firewall e transmitir informações de duas maneiras é possível penetrá-la, porém o preço de escrever um programa que transpasse o firewall pode ser mais alto ou mais baixo. Num caso simples, pode-se lançar o ssh sobre um pty e executar pppd em um tty escravo. O cotty 0.3 deve ser capaz de executá-lo, mas ninguém modificou ainda o fwprc para tanto. Talvez seja o exercício da noite para você. Pode-se até mesmo querer fazê-lo sem um firewall na outra extremidade da rede, a fim de construir uma "VPN" (Rede Virtual Privada). Se precisar usar uma linha de 7 bits, pode-se querer usar SLIP ao invés do PPP. Nunca tentei porque as linhas usam normalmente 8 bits, mas não deve ser difícil. Agora, se a única maneira de cruzar uma firewall for um proxy WWW (usualmente, o mínimo para uma rede conectada a Internet), pode-se querer escrever um servidor que guarde os dados em buffers e os envie durante as conexões HTTP, usando sessões telnet sobre HTTP, onde se executa o fwprc. Pode ser lento e não muito ágil, mas ainda é bom o suficiente para se usar o fetchmail(1), suck(1) e outros programas não interativos. Caso se queira um melhor desempenho, ou se a única coisa que pode passar sem filtro é algo menos usual (perguntas DNS, pacotes ICMP, ou o que quer que seja), então pode-se estar numa situação difícil onde se terá que reprogramar uma pilha IP usando (por exemplo) as funções de protocolo do projeto Fox. Será possível alcançar alguns IPs sobre HTTP, IPs sobre DNS, IPs sobre ICMP, ou outros, que exigem não somente um protocolo complexo, mas também uma interface com o kernel, onde ambas as soluções têm implementações custosas. A propósito, ao se usar algum servidor HTTP que passe através de um Firewall, não esqueça de fazê-lo servir páginas falsas para enganar os administradores de firewall contrários desconfiados. 66..22.. MMaannuutteennççããoo ddoo CCOOMMOO FFAAZZEERR Eu senti que era necessário escrevê-lo, mas eu não tenho aquele tempo disponível, por isso este mini COMO FAZER é ainda um pouco rudimentar. E assim será até que se receba retorno suficiente para saber que seções melhorar. O retorno é bem vindo. Ajuda também. De qualquer maneira as seções acima mostraram muitos problemas cujas soluções são só uma questão de alguém (você?) gastar algum tempo (ou dinheiro, contratando outra pessoa) para sentar e escrever: nada conceitualmente complicado, embora os detalhes possam ser complexos. Não hesite em contribuir com mais problemas e se Deus quiser com mais soluções para este mini-COMO FAZER.