O COMO FAZER sobre a VPN Arpad Magosanyi v0.2,7 Aug1997 v0.2, 7 de Agosto de 1997 11.. MMuuddaannççaass O 'problema sem controle do tty' -> -o 'BatchMode yes' por Zot O'Connor Avisos sobre o kernel 2.0.30. 22.. BBlluurrbb Este é o COMO FAZER sobre a VPN do Linux, uma coleção de informações de como configurar uma Rede Virtualmente Protegida no Linux (e outros `Unixes' em geral). 22..11.. DDiirreeiittooss AAuuttoorraaiiss Este documento é parte do Projeto COMO FAZER Do Linux. A nota dos direitor autorais é a seguinte: A menos que não declarado, os direitos autorais dos documentos COMO FAZER do Linux são dos seus respectivos autores. Os documentos COMO FAZER do Linux podem ser reproduzidos e distribuídos totalmente ou em partes, em qualquer meio físico ou eletrônico, tão longa como esta nota de direitos autorais é mantida em todas as cópias. A redistribuição comercial é permitida e encorajada; no entanto, o autor gostaria de ser notificado de tais distribuições. Todas as traduções, trabalhos derivados ou agregados incorporando quaisquer documentos COMO FAZER do Linux devem ser abrangidos por esta nota de direitos autorais. Por isso, você não pode produzir um trabalho derivado de um COMO FAZER e impor restrições adicionais a esta distribuição. Exceções a estas regras podem ser concedidas; por favor contate o coordenador no COMO FAZER do Linux no endereço dado abaixo. Resumindo, desejamos promover a disseminação desta informação através de quantos canais forem possíveis; no entanto, desejamos conservar os direitos autorais nos documentos COMO FAZER, e gostaríamos de sermos notificados de quaisquer planos de redistribuir os COMO FAZER. Se você possui alguma dúvida, comunique-se com Tim Bynum, o coordenador do COMO FAZER do Linux em linux- howto@sunsite.unc.edu via email. 22..22.. AAddvveerrttêênncciiaa Como sempre: o autor não se responsabiliza por qualquer dano. Para o texto correto, veja a parte relevante do GNU GPL 0.1.1 22..33.. AAddvveerrttêênncciiaa Nós estamos tratando de segurança: você não está seguro, se não possui uma boa política de segurança. 22..44.. CCrrééddiittooss Agradecimentos a todos aqueles que escreveram qual as ferramentas que usaram. Agradecimentos a Zot O'Connor por apontar o problema do "sem controle de tty", e sua solução. 22..55.. ccaarraacctteerreeeeííssttiiccaa ddeessttee ddooccuummeennttoo Este é muito preliminar. Você deve ter conhecimento completo de administração, pelo menos algum conhecimento de firewalls, ppp e ssh. Você deve conhecê-los de qualquer modo se quiser configurar uma VPN. Eu apenas decidi escrever minhas experiências para não esquecê-las. Possivelmente existem de fato alguns buracos na segurança; para ser justo eu tentei em máquinas configuradas como roteadores sem firewalls, dizendo: é simples daquele ponto. 22..66.. DDooccuummeennttaaççããoo RReellaacciioonnaannddaa · COMO FAZER do Firewall no Linux: /usr/doc/COMO-FAZER/Firewall- HOWTO.gz; · COMO FAZER do PPP do Linux: /usr/doc/COMO-FAZER/PPP-HOWTO.gz; · Documentos sobre o ssh: /usr/doc/ssh/*; · O Guia do Administrador de Redes do Linux; · Publicações da NIST Computer Security Special: http://csrc.ncsl.nist.gov/nistpubs/; · Lista do Firewall (majordomo@greatcircle.com). 33.. IInnttrroodduuççããoo Como as firewalls estão amplamente mais e mais usadas na segurança de Internet e Intranet, a capacidade de fazer boas VPNs é importante. Aqui estão as minhas experiências, e comentários são bem-vindos. 33..11.. CCoonnvveennççõõeess Usarei os termos "firewall mestre" e "firewall escravo", apesar de uma VPN não ser feita com uma arquitetura cliente-servidor. Eu simplesmente me referi a elas como participantes ativos e passivos da configuração da conexão. A máquina que é o início da configuração será referida como mestre, e o participante passivo seráo escravo. 33..22.. PPllaanneejjaammeennttoo Antes de você iniciar a configuração do seu sistema, você deve conhecer os detalhes da rede. Eu assumo que você tem duas firewalls protegendo uma intranet por firewall, e ambas estão conectadas a internet. Então agora você deve duas interfaces de rede (pelo menos) por firewall. Pegue um pedaço de papel, e escreva o seu endereço IP e sua máscara de rede. Você precisará de mais de um endereço IP por firewall para a VPN que você quer construir agora. Aqueles endereços deve ser exteriores a suas subredes existentes; eu sugiro usar os endereços do grupo de endereços "privado". Eles são os seguintes: · 10.0.0.0 - 10.255.255.255 · 172.16.0.0 - 172.31.255.255 · 192.168.0.0 - 192.168.255.255 Por causa do exemplo, aqui está uma amostra de configuração: As duas fortalezas são chamadas fellini e polanski. Elas tem uma interface para a internet (-out), uma para intranet (-in) euma para a vpn (-vpn). Os endereços e as máscaras de rede: · fellini-out: 193.6.34.12 255.255.255.0 · fellini-in: 193.6.35.12 255.255.255.0 · fellini-vpn: 192.168.0.1 point-to-point · polanski-out: 193.6.36.12 255.255.255.0 · polanski-in: 193.6.37.12 255.255.255.0 · polanski-vpn: 192.168.0.2 point-to-point Deste modo nós temos um plano. 33..33.. JJuunnttaannddoo aass FFeerrrraammeennttaass Você precisará de: · Uma Firewall do Linux; · Um kernel; · Uma configuração mínima; · ipfwadm; · fwtk; · Ferramentas para a VPN; · ssh; · pppd; · sudo; · pty-redir. Versões atuais: · kernel: 2.0.29 Use um kernel estável, e ele deve ser mais novo que o 2.0.20, por causa do bug do ping. Então o kernel 2.0.30 é o último "estável", mas tem alguns erros. Se você quiser ter o código de rede rápido introduzido nele, tente o prepatch. · Sistema Base: eu prefiro o Debian. YMMV. Você não precisa absolutamente usar nenhum pacote grande e você não precisa usar até mesmo o sendmail, é claro. Você também definitivamente não precisa habilitar telnet, ftp, e os comandos 'r'(como sempre no caso de quaisquer outras máquinas Unix). · ipfwadm: Eu usei o 2.3.0. · fwtk: Eu usei o 1.3. · ssh: >= 1.2.20. Existem problemas com o protocolo base em versões anteriores. · pppd: Eu usei o 2.2.0f para os testes, mas eu não tenho certeza se ele é seguro, por isso eu desliguei o bit setuid, e usei o sudo. · sudo: 1.5.2. · pty-redir: é escrita por mim. Tente ftp://ftp.vein.hu/ssa/contrib/mag/pty-redir-0.1.tar.gz. Sua versão agora é a 0.1. Fale-me se existir algum problema com ela. 33..44.. CCoommppiillaarr ee IInnssttaallaarr Compile ou instale as ferramentas coletadas. Olhe cada uma das documentações (e o COMO FAZER do firewall) para detalhes. Agora nós temos as ferramentas. 33..55.. CCoonnffiigguurree ooss oouuttrrooss ssuubbssiisstteemmaass Configure sua firewall. Você precisa habilitar o tráfego do ssh entre as duas máquinas da firewall; significa uma conexão para a porta 22 no escravo originado do mestre. Inicie o sshd no escravo e verifique se você pode efetuar o login. Este pass é sem teste, por favor fale-me de seus resultados. 33..66.. CCoonnffiigguurree aass ccoonnttaass ppaarraa aa VVPPNN Crie uma conta na firewall escravo usando a sua ferramenta favorita (por exemplo, vi, mkdir, chown, chmod). Você deve criar uma conta no mestre também, mas eu acho que você precisa configurar a conexão na hora da inicialização, desta maneira a sua conta de root fará. Qualquer um pode apontar os riscos do uso da conta de root no mestre? 33..77.. GGeerraarr uummaa cchhaavvee sssshh ppaarraa aa ccoonnttaa ddoo mmeessttrree Use o programa ssh-keygen. Ajuste a senha vazia para a chave privada se você quiser fazer a configuração automática da VPN. 33..88.. CCoonnffiigguurree llooggiinn aauuttoommááttiiccoo ddoo sssshh ppaarraa aa ccoonnttaa ddoo eessccrraavvoo Copie a chave pública recentemente gerada na conta do escravo no .ssh/authorized_keys, e as permissões do arquivo de configuração como a seguir: drwx------ 2 slave slave 1024 Apr 7 23:49 ./ drwx------ 4 slave slave 1024 Apr 24 14:05 ../ -rwx------ 1 slave slave 328 Apr 7 03:04 authorized_keys -rw------- 1 slave slave 660 Apr 14 15:23 known_hosts -rw------- 1 slave slave 512 Apr 21 10:03 random_seed A primeira linha sendo o ~slave/.ssh, e a segunda a ~slave. 33..99.. SSeegguurraannççaa sssshh eessttrreeiittaa Isto refere-se aos recursos na minha configuração no sshd_conf: PermitRootLogin no IgnoreRhosts yes StrictModes yes QuietMode no FascistLogging yes KeepAlive yes RhostsAuthentication no RhostsRSAAuthentication no RSAAuthentication yes PasswordAuthentication no PermitEmptyPasswords no A autenticação da senha é desligada, então o acesso só é possível com chaves autoriazadas (é claro que você desligou telnet e os comandos 'r'). 33..1100.. HHaabbiilliittee aa eexxeeccuuççããoo ddoo pppppp ee ddaa rroottaa ppaarraa aammbbaass aass ccoonnttaass Como a conta do mestre é o root no meu caso, não há nada a fazer. Para a conta do escravo, as linhas a seguir aparecem em /etc/sudoers: Cmnd_Alias VPN=/usr/sbin/pppd,/usr/local/vpn/route slave ALL=NOPASSWD: VPN Como você pode ver, estou usando alguns scripts para configurar o ppp e as tabelas de roteamento no escravo. 33..1111.. FFaaççaa ooss ssccrriippttss No mestre existe um script de inicialização completamente desenvolvido que eu estou usando: #! /bin/sh # skeleton arquivo de exemplo para a construção de scripts /etc/init.d/. # Este arquivo deve ser usado para construir scripts para o /etc/init.d. # # Escrito por Miquel van Smoorenburg . # Modificado pela Debian GNU/Linux # por Ian Murdock . # # Versão: @(#)skeleton 1.6 11-Nov-1996 miquels@cistron.nl # PATH=/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin/X11/: PPPAPP=/home/slave/ppp ROUTEAPP=/home/slave/route PPPD=/usr/sbin/pppd NAME=VPN REDIR=/usr/local/bin/pty-redir SSH=/usr/bin/ssh MYPPPIP=192.168.0.1 TARGETIP=192.168.0.2 TARGETNET=193.6.37.0 MYNET=193.6.35.0 SLAVEWALL=polanski-out SLAVEACC=slave test -f $PPPD || exit 0 set -e case "$1" in start) echo setting up vpn $REDIR $SSH -o 'Batchmode yes' -t -l $SLAVEACC $SLAVEWALL sudo $PPPAPP >/tmp/device TTYNAME=`cat /tmp/device` echo tty is $TTYNAME sleep 10s if [ ! -z $TTYNAME ] then $PPPD $TTYNAME ${MYPPPIP}:${TARGETIP} else echo FAILED! logger "vpn setup failed" fi sleep 5s route add -net $TARGETNET gw $TARGETIP $SSH -o 'Batchmode yes' -l $SLAVEACC $SLAVEWALL sudo $ROUTEAPP ;; stop) ps -ax | grep "ssh -t -l $SLAVEACC " | grep -v grep | awk '{print $1}' | xargs kill ;; *) # echo "Usage: /etc/init.d/$NAME {start|stop|reload}" echo "Usage: /etc/init.d/$NAME {start|stop}" exit 1 ;; esac exit 0 O escravo usa um script para configuração do roteador (/usr/local/vpn/route): #!/bin/bash /sbin/route add -net 193.6.35.0 gw 192.168.0.1 e o seu .ppprc consiste do seguinte: passive 44.. OOllhhee oo qquuee eessttáá aaccoonntteecceennddoo:: O mestre acessa o escravo, inicia o pppd e redireciona todas as coisas dentro de um pty local. Isto consiste nas seguintes etapas: · alocação de um novo pty; · um ssh para o escravo; · execução do pppd no escravo; · o mestre executao pppd neste pty local; · e configura a tabela de roteamento no cliente. Existem considerações de tempo envolvidas (não muito estreitas), e isto é o porque do 'sleep 10s'. 55.. FFaazzeennddoo mmaannuuaallmmeennttee 55..11.. FFaazzeennddoo oo aacceessssoo Você já verificou se o ssh trabalha bem, não? Se o escravo recusa o seu acesso, leia o logs; talvez existam problemas com as permissões do arquivo ou com a configuração do sshd. 55..22.. AAcceennddeennddoo oo pppppp Acesse o escravo, e envie: sudo /usr/sbin/pppd passive Você deve ver resíduos vindos deste ponto. Se ele trabalha bem, se não, existe algum problema ou com o sudo, ou com o pppd. Olhe os comandos, os registros e em _/_e_t_c_/_p_p_p_/_o_p_t_i_o_n_s, e o arquivo _._p_p_p_r_c. Se ele funciona, escreva a palavra 'passive' dentro do .ppprc, e tente novamente. Para livrar-se dos resíduos e continuar trabalhando, pressione enter, '~' e '^Z'. Você deve ter o prompt do mestre agora, e mate o %1. Veja a seção sobre sintonização se você quiser saber mais sobre o caracteree de escape. 55..33.. OOss ddooiiss jjuunnttooss Então, ssh -l slave polanski sudo /usr/sbin/pppd deve funcionar também e libera os resíduos corretos. 55..44.. RReeddiirreecciioonnaammeennttoo ddoo PPttyy Tente redirecionar a coisa toda desta vez: /usr/local/bin/pty-redir /usr/bin/ssh -l slave polanski sudo /usr/sbin/pppd Sentença bem longa, não? Você deve usar o caminho inteiro dentro do ssh executável, visto que o programa pty-redir só permite esta forma por razões de segurança. Agora você conseguiu um nome do dispositivo do programa. Digamos, você obteve o _/_d_e_v_/_t_t_y_p_0 ; você pode usar o comando ps para olhar o que aconteceu. Procure pelo 'p0'. 55..55.. AAllgguummaa ccooiissaa eessttáá nnoo ddiissppoossiittiivvoo?? Tente: /usr/sbin/pppd /dev/ttyp0 local 192.168.0.1:192.168.0.2 para estabelecer a conexão. Olhe a saída do comando ifconfig para ver se o dispositivo está conectado, e use o ping para checar sua rede virtual. 55..66.. CCoonnffiigguurraannddoo aass rroottaass Configure as rotas no mestre e no escravo também. Agora você deve ser capaz de `pingar' uma máquina de uma intranet de outra máquina em outra intranet. Configure as regras adicionais para o firewall; como agora você tem uma VPN, você pode configurar as regras que se referem à conectividade de duas intranets. 66.. AAjjuusstteess 66..11.. AAjjuusstteess ddaa CCoonnffiigguurraaççããoo Como eu disse este COMO FAZER é principalmente um resumo rápido de como eu configurei uma VPN. Existem coisas na configuração que eu não experimentei ainda; estas coisas irão para os seus lugares quando eu examiná-las, ou quando qualquer um me disser: "ela trabalha do seguinte modo:". A coisa mais importante é que a conexão ppp não usa 8-bit ainda. Acredito que se tem algo a fazer ou com a configuração do ssh, ou com a configuração do pty. Nesta configuração o ssh usa o caractere til (~) como o caractere de escape; ele pode parar ou diminuir a comunicação, como qualquer til em uma nova linha faz o ssh fornecer um prompt. A documentação do ssh disse: o sinal correspondente para ssh é o '_-_e', e você pode também ajustá-lo no arquivo de configuração. i 66..22.. TTaaxxaa ddee TTrraannssmmiissssããoo vvss.. cciiccllooss Criar qualquer coisa virtual utiliza recursos do mundo real. Um VPB consome recursos de computação e da transmissão; o objetivo seria obter uma balanço entre as duas. Você pode ajustá-la com a chave '-C'ou com a opção 'CompressionLevel'. Você deve testar usando outro código, mas eu não recomendo. Observe também que o tempo do ciclo pode ser mais longo se você usar uma compactação melhor. Todos os testes serão bem-vindos. 77.. AAnnáálliissee ddaa VVuullnneerraabbiilliiddaaddee Eu tentei abranger aqui as questões resultantes desta configuração particular e das VPNs em geral. Todos os comentários são bem-vindos. · sudo: Bem, eu estou usando o sudo exaustivamente; acredito que ele é ainda mais seguro do que o uso dos bits do setuid. Ele é ainda inconveniente para o Linux pois ele não obtém mais controle de acesso. Espere pela compatibilidade do POSIX.6 . O que é pior, existem scripts do shell que estão obtendo chamadas através do sudo; bastante ruim; alguma idéia? · pppd: Ele também roda o suid; pode ser configurado pelo .ppprc do usuário . Deve existir algum buffer melhor que ele. A linha base: resguarde o registro do escravo tão próximo você possa. · ssh: Esteja ciente de que o ssh mais velho que o 1.2.20 possui dificuldades de segurança. O que é pior, fizemos a configuração tal como quando a conta do mestre foi ajustada; a conta do escravo também foi ajustada, e amplamente aberta para ataques usando os dois programas "sudo". Isto porque eu ecolhi não ter uma senha na chave do mestre, para habilitar a configuração automática da VPN. · firewall: Com o ajuste incorreto da firewall, você abre ambas as intranets; eu recomendo o uso do IP mascarado (pois a configuração das rotas incorretas é menos trivial), e fazer um controle rígido nas interfaces da VPN.