Você está na página 1de 30

Expediente editorial

Diretor Geral Rafael Peregrino da Silva rperegrino@linuxmagazine.com.br

Transio tecnolgica
Recentemente, em reunio com um corretor de seguros, tivemos novamente aquela epifania de constatao de planto: estamos assistindo a um repeteco tecnolgico de algo vivido h 30 anos durante o advento do computador pessoal. O corretor usava um notebook, equipado com (alguma verso do) Windows, mas seu celular era equipado com Android (Linux, open source). Essa combinao est se repetindo em pelo menos 68% do tempo atualmente, segundo dados das principais consultorias de mercado e conforme divulgado durante a MOTODEV App Summit em maio deste ano. O mais interessante, entretanto, que, enquanto o celular (ainda) no suficiente para substituir o PC, seu primo maior, o tablet, est ganhando cada vez mais adeptos. Embora com acesso limitado em grande maioria s classes A e B, seus usurios relatam estar cada vez menos propensos a ligar seus notebooks ou desktops. A mesma plataforma que equipa os celulares predominantemente nos dias de hoje est fadada a equipar os tablets. O Android est se estabelecendo como plataforma padro para esse tipo de desenvolvimento. A escolha realizada pelo Google que no quer nada menos do que aumentar a Internet, com o objetivo de ganhar escala para o seu modelo de negcios baseado em propaganda sensvel a contexto de fornecer a tecnologia de base para os equipamentos que devero estar nas mos de mais de 70% da populao do planeta, foi um primor estratgico! Alm dos dados de busca, esses aparelhos serviro com certeza como coletores de dados dos hbitos de seus usurios, o que dever aumentar a assertividade da propaganda veiculada pelo gigante das buscas. Do lado dos fabricantes de aparelhos (Samsung, Motorola, HTC, Sony-Ericsson, Huawei, para citar apenas alguns, pois h mais de 90 no momento), a plataforma caiu nas graas de quase todos. O fato de ser real e totalmente aberta conferiu aos fabricantes um poder nunca antes disponvel, qual seja, o de operar em todos os nveis de desenvolvimento de seus sistemas gratuitamente. Para os fabricantes de software, h uma plataforma mais ou menos padronizada para desenvolvimento de programas, que est se consolidando e estabilizando com a chegada do Android 4.0. Veremos praticamente toda uma nova gama de aplicativos aparecendo para a plataforma, da mesma forma que ocorreu com o PC h trs dcadas. A demanda por profissionais de desenvolvimento para dispositivos mveis est cada vez mais aquecida e os especialistas j disponveis no mercado esto sendo disputados a tapa. A pilha de servios em torno do Android est se consolidando e no tardaro a aparecer inclusive entidades que certifiquem a proficincia dos desenvolvedores na plataforma. Para o usurio comum apenas mais uma ferramenta, mas que democratiza o acesso tecnologia pelo ganho de escala e pela quantidade de programadores que arregimenta. Como a base de tudo isso o Software Livre, todas as vantagens oriundas das tecnologias abertas vm de roldo: competio, inovao mais rpida, solues mais flexveis, controle de plataforma e independncia de fornecedor, maior estabilidade e segurana, sem esquecer da formao local de mo-de-obra. Parafraseando Linus Torvalds em sua palestra na LinuxCon Brasil 2011: isso tudo vai estar at na pia da sua cozinha pois j chegou sua geladeira...
Rafael Peregrino da Silva Diretor de Redao

EDITORIAL

Editores Flvia Jobstraibizer fjobs@linuxmagazine.com.br Kemel Zaidan kzaidan@linuxmagazine.com.br Editora de Arte Larissa Lima Zanini llima@linuxmagazine.com.br Estagirio Felipe Brumatti Sentelhas fsentelhas@linuxmagazine.com.br Colaboradores Adriano Matos Meier, Alexandre Borges, Alexandre Santos, Augusto Campos, Charly Khnast, Dario Bestetti, Erik Brwaldt, Gavin W. Burris, Hans-Peter Merkel, Jon maddog Hall, Klaus Knopper, Kurt Seifried, Michael Uelschen, Tim Schrmann, Zack Brown. Traduo Emersom Satomi, Pablo Hess, Elias Graciano, Rodrigo Garcia. Reviso Cristiana Ferraz Coimbra Editores internacionais Uli Bantle, Andreas Bohle, Jens-Christoph Brendel, Hans-Georg Eer, Markus Feilner, Oliver Frommel, Marcel Hilzinger, Mathias Huber, Anika Kehrer, Kristian Kiling, Jan Kleinert, Daniel Kottmair, Thomas Leichtenstern, Jrg Luther, Nils Magnus. Anncios: Rafael Peregrino da Silva (Brasil) anuncios@linuxmagazine.com.br Tel.: +55 (0)11 3675-2600 Penny Wilby (Reino Unido e Irlanda) pwilby@linux-magazine.com Amy Phalen (Amrica do Norte) aphalen@linuxpromagazine.com Hubert Wiest (Outros pases) hwiest@linuxnewmedia.de Diretor de operaes Claudio Bazzoli cbazzoli@linuxmagazine.com.br Na Internet: www.linuxmagazine.com.br Brasil www.linux-magazin.de Alemanha www.linux-magazine.com Portal Mundial www.linuxmagazine.com.au Austrlia www.linux-magazine.es Espanha www.linux-magazine.pl Polnia www.linux-magazine.co.uk Reino Unido www.linuxpromagazine.com Amrica do Norte Apesar de todos os cuidados possveis terem sido tomados durante a produo desta revista, a editora no responsvel por eventuais imprecises nela contidas ou por consequncias que advenham de seu uso. A utilizao de qualquer material da revista ocorre por conta e risco do leitor. Nenhum material pode ser reproduzido em qualquer meio, em parte ou no todo, sem permisso expressa da editora. Assume-se que qualquer correspondncia recebida, tal como cartas, emails, faxes, fotograas, artigos e desenhos, sejam fornecidos para publicao ou licenciamento a terceiros de forma mundial no-exclusiva pela Linux New Media do Brasil, a menos que explicitamente indicado. Linux uma marca registrada de Linus Torvalds. Linux Magazine publicada mensalmente por: Linux New Media do Brasil Editora Ltda. Rua So Bento, 500 Conj. 802 S 01010-001 So Paulo SP Brasil Tel.: +55 (0)11 3675-2600 Direitos Autorais e Marcas Registradas 2004 - 2011: Linux New Media do Brasil Editora Ltda. Impresso e Acabamento: RR Donnelley Distribuda em todo o pas pela Dinap S.A., Distribuidora Nacional de Publicaes, So Paulo. Atendimento Assinante www.linuxnewmedia.com.br/atendimento So Paulo: +55 (0)11 3675-2600 Rio de Janeiro: +55 (0)21 3512 0888 Belo Horizonte: +55 (0)31 3516 1280 ISSN 1806-9428 Impresso no Brasil

www.linuxmagazine.com.br

NDICE

CAPA
Encarar os desaos ou pedir para sair? No so s os usurios que cometem erros primrios. Administradores de redes e programadores costumam facilitar frequentemente a vida dos criminosos digitais, seja por descuido ou desconhecimento. 33

Caa aos invasores No mundo digital, segurana nunca demais, principalmente se a sua empresa atua diretamente em servios web. Atravs da anlise de um caso real, saiba como se proteger de um ataque a um servio de webhost, que partiu de um cliente da prpria empresa.

34

Corrente de conana Placas-me bem equipadas s vezes trazem chips de computao convel, embora os usurios e sistemas operacionais raramente os utilizem. O kernel Linux j domina essa tecnologia e seus usurios j podem dar suporte a uma ampla corrente de conana com o TrustedGRUB.

40

Fora do Radar Em funo de seu design inteligente, o Tor oferece mxima segurana aos usurios que desejam resguardar sua identidade.

46

www.linuxmagazine.com.br

Linux Magazine 85 | NDICE

COLUNAS
Klaus Knopper Charly Khnast Zack Brown Augusto Campos Alexandre Borges Kurt Seifried 10 12 13 14 16 18

PROGRAMAO
Programao IPv6 para web 64

NOTCIAS
Geral O cdigo-fonte do Android 4.0 Envenenamento de DNS nos provedores brasileiros 22 Linguagens de programao tais como C, Python, Perl e o kit de ferramentas Qt podem trabalhar com IPv6. Mas voc precisa se assegurar de que est usando as funes, classes e mtodos corretos. Vamos mostrar como levar o seu aplicativo legado para o mundo do IPv6.

CORPORATE
Notcias IBM sob nova direo Riverbed entra para a comunidade OpenStack Entrevista com Martin Roesch Coluna: Jon maddog Hall Coluna: Rafael Peregrino Coluna: Alexandre Santos 24 28 30 32 23

ANLISE
Carteiro bom de briga 51

TUTORIAL
Converso de PDF 72 Os desenvolvedores do Postx queriam uma forma de descartar e-mails indesejados quando fossem entregues, ento adicionaram o Postscreen verso 2.8 de seu servidor. Este mdulo ltra e ordena e-mails sem olhar seu contedo. Contato fsico O projeto Arduino ideal para experincias com computao fsica.Demonstramos seu funcionamento com a construo de um timer simples. 56

SEGURANA
Segurana alm da senha Envie alguns arquivos por email e receba documentos PDF como resposta, usando para isso LibreOfce, Postx e scripts Shell. Caixa de areia 75 60

H muito mais no universo da segurana, do que apenas senhas. Descubra como proteger seus servidores com autenticao de dois fatores.

SERVIOS
Editorial O Arkose permite connar programas potencialmente instveis em uma sandbox virtual, mantendo seu sistema protegido contra acidentes e perda de dados. Emails Linux.local Preview 04 08 78 82

Linux Magazine #85 | Dezembro de 2011

Coluna do Augusto

20 anos do editor de textos vim


Apesar de rstico a primeira vista, o editor de textos vim h 20 anos o melhor amigo do administrador de sistemas.

COLUNA

uando comecei a usar Unix, na primeira metade da dcada de 1990, tive a oportunidade de fazer alguns cursos introdutrios ao sistema em si e sua administrao em implementaes variadas, incluindo o AIX, o HP-UX e, pouco depois, tambm no Linux. Eram cursos presenciais de uma semana e tinham algo em comum: todos eles destinavam algumas horas ao editor vi geralmente descrito pelo instrutor como o editor de textos do Unix com uma justificativa ameaadora. Segundo eles, se o aluno algum dia fizesse alguma bobagem grande demais que impedisse o uso da ferramenta de configurao fcil oferecida pelo fabricante (o SMIT, no caso do AIX, ou o SAM no caso do HP-UX), teria que editar os arquivos de configurao na mo, e isso exigiria saber usar o vi. Os anos se passaram e eu logo aprendi que editar arquivos de configurao na mo no era algo to indesejvel assim, e que at havia alternativas ao vi para faz-lo. Seu uso tambm no era to assustador quanto aqueles instrutores acostumados s ferramentas dos fabricantes pareciam sinceramente acreditar. Mas, at chegar a esse ponto, passei muitas vezes pela aula do vi nos cursos que fiz e, mais tarde, at lecionei ela algumas vezes, sempre assistindo aos alunos j acostumados aos editores mais

Os 20 anos do vim foram comemorados por muitos fs que encontram nele a opo que lhes permite realizar com melhor desempenho suas tarefas de desenvolvimento, administrao ou mesmo edio de textos.
14

recentes tropearem um pouco antes de vencer o desafio de entender a diferena de contexto entre o modo de insero e o de comando, e vendo o aluno distrado que no conseguia sair do editor. Isso em uma poca em que as aulas eram no console e ainda no havia a discreta opo de fechar a janela do terminal e abrir outra... O heroico vi criao de Bill Joy, um dos desenvolvedores originais do BSD, que desenvolveu esse editor a partir de 1976 quando a ideia de um editor visual interativo ainda era to recente que a alternncia de modos e a interface baseada em meras sequncias de teclas ainda poderiam ser consideradas bem mais fceis que outras alternativas existentes. Hoje vivemos uma era de ambientes grficos em que at mesmo o administrador de sistemas pode passar meses ou anos sem precisar editar algo no vi mas ele continua sendo ensinado, no apenas por ser um editor poderoso e cheio de recursos, mas por fazer parte do padro POSIX, o que significa que estar disponvel em qualquer implementao ou clone do Unix. Possivelmente estar mo at mesmo naquelas temidas situaes em que a mquina tem problemas que impedem seu boot completo e, assim, precisa ser consertada em modo texto, monousurio ou sob outra condio restrita. Mesmo assim, os 20 anos do vim (a implementao mais moderna e avanada do vi que est na distribuio de Linux que voc usa e em muitos Unix) foram comemorados por muitos fs que o utilizam no por obrigao ou por falta de opes mais fceis, mas porque encontram nele a opo que lhes permite realizar com melhor desempenho suas tarefas de desenvolvimento, administrao ou mesmo edio de textos. Parabns pelo aniversrio, vim, e que venham mais 20 anos!
Augusto Csar Campos administrador de TI e, desde 1996, mantm o site BR-linux.org, que cobre a cena do Software Livre no Brasil e no mundo.

www.linuxmagazine.com.br

Coluna do Alexandre Borges

Certicao e assinaturas digitais


Em um esforo hercleo, Alexandre Borges se desdobra para ensinar a qualquer um os mistrios da criptograa de chaves simtricas, assimtricas e dos certicados digitais.

COLUNA

scuto frequentemente algumas perguntas vindas de analistas: Como garantir que nossas compras na Internet sejam seguras? O que significa aquele cadeado na barra de status do navegador? Por que, quando entramos em algum site de home banking, solicitam-nos que aceitemos o tal do certificado digital? Afinal, para que serve tudo isso? Para mim claro e cristalino que voc leitor sabe as exatas respostas para essas perguntas; contudo, de que maneira podemos explicar essas coisas para outros analistas e pessoas leigas exemplificadas por profissionais de outras reas como vendedores, advogados ou mdicos? A informao somente tem valor e melhora a sociedade quando difundida e desfazer alguns mitos seria interessante para ajudar na conscientizao da importncia dessas informaes e da tecnologia no dia-a-dia. Ento quer dizer que fcil explicar os conceitos de criptografia simtrica, assimtrica, hashing, certificado digital e assinatura digital? Longe disso. Alis, nada mais difcil, mesmo para tcnicos que j fazem parte deste mundo de TI. Eis como eu fao quando quero explicar as questes acima. Imaginem duas pessoas, com suas respectivas mquinas (A e B). A pessoa A quer enviar uma informao para a pessoa B, porm deseja que ningum possa, no meio do caminho, visualizar a informao. Para tanto ela usa um algoritmo de chave simtrica. Mas o que isso? Simples: um algoritmo (ou programa, para leigos) que embaralha as informaes e, para faz-lo, usa uma espcie de senha (chave de sesso ou key session) para codificar os dados e a mesma senha para decodific-los (desembaralhar os dados). da que vem a palavra simtrica: a mesma chave usada nas duas pontas da comunicao, ou seja: para codificar e decodificar. E ento, o que as pessoas fazem? A pessoa da mquina A combina com a pessoa da mquina B um algoritmo e uma senha (key session), e depois codifica os dados a serem enviados como elas combinaram. A pessoa da mquina B, ao receber estes dados, decodifica-

-os usando o algoritmo e a senha j combinados entre as partes. Alis, por que o nome chave de sesso (key session)? Porque esta senha (chave) somente vale para cada sesso de envio de informaes, ou seja, no prximo envio o usurio pode combinar uma nova senha. Funciona? Muito bem. rpido? Bastante. S tem um pequeno problema: como as pessoas vo trocar esta senha (chave de sesso) entre si? Qualquer meio est sujeito a interceptao: email, SMS, telefone, fax, pessoalmente, correios... Nada, absolutamente nada, seguro para trocar estas senhas (ou chaves). a que est o risco: se algum tiver posse desta senha (chave) e tiver uma vaga ideia do algoritmo usado, poder decodificar as informaes trocadas e ler o que foi enviado. E agora, o que fazer? Neste ponto, entram em jogo os algoritmos assimtricos. Por que assimtricos? Porque a mesma chave que usada para codificar NO a mesma usada para decodificar. Eis como ocorre o processo: a pessoa da mquina A, atravs de um algoritmo assimtrico escolhido em comum acordo entre as partes, gera um par de chaves (ou senhas, para leigos), a pblica e a privada (pub-A e priv-A). Como o nome diz, a chave pblica pode (e deve) ser conhecida por qualquer pessoa; todavia, a privada somente de conhecimento prprio e individual. Em seguida, a pessoa da mquina B faz o mesmo, ou seja: gera seu par de chaves assimtricas (pub-B e priv-B). E o que se segue que, como a pessoa da mquina A sabe a chave pblica da pessoa da mquina B (pub-B), ela usa esta chave (pub-B) para codificar, usando o algoritmo simtrico combinado, a chave de sesso que elas queriam trocar e no podiam de maneira segura. A a tal chave de sesso (codificada) enviada para a pessoa da mquina B. Agora ambos, com a mesma chave pblica, podem trocar dados criptografados como explicado acima. A que est a mgica: uma vez que uma informao codificada dessa forma (usando a chave pub-B), somente com a respectiva chave privada (priv-B) possvel decodific-la. Esse mecanismo uma das maravilhas das chaves assimtricas: o que codificado com uma chave do par gerado (pblico e pri-

16

www.linuxmagazine.com.br

vado) somente pode ser decodificado com a outra chave do mesmo par. Funciona? Sim. rpido? Hum... a vem um pequeno detalhe: ao contrrio dos algoritmos simtricos, os assimtricos so muito (e coloque muito nisso) mais lentos. Se fossem rpidos, poderamos abandonar os simtricos e j enviar a informao (e no apenas a chave de sesso) com o uso do par de chaves simtricas (pblica e privada). Tudo resolvido? No. Por qu? Porque a pergunta agora outra: como a pessoa da mquina A pode ter certeza absoluta de que a chave pblica da pessoa da mquina B dela mesma? E se for de um hacker fingindo ser a pessoa da mquina B? A a pessoa da mquina A teria um grande problema: ela estaria codificando a chave de sesso com a chave pblica do hacker e enviando para a pessoa da mquina B (que no conseguiria abrir a informao). O hacker, interceptando os dados codificados, conseguiria decodificar a informao (que a chave de sesso) e poderia se passar pela pessoa da mquina B, comprometendo toda a troca de informaes entre as partes. exatamente agora que entra em cena o certificado digital. Alis, o que esse certificado e como funciona? A parte interessada (por exemplo, as pessoas das mquinas A e B, ou mesmo uma empresa, em um contexto mais realista), contrata uma terceira parte (autoridade certificadora, tambm conhecida como CA) e, no momento do contrato, envia sua prpria chave pblica. Ento essa companhia certificadora (CA) emite o certificado dessa pessoa ou empresa. Esse certificado um objeto (ou um selo, para leigos) emitido pela autoridade certificadora (CA), que possui total idoneidade internacional (Certsign, por exemplo). O certificado contm dentro de si a chave pblica enviada pela parte interessada e algumas informaes sobre a pessoa ou empresa que est comprando o servio de certificao digital. E aqui est a ideia principal: quando a pessoa da mquina A pede a chave pblica da pessoa da mquina B (pub-B), a pessoa da mquina B no envia a sua chave pblica diretamente, e sim seu certificado digital emitido por uma companhia certificadora. Assim, quem est garantindo e atestando que aquele certificado (mais especificamente, a chave pblica) vem da pessoa da mquina B a autoridade certificadora que tem reconhecimento global para tal ao. Ou seja: ningum (nem a pessoa da mquina A e nem a da mquina B) corre o risco de se ver enganado por um hacker. Funciona? Muito bem. Resolvido o problema? Ainda no. Por qu? Porque quem pode garantir para a pessoa da mquina A que aquele certificado da pessoa da mquina B, emitido e atestado pela autoridade certificadora (CA) foi, de fato, emitido por ela? E se foi um hacker que est se passando pela CA e forjou um certificado? Puxa! Isso parece no ter mais fim... Sempre h um risco, mas tem soluo. Antes de avanarmos para o prximo ponto, til comentar o que so e para que servem os algoritmos de hash.

Fundamentalmente, a ideia assegurar a integridade dos dados, ou seja, ter certeza de que os dados enviados pela mquina A so os mesmos recebidos pela mquina B. E como isso acontece? Com esses dados feita uma conta (da o uso do algoritmo) e esse clculo anexado junto aos dados a serem enviados. Quando esses dados chegam mquina B, o mesmo clculo feito usando-se os dados recebidos, e o resultado comparado com o clculo que foi feito pela mquina A e anexado aos dados enviados. Se os resultados forem iguais, os dados que chegaram esto ntegros e no sofreram nenhuma alterao. Se houver discrepncia, pede-se para retransmitir os dados novamente. Simples, no? Agora sim possvel falar do ltimo elo desta corrente, que a assinatura digital. E qual o seu objetivo? Garantir que, de fato, o certificado digital foi realmente emitido pela companhia certificadora (CA). Para tanto, ocorre o seguinte processo: a CA (companhia certificadora), antes de emitir o certificado para a pessoa da mquina A ou B, faz um clculo de hash desse certificado e criptografa esse clculo usando sua prpria chave privada (sim... a chave privada e no a pblica, por isso chama-se assinatura digital), anexando o resultado no certificado. O usurio da mquina A ou B, atravs do browser (que j tem diversas chaves pblicas cadastradas dentro dele) usa a chave pblica da companhia certificadora (CA) para descriptografar o hash codificado do certificado que , em seguida, comparado com o clculo feito pela prpria mquina de A ou B. Se as os hashes feitos na mquina forem iguais ao hash que veio anexado ao certificado, pode-se garantir que aquele certificado foi, de fato, emitido pela companhia certificadora (CA) em questo, pois a chave pblica da companhia certificadora (CA) somente decodifica os dados criptografados com a sua respectiva chave privada. Repare que a assinatura digital contrria codificao assimtrica: na assinatura digital, o dado codificado com a chave privada e decodificado com a pblica. Na criptografia assimtrica acontece o inverso, pois o dado codificado com a chave pblica e decodificado com a respectiva chave privada. Esse processo descrito acima prova de bala? Sim. As falhas so decorrentes de possveis quebras dos algoritmos envolvidos, ou ainda erro na implementao deste mecanismo. exatamente por isso que os hackers (ou melhor, crackers) costumam tentar atacar a ponta mais fraca do processo, que o usurio, e conseguir as senhas (chaves) antes de tudo comear, pois durante o processo isso muito difcil para no dizer impossvel. At o ms que vem.
Alexandre Borges (alex_sun@terra.com.br) instrutor independente e ministra regularmente treinamentos de tecnologia Oracle, Symantec e EC-Council (CEH e CHFI), alm de estar sempre envolvido com assuntos relacionados ao kernel Linux.

Linux Magazine #85 | Dezembro de 2011

17

Tropa de elite

Encarar os desaos ou pedir para sair?


No so s os usurios que cometem erros primrios. Administradores de redes e programadores costumam frequentemente facilitar a vida dos criminosos digitais, seja por descuido ou desconhecimento. por Kemel Zaidan

CAPA

ados bancrios, endereo, nmeros de telefone, compras, relatrios, documentos pessoais, conversas telefnicas, agenda de contatos, calendrio, editais, impostos, dados governamentais, crculos sociais etc. Poderamos estender a lista indefinidamente se quisssemos, mas parece no haver limites para a capacidade da rede de concentrar nossos dados. A tendncia parece mesmo ser de que a Internet venha a ser o grande hub de nossas vidas sociais, tanto fora quanto dentro do universo digital. Porm, a preocupao com a segurana desses dados no acompanhar a importncia da rede em nossas vidas na mesma proporo de seu crescimento. A linha tnue entre o pblico e o privado est cada vez mais difcil de se distinguir uma vez que hoje muito mais difcil manter informaes pessoais de forma privada, do que era no passado. Por outro lado, boa parte das pessoas que comeam a entrar na rede agora, ignoram as possibilidades e a importncia de manterem dados pessoais afastados do conhecimento de grandes corporaes, pois muitas vezes no se sabe quais e para que fins grandes servios web, como o Google ou o Facebook, coletam informaes de seus usurios. por essas e outras questes que a Linux Magazine #85 traz para voc o tema segurana. Nela, voc poder conferir o interessante caso real relatado por Ygor Bittencourt, de um provedor de hospedagem, que teve seus servidores invadidos e utilizados para atacar um terceiro computador. Voc poder reproduzir no apenas o cenrio do ataque, mas tambm conferir como ele foi descoberto, para s ento tomar as medidas preventivas cabveis para que uma situao como essa no acontea na sua rede. Outro interessante artigo o Fora do Radar, onde o nosso leitor poder instalar e configurar o Tor, uma incrvel ferramenta para a navegao segura e annima, cujo cdigo fonte foi originalmente aberto pelo Intituto de Pesquisas da Marinha dos Estados Unidos.

A rede Tor teve um papel importante nos conflitos recentes ocorridos na Primavera rabe. J no artigo Corrente de confiana, o administrador de sistemas ir aprender como tirar proveito dos chips TPM que comeam a equipar as placas mes mais modernas ao permitir criar toda uma cadeia de assinatura de software, o que pode fazer toda a diferena em um ambiente de servidores. Portanto, arme-se com a sua Linux Magazine mais recente e prepare-se para a dura batalha do dia-a-dia porque misso dada, parceiro, misso cumprida!

Matrias de capa
Caa aos invasores Corrente de conana Fora do Radar 34 40 46

ANLISE | Introduo ao Arduino

Introduo ao Arduino

ANLISE

Contato fsico
O projeto Arduino ideal para experincias com computao fsica. Demonstramos seu funcionamento com a construo de um timer simples. por Dmitri Popov

m seu website [1], o projeto Arduino se apresenta como uma plataforma para prottipos eletrnicos de cdigo aberto, baseada em hardware e software flexveis e fceis de usar, o que no soa muito animador. Mas essa minscula e econmica plataforma lhe permite construir uma gama de projetos fantsticos e no h exigncia de habilidades com solda. O projeto consiste basicamente de uma placa que pode ser programada

para controlar diferentes dispositivos (motores, luzes etc.) conforme a entrada que ela recebe de sensores conectados. possvel conectar praticamente qualquer sensor placa do Arduino por exemplo, um resistor dependente de luz, um sensor de movimento, um termistor ou um sensor de presso e programar o microcontrolador da placa para executar vrias aes com os controladores conectados aos pinos digitais de sada.

A programao feita no IDE Arduino, que usa uma linguagem de programao baseada em Processing [2]. A linguagem em si relativamente fcil de aprender, ento mesmo que voc no tenha nenhuma experincia com programao, pode aprender o bsico rapidamente. A seo de referncia no site do projeto contm uma viso detalhada da linguagem para quem quer iniciar, estando disponvel tambm a verso

Figura 1 O IDE Arduino no muito bonito, mas cumpre bem Figura 2 O Gnoduino uma alternativa mais polida ao
sua funo. IDE padro do Arduino.

56

www.linuxmagazine.com.br

Introduo ao Arduino | ANLISE

sudo add-apt-repository ppa:pmjdebruijn/gnoduino-release sudo apt-get update sudo apt-get install gnoduino

Em seguida conecte a placa Arduino sua mquina e voc estar pronto para comear seu primeiro projeto. possvel criar todo tipo de dispositivos com o Arduino mas, para comear, melhor algo simples. Ento descreverei como construir um timer bsico para treinarmos a tcnica Pomodoro [6] de gerenciamento de tempo. Nesse projeto s precisamos de trs componentes: um LED, um resistor (entre 200 e 680 ohms) e dois cabos de jumper. O resistor opcional, sendo usado para limitar a corrente e evitar danos ao LED.
Figura 3 O Fritzing oferece um ambiente grco para criar projetos do Arduino.

Esquematizao
Antes de comear a montar os componentes na matriz de contato e cabe-los, uma boa ideia desenhar um esquema para ser usado como referncia. Embora voc possa usar caneta e papel para faz-lo, h uma ferramenta melhor chamada Fritzing [7]. Esse programa oferece um ambiente grfico completo para projetos Arduino: voc pode us-lo para desenhar layouts na matriz de contato, esquematizao ou circuitos impressos. Usar o Fritzing em um projeto to simples pode parecer exagero, mas assim que seus projetos Arduino forem ficando mais avanados, voc vai comear a apreciar as capacidades e recursos desse programa. O Fritzing no exige uma instalao tradicional. Para obter a ltima verso, acesse o site do projeto, descompacte o arquivo baixado e execute o script em Bash Fritzing.sh no diretrio correspondente para iniciar o aplicativo. A viso Breadboard no Fritzing permite criar designs na protoboard com o posicionamento de componentes e seu cabeamento (gura 3). A coleo principal de componentes

livre do Arduino Programming Notebook [3] como guia rpido e prtico. Os programas Arduino so chamados de sketches. Voc escreve, depura e faz o upload desses sketches na placa usando o IDE. O Arduino foi desenvolvido como uma forma de introduzir s pessoas o mundo da computao fsica (construir sistemas fsicos interativos que podem perceber o mundo analgico e reagir a ele) mas o projeto mais do que apenas uma ferramenta educacional. possvel usar a placa para todos os tipos de soluo inteligente, desde um alarme ativado por movimentos at um disparador acionado por luz para sua cmera. Voc pode comprar diferentes modelos Arduino gastando a partir de 30 dlares, sendo desnecessrio gastar todas suas economias para poder se iniciar no maravilhoso mundo da computao fsica. Voc pode precisar acrescentar sua lista de compras tambm, uma protoboard (placa com furos e conexes condutoras para montagem de circuitos eltricos experimentais), alguns cabos de jumper, alguns LEDs e resistores.

Usando a protoboard, pode-se construir projetos Arduino sem precisar soldar componentes uma soluo perfeita para a experimentao.

Preparao
A primeira tarefa instalar o ambiente de desenvolvimento para poder escrever sketches e fazer o upload no Arduino. Se estiver usando o Ubuntu ou derivados, instalar o programa necessrio simples:
sudo apt-get install arduino

Esse comando instala o IDE Arduino padro, escrito em Java (gura 1). O IDE cumpre sua funo, mas no se integra muito bem com o Gnome. Felizmente, o Gnoduino fornece uma alternativa polida e leve, projetada especificamente para esse ambiente de desktop (gura 2). O Gnoduino exibe as janelas nativas do Gnome e tem melhor renderizao de fontes, alm do recurso til de numerar linhas. O programa foi escrito em Python e, no Ubuntu, pode ser instalado a partir de um PPA dedicado [5], com os seguintes comandos:

Linux Magazine #85 | Dezembro de 2011

57

ANLISE | Introduo ao Arduino

Figura 4 O Fritzing tambm gera esquemas de cabeamento baseados no projeto da protoboard.

Figura 5 Com o Fritz voc pode projetar esquemas de


circuitos impressos.

na paleta Parts inclui praticamente todas as partes essenciais: de resistores a switches, de LEDs a diversos tipos de sensor. O Fritzing tambm permite a importao de colees de componentes de terceiros. Para faz-la, selecione File/Parts Bin/Open e escolha a coleo que deseja. Voc pode at desenhar suas prprias partes. A pgina Creating Custom Parts [8] do website tem bastante material sobre isso. Assim que posicionar um componente na protoboard, voc pode

modificar suas propriedades na paleta Inspector. possvel, por exemplo, especificar tolerncia, resistncia e espaamento de pinos para resistores, alm de cor e tamanho, para LEDs. Para conectar os componentes com cabos de jumper, clique com o boto direito no socket desejado da matriz, depois arraste o mouse at o socket de destino, enquanto segura o boto direito. Depois possvel mudar a cor do cabo adicionado na paleta Inspector para melhorar a leitura do desenho. Por padro, o Fritzing usa

Listagem 1: Sketch para um timer


01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 int var = 0; void setup() { pinMode(13, OUTPUT); } void loop() { while(var < 5){ digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); var++; } digitalWrite(13, HIGH); delay(15000); var = 0; digitalWrite(13, LOW); delay(1500000); }

Listagem 2: Sketch aperfeioado para um timer


01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 int var = 0; void setup() { pinMode(9, OUTPUT); pinMode(13, OUTPUT); } void loop() { while(var < 5){ digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); var++; } digitalWrite(9, HIGH); delay(15000); var = 0; digitalWrite(9, LOW); delay(1500000); }

cabos retos, que podem ser muito limitadores em estruturas mais complexas. Mas possvel curvar os cabos pressionando a tecla [Ctrl], clicando e arrastando. Enquanto voc trabalha no design da matriz, o Fritzing silenciosamente gera um esquema de cabeamento para seu projeto, que pode ser visto ao mudarmos para a viso Schematic (gura 4). Todas as conexes entre componentes so consideradas ligaes potenciais, sendo exibidas como linhas finas; voc precisa usar o mouse para cabear os componentes de fato. Fazer isso manualmente pode ser um desafio, especialmente se estiver trabalhando com um desenho complexo. Felizmente, o Fritzing tem uma soluo elegante: o recurso Autoroute pode cabear automaticamente os componentes. Os resultados podem s vezes ser decepcionantes, mas na maioria das vezes esse recurso faz um bom trabalho. Alm disso, voc pode melhorar esse resultado manualmente, se necessrio. O Fritzing tambm permite que voc exporte o esquema de cabeamento para diversos formatos. possvel salvar o esquema como uma imagem com File/Export/As Image, que oferece as opes PNG, SVG e PDF, entre outros. Tambm poss-

58

www.linuxmagazine.com.br

Introduo ao Arduino | ANLISE

vel usar File/Export/List of parts (Bill of Materials) para gerar uma lista de compras bem formatada, com todos os componentes usados nos projetos. Se isso no for suficiente, ainda possvel usar o Fritz para desenhar um circuito impresso, portanto voc pode transformar seu prottipo de matriz de contato em um produto de fato ou em um Arduino shield (gura 5). Melhor ainda, o servio Fritzing Fab [9] pode produzir circuitos impressos, prontos para uso, baseados em seu design. Por enquanto, contudo, usaremos o Fritzing para criar um projeto de protoboard para o timer, como o da gura 3. Depois voc pode usar o desenho como guia para cabear os componentes na matriz real e conect-los ao Arduino para completar o projeto de hardware.

Sketch
O prximo passo escrever um sketch para o timer. Basicamente, voc precisa programar o Arduino para ligar o LED a cada 25 minutos, sinalizando que hora de um intervalo. Para deixar as coisas um pouco mais interessantes, voc pode fazer o LED piscar cinco vezes, para atrair a ateno, antes de ligar. Para comear, inicie o Arduino IDE ou o Gnoduino e use o sketch da listagem 1. O que esse sketch faz? Como qualquer programa ou script, sua

primeira tarefa definir as variveis a serem usadas. Nesse caso, a declarao int var = 0 define a varivel var, que atuar como um contador, com um valor de 0 (zero). Alm disso, qualquer sketch Arduino deve conter dois blocos. A funo setup() contm todo o cdigo a ser executado uma vez no incio do programa, enquanto a funo loop() contm o programa em si, que executado em repetio. Por que isso?, voc pode se perguntar. Porque, diferentemente de um computador comum, o Arduino no pode executar vrios programas ao mesmo tempo e os programas no podem terminar. Basicamente, quando voc liga a placa Arduino ela executa o cdigo, parando apenas quando voc desliga. Neste caso, a funo setup() inicializa o pino digital 13 como uma sada, usando a declarao pinMode(13, OUTPUT). Isso permite que o sketch controle o LED conectado ao pino 13. A funo loop() contm o programa em si, que pode ser dividido, a grosso modo, em duas partes. A primeira o lao while que liga o LED (a declarao digitalWrite(13, HIGH)), espera um segundo (delay (1000)), desliga o LED (digitalWrite(13, LOW)), espera outro segundo e ento incrementa o contador em 1 (var++). O loop executa enquanto o valor de

var menor que 5 (ou seja, o LED pisca cinco vezes). Quando var che-

ga a 5, a segunda parte do programa entra em ao, ligando o LED, esperando 15 segundos, desligando o LED e esperando 25 minutos. Para verificar erros no sketch, use o boto Verify no IDE Arduino. Se tudo correr bem, voc deve ver a mensagem Binary sketch size: 1086 bytes (of a 32256 byte maximum) (o tamanho pode variar); do contrrio, surgiro alertas indicando os erros. Finalmente, pressione Upload para enviar o sketch para o Arduino. A placa comear a executar o cdigo imediatamente. Parabns, seu primeiro hardware Arduino funciona!

Etapas posteriores
Embora esse timer Arduino seja bem simples, voc pode aperfeio-lo. Por exemplo, pode adicionar um segundo LED no pino 9 e reescrever o sketch para que o primeiro LED pisque antes de o segundo ser ligado (listagem 2). Em vez de usar um segundo LED, voc pode conectar um alto-falante e programar o Arduino para disparar um tom ou melodia simples. Resumindo, h muitas opes para refinar e melhorar esse simples timer. E depois que dominar o bsico, voc pode trabalhar em projetos mais complexos e empolgantes.

Mais informaes
[1] Arduino: http://arduino.cc/ [2] Linguagem de programao Processing: http://processing.org/ [3] Arduino Programming Notebook: http://www.lulu.com/product/ file-download/arduino-programming-notebook/3524028 [4] Gnoduino: http://gnome.eu.org/evo/index.php/Gnoduino [5] PPA Gnoduino: http://launchpad. net/~pmjdebruijn/+archive/gnoduino-release [6] Tcnica Pomodoro: http://www.pomodorotechnique.com/ [7] Fritzing: http://fritzing.org/ [8] Partes customizadas no Fritzing: http://fritzing.org/ learning/tutorials/creating-custom-parts [9] Fritzing Fab: http://fab.fritzing.org/fritzing-fab

O autor
Dmitri Popov formado em letras (idioma russo) e lingstica computacional; h vrios anos trabalha como tradutor tcnico e colaborador free-lancer. J publicou mais de 500 artigos sobre software de produtividade, computao mvel, aplicativos web e outros tpicos relacionados informtica. Seus artigos j apareceram em sites e revistas da Dinamarca, Inglaterra, EUA, Alemanha, Rssia e, agora, do Brasil.

Gostou do artigo? rtigo?


Queremos ouvir sua opinio. pinio. Fale conosco em m cartas@linuxmagazine.com.br zine.com r Este artigo no nosso site: osso e: http://lnm.com.br/article/6109 br/art /610

Linux Magazine #85 | Dezembro de 2011

59

PROGRAMAO | Aplicativos web e IPv6

Aplicativos web e IPv6

PROGRAMAO

Programao IPv6 para web


Linguagens de programao tais como C, Python, Perl e o kit de ferramentas Qt podem trabalhar com IPv6. Mas voc precisa se assegurar de que est usando as funes, classes e mtodos corretos. Vamos mostrar como levar o seu aplicativo legado para o mundo do IPv6. por Peter Hrenka

migrao para a Internet IPv6 s vai funcionar se as aplicaes que esto rodando na web tambm migrarem. Este artigo explica como os desenvolvedores podem readequar programas tanto para IPv4 quanto para IPv6. Voc vai ver como trabalhar com IPv6 em C, Python, C++, Perl e com o kit de ferramentas Qt. A maioria dos programas usados como exemplo no necessitam de uma conexo nativa em IPv6 Internet, o que significa que voc pode testar seu cdigo localmente, em qualquer distribuio Linux recente.

C 101
Os programadores ainda precisaro emitir uma chamada de sistema via socket() no IPv6 para definir um destino no formato de descritor de arquivos. Se esse destino tiver de ser compatvel com o IPv6, o domnio deve ser PF_INET6 ou AF_INET6. Os tipos aqui podem ser os mesmos usados no IPv4, SOCK_STREAM para UDP e SOCK_DRAM para TCP. As coi-

sas comeam a ficar empolgantes de verdade quando o socket realmente quer iniciar uma conexo. No lado do cliente connect() e no lado do servidor bind(). Ambos com a expectativa de obter um const struct sockaddr*. Mas onde encontr-lo? Entre outras coisas, o RFC 3493 [1] descreve a funo getaddrinfo(), que retorna estas estruturas sockaddr. O getaddrinfo() substitui o gethostbyname(), que obsoleto e incapaz de realizar multithreading (ou, para ser mais preciso: incapaz de reentrncia). De modo geral, a funo getaddrinfo() ajuda a migrar gradualmente, sem dor, do IPv4 para o IPv6. A funo trabalha com resoluo de nomes, parsing (anlise sinttica), criao de estruturas de endereos e parmetros para chamadas subsequentes de rede. A listagem 1 introduz a funo getaddrinfo() e seus parmetros. A node aponta para uma string que descreve o endereo com maior detalhamento. A string normalmente um hostname na forma de www.

linuxmagazine.com.br. Tambm so

permitidas notaes de endereos IPv4 ou IPv6, tais como 127.0.0.1 ou FF80::0201:02FF:FE03:0405%eth0. O parmetro service descreve o nmero da porta.0 Os designadores de servio, como aqueles listados em / etc/services, tambm so permitidos por exemplo, http ou ssh bem como nmeros de portas em notao decimal. O parmetro opcional hint pode apontar para uma addrinfo structure tal como a que definida na listagem 2. res tambm usa essa estrutura, que d suporte a vrios resultados ligados por ai_next para chamar freeaddrinfo() quando os endereos no so mais necessrios. Os desenvolvedores especificam o AF_INET como sendo o ai_family para receber endereos IPv4 e o AF_INET6 para receber endereos IPv6. Caso precise dos dois tipos de endereo, voc deve especificar o AF_UNSPEC, que vai lhe dar primeiro o(s) endereo(s) IPv6 e depois o(s) IPv4. A estrutura res nunca possui AF_UNSPEC. Em vez

64

www.linuxmagazine.com.br

Aplicativos web e IPv6 | PROGRAMAO

disso, mantm a famlia de endereos tangveis do endereo de retorno. Para o ai_socktype, voc deve inserir o SOCK_STREAM para UDP, ou o SOCK_DGRAM para TCP, na estrutura hint. Ao inserir um 0, voc ver vrias entradas com os possveis tipos para cada endereo, se houver. O ai_protocol permite ao programador requisitar um protocolo, tal como FP_INET ou FP_INET6. Geralmente normal usar o valor 0 para receber resultados que batam com os outros parmetros. Um aspecto prtico que os campos ai_family, ai_socktype e ai_protocol correspondem precisamente aos parmetros domain, type e protocol na chamada de sistema socket(), o que significa que voc pode simplesmente deix-los para l. O campo ai_addrlen armazena o valor retornado do comprimen-

to da estrutura do sockaddr_in. O ai_addr contm um ponteiro para um sockaddr_in para IPv4, ou um sockaddr_in6 para IPv6 dentro da estrutura res. Este apontador pode ser usado junto ao ai_addrlen como parmetro para as chamadas de sistema connect(), bind(), sendto() ou recvfrom(). O campo ai_canonname da estrutura res contm um apontador para o nome cannico do host, caso voc o requisite pelos ai_flags. D uma olhada no quadro 1 para ter uma ideia sobre as flags.

As funes alternativas inet_pton() e inet_ntop() existem por causa de inet_aton() e inet_ntoa(), que convertem notaes numricas ASCII e struct in_addr para l e para c (listagem 4).

Python
A verso 2.2 do Python adicionou uma funo getaddrinfo() ao mdulo padro do socket [2]. Felizmente, as caractersticas perversas do C (o que inclui parmetros obsoletos dentro das estruturas hints ou res) no se aplicam ao Python. Alguns parmetros opcionais desta linguagem manipulam a funo da estrutura hints da interface C:
socket.getaddrinfo(host, port,family=0,socktype=0, U proto=0, flags=0)

Efeitos colaterais
Se voc quiser escrever programas compatveis com IPv6, deve evitar certas funes. Por exemplo, evite aquelas que esperam ou retornam uma struct in_addr como parmetro (listagem 3).

Listagem 1: getaddrinfo()
01 02 03 04 05 int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); void freeaddrinfo(struct addrinfo *res);

Listagem 5: getaddrinfo.py
01 #!/usr/bin/env python 02 import sys 03 from socket import * 04 05 host = sys.argv[1] 06 port = 80 if len(sys.argv)<3 else sys.argv[2] 07 08 for addrinfo in getaddrinfo(host, port, AF_ UNSPEC, SOCK_STREAM): 09 family, socktype, proto, canonname, sockaddr = addrinfo 10 socketObject = socket(family, socktype, proto) 11 #socketObject = socket(*addrinfo[:3]) 12 if socketObject is None: continue 13 haveConnection = False 14 try: 15 socketObject. connect(sockaddr) 16 socketObject.close() 17 haveConnection = True 18 except: 19 pass 20 familyString = IPv6 if family==AF_INET6 else IPv4 21 args = familyString, sockaddr[0], haveConnection 22 print({0} address {1}, connect = {2}.format(*args))

Listagem 2: struct addrinfo


01 struct addrinfo { 02 int ai_flags; 03 int ai_family; 04 int ai_socktype; 05 int ai_protocol; 06 size_t ai_addrlen; 07 struct sockaddr *ai_addr; 08 char *ai_canonname; 09 struct addrinfo *ai_next; 10 };

Listagem 3: Funes incompatveis com IPv6


01 02 03 04 05 06 07 int inet_aton(const char *cp, struct in_addr *inp); in_addr_t inet_addr(const char *cp); in_addr_t inet_network(const char *cp); char *inet_ntoa(struct in_addr in); struct in_addr inet_makeaddr(int net, int host); in_addr_t inet_lnaof(struct in_addr in); in_addr_t inet_netof(struct in_addr in)

Listagem 4: inet_pton e inet_ntop


01 02 03 int inet_pton(int af, const char *src, void *dst); const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

Linux Magazine #85 | Dezembro de 2011

65

PROGRAMAO | Aplicativos web e IPv6

As constantes requeridas AF_ e AI_ tambm esto disponveis no mdulo socket.

O valor de retorno do socket.getaddrinfo() uma lista de cinco sets, na seguinte forma:

(family, socktype, proto, canonname, sockaddr)

Figura 1 O Google pode ser encontrado tanto pelo IPv4 como pelo IPv6, tal
como mostra este programa exemplo em Python.

Os trs primeiros parmetros podem ser passados para o socket.socket() para criar um objeto socket. O canonname retorna o valor do nome cannico se for requisitado via flags. O ltimo parmetro, sockaddr, corresponde ao ai_addr, o qual retornado pelo Python como um set com diferentes tamanhos, dependendo da famlia de endereos. A primeira entrada neste conjunto sempre uma string que contm um endereo

Listagem 6: server.py
01 #!/usr/bin/env python 02 import sys 03 from socket import * 04 from select import select 05 06 host = None 07 port = sys.argv[1] 08 flags = AI_PASSIVE 09 10 serverSockets = [] 11 12 for addrinfo in getaddrinfo(host, port, AF_ UNSPEC, SOCK_STREAM, 0, flags): 13 family, socktype, proto, canonname, sockaddr = addrinfo 14 serverSocket = socket(family, socktype, proto) 15 if family==AF_INET6: 16 serverSocket. setsockopt(IPPROTO_IPV6, IPV6_ V6ONLY, 1) 17 serverSocket. bind(sockaddr) 18 serverSocket.listen(1) 19 serverSockets. append(serverSocket) 20 21 22 while True: 23 readable, writable, special = select( serverSockets, [], []) 24 for readSocket in readable: 25 connectionSocket, connectionAddress = readSocket. accept() 26 connectionSocket. send(Hello {0}\n. format(connectionAddress). encode(ascii)) 27 connectionSocket. close()

Figura 2 O servidor programado em Python responde s conexes telnet em


IPv6 e IPv4.

Figura 3 Um pequeno programa em Qt para a linha de comando descobre os


endereos IP dos hostnames.

66

www.linuxmagazine.com.br

Aplicativos web e IPv6 | PROGRAMAO

IP em notao numrica; a segunda sempre o nmero da porta. Para o IPv6, h entradas adicionais para flow info e scope id. Em ambos os casos, o ajuste pode ser usado como parmetro para os mtodos socket bind() e connect(). O primeiro programa exemplo um pequeno script Python (listagem 5) que usa getaddrinfo() para exibir os endereos para um host e tenta conectar-se a cada um destes endereos. Voc pode usar getaddrinfo(), por exemplo, para verificar se um determinado servidor web acessvel via IPv6. O cdigo compatvel com ambas as verses do Python: 2.7 e 3.1. O primeiro parmetro que o script espera o nome de um host (hostname) que ele passa, sem mudanas, para getaddrinfo() (linha 8). O padro 80. O script, ento, tenta fazer uma conexo para cada endereo encontrado, criando um objeto socket com family, socktype e com os parmetros proto que foram retornados. Feito isto, tenta fazer uma conexo connect() em relao a sockaddr (linha 15). Se isso funcionar, ser criada uma nota em haveConnection. O Google s fornece endereos IPv6 a certos provedores que tenham passado no teste IPv6. possvel observar isso nesta sada que mostra que cada famlia de endereos pode conter diversas entradas (gura 1). O nome de host ipv6.google.com sempre retorna um endereo IPv6. Tal como possvel ver do Facebook, voc pode adicionar uma mensagem de alerta para um endereo IPv6 de forma criativa:
$ python getaddrinfo.py www.facebook.com IPv6 address 2620:0:1c08:4000: face:b00c:0:1,connect = True IPv4 address 69.171.224.41,connect = True

Listagem 7: connectToHost
01 void connectToHost ( const QString & hostName, quint16 port, OpenMode openMode = ReadWrite )

Listagem 8: simpleClient.cpp
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include #include #include #include #include <QtCore/QCoreApplication> <QtCore/QStringList> <QtNetwork/QHostAddress> <QtNetwork/QTcpSocket> <iostream>

int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QString host = app.arguments().at(1); int port = 80; QTcpSocket socket; socket.connectToHost(host, port); if (!socket.waitForConnected(1000)) { std::cout << Could not connect << std::endl; return 10; } QHostAddress peerAddress = socket.peerAddress(); QString address = peerAddress.toString(); std::cout << Connected to << address.toAscii().constData() << std::endl; socket.close(); return 0; }

Listagem 9: greeter.h
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #ifndef GREETER_H #define GREETER_H #include <QtCore/QObject> #include <QtNetwork/QTcpServer> #include <QtNetwork/QTcpSocket> class Greeter : public QObject { Q_OBJECT public: Greeter(QObject *parent) : QObject(parent) {} public slots: void newConnection(QObject* serverObject) { QTcpServer* server = static_cast<QTcpServer*>(serverObject); QTcpSocket* connection = server->nextPendingConnection(); connect(connection, SIGNAL(disconnected()), connection, SLOT(deleteLater())); QHostAddress peerAddress = connection->peerAddress(); QString address = peerAddress.toString(); connection->write(Hello ); connection->write(address.toAscii()); connection->write(\n); connection->disconnectFromHost(); } }; #endif

Qual a aparncia do lado do servidor? Em uma aplicao servidora capacitada a IPv6, necessrio es-

Linux Magazine #85 | Dezembro de 2011

67

PROGRAMAO | Aplicativos web e IPv6

Quadro 1: Detalhes dos AI_FLAGS


AI_ADDRCONFIG: Se o programador fornecer apenas as especicaes deste sinal (flag), os endereos s sero retornados se alguma interface de rede tiver congurado pelo menos um endereo no-loopback de tipo correspondente. Isso signica que um dispositivo sem conexo IPv6 s receber endereos IPv4 e vice-versa. Infelizmente, os desenvolvedores das atuais bibliotecas Glibc [10] e Eglibc [11] tomaram a deciso questionvel de aceitar endereos para links locais IPv6 como congurveis. Isso quer dizer que o getaddrinfo() apresenta endereos IPv6 inalcanveis para os computadores que no tenham endereos IPv6 globais. Em tais ambientes as conexes normalmente falham logo, mas grandes timeouts ocorrem em alguns casos, e justamente para evit-lo que esta opo foi projetada. Fora isso, aconselhvel usar essa opo no lado do cliente para evitar tentativas de conexo e consultas DNS propensas a erros. AI_PASSIVE: Retorna sockets apropriados s chamadas de sistema bind() e accept(). AI_V4MAPPED: Retorna endereos IPv4 identicados por sockets AF_ INET6, para os quais nenhum endereo IPv6 pde ser vericado como endereo IPv6 do tipo mapeado em IPv4. AI_ALL: Retorna todos os endereos IPv6 e IPv4 mapeados (apenas se for combinado com o AI_V4MAPPED). AI_CANONNAME: Resolve um hostname cannico e o retorna dentro de uma lista res como primeiro item. AI_NUMERICHOST: Evita consultas ao DNS. O node precisa ser especicado em notao numrica.

pecificar None como host, AF_UNSPEC como a famlia e AI_PASSIVE para os flags receberem os parmetros e os endereos para sockets servidores que escutam as conexes em todas as interfaces de rede. Isso significa pelo menos dois sockets. A primeira questo quando um socket IPv4 ou IPv6 daro bind para a mesma porta, ao mesmo tempo. E a resposta : depende da opo de socket IPV6_V6ONLY, j descrita no RFC3493. No Python, voc pode ajustar esse detalhe ao usar o mtodo socket sockopt().
socket.setsockopt (IPPROTO_IPV6, IPV6_V6ONLY, 1)

Infelizmente, a configurao padro para essa opo depende do sistema operacional e at mesmo da distribuio. Alguns sistemas BSD a ativam por padro e, no Linux, o administrador pode ativ-la durante a execuo do sistema:
sysctl net.ipv6.bindv6only=1

aconselhvel que os programadores ajustem essa opo explicitamente e, neste caso, devem estar sempre prontos para ligar uma porta IPv6 mesmo que esta j esteja vinculada ao IPv4. Caso o IPV6_V6ONLY esteja desabilitado, as novas mensagens IPv4 so redirecionadas a um socket IPv6 por um socket V4-mapped. As especificaes IPv6 incluem uma tcnica para mapeamento de endereos IPv4 para endereos IPv6 [3]. Apesar de os endereos IPv4 mapeados serem prticos, tambm possuem desvantagens. Uma delas no ter representao textual, o que leva a strings modificadas, mais especificamente em sadas de log. Isso pode causar problemas para ferramentas de anlise que usam, digamos, expresses regulares para buscar endereos IPv4 e no conseguem identificar novas strings. Por outro lado, uma srie de problemas de segurana potenciais esto relacionados aos endereos mapeados em IPv4 [4]: o aplicativo no

consegue distinguir se uma conexo IPv4 existe ou se est lidando com uma conexo IPv6 com um endereo manipulado. O segundo problema com os dois server sockets que a chamada accept() normalmente fica bloqueada enquanto espera por uma conexo. Para contornar esse problema, os desenvolvedores poderiam, teoricamente, ativar dois processadores no servidor ou trabalhar com vrias threads. Contudo, isso no necessrio porque o select oferece uma soluo bem mais elegante para o problema ao permitir que o programa espere por diversos sockets ao mesmo tempo. Essa abordagem pode parecer um pouco intrincada, mas os aplicativos mais complexos no conseguiro resolver o problema sem usar o select ou alternativas como poll ou epoll. Em Python, voc vai encontrar a funo select() no mdulo padro Select [5].
readable, writable, special = select.select(rlist, wlist, xlist[, timeout])

Os parmetros rlist, wlist e xlist so listas de arquivos ou objetos socket que reagem a leitura, escrita e eventos incomuns. Os trs valores de retorno dados ao programa so listas de objetos que chegaram a um estado de espera. O valor para novas conexes readable. Em Python, o accept() suprido como mtodo de objeto socket que retorna um 2-tuple,
(conn, address) = socket.accept()

em que conn o novo socket na conexo estabelecida e address o endereo da outra parte da notao tuple do Python. O prximo exemplo de cdigo (listagem 6) usa uma dessas tcnicas IPv6 do Python na prtica. O cdigo encarregado de escutar ouve a porta, aceita as conexes que esto

68

www.linuxmagazine.com.br

Aplicativos web e IPv6 | PROGRAMAO

chegando e transfere seu endereo IP. A gura 2 mostra uma sesso Telnet em que o servidor usa IPv6 e Ipv4.

Kit de ferramentas Qt
O framework QT orientado a objetos C++ fornece diversas abstraes para programao voltada para redes dentro da biblioteca QtNetwork [6]. Em circunstncias normais, os programas cliente que usam os mtodos corretos sero conectados automaticamente via IPv6. O Qt oferece as classes QTcpSocket e QudpSocket para programao de re-

des. Ambas so derivadas da classe bsica QAbstract-Socket. Para estabelecer uma conexo TCP em um programa cliente, o desenvolvedor precisa primeiro criar uma QTcpSocket e, ento, chamar o mtodo QAbstractSocket, definido na classe base connectToHost() (listagem 7). Como exemplo, considere um programa mnimo de Qt (listagem 8) que tenta abrir uma conexo para um servidor web usando o nome passado pelo usurio como primeiro parmetro na linha de comando (gura 3).

Quadro 2: IPv6 na programao Perl


Se voc deseja escrever programas voltados para o IPv6 em Perl, sua nica opo o mdulo CPAN Socket6, que oferece funes como getaddrinfo(). O Perl 5.14 (maio de 2011) foi a primeira verso a implementar a funcionalidade no mdulo do Socket [12] no ncleo da linguagem. A listagem 11 mostra uma exemplo de aplicativo nesse sentido. A programao de Socket mais conveniente com o IO::Socket [13]. O IO::Socket::INET, necessrio para o IPv4, j faz parte do ncleo do Perl h muitos anos. O IO::Socket::INET6 do CPAN fornece um duplo mdulo para o IPv6. use IO::Socket::INET6; my $sock6 = IO::Socket::INET6->new( '[::1]:12345' ); my $sock4 = IO::Socket::INET6->new( '127.0.0.1:12345' ); O mdulo Socket6 compatvel retroativamente com o IO:Socket::INET e tambm pode criar conexes IPv4. O Socket6 aceita endereos como nomes de host na notao IPv4 ou IPv6 porque o IO::Socket::INET suporta programao mais simplicada e sockets no estilo Libc. Muitos programas e mdulos Perl o usam, com o sacrifcio de suas capacidades IPv6 (por exemplo, mdulos do ncleo, tais como o Net::SMTP, Net::FTP e mdulos importantes do CPAN, tais como LWP). Em muitos casos, possvel readequar programas ao IPv6 com a ajuda do Net::INET6Glue::INET_is_INET6 [14], que substitui o IO::Socket::INET por IO::Socket::INET6: use Net::INET6Glue::INET_is_INET6; use LWP::Simple; print get('http://ipv6.google.com/'); A seguinte linha de comando habilita ao IPv6 um programa j existente: $ perl -Mnet::INET6Glue::INET_is_INET6 ipv4_programm.pl Net::INET6Glue::FTP ainda estende o Net::FTP, adicionando os comandos essenciais EPRT e EPSV para IPv6. O IO::Socket::SSL fornece suporte simples ao SSL e, automaticamente, ao IPv6, desde que o IO::Socket::INET6 esteja instalado. Alm disso, o Perl oferece diversas bibliotecas para manipulao no-bloquevel de sockets. Em muitos casos, essas solues j suportam o IPv6, mas no usam o bloquevel getaddrinfo() para consultas de endereos, preferindo os seus prprios. Os exemplos incluem AnyEvent e POE. Contudo, o gerenciador dever retornar os resultados em ordem diferente da que voc poderia esperar com o getaddrinfo().

O QHostAddress [7] usado para sada: essa a abstrao Qt para endereos IPv4 e Ipv6. Entre outras coisas, ela fornece o mtodo QHostAddress::toString(). A aplicao QCoreApplication d aos desenvolvedores a opo de criar programas Qt sem uma GUI (listagem 8, linha 10). Aps connectToHost() (linha 16), que imediatamente retorna as chamadas de cdigo de waitForConnected() para esperar por uma conexo (linha 18). Uma outra alternativa atribuir o sinal connected() a um slot apropriado. Uma vez estabelecida a conexo, o programa exibe o peerAddress. Em um ambiente com suporte a IPv6, possvel ver que o programa estabelece automaticamente a conexo IPv6.
$ ./simpleClient www.google.com Connected to 2A00:1450:4001:C01:0:0:0:68%0

Isso prtico, mas no lhe d a possibilidade de interveno que o getaddrinfo() d aos programadores C. A funo que chega mais perto de faz-lo QHostInfo [8], que oferece mtodos para resoluo de nomes. Infelizmente, QHostInfo no oferece toda a convenincia que getaddrinfo d. Por exemplo, impossvel especificar quando voc quer endereos IPv4 ou IPv6 e o desenvolvedor no pode especificar flags, tais como AI_ADDRCONFIG. A implementao simples: o mtodo esttico, QHostInfo::fromName(const QString& name) retorna uma instncia QHostInfo , que usa QHostInfo::addresses() para retornar uma QList de instncias QHostaddress. Uma variante do nome lookupHost() trabalha em outra direo, usando threads separadas para lidar com requisies feitas, as quais so chamadas dentro do slot especificado do objeto. As aplicaes de servidor no so automaticamente compatveis com o

Linux Magazine #85 | Dezembro de 2011

69

PROGRAMAO | Aplicativos web e IPv6

IPv6 no Qt. O QTcpServer que usa abstrao para o socket servidor apenas escuta um endereo. Infelizmente,

o argumento padro um endereo IPv4 QHostAddress::Any dentro do mtodo listen().

Listagem 10: server.cpp


01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 #include #include #include #include #include #include #include #include <QtCore/QCoreApplication> <QtCore/QSignalMapper> <QtCore/QStringList> <QtNetwork/QNetworkInterface> <QtNetwork/QHostAddress> <QtNetwork/QTcpServer> <iostream> greeter.h

int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); int port = app.arguments().at(1).toInt(); Greeter* greeter = new Greeter(&app); QSignalMapper* sigMap; sigMap = new QSignalMapper(&app); greeter->connect(sigMap, SIGNAL(mapped(QObject *)), SLOT(newConnection(QObject *))); QList<QTcpServer> servers; QList<QNetworkInterface> ifs; ifs = QNetworkInterface::allInterfaces(); foreach(const QNetworkInterface& i, ifs) { QList<QNetworkAddressEntry> entries; entries = i.addressEntries(); foreach(const QNetworkAddressEntry& entry, entries) { QHostAddress address = entry.ip(); // fix scope of link-local addresses Q_IPV6ADDR addr6;// = address.toIPv6Address(); addr6 = address.toIPv6Address(); if (addr6[0] == 0xfe && addr6[1] == 0x80) { QString name=i.humanReadableName(); address.setScopeId(name); } QTcpServer* server; server = new QTcpServer(&app); sigMap->setMapping(server, server); sigMap->connect(server, SIGNAL(newConnection()), SLOT(map())); server->listen(address, port); if (!server->isListening()) { std::cout << Cannot listen on << address.toString().toAscii().constData() << std::endl; } } } return app.exec(); }

Para contornar essa situao, os desenvolvedores podem especificar o QHostAdress::AnyIPv6 IPv6 para o mtodo listen(). Essa soluo vai funcionar em qualquer plataforma e distribuio onde a opo padro do socket IPV6_V6ONLY for 0. O programa resultante recebe conexes IPv4 via endereos mapeados em IPv4. No entanto, no h uma maneira simples de dizer ao QTcpServer para usar a opo socket IPV6_V6ONLY. Uma soluo injetar um descritor socket criado em C atravs do QTcpServer::setS ocketDescriptor. Os programadores encontraro uma soluo alternativa ao mergulhar na biblioteca QtNetwork. Se voc o fizer, encontrar a classe QNetworkInterface , que enumera todos os dispositivos da rede. Essa classe cria uma lista de instncias QNetworkAddressEntry para cada dispositivo e cada um tem um QHostAdress. Assim possvel descobrir todos os endereos IPv4 e IPv6 existentes no sistema. O desenvolvedor tem, primeiro, a opo de abrir uma porta no servidor para certas placas de rede

Listagem 11: Socket Perl


01 #!/usr/bin/perl 02 03 use Socket6; # ab 5.14 reicht use Socket 04 my @res = getaddrinfo(ipv6. google.com,http,AF_ UNSPEC,SOCK_STREAM ); 05 my $sock; 06 while (! $sock and @res) { 07 my ($fam,$type,$proto,$s addr,$cname) = splice(@ res,0,5); 08 socket($sock,$fam,$type,$proto) or die $!; 09 connect($sock,$saddr) and last; 10 undef $sock; 11 } 12 $sock or die $!;

70

www.linuxmagazine.com.br

Aplicativos web e IPv6 | PROGRAMAO

apenas. O cdigo para servidores QT (listagens 9 e 10) interage com todos os dispositivos e endereos da rede (linha 29 na listagem 10). Voc pode simplesmente usar QN
etworkInterface::allAddresses() [9] para isso, mas infelizmente

Concluso
Se voc sabe o que est procurando, no ser difcil fazer um programa compatvel com o IPv6. Ainda que os programas clientes sejam razoavelmente simples, os programas servidores tm maior complexidade caso o desenvolvedor deseje abordar quaisquer eventualidades. Os frameworks com alto nvel de abstrao podem virar um problema caso no tenham funcionalidade crtica em sua camada de abstrao, tal como IPV6_V6ONLY dentro do kit de ferramentas QT.

ele vai retornar 40 endereos locais de links. Para cada endereo de rede, o programa cria um novo QTcpServer (linha 46, listagem 10) e o conecta usando um QSignalMapper, o que necessrio porque o QTcpServer apenas envia um sinal newConnection() vazio que no informa ao receptor qual dos muitos remetentes tem uma nova conexo. O QSignalMapper avalia um sinal com a informao do seu remetente, de forma que o programa possa dizer ao visitante qual IP eles esto usando.

Gostou do artigo? rtigo?


Queremos ouvir sua opinio. pinio. Fale conosco em m cartas@linuxmagazine.com.br zine.com r Este artigo no nosso site: osso e: http://lnm.com.br/article/6106 br/art /610

Mais informaes
[1] RFC 3493: http://tools.ietf.org/html/rfc3493 [2] getaddrinfo() em Python: http://docs.python.org / library/socket.html#socket.getaddrinfo [3] Endereos IPv4-Mapped IPv5: http://www.tcpipguide. com/free/t_IPv6IPv4AddressEmbedding-2.htm [4] Aspectos da segurana com endereos V4MAPPED: http:// tools.ietf.org/html/draft-itojun-v6ops-v4mapped-harmful-02 [5] select() em Python: http://docs.python.org/ library/select.html#select.select [6] Biblioteca QtNetwork: http://doc.qt.nokia. com/4.6/network-programming.html [7] QHostAddress: http://doc.qt.nokia.com/4.6/qhostaddress.html [8] HostInfo: http://doc.qt.nokia.com/4.6/qhostinfo.html [9] QNetworkInterface: http://doc.qt.nokia. com/4.6/qnetworkinterface.html [10] Glibc bug: http://sourceware.org/bugzilla/show_bug.cgi?id=12377 [11] Bug em Ubuntu Eglibc: https://bugs.launchpad. net/ubuntu/+source/eglibc/+bug/762512 [12] Mdulo Perl socket: http://perldoc.perl.org/Socket.html [13] IO::Socket::INET: http:// perldoc.perl.org/IO/Socket/INET.html [14] Net::INET6Glue : http://search.cpan.org/~sullr/Net-INET6Glue-0.5/ [15] Listagens do artigo, incluindo os arquivos para o Qmake: [LINK LINK LINK LINK LINK LINK LINK]

Linux Magazine #85 | Dezembro de 2011

71

TUTORIAL | Converso de PDF

TUTORIAL

Converso para PDF baseada em email

Converso de PDF
Envie alguns arquivos por email e receba documentos PDF como resposta, usando para isso LibreOfce, Postx e scripts Shell. por Olaf Hbner

uitos programas Linux criam documentos PDF a partir de diversos formatos. Mas, e se sua equipe precisar converter diversos documentos para PDF de uma vez s? O mtodo precisaria ser econmico, simples, rpido e possuir uma interface grfica que no oferea muita dificuldade ao usurio. Uma pesquisa inicial revela diversas solues em potencial, mas converter vrios documentos ao mesmo tempo sempre envolve uma boa dose de entrada de dados por parte do usurio, e o uso de impressoras de PDF virtuais muito lento quando voc tem muitos arquivos. As equipes de escritrio tm familiaridade com email, algo que usam todos os dias para diversas funes. Essa ideia bsica est por trs do projeto que uma empresa de Berlim, na Alemanha, implementou para combinar um servidor de email com o Open/ LibreOffice, criando para isso uma soluo interna. O usurio s precisa enviar os arquivos que quer converter como anexos para o servidor, e receber de volta o resultado documentos PDF no email de resposta.

Sequncia prtica
necessrio um endereo de email separado para receber as tarefas de converso. Neste exemplo, usarei pdf@dominio.tld. No lado em que ocorre a converso, voc precisa do Postfix. A seguinte linha no arquivo /etc/aliases pede para o servidor de email repassar a mensagem para o script de converso:
pdf: "|/usr/local/bin/ pdf-konverter.sh"

depois, os repassa para o Unoconv [1], um utilitrio para comunicao com o Open/LibreOffice. Esse conjunto de aplicativos para escritrio cuida do processo de converso antes de o script finalmente empacotar

Listagem 2: /etc/init.d/ unoconvd


01 02 03 04 05 06 07 08 #!/bin/sh ### BEGIN INIT INFO # Provides: unoconvd # Required-Start: $network # Required-Stop: $network # Default-Start: 2 3 5 # Default-Stop: # Description: unoconvd - Convert to PDF 09 ### END INIT INFO 10 case "$1" in 11 start) 12 /usr/bin/unoconv --listener & 13 ;; 14 stop) 15 killall soffice.bin 16 ;; 17 restart) 18 killall soffice.bin 19 sleep 1 20 /usr/bin/unoconv --listener & 21 ;; 22 esac

O comando postalias /etc/aliases compila a configurao para o Postfix. O script pdf-konverter.sh primeiro desempacota os anexos;

Listagem 1: /etc/postx/main.cf
01 myhostname = pdfserver.dominio.tld 02 mydomain = dominio.tld 03 mydestination = $mydomain 04 myorigin = $mydomain 05 alias_maps = hash:/etc/aliases 06 alias_database = hash:/etc/aliases 07 # optional smarthost 08 # relayhost = mail.domain.tld 09 mynetworks = 127.0.0.0/8 10 message_size_limit = 51200000

72

www.linuxmagazine.com.br

Converso de PDF | TUTORIAL

os arquivos de volta, sob a forma de anexos, e os devolve ao remetente. O tamanho mximo de um email definido pelo parmetro message_size_limit na configurao do Postfix (listagem 1). Como o LibreOffice executado como daemon, o processo de converso em si muito rpido: um email de 20 MB com 19 anexos consome apenas um minuto na converso e retorno e o email de teste ainda passou por um scanner antivrus tanto na ida quanto na volta. No caso de um nico arquivo, os usurios o recebem de volta em apenas alguns segundos.

Listagem 3: pdf-konverter.sh (trecho)


01 02 03 04 05 #!/bin/sh [...] # extrai os anexos como arquivos individuais /usr/local/bin/ripmime -i $PDFMAIL -d $PDF_PATH --overwrite --syslog --extended-errors

Requerimentos do sistema
A equipe em Berlim usou a verso 64-bit do Debian Squeeze, mas tudo pode ser feito da mesma maneira com o Ubuntu 10.10. Como o aplicativo s depende de componentes de cdigo aberto, deve funcionar em outras distribuies tambm. Alm do Postfix como servidor de email, tambm sero necessrios empacotadores e desempacotadores para os anexos. O ripMIME a escolha certa para desempacotar os anexos: ele pega os anexos codificados como MIME de um email e os grava como arquivos individuais no diretrio selecionado. Uma ferramenta alternativa para isso o Uudeview [2]. O ripMIME atuou como um desempacotador bem gil em nosso laboratrio. O programa est atualmente disponvel apenas em cdigo-fonte [3]; voc pode compil-lo com make && make install. O comando
chown nobody:nogroup /usr/local/bin/ripmime

define as permisses corretas para o binrio. Para o empacotamento, o programa uuenconde est prontamente disponvel no pacote debian sharutils. Ele codifica os arquivos convertidos no email de resposta.

06 07 # lista arquivos compatveis 08 /bin/ls $PDF_PATH/*.* \ 09 | /bin/egrep -i '\.(do[ct]|doc[mx]|rtf|pp[ts]|xl[st]|csv|od[stdgp]|ott| htm|sd[wcda]|sxc|jpg|pts|bmp|png|tif|gif)$ \ 10 > $PDF_PATH/files_to_convert.txt 11 12 # cria cabealho e corpo do email 13 echo "From: $PDF_FROM" >$EMAIL_RETURN 14 echo "To: $SENDER" >>$EMAIL_RETURN 15 echo "Subject: $SUBJECT" >>$EMAIL_RETURN 16 echo "MIME-Version: 1.0" >>$EMAIL_RETURN 17 echo "Content-Type: multipart/mixed; boundary=\$BOUNDARY"\ >>$EMAIL_RETURN 18 echo "--$BOUNDARY" >>$EMAIL_RETURN 19 echo "Content-Type: text/plain; charset=\"$CHARSET\"; format=flowed" >>$EMAIL_RETURN 20 echo "Content-Transfer-Encoding: quoted-printable" >>$EMAIL_RETURN 21 /bin/cat $PDF_PATH/body_return.txt >>$EMAIL_RETURN 22 23 # processamento linha a linha da lista de arquivos 24 while read FILE_NAME 25 do 26 /usr/bin/unoconv -f pdf "${FILE_NAME}" 27 done < $PDF_PATH/files_to_convert.txt 28 29 # codifica nomes de arquivos como ISO-8859-15, remove caracteres 30 # especiais e codifica os arquivos PDF como base64 31 for ATTACHMENT in $PDF_PATH/*.pdf 32 do 33 FILENAME=$(basename "${ATTACHMENT}") 34 (echo "${ATTACHMENT}" ; echo $FILENAME) >> $PDF_PATH/pdf_filenames_and_basenames.txt 35 ( echo -n "\"=?$CHARSET?Q?" ; \ 36 echo -n $FILENAME | /usr/bin/perl -pe use MIME::QuotedPrint; $_=MIME::QuotedPrint::encode($_); \ 37 | /bin/sed s/\./=2E/g /bin/sed s/ /=20/g /bin/sed s/=$//g; \ 38 echo "?="\" \ 39 ) | tr -d \n >$PDF_PATH/filenames_codiert.txt 40 FILENAME_CODIERT=$(/bin/cat $PDF_PATH/filenames_codiert.txt ) 41 echo "--$BOUNDARY" >>$EMAIL_RETURN 42 echo "Content-Type: application/pdf;" >>$EMAIL_RETURN 43 echo " name=$FILENAME_CODIERT" >>$EMAIL_RETURN 44 echo "Content-Transfer-Encoding: base64" >>$EMAIL_RETURN 45 echo "Content-Disposition: attachment;" >>$EMAIL_RETURN 46 echo " filename=$FILENAME_CODIERT" >>$EMAIL_RETURN 47 echo "" >>$EMAIL_RETURN 48 # strip first and last line 49 /bin/cat "${ATTACHMENT}" uuencode --base64 $BOUNDARY /bin/sed 1,1d /bin/sed $d >>$EMAIL_RETURN 50 done 51 # fim da mensagem de email 52 echo "--$BOUNDARY--" >>$EMAIL_RETURN 53 54 # envia email 55 /bin/cat $EMAIL_RETURN | /usr/sbin/sendmail -t -f pdf@dominio.tld 55 exit 0

Linux Magazine #85 | Dezembro de 2011

73

TUTORIAL | Converso de PDF

Servidor Ofce
A ferramenta de linha de comando unoconv ser realmente necessria para executar o Open/LibreOffice em modo servidor. Ela usa as ligaes de dados UNO para ler os formatos compatveis e salv-los no formato escolhido. O site do Unoconv [1] exibe uma lista impressionante de formatos compatveis para importao e exportao. Para iniciar o LibreOffice como um daemon, use o comando:
unoconv --listener

que, por padro, escuta a porta TCP 2002, embora seja possvel mudar isso com a opo --port. Outras grandes vantagens do modo --listener so: a velocidade com que os documentos so convertidos e a sintaxe simples. Mais informaes sobre como usar o LibreOffice em modo daemon e sobre a API esto nas pginas de ajuda do LibreOffice [4] e no wiki do OpenOffice [5].

H, contudo, um seno: se voc tiver uma instalao padro do Debian Squeeze e iniciar o Unoconv no modo --listener, ver uma mensagem de erro sobre a ligao UNO do Python. Para contornar isso, instale o pacote LibreOffice a partir dos backports ao invs do OpenOffice. Como o Unoconv trabalha em cooperao ntima com a verso do Office, voc precisa do pacote Debian na verso unstable [6]. Como root, digite os seguintes comandos para criar um script de inicializao para controlar o servidor do LibreOffice e preencha-o com o contedo da listagem 2:
touch /etc/init.d/unoconvd chmod 755 /etc/init.d/unoconvd

Depois, a ferramenta insserv garante que o servio ser iniciado no nvel de execuo padro:
insserv -d unoconvd

ou chkconfig, ou ento configur-lo manualmente. Aps iniciar o daemon tanto ao usar a verso RC ou se o fizer manualmente, por exemplo, com o comando /etc/init.d/unoconv start voc passar a ver o unoconv e o soffice.bin na lista de processos. O script que recebe o email, converte-o e o devolve ao remetente est localizado em /usr/local/bin/ pdf-konverter.sh. Sua propriedade deve ser nobody:nogroup. A listagem 3 mostra parte de seu contedo. Se no estiver satisfeito com o Unoconv e o Open/LibreOffice, voc pode mudar as linhas no script de converso para uma das muitas alternativas: Antiword [7] (que primeiro converte para Postscript e depois, com o ps2pdf, para PDF), Pandoc [8], JOD, PyODConverter [9] e LOPDFConverter [10] so as opes disponveis.

Se no tiver o insserv, voc pode configurar o servio com update-rc.d

Futuro
Essa soluo basicamente ir permitir que voc execute um servidor de converso PDF bastante gil. Como a verso 0.4 (ou superior) do Unoconv oferece filtros especiais para exportao, voc pode acrescentar outra conta de email a o arquivo /etc/aliases e escrever um segundo script (ou uma seo interna para avaliao de parmetros) para poder escolher os formatos de exportao [11]. Antes de implementar o conversor PDF em um ambiente de produo, fique atento a algumas recomendaes de segurana: executar o Unoconv como um usurio definido, criar cronjobs para apagar diretrios temporrios, criar arquivos de log e blindar o Postfix.

Mais informaes:
[1] Unoconv: http://dag.wieers.com/home-made/unoconv [2] Uudeview: http://www.fpx.de/fp/Software/UUDeview [3] ripMIME: http://www.pldaniels.com/ripmime/ripmime-1.4.0.9.tar.gz [4] Parmetros para iniciar o LibreOfce: http://help.libreoffice. org/Common/Starting_the_Software_With_Parameters [5] Exportar para PDF no OpenOfce: http://wiki. services.openoffice.org/wiki/Documentation/OOo3_ User_Guides/Getting_Started/Exporting_to_PDF [6] unoconv-unstable: http://packages.debian. org/sid/all/unoconv/download [7] Antiword: http://freshmeat.net/projects/antiword [8] Pandoc: http://johnmacfarlane.net/pandoc [9] JOD e PyODConverter: http://artofsolving.com/opensource [10] LOPDFConverter: http://sourceforge.net/projects/lopdfconverter [11] API OpenOfce API para exportao PDF: http://wiki. services.openoffice.org/wiki/API/Tutorials/PDF_export [12] Listagens deste artigo: http://www.lnm. com.br/issues/85/mail2pdf.zip

Gostou do artigo? go?


Queremos ouvir sua opinio. pinio. Fale conosco em cartas@linuxmagazine.com.br e.com.b Este artigo no nosso site: so sit http://lnm.com.br/article/6092 articl 092

74

www.linuxmagazine.com.br

Sandbox simples com o Arkose | TUTORIAL

Sandbox simples com o Arkose

Caixa de areia
O Arkose permite connar programas potencialmente instveis em uma sandbox virtual, mantendo seu sistema protegido contra acidentes e perda de dados. por Thomas Drilling

TUTORIAL

ma criana pode brincar em segurana dentro de uma caixa de areia, sem o perigo de destruir objetos de valor. Este mesmo princpio, que funciona bem no mundo fsico, pode ser aplicado ao ambiente virtual. Uma caixa de areia digital tem um propsito mais restritivo, mas a ideia a mesma: criar um ambiente para programas no qual eles possam ser executados sem causar danos ao sistema como um todo. Neste contexto, dano refere-se a aspectos relacionados tanto ao cdigo do software quanto ao ambiente operacional. O Arkose [1], desenvolvido por Stphane Graber, uma ferramenta de continer que mantm o mesmo conceito tecnolgico do LXC (Linux Container) [2]. Ele foi incorporado ao kernel na verso 2.6.29 e baseado nos namespaces (espaos de nomes) do kernel [3] (para isolar processos) e Cgroups [4] (para restringir recursos), o que o torna equivalente a um aplicativo ou a um continer de sistema. De acordo com o website no Launchpad, o Arkose um aplicativo de continer seguro e amigvel ao usurio [...] Basicamente ele permite iniciar qualquer binrio instalado dentro de um continer configurvel. possvel definir quanto espao em disco ele ocupar, se ter acesso rede e se deve ter acesso ao seu diretrio /home.

Este software foi projetado para ser simples e no oferece a mesma gama de recursos includos em outros programas como ferramentas de continer mais sofisticadas. Contudo, rpido e fcil. possvel iniciar um aplicativo dentro de um continer seguro com um nico comando, ou mesmo de dentro do gestor de arquivos Nautilus (gura 1). Tal como voc ver neste artigo, o Arkose usa o sistema de arquivos de camadas Aufs para simular o acesso ao sistema de arquivos local, o que significa que o aplicativo que est sendo executado dentro de um continer no sabe que est dentro dele ou em uma rea local restrita. O Arkose prtico como ferramenta de segurana e desenvolvimento. Seu ambiente fcil e gil permite montar e testar aplicativos de modo a no danificar o seu sistema.

ir usar, enquanto o kernel cuida da questo das hierarquias. O controlador de recursos de memria do kernel isola esses grupos do restante do sistema e restringe o apetite de programas insaciveis por memria. Caso os Cgroups estejam habilitados no kernel, este os utilizar para gerenciar todos os recursos sejam eles processos do espao do usurio, seus prprios processos ou processos do kernel. O Aufs [5], um novo derivado do UnionFS, exibe mudanas no sistema de arquivos dentro do continer. Trata-se de um sistema de arquivos em camadas usado para simular escrita em mdias no-gravveis. Assim, o Arkose d a cada usurio Linux uma soluo simples para colocar programas dentro de uma rea restrita.

Instalao
Usar o Arkose muito fcil no Natty Narwhal. O Ubuntu 11.04 a primeira distribuio a vir com esse programa em seu repositrio e a incluir uma interface grfica integrada ao Nautilus. Para instal-lo, simplesmente selecione os pacotes arkose, arkose-gui (interface grfica) e arkose-nautilus (integrao ao Nautilus) no gerenciador de pacotes. necessrio preencher os seguintes pr-requisitos: a verso 1.3 precisa, no mnimo, do kernel 2.6.36, com suporte a Aufs2 habilitado padro no Ubuntu 11.04. necessrio, ainda, ter o LXC,

Como funciona o Arkose?


O recurso Cgroups est disponvel no kernel Linux desde a verso 2.6.24. Ele permite ao kernel agrupar processos e execut-los dentro de um outro processo especfico ou us-lo como uma unidade dentro de um planejamento. Em um sistema Linux, essa tcnica oferece a possibilidade de selecionar um grupo de processos e determinar os recursos que cada um

Linux Magazine #85 | Dezembro de 2011

75

TUTORIAL | Sandbox simples com o Arkose

Figura 1 A integrao com o Nautilus permite


aos usurios executar qualquer aplicativo dentro de uma rea local restrita.

Figura 2 O Arkose oferece uma quantidade mnima de


opes para congurar a rea local.

o Python, o Gtk e um emulador de terminal X (todos eles fazem parte da configurao padro do Ubuntu). Infelizmente, por enquanto, o repositrio do Ubuntu 11.04 dispe apenas da verso 0.3.2. Se voc quiser trabalhar com o Arkose, provavelmente vai preferir instalar a atual verso de desenvolvimento 1.3.2. No Ubuntu 11.04 isso relativamente indolor e possvel faz-lo ao habilitar o repositrio PPA ppa:arkose-devel/stable, onde ser possvel encontrar tambm a verso 1.3.2 para o Ubuntu 10.10. Como alternativa, voc pode fazer o download da verso 1.3.1 diretamente do Launchpad [6]. Depois de instalado, a interface grfica (arkose-gui) estar disponvel em seu sistema no menu Aplicativos/Ferramentas de sistema/Arkose Desktop Application Sandboxing. mais fcil iniciar um programa dentro de um continer ao selecionar Abrir em uma sandbox no Nautilus ser preciso ter instalado o pacote arkose-nautilus para que esta opo esteja disponvel (gura 1).

Congurao
O Arkose exibe uma caixa de dilogo com o caminho para o programa ou binrio selecionado. Ao clicar em Exibir as opes da rea local uma srie de novas opes mostrada (gura 2).

A opo tamanho do recipiente (Container) permite definir o tamanho mximo do continer, o que limita o espao de trabalho do programa dentro da RAM e suas tentativas de iniciar novas instncias, criar documentos e arquivos temporrios. Se desejar manter as opes selecionadas como padro para as prximas vezes em que o executar, selecione um das opes Diretrio/home real (em vez de copiar-na-escrita) ou Diretrio/ tmp real (em vez de copiar-na-escrita). O suporte rede autoexplicativo: d ao programa dentro do continer acesso rede do sistema. A verso 1.3 acrescentou a opo Tipo de armazenamento com dois botes: ext4 (disco) e tmpfs (memria). A segunda faz com que as mudanas permaneam visveis ao programa na RAM em vez de escrev-las no ~/.arkose/. Voc tambm pode iniciar o Arkose pela linha de comando, com sudo arkose. Use man arkose para listar as opes para sua execuo, que so as mesmas da caixa de dilogo da interface grfica.

servios do sistema hospedeiro, tais como o D-Bus. O fato que, atravs do Arkose 0.3.2, um programa sequer tem acesso ao PulseAudio. Esta ltima restrio caiu na verso 1.3, que introduz uma srie de mudanas decisivas. Por exemplo, os programas agora podem enviar sons ao PulseAudio e usar dispositivos de vdeo, como a webcam. Alm disso, o Arkose tem seu prprio servidor X. Por ltimo, mas no menos importante, sua nova verso permite comunicao via D-Bus.

Concluso
O Linux, particularmente, tem vrias boas opes de mtodos para colocar aplicativos potencialmente instveis dentro de reas restritas. As opes variam entre um simples redirecionamento do diretrio raiz at uma virtualizao completa do sistema operacional dentro de contineres. Se tudo o que voc quer isolar programas individualmente, no necessrio instalar programas mais poderosos. Voc pode confiar no Arkose, que lhe permite usar as complexas tecnologias de continer do Linux com os recursos de um usurio padro.

Arkose 1.3
Um programa controlado pelo Arkose executado praticamente isolado do resto do sistema, de modo que no tem a possibilidade de acessar

76

www.linuxmagazine.com.br

Sandbox simples com o Arkose | TUTORIAL

Quadro 1: Ferramentas de rea restrita/local


O Linux tem uma gama de tecnologias de sandboxing (restrio de rea para programas) a comear pela possibilidade de redirecionar um sistema de arquivos com o chroot, passando pela virtualizao de um ambiente ou sistema operacional (OpenVZ, Linux-VServer), indo at a possibilidade de emular todo o hardware hospedeiro. Todas essas tecnologias que suprem um contexto virtual para um programa ou restringem seus direitos de acesso para evitar que cause danos ao sistema hospedeiro podem, por princpio, ser consideradas ferramentas de conteno ou restrio de rea. Essas solues incluem contineres de recursos tais como OpenVZ, Linux-VServer, Solaris Zones, Parallels Virtuozzo, User-mode Linux (UML) ou LXC (Linux Containers) . Programas como o KVM/Qemu, Bochs, FAUmachine ou Xen e VMware tambm do suporte ao sandboxing. O desenvolvedor do Fedora, Daniel Walsh, tem planejado uma rea local baseada no SELinux j h algum tempo.

Mais informaes:
[1] Arkose: http://www.stgraber. org/category/arkose [2] Contineres Linux (LXC): http://lxc.sourceforge.net [3] Espaos de nomes no kernel: http://lcx.sourceforge. net/index.php/about/ kernel-namespaces [4] Cgroups: http://www. mjmwired.net/kernel/ Documentation/cgroups [5] Aufs: http://aufs. sourceforge.net [6] Arkose no Launchpad: https://launchpad.net/ arkose/trunk/1.3

Gostou do artigo? go?


Queremos ouvir sua opinio. a op o. Fale conosco em cartas@linuxmagazine.com.br .com.b Este artigo no nosso site: so sit http://lnm.com.br/article/6089 articl 089

Linux Magazine #85 | Dezembro de 2011

77

PREVIEW

Linux Magazine #86


Guerra
No amor e na guerra, vale tudo, j dizia o ditado. E na guerra contra os crackers preciso se armar com o que h de mais moderno no ramo da segurana. Nesta edio voc poder conhecer quais as ferramentas e tcnicas que os invasores utilizam ao se prepararem para um ataque e como se antecipar a elas. Voc tambm ir conhecer na Linux Magazine #86 uma maneira de proteger suas senha com o phpass e como utilizar ferramentas de monitoramento de forma a perceber qualquer sinal de quebra de segurana. No perca, porque a prxima edio est um estouro!

Admin Magazine #4
Otimizao de velocidade
Na prxima edio da Admin Magazine, voc ira conhecer as melhores dicas e tutoriais para tirar maior proveito dos computadores existentes em seu parque de TI, diminuindo assim a obsolescncia do hardware e as mais diversas formas para aumentar o desempenho dos servios que so executados na rede. No perca a edio #4 da melhor revista para administrador de redes.

82

www.linuxmagazine.com.br

Você também pode gostar