EDITORIAL
Diretor Geral Rafael Peregrino da Silva rperegrino@linuxmagazine.com.br Editores Flvia Jobstraibizer fjobs@linuxmagazine.com.br Laura Loenert Lopes llopes@linuxmagazine.com.br Editora de Arte Larissa Lima Zanini llima@linuxmagazine.com.br Editor Online Felipe Brumatti Sentelhas fsentelhas@linuxmagazine.com.br Colaboradores Alexandre Borges, Alexandre Santos, Augusto Campos, Ben Martin, Brian Proftt, Cezar Taurion, Charly Khnast, David J. Dodd, Jon maddog Hall, Klaus Knopper, Kurt Seifried, Marcin Teodorczyk, Markus Junginger, Michael Messner, Thomas Drilling, Tim Schrmann, Zack Brown. Traduo Laura Loenert Lopes, Rodrigo Garcia, Sebastio Luiz da Silva Guerra. Reviso Ana Carolina Hunger. 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 - 2012: Linux New Media do Brasil Editora Ltda. Impresso e Acabamento: IBEP Grca. 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
NDICE
CAPA
Sempre alerta! Rpidos e silenciosos, invasores podem atacar uma rede, danicla e sair sem deixar rastros antes que voc perceba. Saiba como evitar estes e outros problemas de segurana. 33
Rede de segurana No est interessado em depender da consultoria de um hacker prossional? Pode ser interessante conar um rastreador de vulnerabilidade a um software especializado neste tipo de tarefa, como o OpenVAS.
34
Agulha no palheiro A beleza do Wireshark no est somente em seu funcionamento em tempo real. Ao salvar um histrico de atividades de rede em um arquivo pcap usando uma ferramenta como a tcdump, podemos ltrar os dados com o Wireshark para localizar evidncias de invaso.
40
Anlise de vulnerabilidades Nesse artigo, demonstramos um ataque bem-sucedido a um servidor via IPv6 e explicamos como as principais ferramentas de segurana lidam com o protocolo.
44
www.linuxmagazine.com.br
COLUNAS
Klaus Knopper Charly Khnast Augusto Campos Alexandre Borges Kurt Seifried Zack Brown 12 14 16 18 20 22
SEGURANA
Segurana da informao Pioneiro em detectar vulnerabilidades em sistemas antivrus, vice-presidente da Sourcere detalha soluo de segurana ideal e comenta sobre o cenrio brasileiro, inovador em malwares. Olhar penetrante 60 57
NOTCIAS
Geral HTML5 deve estar completo at 2014 A verso beta do RHEL 5.9 inclui drivers para o Hyper-V SUSE Manager 1.7 suporta PostgreSQL e IPv6 Xen 4.2 traz nova coleo de ferramentas Tire proveito do baixo consumo de energia oferecido por dispositivos NAS modernos para monitorar suas cmeras. 24
CORPORATE
Notcias Red Hat com maior faturamento e menor lucro Rackspace entrega OpenStack para fundao independente Foxconn investir R$1 bilho no Estado de So Paulo Coluna: Jon maddog Hall Coluna: Cezar Taurion Coluna: Alexandre Santos 28 30 32 26
TUTORIAL
Crptico 66
ANDROID
Toque perfeito 50
A criptograa uma parte importante da segurana em TI, e o OpenSSL uma conhecida ferramenta de criptograa para o Linux. Especialistas conam no OpenSSL porque livre, possui muitos recursos e fcil de usar em scripts Bash. Computao pioneira A sbita popularidade de computadores miniboard como o Raspberry Pi trouxe de volta o esprito pioneiro dos primeiros dias do Linux. Repentinamente, o faa voc mesmo na comunidade de cdigo aberto est de volta. 70
PROGRAMAO
Centro do alvo? Com a verso 2.0 do Android, os desenvolvedores passaram a ter acesso a recursos multitoque anteriormente reservados a aplicativos do sistema. Mas ateno: preciso ter cuidado ao manusear a API. 72
REDES
Squid no meio 54 A linguagem de programao Dart a atual alternativa do Google ao JavaScript. Executada principalmente em navegadores, tambm pode ser utilizada em linha de comando e em servidores como substituta para o PHP.
SERVIOS
Editorial Como monitorar a rede quando os sistemas-clientes se conectam a servidores seguros atravs do protocolo HTTPS? Mantenha o monitoramento em dia com o servidor proxy Squid. Emails Linux.local Preview 06 10 78 82
CORPORATE
Inteligncia coletiva
Conhecimento na era digital existe para ser compartilhado. E o volume de dados armazenados na rede tende a crescer assustadoramente. Cabe a ns, usurios, saber ltrar aquilo que realmente nos interessa.
ivemos hoje um consenso de que a tecnologia da informao pode expandir nossa capacidade de comunicao, colaborao, compartilhamento de conhecimento e, por extenso, a nossa capacidade de descoberta e inovao. At a chegada da era digital, a maioria das pessoas aceitou um sistema padro de conhecimento. Os alunos estudavam temas, ganhavam credenciais para provar sua proficincia e tornavam-se especialistas. Parte destes especialistas conduziam pesquisas e transmitiam conhecimento escrevendo livros e artigos para compartilhar suas descobertas e concluses com o meio acadmico e profissional. Outros, ao aplicar o conhecimento na prtica, comprovavam a teoria ou a derrubavam. Conforme essas novas descobertas iam ganhando aceitao, juntavam-se ao corpo de conhecimento estabelecido onde forneciam a base de conhecimento para o prximo nvel de aprendizagem num ciclo seguro e lento. Mas, desde 1961, quando o MIT demonstrou o primeiro sistema mundial de compartilhamento [1], o embrio dasmdias digitais passou a impulsionar o desenvolvimento e a adoo de tecnologias colaborativas cada vez mais sofisticadas. Hoje usamos email, mdias sociais, mensagens instantneas, fazemos conferncias pela Internet e compartilhamos espaos de trabalho atravs de servios online. A abundncia de informaes na rede tornou ainda mais difcil discernir o que verdadeiro daquilo que falso. O co-fundador da Wired, Kevin Kelly, recentemente escreveu que os seres humanos publicaram pelo menos 32 milhes de livros, 750 milhes de artigos e ensaios, 25 milhes de msicas, 500 milhes de imagens, 500 mil filmes, 3 milhes de vdeos, programas de TV e curtas-metragens, alm
de 100 bilhes de pginas pblicas na Internet, e a maior parte desta exploso de conhecimento aconteceu nos ltimos 50 anos. Mesmo com o temor de que nossas mentes possam estar sendo modificadas pela natureza superficial da Internet [2], o conhecimento avana a um ritmo sem precedentes, alavancado por esta Inteligncia Darwiniana Coletiva que surge dessa gororoba digital. Pessoas comuns oferecem abordagens e solues inovadoras para problemas que antes s uns poucos privilegiados tinham acesso. Agora e cada vez mais, a pessoa mais inteligente da sala a sala em si. Uma rede digital que une pessoas e ideias na sala e se conecta aos que esto fora dela. Por mais que reclamemos do excesso de lixo digital, prefiro parafrasear o terico organizacional Russell Ackoff que, em 1988, j dizia: no o excesso de informao; falha nos nossos filtros. Que venha a Web Semntica [3] para nos salvar.
Mais informaes:
[1] Compatible Time-Sharing System: http://en.wikipedia.org/wiki/ Compatible_Time-Sharing_System [2] What the Internet Is Doing to Our Brains, by Nicholas Carr: http://www.theshallowsbook.com/ nicholascarr/Nicholas_Carrs_The_Shallows.html [3] W3C Web Semntica: http:// www.w3.org/2001/sw/
32
www.linuxmagazine.com.br
Sempre alerta!
Rpidos e silenciosos, invasores podem atacar uma rede, danic-la e sair sem deixar rastros antes que voc perceba. Saiba como evitar estes e outros problemas de segurana. por Flvia Jobstraibizer
CAPA
segurana de redes e sistemas e seu contnuo monitoramento um assunto vasto e por vezes complicado no mundo da tecnologia da informao. No entanto, existe no arsenal do profissional de TI, diversas ferramentas teis para o monitoramento, busca e preveno de potenciais ataques ou problemas relacionados a segurana. Entre tantas tarefas que um administrador de sistemas precisa desempenhar durante sua jornada de trabalho, a segurana da rede e dos sistemas sob sua responsabilidade acaba sendo relegada para segundo plano. Isso se deve ao fato de que os profissionais delegam a tarefa do monitoramento para determinadas ferramentas que, embora eficientes, precisam de uma mozinha para realizar seu trabalho com excelncia. Nesta edio da Linux Magazine vamos falar sobre o preocupante assunto da invaso de redes e sistemas. Os invasores modernos so muito mais efetivos do que antigamente. So rpidos, silenciosos e depois de atingirem seu objetivo seja roubar informaes, seja danificar um sistema vo embora sem deixar rastros, na maioria das vezes. E o problema mesmo, acaba ficando na mo do profissional que agora ter uma grande dor de cabea para resolver. Um dos mais eficientes monitores de rede, o Wireshark, ser abordado nesta edio, em conjunto com algumas ferramentas menos conhecidas e que fazem parte da soluo. Aprenda como ler e interpretar informaes em busca de potenciais evidncias de invaso. O profissional que estiver engajado em encontrar vulnerabilidades que potencialmente podem ser utilizadas por invasores, deve conhecer a ferramenta OpenVAS. Indispensvel no arsenal do analista de segurana, o OpenVAS uma soluo completa para busca de vulnerabilidades em locais especficos como softwares, portas do servidor e servios locais como os protocolos de email e web. Realizamos tambm, uma variedade de testes de invaso em redes que j esto funcionando sob o novo protocolo IP, o IPv6. Descubra quais so as vulnerabilidades que o
novo protocolo IP esconde e prepare-se para, juntamente com a adoo do protocolo, manter sua rede segura! A nova gerao da tecnologia traz diversos benefcios como o IPv6, o HTML5, BIG DATA, HPC, novos sistemas de arquivos, novos kernels e toda uma sorte de ferramentas de segurana para manter os invasores longe dos seus dados. No entanto, nem toda essa avanada tecnologia far com que voc durma tranquilo. preciso estar sempre alerta!
Matrias de capa
Rede de segurana Agulha no palheiro Anlise de vulnerabilidades 34 40 44
33 3
ANDROID | Multitoque
Android multitoque
ANDROID
Toque perfeito
Com a verso 2.0 do Android, os desenvolvedores passaram a ter acesso a recursos multitoque anteriormente reservados a aplicativos do sistema. Mas ateno: preciso ter cuidado ao manusear a API. por Markus Junginger
sucesso do iPhone demonstra que os controles multitoque oferecem muitos benefcios prticos. No de se admirar que concorrentes do iPhone trabalhem duro no desenvolvimento de suas prprias tecnologias multitoque. O Google estendeu a verso 2.0 do Android API para que desenvolvedores e usurios pudessem se beneficiar de recursos que envolvem toques e gestos.
Listagem 1: onTouchListener
01 public boolean onTouch(View v, MotionEvent event) { 02 if (event.getAction() == MotionEvent.ACTION_DOWN) { 03 int x = event.getX(); 04 int y = event.getX(); 05 doSomething(x,y); 06 } 07 }
droid, isto o equivalente a uma API nvel 5 (Android 2.0 ou mais recente). O hardware tambm influencia no nvel de suporte multitoque, e a verdadeira extenso deste suporte nem sempre transparente. Por exemplo, embora o HTC originalmente suportasse Android 1.0 em seu modelo G1 (antes mesmo do recurso multitoque ter sido anunciado), o hardware j era capaz de identificar diversos tipos de gestos. No entanto, o reconhecimento de gestos no necessariamente o mesmo que suporta multitoque. Dispositivos com telas resistentes ao toque, em particular, frequentemente detectam apenas um nico toque isto se aplica, por exemplo, ao HTC Tattoo. Outros dispositivos retornam apenas uma caixa delimitadora: embora estes dispositivos possam identificar uma caixa entre dois dedos, no so capazes de identificar toques individuais. A gura 1 ilustra estas restries de hardware: o desenho mostra dois dedos posicionados de forma distinta em uma caixa delimitadora. Se os dedos do usurio se moverem de uma posio a outra, o dispositivo frequentemente confunde as posi-
es dos dedos e s identificar a caixa com segurana. Muitos aparelhos HTC, como o Desire, usam esta tecnologia. O primeiro smartphone com Android 2.0, o Motorola Droid, detectava as posies dos dois dedos individualmente. O Galaxy S capaz de identificar e processar at quatro toques simultneos. Os desenvolvedores no devem assumir que a tecnologia multitoque estar disponvel onde quer que Android esteja presente. Para aplicativos que dependem de mltiplas entradas por toque para recursos crticos, o desenvolvedor deve adicionar uma nota ao manifesto para garantir que somente os dispositivos multitoque sejam capazes de instalar o aplicativo no Google Play:
<uses-feature android:name = \ "android.hardware.touchscreen. multitouch" />
50
www.linuxmagazine.com.br
Multitoque | ANDROID
com a classe MotionEvent, que inclui recursos adicionais suportados pelo Android 2.0 [1]. Para comear, aceite objetos MotionEvent. Um desenvolvedor normalmente instala um recurso listener para uma visualizao usando setOnTouchListener() ou substitui as classes Activity ou View em onTouchEvent(). A listagem 1 mostra um esqueleto para o onTouchListener. Como possvel notar na listagem 1, o desenvolvedor acessa todos os dados relevantes, tais como a ao realizada ou coordenadas x e y, atravs dos mtodos de acesso a objetos MotionEvent. Na sequncia de um evento ACTION_DOWN, desencadeado pelo Android quando o usurio toca na tela pela primeira vez, o sistema operacional envia eventos ACTION_MOVE para movimentao de dedos. Os eventos continuam at que o usurio pare de tocar na tela. O Android ento informa ao aplicativo que o dedo deixou a tela, e envia um ACTION_UP. Como indica o mtodo
de assinatura onTouch(), possvel registrar um OnTouchListener com mltiplas visualizaes. Na base desta curta atualizao MotionEvent, o desenvolvedor poder criar extenses de mltiplas entradas por toque. Se atualizarmos um aplicativo Android existente, no h necessidade de modificar a estrutura do aplicativo pois os dados das entradas multitoque utilizam o mesmo caminho. Isto fornece um significado adicional ao cdigo do mtodo getAction(): o nmero inteiro de 32-bit codifica dois valores. Podemos isolar esses valores usando bitmasks apropriadas e deslocamentos de bits:
int action = event.getAction() & MotionEvent.ACTION_MASK; int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_ MASK) >> MotionEvent.ACTION_ POINTER_ID_SHIFT;
51
ANDROID | Multitoque
Figura 1 Dedos cruzados causam problemas, a caixa de vnculo para as posies dos dedos a mesma para ambas as variantes, o que signica que o dispositivo no pode identicar precisamente as posies.
gos de ao: ACTION_POINTER_DOWN e ACTION_POINTER_UP correspondem a ACTION_DOWN e ACTION_UP; a diferena que o Android no os utiliza at que um segundo dedo toque na tela. O exemplo demonstra a sequncia de aes. Primeiro o dedo 1 toca a tela, desencadeando assim uma ACTION_DOWN. Quando o dedo 2 toca a tela, disparado um evento ACTION_POINTER_DOWN. Se os dedos se moverem em seguida, o Android registrar um ACTION_MOVE. Se o dedo 1 ento se erguer para fora da tela, o cdigo fornecer um ACTION_POINTER_ UP, considerando que este se trata de um evento ACTION_UP para o dedo 2.
O aplicativo Multitouch Test, disposto na gura 2, resume os principais aspectos relacionados s mltiplas entradas por toque no Android. O aplicativo, disponvel no Google Play, serve para visualizar os eventos multitoque e til como ponto de partida para experimentao de extenses prprias.
Quadro 1: Indicadores
Nos crculos multitoque do Android, um indicador representado por um dedo que interage com a tela. Em outras palavras, um indicador pode ser alguma outra fonte de entrada, como um cursor do mouse. Os desenvolvedores enumeram indicadores usando o getPointerCount(). Ao invs de mtodos de acesso sem parmetros do MotionEvent, temos agora mtodos sobrecarregados, cada um com o indicador de ndice, como o getX(int pointerIndex). Dependendo do aplicativo, o desenvolvedor pode no precisar de mais nada alm de informaes para projetar um aplicativo que suporte mltiplas entradas por toque.
do do cdigo utilizado para chamar a ao. O crculo fica azul quando o usurio toca a tela, verde quando o usurio move um dedo, ou cinza quando acionado o cdigo para um dedo sendo levantado fora da tela. O aplicativo mostra tambm nos crculos o ID do indicador e o ltimo cdigo utilizado para chamar a ao. preciso implementar o cdigo do aplicativo no contexto de uma atividade. A listagem 2 mostra a implementao do OnTouchListener, que vincula-se exibio usando o setOnTouchListener(), conforme ilustrado na listagem 3. Para economizar espao, deixamos de fora as definies de membros, tais como as arrays points[] e lastActions[]. O cdigo-fonte completo est disponvel online [2]. As primeiras linhas da listagem 2 resumem o cdigo da ao e o ndice do indicador. Aps este passo, o cdigo da ao e da posio do indicador esto descritos para as arrays lastActions[] ou points[]. O ndice de ambas as arrays corresponde identificao do indicador, em cada caso. O nmero de indicadores limitado pelas constantes MAX_POINTERS: o aplicativo gerencia um nmero mximo de 20 indicadores. Um caso especial ocorre quando so definidos os cdigos para uma determinada ao. O MotionEvent para o ACTION_POINTER_DOWN retorna mltiplos valores, desde que o ACTION_POINTER_DOWN refira-se apenas a um nico indicador ID. O nico caso em que possvel usar os valores lastActions() para todos os indicadores no MotionEvent o ACTION_MOVE. Por fim, o touchView.invalidate() na linha 20 dispara uma atualizao de status e mostra os novos valores. A visualizao neste aplicativo uma classe separada, diretamente derivada da View, como mostra a listagem 3. O objeto Canvas fornece um mtodo simples de desenhar crculos em um loop. Os cdigos para
52
www.linuxmagazine.com.br
Multitoque | ANDROID
coordenadas e chamadas de ao necessrios para desenhar crculos so coletados pelo onTouchListener da listagem 2 nas arrays points[] e lastActions[]. A cor e o texto de um crculo so definidos pelos mtodos getColor() e getActionText(). A mltipla escolha determina o valor de retorno, que depende do cdigo da ltima ao atribuda ao indicador. Finalmente, o aplicativo tambm desenha o nmero de indicadores contidos no MotionEvent em formato texto. O mtodo calcDevicePixels() auxiliar e verifica o nmero especfico de pixels do dispositivo, que por sua vez depende da profundidade de pixels dispostos na tela.
multiplicar a propriedade ScaleFactor pelo ScaleGestureDetector. Com os mtodos getFocusX() e getFocusY() possvel verificar o foco do dimensionamento.
Concluso
Hardware e software em dispositivos Android possuem uma enorme influncia no suporte multitoque. Telas que suportam mltiplas entradas
por toque dependem do Android 2.0 ou mais recente e muitas vezes apresentam capacidades limitadas um fato que os desenvolvedores precisam ter em mente na construo de seus aplicativos. A API multitoque, com suas MotionEvents e diversos indicadores, asseguram um lugar no pdio para o Android no que se refere a dispositivos dotados deste recurso.
Pinch e zoom
Possivelmente, a novidade mais interessante o ScaleGestureDetector, que detecta e amplia gestos. Trs etapas so necessrias para utiliz-lo: primeiro, preciso instanciar um ScaleGestureDetector; em seguida, passar cada MotionEvent para o ScaleGesture-Detector; por ltimo, necessrio um listener especial para coletar os novos dados. A listagem 4 mostra estas trs etapas nos mtodos init() e onTouchEvent(), e na classe MyScaleListener. O mtodo onScale() escalona a visualizao ao
Mais informaes
[1] API multitoque para Android: http://developer.android. com/reference/android/ view/MotionEvent.html [2] Cdigo-fonte para este artigo: http://smart-developer.com/ Resources/Article-Code
Gostou do artigo? o?
Queremos ouvir sua a opinio. Fale conosco em cartas@linuxmagazine.com.br zine.com. Este artigo no nosso so site: sit http://lnm.com.br/article/7648 article 648
53
SEGURANA
Olhar penetrante
Tire proveito do baixo consumo de energia oferecido por dispositivos NAS modernos para monitorar suas cmeras. por Ben Martin
moderno hardware NAS possui a CPU embutida que muitas vezes oferece grande desempenho com baixo consumo de energia. Muitas destas unidades necessitam de menos de 10 watts para operar com uma conexo de rede gigabit e a CPU a 100% de uso. Um NAS com baixo consumo de energia pode consumir de 10% a 20% da eletricidade que um hardware desktop precisa para funcionar. A principal questo passa a ser ento: seria a CPU do NAS rpida o suficiente para monitorar e detectar o movimento de uma ou mais cmeras? Neste artigo, examinaremos se o QNAP TS-219P II [1], com uma CPU ARM Marvell de 2 GHz e 512MB de RAM, est pronto para o desafio de deteco de movimento em tempo real (gura 1). Note que grande parte do artigo tambm deve ser diretamente aplicvel ao seu primo mais barato
de carcaa nica, o QNAP TS-119p II, que ostenta a mesma CPU/RAM. Uma soluo popular para monitoramento com cmera e deteco de movimento a suite ZoneMinder [2]. As cmeras podem ser tanto de rede IP como cmeras USB conectadas diretamente ao servidor ou em outra mquina na rede. O ZoneMinder pode monitorar todas as suas cmeras, detectar movimento em reas-chave ou zonas, e notific-lo sobre a atividade em reas de interesse. As zonas limitam a rea de monitoramento, de modo que o ZoneMinder pode ver quando algum caminha at sua garagem sem que o vento nas rvores acione um alarme falso. Duas empresas que fazem hardware NAS usando CPU ARM de alto nvel so a Synology e a QNAP. Produtos de baixa capacidade com CPUs de 1.2GHz e 256MB de RAM tambm esto disponveis, assim como modelos
mais sofisticados com CPUs de 2GHz e 512MB de RAM. No intervalo dos 1,2 GHzz esto o Synology DS212j e o QNAP TS-212; no intervalo dos 2 GHz esto o Synology DS212+ e o QNAP TS-219P II, juntamente com o de carcaa nica QNAP TS-119p II. Tanto o produto da QNAP quanto o da Synology vem com sua prpria distribuio Linux. Ambas as unidades NAS permitem usar o gerenciador de pacotes ipkg para instalar aplicativos de cdigo aberto adicionais e complementar o software embarcado. Por exemplo, o leitor pode instalar o padro CoreUtils ao invs dos binrios-padro BusyBox.
Instalao
Se o usurio no possuir um dispositivo NAS instalado, a configurao inicial para este aparelho exige que seja feita a remoo de uma (ou mais) bandejas individuais de disco rgido, um parafuso do disco da bandeja, e o deslizamento de volta para a unidade. Uma vez que os cabos de energia e rede estiverem conectados, teremos completado a configurao de hardware. Por outro lado, o Synology DS212j desliza em duas partes separadas, e fixamos o disco rgido diretamente em um gabinete de disco rgido interno antes de fazermos o mesmo com a capa exterior do Synology NAS. Quando ligamos o TS-219P II, o dispositivo tentar obter um endereo
60
www.linuxmagazine.com.br
IP via DHCP, aps o qual podemos efetuar login em uma interface online do dispositivo NAS e concluir a instalao. A configurao inicial do TS-219P II envolve o upload de um arquivo de imagem firmware de 140 MB (gura 2). Aps o NAS reinicializar e cair na distribuio Linux que acabamos de carregar, preciso responder algumas perguntas sobre localidade, senhas e preferncias do aplicativo (gura 3). Para muitos fins, a combinao de pacotes nativos do fornecedor NAS complementada com pacotes disponveis atravs do ipkg suficiente. Se o aplicativo que o usurio necessita no est incluso no ipkg, possvel compil-lo e instal-lo. Este processo geralmente envolve a criao de um ambiente em mquina virtual para a CPU ARM em uma mquina desktop, bem como a compilao do software. Normalmente, os cabealhos de desenvolvimento de software no NAS no esto disponveis facilmente sob a forma de pacotes para instalao no prprio equipamento.
provavelmente mais at que a configurao do ambiente de compilao necessrio para ampliar o nmero de softwares se continuarmos a usar o firmware fornecido [4]. Para prosseguir, siga os seguintes passos: 1. Opcionalmente, faa uma cpia de segurana do firmware do carto de memria no NAS. 2. Baixe o Debian flasher, kernel, metadados, e arquivos de instalao initrd. 3. Instale os arquivos na memria flash do NAS. 4. Reinicie. 5. Conecte-se via SSH no NAS e conclua o processo com a interface
de instalao do Debian, que baseada em console. Uma vez que o passo 5 tenha sido concludo, o programa ir reinstalar a memria do NAS para iniciar em um novo sistema Debian. Alm do kernel e o initrd residente na memria flash do NAS, as etapas restantes para instalar o Debian so exatamente as mesmas que existem em uma mquina desktop. Como veremos mais adiante, o primeiro passo para fazer uma cpia de segurana do firmware existente opcional. O instalador Debian convenientemente pega as configuraes de hosts e de rede que havamos feito
61
reinicializao, devemos ser capazes de fazer um ssh como root e encontrar uma tima mquina Debian nos aguardando. Com um disco WD Green de 2TB executando, o NAS ocioso deve consumir cerca de 10 watts de energia (tabela 1).
Figura 3 Uma vez que o rmware gravado em disco, congure seu login,
localizao, IP, e servios de informao.
com o firmware QNAP normal e as reutiliza para a instalao do Debian. A maioria das perguntas so sobre localizao e como desejamos que discos e parties sejam configurados. Em nossa instalao do Debian Wheezy (listagem 1), os primeiros cinco comandos criam uma cpia de segurana da memria flash existente em um pendrive. Na linha 6, os quatro arquivos de instalao do Debian mencionados no passo 2 so baixados, enquanto um comando flash-debian na linha 8 nos coloca na memria flash do QNAP, pronto para ser carregado quando o NAS for reiniciado. Aps o NAS ser reiniciado, devemos ser capazes de fazer ssh nele como installer@NAS usando a senha install. Provavelmente teremos que remover a chave do host do arquivo ~/.ssh/known_hosts para o SSH no considere que o host mudou sua chave de forma inespera-
da desde a ltima conexo. Em seguida, o usurio dever ver um menu de boas-vindas como o da gura 4. Perto do final da instalao, teremos a chance de alterar a seleo de aplicativos. muito importante que o usurio no se esquea de instalar a opo de servidor SSH, para que possa conectar-se facilmente no NAS quando o Debian instalado for executado. Alm disso, precisaremos de um servidor online, um banco de dados SQL, e um servidor de arquivos enquanto estivermos neste menu. Apesar de um servidor de arquivos no ser realmente necessrio para o ZoneMinder, se o usurio possuir algum espao sobrando no seu disco rgido, pode desejar acess-lo atravs da rede para outros fins. Quando a instalao estiver concluda, o instalador pede que sejam removidos todos os discos CD-ROM ou de instalao (que no temos). Na
62
www.linuxmagazine.com.br
software no firmware de quando o comprou, poupando-o de um NAS personalizado que no iria inicializar. Em seguida, podemos colocar o instalador do Debian de volta na memria flash do NAS e escolher com mais sabedoria na pilha de discos rgidos disponveis. claro que, em produo, todo mundo usa um RAID espelhado ou tem um slido, automatizado e testado sistema de backup incremental em funcionamento, no mesmo?
ZoneMinder
As principais dependncias do ZoneMinder so Perl, MySQL, OpenSSL, a biblioteca JPEG, alguns mdulos Perl, e (opcionalmente) FFmpeg. O ZoneMinder inclui cdigo PHP, C++ e Perl. Depois de instalar o Debian no sistema, podemos tirar proveito dos repositrios de pacotes para instalar o ZoneMinder sem ter que compil-lo. A instalao simples como chamar um:
apt-get install zoneminder
resultando em cerca de 170 MB de espao adicional usado no NAS. Para iniciar a interface online do ZoneMinder, temos que criar um link do arquivo de configurao do site no diretrio conf.d do Apache:
# ln -s /etc/zm/apache.conf /etc/ apache2/conf.d/zoneminder.conf # /etc/init.d/apache2 restart
soluo da imagem, largura e altura em pixels coincide com a sada da cmera (gura 6). Alm disso, precisamos saber o endereo IP e a porta da cmera e, via HTTP, pode ser necessrio entrar com o URL para comear a usar os dados da cmera. Para uma cmera de 640x480, espere utilizar cerca de 10% da CPU somente do ZoneMinder para transmitir dados a uma baixa taxa de quadros [6]. Adicionar zonas para detectar movimento em reas crticas da imagem ir adicionar mais uso de CPU neste valor. Nossa configurao NAS teve que usar at 25% da CPU para atender ao streaming de vdeo a partir de uma webcam com 640x480 para o Firefox (gura 7). Com a cmera TP-Link apontada para uma cena escura ao ar livre noite, a deteco de movimento manteve-se em cerca de 15% da CPU para quadro cheio (full frame 640x480) de deteco em uma taxa de quadros baixa (tabela 2).
640x480. Para calcular a quantidade de memria necessria para o armazenamento de imagens da cmera, encontre a memria (bytes) para um nico quadro: largura(px) x altura(px) x 3(RGB). Estas imagens so armazenadas numa rea de buffer na memria. O padro que utilizamos foi de 40 imagens no buffer para uma cmera. O comando:
mount -o remount,size=256m /dev/shm
Memria compartilhada
O ZoneMinder precisa manter as imagens recentes que recebe das cmeras em algum lugar na memria. Nas verses anteriores, o ZoneMinder usava memria compartilhada para armazen-las. Agora, ele cria e usa arquivos de memria mapeados em /dev/shm. Independentemente de qual sistema esteja em uso, pode ser necessrio adequar o NAS para fazer o armazenamento correto de memria disponvel para estas imagens. O ZoneMinder 1.25.0 do Debian Wheezy utilizado neste artigo usa o dospositivo /dev/shm para as imagens. A instalao padro criou um sistema de arquivos tmpfs com um tamanho limite de 100MB. O ZoneMinder precisa de cerca de 100MB para uma nica cmera de 1280x720, e cerca de 35MB para uma nica cmera de
vai dedicar mais memria para imagens do ZoneMinder. Para fazer isso funcionar aps uma reinicializao, edite o arquivo /etc/default/tmpfs e defina shm_size para o tamanho que desejar. Para economizar memria para cmeras maiores, ajuste o tamanho de buffer para quadros de imagem mostrado na guia Buffers das confi-
Com este link no lugar e o Apache reiniciado, devemos ver a interface online do ZoneMinder em http://NAS/zm/, supondo que NAS o endereo IP da unidade NAS. O boto Add New Monitor na parte inferior da interface do ZoneMinder permite que adicionemos uma nova cmera no sistema (gura 5). Para este exemplo, usaremos duas cmeras: a TP-Link TLSC3171G 640x480 IP e a Logitech C910 USB 1080p. A parte complicada na configurao de cmeras saber o que o caminho do host remoto (Remote Host Path) deve ser e ter a certeza de que a re-
63
guraes da cmera. Descobrimos que para usar menos quadros tivemos que excluir, por exemplo, zm.mmap.2 de /dev/shm e fazer o ZoneMinder recriar um novo arquivo menor quando aceitamos a configurao da cmera. Usar 20 quadros para uma cmera de 720p requer apenas 53MB de RAM.
Quando clicamos no nome de uma cmera no ZoneMinder, mostrada uma visualizao ao vivo do que a cmera est captando, junto com uma lista dos eventos que foram detectados recentemente e a capacidade de forar o disparo de um alarme. O disparo de um alarme tem o mesmo efeito que forar o ZoneMinder a pensar que um movimento significativo ocorreu na cmera. Em nosso primeiro teste, usamos uma cmera TPLink com 640x480 a 5fps. O monitoramento usou 15% da CPU, e forar um estado de alarme causou um salto de at 26% da CPU. Aps a confirmao de um alarme disparado pelo ZoneMinder indicando movimento real na cmera, foi confirmado o mesmo salto para 26% de uso de CPU no NAS. Monitoramento com uma C910 Logitech atravs da rede com resoluo de 1280x720 a 10fps consumiu 72% de CPU do NAS. Baixando para 2fps com a mesma cmera usou at 22% da CPU. A visualizao ao vivo a 2fps consumiu um adicional de 40% de CPU. Claramente, cmeras de monitoramento de 720p a 30fps esto alm do que a CPU no NAS pode segurar, e deteco de movimento a 10fps provavelmente no possvel, mas se voltarmos alguns quadros por segundo com a mesma cmera, pode ser bom a 720p se o usurio desejar utilizar apenas uma cmera.
Uma cmera USB ultrabarata com 640x480 que s pode produzir vdeo YUYV conectada porta USB2 do NAS sendo usada a 5fps precisa de cerca de 15% da CPU para monitorar e 50% para transmitir. A deteco de movimento em quadro cheio nesta cmara requer um adicional de 40% de CPU, que tem picos de at 80% se um estado de alarme disparado. O uso da CPU no mudou muito entre as predefinies rpida e melhor com baixa, mdia e altas sensibilidades. Reduzir para uma rea de alarme de 100x100 diminuiu o uso da CPU a 35%. Mudar a cmera ligada localmente para a C910 da Logitech e tentar a resoluo de 1280x720 a 5fps dividiu o uso de CPU 50-50 entre monitorar a cmera e verificar movimentos nos quadros. Tal diviso de 50-50 parecia suspeita, j que a deteco de movimento deve ser mais custosa do que o simples monitoramento. Depois de voltar para 3fps, o monitoramento usou apenas 30% da CPU e a deteco de movimento usou 68%. Depois de voltar para 640x480 a 4 fps, o monitoramento consumiu 12% de CPU e a deteco de movimento, 28%. Logo, se o usurio quiser usar este processador, qualquer coisa acima de 640x480 susceptvel a causar problemas de desempenho.
Mergulho no cdigo
Pelo fato de no vermos muita diferena no uso de CPU para cada um dos algoritmos de deteco de movimento que o ZoneMinder oferece, decidimos dissecar um pouco o cdigo. O cdigo chama Monitor::DetectMotion() a cada quadro para trabalhar a pontuao (quantidade de movimento) e se um alarme foi acionado. Tendo esse mtodo retornar sem alarme de imediato ao invs de deteco de movimento real resultou em cerca de 8% da CPU a ser utilizada para uma cmera de 640x480 executando a 6fps.
NAS desligado, mas com cabo plugado Disco com giro baixo e nenhum cabo de rede Disco com giro baixo Em execuo com o disco girando Discos girando e executando o OpenSSL
64
www.linuxmagazine.com.br
Uma das primeiras coisas que DetectMotion() faz criar uma imagem delta, medindo o quanto o quadro atual difere de um quadro de referncia. A imagem delta apenas registra a intensidade da diferena para cada pixel em vez da diferena de cada vermelho, verde e azul. Para fazer a imagem delta e exclu-la novamente antes de retornar nenhum alarme, 15% da CPU foi necessria antes de qualquer deteco de movimento ter ocorrido. O ncleo do mtodo Imagem::Delta() cria uma imagem delta e registra quanto cada pixel diferente de uma imagem de referncia:
... red = y_r_table[*psrc++ - *pref++]; green = y_g_table[*psrc++ - *pref++]; blue = y_b_table[*psrc++ - *pref++]; *pdiff++ = abs_tablered + green +; ...
do com o comando /proc/cpuinfo, a CPU neste equipamento QNAP s tinha disponvel as extenses swp half thumb fastmult edsp. Pelo fato de os valores de referncia apresentados na tabela 2 variarem mais com a resoluo de imagem e taxa de quadros, apenas preparar e produzir todos os quadros estava consumindo uma quantidade substancial da CPU.
Consideraes nais
Os chips ARM top de linha que equipam alguns hardwares NAS modernos fornecem uma plataforma para computao em tempo real bastante interessante, com consumo de energia reduzido. A CPU de 2GHz Kirkwood do NAS testada aqui poderia realmente apenas lidar com deteco de movimento em uma taxa de quadros baixa em duas cmeras IP com 640x480 ao mesmo tempo. Tenha em mente que o dispositivo pode fazer isso com menos de 15 watts, incluindo o disco rgido. Quando no h eventos acontecen-
do, o equipamento pode cair para menos de 10 watts enquanto ainda monitora ativamente as cmeras em busca de movimentos interessantes. Monitoramento de cmera normalmente uma proposta de trs turnos. A prxima vez que o leitor considerar realocar um PC com consumo de 75 watts a 100 watts para este propsito, poder considerar a alternativa NAS, j que a mesma poderia muito bem pagar-se nos primeiros 12-18 meses se levarmos em conta a economia de energia. Com uma instalao Debian, o NAS tem acesso a uma quantidade enorme de pacotes de software que permitem a personalizao do dispositivo para lidar com uma tarefa especfica.
Mais informaes
[1] Pgina do QNAP TS219P II: http://web. qnap.com/pro_detail_ feature.asp?p_id=211/ [2] ZoneMinder: http:// www.zoneminder.com/ [3] Debian no QNAP NAS: http:// www.cyrius.com/debian/ kirkwood/qnap/ts-219/ [4] Documentao do instalador do Debian ARM: http://www. debian.org/releases/lenny/ arm/install.pdf.pt_BR [5] Recuperao de rmware do QNAP: http://wiki.qnap. com/wiki/Firmware_Recovery/ [6] Discusso sobre uso de CPU pelo ZoneMinder: http://www. zoneminder.com/wiki/index. php/FAQ#Why_is_ZoneMinder_ using_so_much_CPU.3F [7] Arquitetura ARM: http:// en.wikipedia.org/wiki/ ARM_architecture
As variveis so pref, a imagem de referncia; psrc, o quadro atual e pdiff, a imagem delta. Este cdigo pode ser modificado e executado mais rapidamente em CPUs ARM com a extenso NEON [7]. De acor-
65
TUTORIAL
Crptico
A criptograa uma parte importante da segurana em TI, e o OpenSSL uma conhecida ferramenta de criptograa para o Linux. Especialistas conam no OpenSSL porque livre, possui muitos recursos e fcil de usar em scripts Bash. por Marcin Teodorczyk
OpenSSL [1] faz uso da entrada e sada padres, e suporta uma ampla gama de parmetros, tais como opes de linha de comando, variveis de ambiente, pipes, arquivos e descritores de arquivos. Podemos aproveitar estes recursos para escrever rapidamente scripts Bash [2] que automatizam tarefas, tais como teste de conexes SSL/TLS, converses massivas entre diferentes formatos de chaves criptogrficas e certificados, assinatura/ criptografia em lote de arquivos, auditoria de arquivos protegidos por senha, e implementar ou testar uma infraestrutura de chaves pblicas PKI (Public Key Infrastructure). As ferramentas do OpenSSL fornecem muitos mdulos que executam tarefas especficas. Cada mdulo no um executvel separado mas, ao invs disso, selecionado com o primeiro parmetro do executvel openssl. Por outro lado, cada mdulo tem uma pgina de manual separada. Por exemplo, um mdulo chamado x509 gerencia certificados digitais X.509 e um mdulo chamado pkcs12 gerencia pacotes PKCS12.
mas, para ver sua pgina de manual, devemos digitar man x509.
bm podemos localizar servidores que aceitam protocolos ou cifras fracos e poderiam assim permitir um ataque malicioso. Com uma pequena ajuda do Bash, possvel automatizar esse processo. Suponha que os nomes do cliente e do servidor so cliente e servidor, e que o servidor escuta conexes SSL/ TLS na porta 443. Para verificar quais protocolos o servidor aceita, podemos usar os seguintes parmetros: -ssl2, -ssl3, -tls1, -no_ssl2, -no_ssl3, ou -no_tls1. Pelo fato de o SSL2 ser conhecido por ter falhas de segurana, podemos tentar nos conectar ao servidor usando o seguinte comando:
openssl s_client -connect server:443 -no_ssl3 -no_tls1
Se o servidor aceita qualquer outro protocolo exceto SSL3 ou TLS1, o comando anterior abre uma conexo e espera por dados claro, esta abordagem no a ideal se o usurio pretende inserir o comando em um script Bash). Para fechar a conexo imediatamente depois de estabelec-la, escreva na entrada padro do s_client:
66
www.linuxmagazine.com.br
Da mesma forma, podemos verificar cifras permitidas com o parmetro -cipher. Para comodidade do utilizador, o OpenSSL permite especificar conjuntos de cifras especficas (por exemplo, DES-CBC3-SHA) ou grupos de cifras (por exemplo, LOW, MEDIUM, HIGH, NULL, ALL). Descubra nomes de grupo e cifras com man ciphers. Para verificar se o servidor aceita conexes usando cifras do grupo NULL ou LOW, use o seguinte:
echo "x" | openssl s_client -connect $server:443 -cipher NULL,LOW
que permitem tais conexes so gravados no arquivo bad_protocol.txt. Da mesma forma, os hosts que permitem conexes com cifras NULL ou LOW so listados em bad_cipher.txt.
Em scripts Bash, uma boa ideia executar mdulos OpenSSL com um tempo limite especificado. Caso contrrio, quando uma mquina no puder ser resolvida, o script ficar esperando por um longo tempo. Um utilitrio Linux especial permite executar qualquer comando com um tempo limite. Surpreendentemente, o utilitrio se chama timeout. Por exemplo, para verificar se uma conexo SSL2 pode ser estabelecida, mas no esperar por ela mais de 10 segundos, use:
echo "x" | timeout 10 openssl s_client -connect server:443 -ssl2
tal operao no Bash com a opo passin do OpenSSL. Esta opo nos permite especificar senhas para acessar dados em arquivos protegidos por senhas de cinco maneiras. Ela til no s para o PKCS12, mas para toda ao que requer uma senha; por exemplo, chaves privadas ou dados criptografados. Primeiro, especificamos uma senha como pass:password_text e, neste caso, password_text a senha atual. Este no um mtodo seguro, porque a senha armazenada no histrico do Bash e pode ser vista com um comando ps durante a execuo. Segundo, especificamos a senha com env:var. Este mtodo mais seguro, porque a senha manipulada na varivel de ambiente var. Outra abordagem a de armazenar a senha como file:pathname, que diz ao OpenSSL para ler a senha da primeira linha de um arquivo localizado em pathname. Ou ainda poderamos usar fd:number, o que faz o OpenSSL ler a senha do descritor de arquivo number. Finalmente, podemos simplesmente usar stdin para ler senhas da entrada padro. Em seguida, extrairemos todos os certificados de arquivos PKCS12 protegidos por senha em um diretrio de trabalho e tratamos de armazen-los sem senha. Isto pode ser feito da seguinte forma:
for file in *.p12; do openssl pkcs12 -in $file -passin file:$file.pass -nokeys -nodes -out $file.nokeys done
Finalmente, para tornar o comando mais automtico, podemos usar a varivel $? para verificar o cdigo de retorno do ltimo comando executado pelo Bash. Se a conexo for estabelecida, o OpenSSL retorna 0. A listagem 1 mostra um exemplo de script simples, com tudo que fizemos at agora. O script l nomes de hosts da entrada padro e verifica se uma conexo diferente de SSL3 ou TLS1 pode ser estabelecida com a porta 443. Ele espera no mais do que trs segundos. Nomes de hosts
Outra tarefa comum a extrao de chaves/certificados de um pacote PKCS12, que geralmente protegido com uma senha. possvel lidar com
67
Supomos que temos uma senha para cada arquivo PKCS12 escrita em um arquivo com a extenso .pass.
for file in *.txt; do openssl aes-256-cbc -d -a -salt -in "$file" -out "../dec/$file" -passin file:pass done
Teste do PKI
O ltimo grande recurso do OpenSSL o de implementar uma infraestrutura de chave pblica (PKI). Uma PKI muitas vezes tem um papel crucial na segurana, e o OpenSSL pode ser usado para implementar e testar uma PKI. Primeiro, podemos usar o OpenSSL para gerar pares de chaves e pedidos de assinatura de certificado correspondentes (da sigla CSRs, de Certificate Signing Request). Segundo, podemos assinar CSRs, criando assim certificados vlidos. Terceiro, podemos revogar e gerar CRLs. Quarto, podemos assinar/ criptografar e verificar/descriptografar. E finalmente, podemos alterar os parmetros em tempo real e manipular valores, tais como algoritmos, comprimentos de chave ou contedo DN. possvel usar estes dados como entrada para outros aplicativos. A listagem 2 mostra alguns exemplos de recursos que usamos para testar vrios elementos de uma PKI. A funo create_config foi cortada para melhor legibilidade. Utilize o contedo de seu arquivo de configurao padro do OpenSSL para configuraes adicionais. O arquivo de configurao normalmente se chama openssl.cnf e fica em /etc. Por padro, o OpenSSL l o arquivo de configurao de um local especificado (normalmente /etc/ openssl.cnf); mas, para nossos testes, foi mais fcil criar um arquivo
O sistema solicitar uma senha criptogrfica, que tambm tem de ser digitada quando for descriptografada mais tarde. No a melhor opo para operaes em massa, mas j descrevemos vrios mtodos para especificar uma senha para o OpenSSL. Assim, para criptografar todos os arquivos .txt no diretrio atual e grav-los no diretrio ../enc com a cifra aes-256-cbc, possvel usar o seguinte loop (supondo que a senha est escrita no arquivo de pass):
for file in *.txt; do openssl aes-256-cbc -a -salt -in "$file" -out "../enc/$file" -passin file:pass done
Este comando ir recuperar uma lista de certificados revogados (da sigla CRL, de Certificate Revocation List) e decodific-la com o OpenSSL. Em seguida, pesquisar por um nmero de srie. Da mesma forma, como com os scripts Bash anteriores, podemos adicionar um timeout e verificar a sada do comando grep com a varivel $?.
Podemos descriptografar todos os arquivos .txt no diretrio atual e grav-los no diretrio ../dec com:
68
www.linuxmagazine.com.br
de configurao na hora. A funo de script create_config cuida disso escrevendo a configurao no arquivo ./config. Mais tarde, o arquivo criado por esta funo apontado no OpenSSL com o parmetro -config. Em seguida, temos funes create_ root_ca, create_crl, create_client_req, sign_client_req, e revoke_client_cert; os nomes delas so auto-explicativos. Todas estas funes recebem parmetros que especificam tarefas como uma string DN (de nome exclusivo ou distinguished name), prazo de validade, tamanho de chave etc. A parte principal do script (no mostrada na listagem) pode utilizar as funes para gerar um nmero especfico de certificados de autori-
dade certificadora (da sigla CA, de Certification Authority) e um determinado nmero de certificados de cliente para cada CA. Alm disso, poderamos revogar certificados de algum cliente logo aps a gerao. Desta forma, a sada do script possuiria vrios certificados CA, certificados de cliente revogado, e CRLs.
te que esta apenas a ponta de um iceberg. Encorajamos nosso leitor a olhar o manual e fazer experimentos com suas prprias ideias. Apenas no confunda a chave privada de outra pessoa com a sua prpria.
Mais informaes
[1] OpenSSL: http:// www.openssl.org/ [2] Bash: http://www.gnu. org/software/bash/
Concluso
O OpenSSL uma ferramenta muito flexvel. Pelo fato de podermos especificar todos os parmetros necessrios usando a linha de comando, arquivos, pipes e variveis de ambiente, perfeitamente adequado para os scripts Bash. Este artigo descreveu alguns usos para o OpenSSL, mas tenha em men-
69
TUTORIAL | Raspberry Pi
Raspberry Pi
TUTORIAL
Computao pioneira
A sbita popularidade de computadores miniboard como o Raspberry Pi trouxe de volta o esprito pioneiro dos primeiros dias do Linux. Repentinamente, o faa voc mesmo na comunidade de cdigo aberto est de volta. por Brian Proftt
t agora, a maioria dos nerds j ouviu falar do Raspberry Pi [1], mas caso o leitor ainda no tenha ouvido falar a respeito, oferecemos um panorama sobre o assunto. O projeto Raspberry Pi comeou em 2006, quando um grupo de pesquisadores do laboratrio de computao da Universidade de Cambridge, no Reino Unido, observava os conhecimentos de informtica em declnio para estudantes de Nvel A que acessavam seus programas. O que viam no era nada positivo, e era uma tendncia que se repetia tambm em outras naes, alm do Reino Unido. Apesar da proliferao dos computadores pessoais, ou talvez por causa dela, as crianas j no experimentavam massivamente os PCs. Em vez disso, elas utilizavam aplicativos como eles eram apresentados ou apenas compravam e baixavam novos para fazer o que queriam; hackear, ao que parecia, estava saindo de moda.
Os primrdios
A equipe de Cambridge, liderada pelo designer Eben Upton, comeou a montar um dispositivo pequeno, porttil, e muito barato que iria inicializar diretamente em um ambiente de programao. A partir da, estudantes de qualquer idade poderiam comear a programar para o que lhes fosse mais interessante.
Nos EUA, a carncia de conhecimentos em informtica no ensino para jovens significa que o pas dever enfrentar uma sria lacuna de talentos para o desenvolvimento de aplicativos no futuro. Os EUA j possuem uma falta de talentos no que se refere anlise de dados massivos, logo no nada improvvel que essa lacuna na programao surja um pouco mais adiante. Esta no uma coisa boa, e no pelos habituais argumentos geopolticos que condenam os EUA ou o Reino Unido de ficar para trs de uma nao ou de outra. Como sociedades autossuficientes, so naes que desejam a gesto de informaes e contedos puramente nas mos de poucos e seletos magos da programao? Dadas as devidas propores, o declnio da alfabetizao na programao se espelha no declnio da alfabetizao aps a queda do Imprio Romano, e todos ns sabemos o que aconteceu depois. A centralizao do controle dos nossos dados pode ser um pouco diferente para a nossa sociedade de como foi a centralizao da palavra escrita pelo clero e pela aristrocracia na Idade Mdia. Tal a viso que engloba o contexto no qual se insere o projeto do Raspberry Pi. Em 2008, o dispositivo conhecido como Raspberry Pi tinha concludo
a fase de projeto e estava pronto para ser produzido. A fundao Raspberry Pi foi criada naquele ano e, aps trs anos de captao de recursos e produo, os dispositivos Pi foram saindo da linha de montagem.
O presente
Existem dois modelos do Raspberry Pi disponveis: o modelo A por 25 dlares em modelo B por 35 dlares. Ambos possuem um processador ARM de 700 MHz em uma placa monoltica da Broadcom, com 256 MB de RAM e um slot de carto SD/MMC/SDIO para armazenamento. A nica grande diferena entre os dois modelos que com mais 10 dlares possvel obter um conector Ethernet 10/100 e uma segunda porta USB no modelo B. Esse pequeno diferencial de preo e a popularidade de um dispositivo conectado rede poderia explicar por que o tempo de espera em qualquer lugar , em mdia, de 5 a 12 semanas para adquirir um modelo B, de acordo com o fornecedor. E ele no est mais sozinho: novos dispositivos, como o Cotton Candy, o Mele A1000, o MK802 e o Oval Elephant fazem parte desta crescente famlia de mini-PCs. claro que possvel fazer muitas coisas alm de simples programao com um Raspberry Pi nas mos. Exis-
70
www.linuxmagazine.com.br
Raspberry Pi | TUTORIAL
tem pessoas que descobriram que o dispositivo, por exemplo, pode ser um vivel media streamer [2] e um reprodutor de rdio Internet [3]. Para este artigo, no entanto, cobriremos o objetivo geral do dispositivo: executar um sistema operacional Linux no qual o leitor possa programar. H um sem nmero de distribuies que podem ser executadas no Raspberry Pi. Basicamente tudo que precisamos de uma distribuio compilada para um processador ARM11 em uma imagem de disco que vai caber em pelo menos um carto SD de 2GB. No entanto, a equipe do Raspberry Pi atualmente recomenda uma das trs distribuies listadas em sua pgina de downloads [4]: Raspbian wheezy, Arch Linux ARM, e QtonPi. Para os iniciantes, a Raspberry Pi recomenda a variante do Debian, Raspbian, que consideravelmente otimizada para o dispositivo Pi e tem o LXDE, o Midori, e outras ferramentas de desenvolvimento. A Raspbian a que instalamos para este artigo, mas para as outras imagens o procedimento ser o mesmo; apenas mudam os nomes dos arquivos. Nota: os nomes de arquivos so os disponveis no momento em que escrevemos esta matria. Eles podem variar um pouco aps a publicao desta edio. Para comear, visite a pgina de downloads do Raspberry Pi e baixe a ltima edio do arquivo ZIP do Raspbian wheezy. No diretrio em que baixar o arquivo, extraia a imagem com
unzip 2012-07-15-wheezy-raspbian.zip
Este comando ir listar os dispositivos que esto montados. Veremos um nome do dispositivo que no corresponde configurao atual de unidades do seu sistema. Esse dispositivo extra seu carto SD. Se o carto possuir um nome como /dev/sdd1, ignore o 1 (ou qualquer outro nmero ao final do nome). Os nmeros indicam parties, e quando gravarmos a imagem de disco do Raspbian no carto, precisaremos do nome do dispositivo, que neste exemplo ser /dev/sdd. Tambm necessrio desmontar todas as parties que esto no carto. A maioria dos cartes SD ter apenas uma partio, mas para o caso de haver mais de uma, desmontar todas elas limpar o caminho para a nova imagem de disco. Presumindo que o nome do dispositivo /dev/sdd, digite
umount /dev/sdd1
para limpar o cache de gravao. Agora podemos remover o carto SD e us-lo em nosso dispositivo Raspberry Pi. Com a porta HDMI gerenciando vdeo e duas portas USB cuidando dos controles do mouse e do teclado, o leitor poder indagar se o tamanho do carto SD estar limitado ao armazenamento. Atravs de um hub USB, porm, tambm possvel expandir as portas e comear a usar drives USB externos para armazenamento.
O futuro
Uma das maiores atraes para o dispositivo Raspberry no apenas o dispositivo em si; a comunidade em volta deste pequeno dispositivo muito forte e est crescendo rpido. Quem no teve a felicidade de viver os primeiros dias do Linux, quando as coisas eram rpidas e livres e a informao muito mais complicada de se obter ento esta ser uma experincia nova que remeter a esses dias. Veteranos do Linux se sentiro em casa com a comunidade Raspberry. A convergncia de dispositivos baratos e poderosos como este deve abrir caminho para uma srie de projetos inovadores e o Raspberry Pi j desperta ateno na produo de robs terrestres [5] e dispositivos de realidade extraterrestre [6]. As possibilidades, como aconteceu com o velho Linux, so infinitas.
Repita o comando umount para todas as parties com sdd no nome. Em seguida, escreva a imagem do Raspbian no carto SD com o comando dd. Cuidados devem ser tomados aqui para que no sejam utilizados como destino o disco rgido ao invs do carto SD. Ainda no terminal, navegue at o diretrio /2012-07-15-wheezy-raspbian e digite
sudo dd bs=1M if=2012-07-15wheezy-raspbian.img of=/dev/sdd
Esta etapa pode levar algum tempo, portanto seja paciente e no pense que o processo est travado. Quando
Mais informaes
[1] Raspberry Pi: http://www.raspberrypi.org/ [2] Media streamer: http://wiki.xbmc.org/index.php?title=Raspberry_Pi [3] Rdio Internet: http://www.raspberrypi.org/ phpBB3/viewtopic.php?f=9&t=4031 [4] Downloads: http://www.raspberrypi.org/downloads [5] Robs: http://www.raspberrypi.org/forum/ projects-and-collaboration-general/starwars-r5-d4-astromech [6] Balo Meteorolgico: http://www.raspberrypi. org/phpBB3/viewtopic.php?f=9&t=2059
71
PROGRAMAO | Dart
PROGRAMAO
Centro do alvo?
A linguagem de programao Dart a atual alternativa do Google ao JavaScript. Executada principalmente em navegadores, tambm pode ser utilizada em linha de comando e em servidores como substituta para o PHP. por Tim Schrmann
cdigo escrito na linguagem de programao Dart do Google se parece muito com uma mistura de JavaScript e Java com uma pitada de Scala. Essa semelhana intencional: a linguagem de programao [1] foi projetada com base no desejo de eliminar alguns problemas e o lastro legado do JavaScript. A premissa que os programas Dart possam ser
executados mais rapidamente e com melhor segurana, que trabalhem em qualquer dispositivo compatvel com Internet e que sejam adequados para projetos ainda maiores [2]. Se uma pessoa tem experincia com linguagens de programao e essa descrio encaixa-se para quase qualquer programador web ir tambm rapidamente sentir-se vontade com o Dart.
Programas escritos em Dart sero executados em uma mquina virtual especial no navegador. O projeto fornece uma implementao de referncia em um site, que ainda capaz de executar programas Dart em linha de comando ou em um servidor de Internet. O Dart , sobretudo, um substituto adequado do PHP. Alm da mquina virtual, o projeto oferece um par de bibliotecas cujas funes entre outras coisas oferecem suporte manipulao conveniente da rvore de um site DOM (sigla para Document Object Model ou modelo de objeto de documentos). Um par de outras ferramentas tambm facilita a vida de programadores, como o editor Dart baseado no Eclipse (gura 1).
Trabalho em andamento
Tudo isso soa muito atraente, com uma desvantagem pequena: o Dart est atualmente em um estgio muito inicial de desenvolvimento e, portanto, no adequado para uso em produo. Os inventores do Dart intencionalmente lanaram a sua
72
www.linuxmagazine.com.br
Dart | PROGRAMAO
especificao em um estgio inicial para coletar tantas sugestes de melhorias quanto fosse possvel, bem como para melhorar a aceitao. tambm precisamente por isso que a especificao da linguagem tem sido colocada sob a licena Creative Commons Atribution 3.0 e o cdigo do programa publicado pelo projeto sob a licena BSD Google [3]. Quando este artigo foi escrito, a verso mais recente do Dart era a 0.08, e esta a verso na qual a viso geral a seguir se baseia.
main() e Classes
O ponto de partida para um programa Dart, como em Java, o main(). Para os programadores de JavaScript, especialmente, isso pode parecer novo:
main() { // Um pequeno comentrio print("Ol Mundo!"); }
Os programadores de JavaScript iro tossir novamente: Dart uma linguagem orientada a objetos em todos os sentidos. A listagem 1 mostra a declarao de uma classe chamada Carro. A classe comea por definir uma nova varivel cor. Como a palavra-chave var sugere, as variveis podem assumir valores arbitrrios a qualquer momento como no JavaScript, Dart uma linguagem sem tipos. Esta seguida pelo construtor Carro(), que deve usar o mesmo nome de classe. O this representa o objeto atual, como em Java; em outras palavras, this.cor garante que o valor no acabe em uma varivel global ou em uma nova varivel. A linha 8 mostra duas caractersticas do Dart. Em linguagens como Java, o desenvolvedor pode definir vrios construtores com parmetros diferentes (sobrecarga). Quando um objeto criado, a linguagem, ento, automaticamente chama o construtor correspondente. Em linguagens como Dart, tal escolha no to simples. Para resolver o problema, a linguagem utiliza construtores co-
73
PROGRAMAO | Dart
nhecidos. Na listagem 1, o segundo construtor chamado de pintura, e caso se queira chamar precisamente esse construtor ao criar uma instncia Carro na funo main(), preciso especificar o nome l:
Carro ferrari = new Carro.pintura("vermelho");
Em contraste, new Carro() iria apenas chamar o construtor normal. Como um segundo recurso especial, o construtor Carro.pintura() usa uma abreviao: o Dart atribui o valor passado para ele diretamente para a varivel cor. Claro, se preferir, use a verso longa:
Carro.pintura(var umacor) { this.color = umacor; }
foi dito, este apenas um aviso e no um erro o programa continuar a funcionar com um nmero em cor. Esse comportamento chama a ateno do programador para erros de atribuio e torna o cdigo mais legvel, e os usurios no precisam temer uma falha sbita do programa. Alm do tipo String, o Dart tambm suporta os tipos listados na tabela 1. Alis, todos estes so objetos internos. possvel at criar listas e mapas com um new:
var autos = new List();
(por exemplo, => e significa {return e;}). No Dart, possvel passar uma funo para outra, o que muito til em loops:
digaOla(String nome) => print("Ola ${nome}"); List nomes = ["Tim", "Joe", "Henry"]; nomes.forEach(digaOla);
As variveis que podem assumir valores arbitrrios podem ser muito convenientes, mas esta abordagem tende a causar alguma negligncia por parte dos programadores no mundo real, o que leva a erros que podem ser difceis de resolver. Por este motivo, os programadores podem, opcionalmente, especificar um tipo de uma varivel:
class Carro { String cor; [...]
As variveis que ainda no tiveram um valor atribudo automaticamente tm o valor especial null. Como no PHP, o Dart pode inserir o contedo de variveis em strings. O cdigo:
String nome = "John Doe"; print ("Ol ${nome}");
A funo digaOla escreve a string passada para ela aps Ol e exibe os resultados na tela. A segunda linha cria uma lista com trs nomes que, por sua vez, so empurrados um aps o outro e entregues para a funo pelo forEach neste caso, a funo digaOla(). Em outras palavras, este trecho de trs linhas de cdigo exibe Ol Tim, Ol Joe e Ol Henry. Pelo fato de o digaOla s ocorrer em nomes.forEach(), podemos declarar a funo de l diretamente e exibir seus nomes da mesma forma:
List nomes = ["Tim", "Joe", "Henry"]; nomes.forEach( (String nome) => print("Ol ${nome}") );
geraria um Ol John Doe. Dentro dos colchetes {} pode at haver expresses completas ou chamadas de funo.
Verso em linha
Usurios Dart podem abreviar uma definio de funo individual como a seguir:
int quadrado(int numero) { return numero*numero; }
Se o programa Dart tenta armazenar um nmero em cor em algum estgio posterior do programa, a mquina virtual cria um aviso. Como
Tipo String int double num bool List Map Contedo String (32-bit Unicode) Inteiro
com =>
int quadrado(int numero) => numero*numero;
Esta forma compacta de codificao funciona bem aqui mas, em funes mais complexas, pode-se facilmente perder de vista o que se est fazendo. Os suspeitos de costume esto disponveis para controle de fluxo: for, if, switch e while, e agem exatamente como seus homlogos em Java ou JavaScript. Alm disso, possvel usar excees para detectar erros.
Exemplo String nome = Joe; int numero = 12; double numero = 1.3456; num y = mx + b bool pegacookies = true; List nomes = [Tim, Joe, Henry]; Map traducao = {house : casa, car : carro, chair : cadeira};
Nmeros de ponto utuante de 64 bits (em conformidade com o padro IEEE 754) Nmeros inteiros, nmeros de ponto utuante, ou ambos verdadeiro/falso Uma lista de valores, tambm conhecida como array Array associativo, tambm conhecido como um mapa hash ou dicionrio de dados
74
www.linuxmagazine.com.br
Dart | PROGRAMAO
Clssico
O Dart herdou interfaces do Java. Quando uma classe implementa uma interface, ela garante que a funo especificada na interface seja fornecida. A listagem 2 fornece um exemplo de herana. Uma classe pode implementar vrias interfaces, mas apenas herda exatamente uma classe (ou seja, usa extends para estender a classe). Na listagem 2, todas as variveis e funes so pblicas, com uma exceo, _altura. Se o nome da varivel ou uma funo comea com um sublinhado, ela privada, e s possvel acessar a varivel ou funo dentro da prpria classe. Na listagem 2, isso significa que no se pode retroativamente modificar a altura de um retngulo.
Figura 2 O SDK Dart inclui uma mquina virtual para linha de comando.
Oferta de Factory
Padres de projeto [4] tm sido parte do repertrio do desenvolvedor profissional por muitos anos. Assim, no h nenhuma surpresa em que o Dart tambm suporte este recurso. Por exemplo, o padro Factory j faz parte da linguagem: se o construtor for prefixado com a palavra-chave factory, o Dart no cria automaticamente um objeto desta classe, mas deixa para o construtor. O programador pode ento olhar em um cache para ver se um objeto correspondente j existe, como pode ser visto na listagem 3. A varivel outrocarro neste exemplo aponta para o mesmo objeto como umcarro. A palavra-chave static garante que garagem s existe uma vez; todos os objetos Carro acessam a mesma varivel. O padro Factory pode tambm ser combinado com interfaces. Para fazer isso, atribui-se a classe padro factory a uma interface, e a classe factory retorna objetos para coincidir com a interface. A listagem 4 mostra um exemplo disso. A interface define a assinatura do construtor, que em seguida gera objetos para coincidir com a interface. O Carro-
for passado. Durante a instncia em main(), parece que se est criando um Carro diretamente. Alm disso, a palavra-chave is testa para ver se um objeto um tipo especfico. Alis, a palavra-chave final na frente do fabricante garante que varivel s possa ser atribudo um valor exato e somente uma vez durante sua inicializao.
svel us-los para criar rapidamente recipientes para objetos arbitrrios. As listas de funes embutidas e mapas so genricos. Por exemplo, List<Car> cria uma lista de objetos Carro:
main() { List<Carro> listadecarros = new List<Carro>(); listadecarros.add(new Carro("Ferrari")); Carro umcarro = listadecarros[0]; }
Servio de Continer
O Dart contm os tipos genricos, tambm conhecidos como generics, com os quais provavelmente estamos familiarizados por causa do Java. Programadores C++ tambm conhecem esse conceito como templates. pos-
75
PROGRAMAO | Dart
Paralelismo
Programadores normalmente mudam as tarefas que precisam ser executadas em processos paralelos separados e, em seguida, trabalham duro para unir os resultados intermedirios. O Dart remove as dores de cabea desse processo: um objeto derivado
da classe Isolate bsica, se assim se deseja, executado separadamente do programa principal em seu prprio processo. Para ser capaz de trocar resultados intermedirios, os Isolates podem enviar mensagens uns para os outros. Essas mensagens so primeiro enfileiradas at que o receptor Isolate pegue o que conhecido como uma porta. Este modelo lembra
muito o modelo atual do Erlang ou Scala. A listagem 5 mostra um exemplo completo. O programa de exemplo primeiro recebe um novo objeto Receiver, que despejado em um processo separado com spawn(). Depois disso, ele envia o objeto de quatro palavras em sucesso. Assim que o objeto recebe uma palavra, escreve-a na tela. O Isolate sempre d uma porta para o objeto que enviou a mensagem na forma de replyTo. Isso significa que ele pode responder diretamente para o seu solicitante. Os Isolates executam em um espao de memria separado. Um efeito colateral positivo disto que a coleta de lixo pode lidar com cada Isolate individualmente. No retorno, a mquina virtual precisa copiar as mensagens entre o Isolate. No futuro, os Isolates sero inclusive capazes de usar as diferentes bibliotecas Dart com diferentes verses.
Acesso DOM
Pelo fato de o Dart ser projetado para substituir o JavaScript, os programadores devem ser capazes de usar a linguagem para acessar a rvore DOM de um site. Para que isso acontea, o Dart inclui a sua prpria biblioteca, que pode ser importada como a seguir:
#import("dart:html");
Depois, pode-se usar a seguinte expresso para acessar uma <div> com a ID menu:
document.query("#menu");
Os elementos podem assim ser localizados atravs de seletores CSS em um estilo muito semelhante ao jQuery. O Dart pode usar programas de outras classes e funes para configurar conexes HTTP (Ajax keyword), dados de processo JSON, e at mesmo acessar o sistema de arquivos, entre outras coisas. Para
76
www.linuxmagazine.com.br
Dart | PROGRAMAO
Executado
Como os navegadores de hoje atualmente no compreendem programas Dart, o projeto desenvolveu o compilador Dartc, que converte programas Dart em cdigo JavaScript. No entanto, o Dartc tinha a reputao de criar programas JavaScript muito grandes, que executam muito lentamente. Para resolver este problema, um compilador GNU chamado Frog foi criado (e inclusive escrito em Dart), que gera cdigo JavaScript muito mais compacto. O Frog uma mquina virtual para a linha de comando (gura 2) includa no SDK Dart, que est disponvel gratuitamente na pgina do projeto [6]. Tudo que necessrio fazer baixar o arquivo ZIP correspondente, descompactar, e ento compilar o seu prprio programa Dart (por exemplo, test.dart) usando o Frog a partir do diretrio bin,
./frogc --enable_type_checks test.dart
cas embutidas da linguagem (com exceo da dart:html), para quando os programadores precisarem usar a declarao de importao se eles trabalharem com a mquina virtual de linha de comando. Finalmente, tambm possvel usar o Dartium, uma verso especial do navegador Chromium com uma mquina virtual Dart embutida [8]. possvel verificar a especificao completa da linguagem Dart [9] e o cdigo fonte de vrios dos maiores programas de exemplo Dart [10] no site do dartlang.org.
Concluso
Com exceo do Dartium, todos os atuais navegadores ignoram o Dart, e no se pode culp-los; afinal, a linguagem de programao no est totalmente completa. Ao mesmo tempo, o Dart est enfrentando fortes crticas: a maioria dos observadores acredita que o apoio a outra linguagem web suprfluo e contraproducente. O futuro do Dart depender em grande parte da seriedade que o Google vem demonstrando no mercado; a empresa tem o poder
de fazer valer essa linguagem, e se o faz no que se refere a dispositivos Android e navegador Chrome outros fabricantes de navegadores sero incapazes de desviar o olhar. No entanto, o perigo que uma comunidade de adversrios do Dart possa vir a existir, o que significaria mais uma vez a fragmentao da Internet. Dito isto, at mesmo os crticos devem reconhecer que os programas Dart so mais fceis de ler e compreender do que suas contrapartidas em JavaScript. Graas orientao a objetos genuna, aplicativos maiores e de mais fcil manuteno tambm so possveis. A perspectiva de uma linguagem nica para o cliente e o servidor tambm atraente programadores web no precisariam mais alternar entre JavaScript e, digamos, PHP. Mas mesmo quem no vem do mundo Java deve ser capaz de encontrar seu espao em um tempo muito curto. Por fim, a linguagem organizada de forma aberta, em contraste com o Java, e qualquer usurio pode apresentar propostas de melhorias. Pelo menos, assim tem sido o processo at agora.
Mais informaes
[1] Projeto Dart: http://www.dartlang.org/ [2] Objetivos do projeto Dart: http://www.dartlang. org/docs/technical-overview/#goals [3] Licena BSD Google: http://code.google.com/ intl/de-DE/google_bsd_license.html [4] Padres de Projeto: http://en.wikipedia. org/wiki/Software_design_pattern [5] Referncia da API Dart: http://api.dartlang.org/ [6] SDK Dart: http://www.dartlang.org/docs/getting-started/sdk/ [7] Dartboard: http://try.dartlang.org/ [8] Navegador Dartium: http://www.dartlang.org/dartium/ [9] Sintaxe da linguagem Dart: http://www.dartlang.org/docs/spec/ [10] Programas Dart de exemplo: http://www.dartlang.org/samples/ [11] Listagens deste artigo: http://www.lnm.com.br/issues/95/dart.zip
O parmetro --enable_type_checks garante que o compilador, ou a mquina virtual, possibilite a verificao do tipo. Caso prefira no usar o SDK agora, possvel executar seus prprios programas diretamente no site do projeto Dart, que conhecido como Dartboard [7] (gura 3). O Dartboard integra a maioria das bibliote-
77
Infraestrutura de Redes
Passo a passo da montagem de uma rede de computadores, desde o cabeamento e roteadores at a congurao das mquinas clientes. Congurao e manuteno de servios essenciais como DNS, compartilhamento de arquivos e acesso remoto.
Samba:
O contedo e o formato dos livros foram desenvolvidos a partir da experincia prtica e educacional de seus autores, com foco principal no desenvolvimento de competncias, atravs de conceitos, exemplos detalhados e dicas de quem realmente entende do assunto. O material indicado tanto para autodidatas que desejam se aperfeioar quanto para utilizao em escolas. O professor ir se sentir confortvel para desenvolver as atividades a partir do livro, que procura atender tanto expectativa do aprendiz quanto demanda profissional do mercado de TI.
PREVIEW
82
www.linuxmagazine.com.br