Seguranca para Desenvolvedores Web - 1 Edicao - John Paul Mueller - 2019
Seguranca para Desenvolvedores Web - 1 Edicao - John Paul Mueller - 2019
Seguranca para Desenvolvedores Web - 1 Edicao - John Paul Mueller - 2019
Novatec
São Paulo | 2019
Authorized Portuguese translation of the English edition of Security for Web Developers, ISBN
9781491928646 © 2015 John Mueller. This translation is published and sold by permission of O'Reilly
Media, Inc., which owns or controls all rights to publish and sell the same.
Tradução em português autorizada da edição em inglês da obra Security for Web Developers, ISBN
9781491928646 © 2015 John Mueller. Esta tradução é publicada e vendida com a permissão da
O'Reilly Media, Inc., detentora de todos os direitos para publicação e venda desta obra.
© Novatec Editora Ltda. 2016.
Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. É proibida a reprodução desta
obra, mesmo parcial, por qualquer processo, sem prévia autorização, por escrito, do autor e da Editora.
Editor: Rubens Prates
Tradução: Lúcia Kinoshita
Revisão gramatical: Smirna Cavalheiro
Assistente editorial: Priscila A. Yoshimatsu
Editoração eletrônica: Carolina Kuwabata
ISBN: 978-85-7522-767-1
Histórico de edições impressas:
Março/2016 Primeira edição
Novatec Editora Ltda.
Rua Luís Antônio dos Santos 110
02460-000 – São Paulo, SP – Brasil
Tel.: +55 11 2959-6529
Email: [email protected]
Site: www.novatec.com.br
Twitter: twitter.com/novateceditora
Facebook: facebook.com/novatec
LinkedIn: linkedin.com/in/novatec
Este livro é dedicado a todos os profissionais médicos que me ajudaram a
recuperar minha saúde – que ouviram todas as minhas queixas e
encontraram maneiras de tratá-las. Sim, eu precisei seguir suas
recomendações, mas foram eles que as ofereceram a mim. Boa saúde é uma
dádiva excepcional.
Sumário
Prefácio
Parte I ■ Desenvolvendo um plano de segurança
Capítulo 1 ■ Definindo o ambiente da aplicação
Especificando as ameaças às aplicações web
Entendendo a Software Security Assurance (SSA)
Considerando o OSSAP
Definindo os requisitos de SSA
Classificando dados e recursos
Fazendo a análise necessária
Mergulhando em questões específicas de linguagem
Definindo os principais problemas de HTML
Definindo os principais problemas de CSS
Definindo os principais problemas de JavaScript
Considerando o essencial para defesa nos endpoints
Evitando falhas de segurança
Detectando falhas de segurança
Corrigindo um software com problemas
Lidando com armazenamento em nuvem
Usando códigos e recursos externos
Definindo o uso de bibliotecas
Definindo o uso de APIs
Definindo o uso de microsserviços
Acessando dados externos
Permitindo acesso a outros
Capítulo 2 ■ Acolhendo as necessidades e expectativas
dos usuários
Desenvolvendo uma visão de usuário à aplicação
Considerando os problemas de BYOD (Bring Your Own Device)
Entendendo a segurança de aplicações baseadas em web
Considerando problemas de aplicações nativas
Usando navegadores customizados
Verificando problemas de compatibilidade de código
Tratando atualizações quase contínuas de dispositivos
Planejando alternativas a senhas
Trabalhando com frases-senha
Usando soluções biométricas
Contando com cartões-chave
Contando com chaves USB
Implementando uma estratégia de token
Focando nas expectativas dos usuários
Deixando a aplicação fácil de usar
Deixando a aplicação rápida
Criando um ambiente confiável
Mantendo a segurança em perspectiva
Capítulo 3 ■ Obtendo assistência de terceiros
Identificando soluções de terceiros para segurança
Considerando soluções para segurança em nuvem
Entendendo os repositórios de dados
Lidando com problemas de compartilhamento de arquivos
Considerando o armazenamento em nuvem
Escolhendo um tipo de produto
Trabalhando com bibliotecas
Acessando APIs
Considerando os microsserviços
Um aviso contém informações que você deve saber, pois, do contrário, poderá
sofrer uma terrível fatalidade. Assim como uma nota, o aviso dá ênfase a um
texto especial, mas esse texto informa sobre aspectos em potencial que poderiam
causar problemas significativos em algum ponto. Se você não aproveitar mais
nada de um capítulo, grave o significado por trás dos avisos em sua memória
para poder evitar erros caros mais tarde.
Caixas de texto
Uma caixa de texto contém informações úteis que você não necessariamente precisa
saber para trabalhar com aplicações web. Leia todas as caixas de texto em algum
momento porque elas realmente são interessantes, mas não é preciso lê-las de imediato.
As caixas de texto contêm boas informações que complementam o assunto discutido no
momento, mas que podem não ser exatamente sobre ele.
Agradecimentos
Agradeço à minha esposa Rebecca. Embora ela não esteja mais conosco
agora, seu espírito está em todos os livros que escrevo, em todas as palavras
que estão nas páginas. Ela acreditava em mim quando ninguém mais o fazia.
Russ Mullen, Billy Rios e Wade Woolwine merecem meu agradecimento
pela revisão técnica deste livro. Todos os três revisores técnicos contribuíram
muito para a exatidão e a profundidade do material que você vê aqui. Muitas
vezes pude lançar ideias a eles e pedir que me ajudassem a pesquisar assuntos
essenciais para o livro.
Meu agente Matt Wagner merece crédito por ter me ajudado a conseguir o
contrato, em primeiro lugar, e por cuidar de todos os detalhes que a maioria
dos autores realmente não leva em consideração. Serei sempre grato pela sua
assistência. É bom saber que alguém quer ajudar.
Várias pessoas leram o livro todo ou parte dele para me ajudar a melhorar a
abordagem e os scripts de teste e, em geral, ofereceram sugestões que todos
os leitores gostariam de ter dado. Esses voluntários ajudaram de tantas
maneiras que é impossível mencioná-los aqui. Em especial, sou grato aos
esforços de Eva Beattie, Glenn A. Russell e Luca Massaron, que ofereceram
sugestões em geral, leram o livro todo e se dedicaram de forma altruísta a
este projeto.
Por fim, gostaria de agradecer a Meg Foley, Nicole Shelby, Jasmine Kwityn e
ao restante da equipe de edição e produção.
Nesta parte do livro você aprenderá a criar um plano de segurança para usar
quando escrever aplicações. Ter um bom plano de segurança garante que sua
aplicação realmente atenderá a metas específicas e que outras pessoas
poderão discutir como implementar a segurança com a equipe de
desenvolvimento. Sem um bom plano de segurança definido, com frequência,
hackers terão fácil acesso à aplicação e causarão todo tipo de problemas à sua
empresa. O capítulo 1 apresenta uma introdução que ajudará você a entender
os componentes de um bom plano de segurança.
É importante perceber que o plano de segurança não está centrado apenas na
aplicação, mas também em como os usuários a utilizam. Toda aplicação bem-
sucedida tem o usuário em mente, conforme descrito no capítulo 2.
Além disso, você deve entender que as aplicações não existem mais no vácuo
– elas interagem com fontes de dados online e dependem de códigos de
terceiros. Com isso em mente, você também deve considerar o modo como as
soluções de terceiros podem afetar sua aplicação, tanto de forma positiva
quanto negativa. Usar soluções de terceiros também pode diminuir bastante
seu tempo de programação. O capítulo 3 ajuda você a alcançar esse objetivo.
CAPÍTULO1
Definindo o ambiente da aplicação
Manipulação de parâmetros
Hackers podem fazer experimentos com parâmetros passados como parte
do cabeçalho de requisição ou do URL. Por exemplo, ao trabalhar com o
Google, você pode alterar o URL e os resultados de sua pesquisa. Não se
esqueça de criptografar qualquer parâmetro que você passar entre o
navegador e o servidor. Além disso, use protocolos seguros de páginas web,
como HTTPS, quando passar parâmetros.
Hackers ainda podem manipular parâmetros se tiverem tempo e dedicarem
esforço suficientes. Também é importante definir cuidadosamente os intervalos e
os tipos de dados para os valores dos parâmetros a fim de reduzir os problemas
em potencial apresentados por esse ataque.
Considerando o OSSAP
Um dos principais sites que você precisa conhecer para fazer da SSA uma
realidade em aplicações web é o OWASP (Open Web Application Security
Project ou Projeto Aberto para Segurança em Aplicações Web, em
https://www.owasp.org/index.php/OWASP_Software_Security_Assurance_Process
– veja a figura 1.1. O site detalha o processo necessário para fazer com que o
OSSAP (OWASP Security Software Assurance Process, ou Processo de
Garantia de Segurança de Software do OWASP) seja parte do SDLC
(Software Development Lifecycle, ou Ciclo de Vida do Desenvolvimento de
Software). Sim, é uma enorme sopa de letrinhas, mas você deve conhecer
esse grupo para criar um processo para sua aplicação que esteja de acordo
com o trabalho feito por outras empresas. Além disso, as informações nesse
site ajudarão você a desenvolver um processo de segurança para sua
aplicação que realmente funcione, faça parte do processo de desenvolvimento
e a não consumir muito tempo para criar seu próprio processo.
Embora o OSSAP ofereça um ótimo framework para garantir que sua aplicação
atenda aos requisitos de SSA, não há nenhum requisito para você interagir com
esse grupo de forma alguma. O grupo licencia sua abordagem para SSA. No
entanto, atualmente, ele acabou de iniciar seus trabalhos e você verá muitos
TBDs (To Be Determined, ou A ser definido) no site que o grupo planeja definir
com o passar do tempo. É claro que você precisa de um plano para hoje, portanto
o OWASP e seu OSSAP apresentam um lugar para você pesquisar soluções no
presente e, possivelmente, obter ajuda adicional mais tarde.
Lógica
Interagir com uma aplicação e os dados que ela gerencia é um processo.
Embora usuários possam executar tarefas de maneira aparentemente
aleatória, tarefas específicas seguem padrões que se devem ao fato de o
usuário precisar seguir um procedimento para obter um bom resultado. Ao
documentar e entender esses procedimentos, você pode analisar a lógica da
aplicação de um ponto de vista prático. Usuários dependem de um
procedimento em particular por causa da maneira como os desenvolvedores
projetam a aplicação. Alterar o design necessariamente alterará o
procedimento.
A questão principal da análise é procurar falhas de segurança no
procedimento. Por exemplo, a aplicação pode permitir que o usuário
permaneça logado, mesmo que nenhuma atividade seja detectada por um
longo período de tempo. O problema é que o usuário pode nem mesmo estar
presente – outra pessoa poderia acessar a aplicação usando as credenciais do
usuário e ninguém perceberia, pois todos achariam que o usuário está logado
usando o mesmo sistema, como sempre.
No entanto, falhas de segurança nos dados podem assumir outras formas. Um
número de identificação de uma peça pode ser constituído de diversos
elementos quantificáveis. Para obter um bom número de identificação de
peça, a aplicação poderia solicitar os elementos, em vez de pedir o número
como um todo e compor o número de identificação a partir desses elementos.
A ideia é deixar o procedimento mais limpo, mais claro e menos suscetível a
erros de modo que o banco de dados não acabe com muitas informações
ruins.
Dados
Talvez você ache que não pode fazer muitas análises em dados do ponto de
vista de segurança, mas, na verdade, há muitas questões a considerar. De fato,
a análise de dados é uma das áreas em que as empresas mais deixam a desejar
porque a ênfase está em como administrar e usar os dados, e não em como
protegê-los (é razoável supor que você deve abordar todas as três questões).
Ao analisar dados, você deve considerar os seguintes pontos:
• Quem pode acessar os dados
• Qual é o formato usado para armazenar os dados
• Quando os dados são acessíveis
• Onde os dados são armazenados
• Por que cada item de dado é disponibilizado como parte da aplicação
• Como os dados são separados em componentes e qual é o resultado da
combinação dos dados para uso da aplicação
Por exemplo, algumas aplicações falham na prática de ocultar dados (data
hiding), que é uma funcionalidade essencial para qualquer boa aplicação.
Ocultar dados significa dar ao usuário somente a quantidade de informações
realmente necessária para executar uma tarefa específica.
As aplicações também formatam alguns dados incorretamente. Por exemplo,
é quase certo que armazenar senhas como texto causará problemas se alguém
conseguir invadir o sistema. Uma opção melhor é armazenar o hash da senha
usando um algoritmo seguro (um que não tenha sido quebrado). O hash não é
importante para alguém que tenha feito uma invasão, pois a aplicação precisa
da senha a partir da qual o hash foi criado.
Deixar todos os dados acessíveis o tempo todo também é uma péssima ideia.
Dados sensíveis devem aparecer na tela somente quando alguém estiver
disponível para monitorar seu uso e reagir imediatamente, caso o usuário faça
algo inesperado.
Armazenar dados sensíveis na nuvem é uma ideia particularmente ruim. Sim,
usar armazenamento em nuvem deixa os dados prontamente disponíveis,
além de rápidos para serem acessados, mas também vulneráveis. Armazene
dados sensíveis em servidores locais quando você tiver acesso direto a todos
os recursos de segurança usados para manter os dados protegidos.
Desenvolvedores de aplicações também tendem a deixar muitas informações
disponíveis. Use ocultação de dados para manter dados específicos de
gerenciamento ocultos a outros tipos de usuários. No entanto, alguns dados
não têm lugar na aplicação. Se ninguém realmente precisa de determinado
dado para executar uma tarefa, não acrescente esse dado à aplicação.
Muitos dados atualmente estão em agregações, como parte de outros dados. É
possível a um hacker aprender muito sobre sua empresa ao identificar a forma
de agregação usada, separando o item de dado para descobrir suas partes
constituintes. É importante considerar como os dados são reunidos e
adicionar proteções que dificultem descobrir a origem desses dados.
Interface
Um grande problema com softwares atualmente é a inclusão de recursos
desnecessários. Espera-se que uma aplicação atenda a um conjunto específico
de objetivos ou execute um conjunto específico de tarefas. Invariavelmente,
alguém tem a ideia de que o software, de alguma maneira, seria melhor se
tivesse determinadas funcionalidades que não têm nada a ver com os
objetivos principais que o software deve alcançar. O termo excesso de
recursos (feature bloat) está presente há muito tempo. Normalmente, ele é
discutido em um sentido monetário – como a origem dos problemas de
velocidade das aplicações, o responsável pela elevação dos custos de
treinamento dos usuários e aquele que acaba com os cronogramas de
desenvolvimento. Entretanto, os problemas de interface da aplicação – que,
com frequência, são os mais afetados pelo excesso de recursos – têm um
impacto significativo na segurança na forma de um aumento da superfície de
ataque. Sempre que a superfície de ataque aumenta, você oferece mais
oportunidades a um hacker para ter acesso à sua empresa. Livrar-se de
recursos desnecessários ou transferi-los para uma aplicação totalmente
diferente reduzirá a superfície de ataque, deixando sua aplicação muito mais
segura. É claro que você economizará dinheiro também.
Outro problema em potencial é a interface com pistas (hint interface) – uma
interface que revela os recursos de segurança da aplicação ao oferecer
informações ou recursos demais a um hacker em potencial. Embora seja
necessário oferecer uma maneira para o usuário recuperar uma senha perdida,
algumas implementações, na verdade, possibilitam a um hacker obter a senha
de um usuário e transformar-se nele. O hacker pode até mesmo impedir que o
verdadeiro usuário acesse a conta alterando a senha (essa ação, porém, seria
contraproducente, pois um administrador poderia facilmente restaurar o
acesso do usuário). Um sistema mais conveniente é garantir que o usuário
tenha realmente feito a solicitação antes de tomar qualquer atitude e, então,
certificar-se de que o administrador enviará as informações de login de forma
segura.
Restrições
Uma restrição é simplesmente um método para garantir que as ações atendam
a critérios específicos antes que elas sejam permitidas. Por exemplo,
desabilitar o acesso a elementos de dados, a menos que o usuário tenha o
direito de acessá-los, é um tipo de restrição. No entanto, as restrições têm
outras formas mais importantes. O tipo principal de restrição é determinar de
que modo determinado usuário pode gerenciar os dados. A maioria dos
usuários só precisa de acesso de leitura aos dados; apesar disso, as aplicações
comumente concedem acesso de leitura/escrita, abrindo uma enorme brecha
de segurança.
Dados também têm restrições a serem consideradas também. Ao trabalhar
com dados, você deve definir exatamente o que os torna únicos e garantir que
a aplicação não vá quebrar nenhuma regra em relação a essa unicidade. Com
isso em mente, geralmente você deverá considerar os seguintes tipos de
restrições:
• Garantir que os dados sejam do tipo certo
• Definir o intervalo de valores aceito pelos dados
• Especificar os tamanhos mínimos e máximos dos dados
• Listar qualquer valor inaceitável para os dados
Bloquear o acesso
Na verdade, é possível bloquear todo o acesso a dados na nuvem usando um
firewall, uma política ou um recurso da aplicação. No entanto, a capacidade
de bloquear o acesso de todos os lugares em que um usuário possa querer
acessar dados na nuvem é extremamente difícil e os usuários são bastante
determinados. Além disso, bloquear o acesso pode ter efeitos negativos nas
reuniões de negócio. Por exemplo, parceiros podem optar por usar o
armazenamento em nuvem como um método para troca de arquivos
grandes. Uma estratégia de bloqueio também faz os usuários ficarem com
raiva, de modo que eles não trabalharão com sua aplicação ou acharão
maneiras de contornar a funcionalidade que você procurava oferecer. Essa
será a melhor opção se sua empresa tiver de administrar grandes
quantidades de dados sensíveis, houver requisitos legais para proteger os
dados ou simplesmente não precisar da flexibilidade do armazenamento em
nuvem.
Permitir acesso sem controle
Você poderia optar por ignorar os problemas envolvidos no uso do
armazenamento em nuvem. Entretanto, uma política como essa deixa sua
empresa suscetível à perda e violação de dados e a todo tipo de outros
problemas. Infelizmente, muitas empresas atualmente usam essa estratégia
porque controlar o acesso dos usuários tornou-se muito difícil e a empresa
não tem meios para usar outro tipo de abordagem.
Contar com locais seguros controlados pela empresa
Se você precisa que os usuários acessem dados na nuvem usando uma conta
da empresa, você pode, pelo menos, monitorar o uso de arquivos e ter
meios para recuperar os dados quando um funcionário sair da empresa. No
entanto, os problemas básicos com o armazenamento em nuvem
permanecem. Um hacker com o conhecimento certo ainda poderia acessar a
conta e obter seus dados ou simplesmente optar por espionar você de outras
maneiras. Essa opção funcionará bem se sua empresa não gerencia dados
com medidas de proteção exigidas legalmente e você estiver disposto a
trocar um pouco de segurança por conveniência.
Controlar o acesso dentro da aplicação
Muitos serviços em nuvem suportam uma API que permite interagir com o
serviço de maneiras únicas. Embora essa abordagem consuma bastante
tempo, ela tem a vantagem de permitir que você controle o local em que o
usuário armazena dados sensíveis, ao mesmo tempo que lhe oferece a
flexibilidade para usar armazenamento em nuvem para dados menos
sensíveis. Considere essa solução quando sua empresa precisar interagir
com um grande número de parceiros, ao mesmo tempo que precisar
também administrar grandes quantidades de dados sensíveis ou críticos.
Contar com uma solução de terceiros
Você pode encontrar soluções de terceiros, como a da Accellion
(http://www.accellion.com/), que oferece conectores para armazenamento
em nuvem. O fornecedor oferece um serviço que atua como um ponto
intermediário entre sua aplicação e o armazenamento de dados online. O
usuário é capaz de interagir naturalmente com os dados, mas o serviço
controla o acesso usando políticas que você define. O problema com essa
abordagem é que agora você passa a ter uma camada adicional para
considerar quando escrever a aplicação. Além disso, você deve confiar no
terceiro que oferece o conector. Essa solução em particular funciona bem
quando você precisa de flexibilidade, sem os custos usuais de
desenvolvimento, e não quer criar sua própria solução que dependa de
acesso a API.
É importante escolher frases das quais o usuário se lembrará, mas que não
estejam associadas à aplicação, à vida pessoal do usuário ou ao seu ambiente
de trabalho. Não há motivos para oferecer vantagens aos hackers quando se
trata de adivinhar uma frase-senha. Portanto, uma frase-senha como I Work in
R00m 23a. não é, particularmente, uma boa frase-senha – seria muito fácil
adivinhá-la.
Simplesmente dizer ao usuário para depender de frases-senha não funcionará. De
fato, os usuários continuarão a usar senhas como secret e master porque as
usaram por muito tempo. Usuários tendem a rejeitar tudo que os façam trabalhar
mais, mesmo que seja só um pouco. Como consequência, você deve garantir o
cumprimento das regras de complexidade como parte do código de sua aplicação,
de modo que o usuário seja forçado a usar algo melhor que os suspeitos usuais
quando se trata de senhas. Se um usuário tiver de usar uma senha realmente
complexa, a ideia de usar uma frase-senha em seu lugar torna-se muito mais
atraente.
Formato da orelha
Você segura seu smartphone próximo à sua orelha, exatamente como faria
para fazer uma chamada. No entanto, em vez de ouvir alguém falar, você
fará login em uma aplicação. A solução já existe na forma da Ergo Lock
Screen App (http://www.descartesbiometrics.com/ergo-app/).
Técnica de digitação
Toda pessoa tem uma maneira diferente de digitar. A velocidade com que
você digita, o tempo que segura as teclas e até mesmo as pausas entre as
letras o identificam como digitador. Ao digitar uma frase específica e
monitorar o modo como você a digita, uma aplicação poderia criar uma
autenticação de dois fatores que não pode ser diferenciada da simples
digitação da senha. No entanto, um hacker que roubasse a senha não seria
mais capaz de usá-la. Uma empresa que já implementou uma solução desse
tipo é a Coursera, na forma do Signature Track
(http://blog.coursera.org/post/40080531667/signaturetrack).
A promessa dos sistemas biométricos não está tão próxima da realidade da
biometria. Por meio de descrições, já sabemos que os hackers criaram
métodos para passar por cima das senhas biométricas. Se a senha de um
usuário for comprometida, basta dar-lhe uma nova senha. No entanto, se a
impressão digital de um usuário for comprometida, não será viável cortar e
costurar um novo dedo.
Por que usar autenticação de dois fatores?
Um problema com a maior parte das soluções de autenticação de um fator é que elas
têm um ponto fraco que alguém pode explorar com relativa facilidade. Por exemplo,
um hacker poderia roubar uma senha ou uma frase-senha usando um ataque de
engenharia social ou até mesmo de força bruta. Ao usar uma autenticação de dois
fatores, é possível reduzir o risco de alguém passar por cima do processo de
autenticação. É claro que poderíamos argumentar que uma autenticação de três ou de
quatro fatores seria melhor ainda, mas haveria um ponto em que ninguém mais
conseguiria entrar em sua própria conta.
Há vários tipos de autenticação de dois fatores. Por exemplo, você pode fornecer tanto
uma senha quanto um token a um usuário. Também é possível combinar senhas com
soluções biométricas. Muitos bancos atualmente usam autenticação de dois fatores, e
você pode usá-la opcionalmente em sites como Google, Facebook e Twitter.
O problema com a autenticação de dois fatores é o mesmo da autenticação de um fator
– normalmente, os usuários não gostam de autenticação. A sensação é que deveria ser
possível usar a aplicação sem fazer nada adicional. É claro que a autenticação é
importante, e você deve usar a autenticação de dois fatores para dados críticos ou
sensíveis. Porém, é importante considerar o ponto de vista do usuário sobre quais
opções de autenticação funcionarão melhor. Criar uma solução flexível é essencial se
você quiser que essa solução de segurança seja bem-sucedida.
Acessando APIs
APIs são códigos que você acessa a partir de sua aplicação fazendo chamadas
a um local centralizado. As APIs existem como uma entidade separada e você
aciona essa entidade a partir de sua aplicação. A questão é que as APIs são
totalmente separadas de outros códigos de sua aplicação, portanto você
precisa criar uma referência para ela e, então, fazer solicitações à API. Uma
API normalmente está associada a algum tipo de serviço, por exemplo,
armazenamento de dados. Use APIs para criar uma conexão do tipo
cliente/servidor, com todos os problemas de segurança que uma conexão
dessas implica.
Algumas APIs incluem acessos protegidos para ajudar a garantir que hackers não
possam usar facilmente determinados exploits para ter controle da API ou usá-la
de maneiras que seus criadores jamais imaginaram. Algumas APIs exigem uma
combinação de nome e senha para que o serviço possa ser acessado, o que não é
um problema, desde que a informação seja enviada de forma criptografada. Mas
mesmo usando criptografia, os dados não estarão realmente seguros. Como
alternativa, as APIs podem usar chaves de acesso. Infelizmente, quando as
chaves são expostas, os endpoints das APIs continuam a dar informações
alegremente a quem quer que as requisite. Em suma, problemas de segurança
ocorrerão com uma API em algum momento, mas você pode empregar métodos
para cercear as atividades dos hackers. Continua sendo importante manter-se
vigilante e prestar atenção em atividades de hackers quando usar uma API.
Um problema em potencial com APIs é que elas podem ser lentas. Sua
aplicação torna-se menos eficiente e pode haver atrasos. Esse é um aspecto
importante a ser considerado porque a paciência não é a melhor das virtudes
dos usuários e eles podem acabar fazendo algo que causará falhas
inadvertidamente em sua aplicação enquanto esperam. Aplicações com falha
sempre apresentam problemas de segurança que os hackers ficariam bem
satisfeitos em explorar.
Também é possível aos hackers usar ataques man-in-the-middle para acessar
seus dados quando uma API estiver sendo usada. Um ataque man-in-the-
middle, em especial, é difícil de detectar porque as chamadas aparentemente
funcionam e você não verá nenhuma diferença nos dados quando os
recuperar posteriormente. Enquanto isso, o hacker usa os dados acessados
para executar tarefas como obter números de cartões de crédito de clientes ou
informações úteis sobre sua empresa. Ao trabalhar com uma API, você deve
prestar bastante atenção a questões como criptografia de dados para garantir
que seus dados permaneçam seguros. Alguns exemplos de APIs são:
• AccuWeather (http://www.programmableweb.com/api/accuweather)
• Amazon (https://affiliate-
program.amazon.com/gp/advertising/api/detail/main.html)
• Box (https://developers.box.com/)
• Facebook (https://developers.facebook.com/)
• Flickr (https://www.flickr.com/services/developer/)
• Google (https://developers.google.com/products/)
• Pinterest (http://www.programmableweb.com/api/pinterest)
• Salesforce (http://www.salesforce.com/us/developer/docs/api/index.htm)
• Twitter (https://dev.twitter.com/overview/documentation)
• WordPress (http://codex.wordpress.org/WordPress_APIs)
• YouTube (https://developers.google.com/youtube/)
Uma das diferenças entre bibliotecas e APIs é que a maioria das bibliotecas
oferece uso gratuito, enquanto muitas APIs cobram para serem utilizadas. Na
maioria dos casos, você pode ter acesso a uma API em um nível suficiente para
testá-la, mas para ter a funcionalidade completa, você precisa obter uma chave, o
que significa pagar pelo nível de acesso necessário.
Além disso, muitos hosts de APIs exigem que você teste sua aplicação em modo
sandbox e obtenha um certificado para a aplicação depurada resultante antes que
o host permita à aplicação usar a API propriamente dita. Esses requisitos também
aumentam o custo de usar APIs, o que pode torná-las menos populares que as
bibliotecas.
Considerando os microsserviços
Microsserviços são uma tecnologia nova baseada em tecnologias existentes.
Um microsserviço é um tipo de mistura entre web service, API e biblioteca,
mas em um pacote pequeno. Com efeito, microsserviços têm a seguinte lista
de recursos que você deve considerar:
• Dependem de uma aplicação pequena, de propósito único e baseada em
serviço para criar uma aplicação totalmente funcional (cada aplicação de
propósito único é um microsserviço).
• Usam a linguagem de programação mais apropriada para a tarefa.
• Acessam dados da aplicação usando a técnica mais eficiente de
gerenciamento de dados para o microsserviço em particular.
• Oferecem uma comunicação leve para cada microsserviço.
• Dependem de protocolos como REST para se comunicar, de modo que o
pipe não é inteligente, mas o microsserviço é.
• Empregam gerenciamento descentralizado de aplicações, pois cada
microsserviço é monitorado separadamente.
• Cada microsserviço é selecionado conforme for necessário para criar
qualquer aplicação completa (desktop, navegadores móveis, aplicativos
móveis nativos e até mesmo APIs).
Dada a maneira como os microsserviços funcionam, você deve considerar
alguns dos mesmos problemas das bibliotecas e APIs. Por exemplo, um
microsserviço poderia fazer parte do código de sua aplicação, portanto você
deve considerar o modo como o microsserviço interage com a aplicação.
Além disso, como ocorre com uma API, dados são enviados e recebidos
quando trabalhamos com um microsserviço, por isso é possível que ataques
man-in-the-middle causem problemas.
Do ponto de vista de segurança, os microsserviços tendem a implementá-la
de modo diferente das bibliotecas e das APIs. Em vez de oferecer uma única
solução para tudo e para todos que usam os microsserviços em um site como
um todo, cada microsserviço oferece um sistema individualizado de
segurança baseado nas necessidades desse microsserviço. Como resultado, os
microsserviços tendem a oferecer melhor nível de segurança, mas essa
segurança também é irregular e mais difícil de ser trabalhada. Eis alguns
exemplos de microsserviços (cada um desses sites oferece acesso a diversos
microsserviços – você escolhe quais quer usar em uma aplicação em
particular):
• Akana (http://www.akana.com/solutions/microservices)
• Archivematica (https://www.archivematica.org/en/)
• Gilliam (http://gilliam.github.io/)
• LSQ.io (https://angel.co/lsq-io)
• Seneca (http://senecajs.org/)
Pelo fato de serem tão novos, você encontrará muitas discussões sobre o que,
exatamente, é um microsserviço. Para alguns especialistas, o número de LOC
(Lines of Code, ou Linhas de Código) importa. Um serviço que tenha um LOC
entre 200 e 500 se enquadra como um microsserviço, mas se estiver acima disso,
não será. (Um LOC menor que 200 aparentemente não oferece um nível
suficiente de funcionalidade.) Consequentemente, um microsserviço como o
Cloner (https://www.npmjs.com/package/app-cloner-heroku) atende aos
requisitos (LOC de 305), mas um microsserviço como o Deploy Hooks
(https://devcenter.heroku.com/articles/deploy-hooks) não atende (LOC de 1240).
1 “Moving Your Infrastructure to the Cloud: How to Maximize Benefits and Avoid
Pitfalls” (Transferindo sua infraestrutura para a nuvem: como maximizar as vantagens e
evitar as armadilhas, http://www.rackspace.com/knowledge_center/whitepaper/moving-
your-infrastructure-to-the-cloud-how-to-maximize-benefits-and-avoid-pitfalls), “Cost
Savings, Efficiencies Lead IT Pros to Cloud Computing” (Economia nos custos e
eficiência levam profissionais de TI para a computação em nuvem,
http://searchcloudcomputing.techtarget.com/feature/Cost-savings-efficiencies-lead-IT-
pros-to-cloud-computing) e “To Find Cloud Cost Savings, All You Need Is a Little
Patience” (Para identificar economias com a nuvem, tudo de que você precisa é de um
pouco de paciência, http://searchcloudcomputing.techtarget.com/feature/To-find-cloud-
cost-savings-all-you-need-is-a-little-patience) oferecem esclarecimentos adicionais sobre
todo o quadro geral da economia.
2 Por exemplo, veja “Dropbox Drops the Security Notification Ball, Again” (Dropbox
pisou na bola na notificação de segurança novamente,
http://www.zdnet.com/article/dropbox-drops-the-security-notification-ball-again/) e
“Wary of Privacy Issues? Ditch Dropbox and Avoid Google, Says Edward Snowden”
(Desconfiado de questões de segurança? Deixe de lado o Dropbox e evite o Google, diz
Edward Snowden, http://www.newsweek.com/wary-privacy-issues-ditch-dropbox-and-
avoid-google-says-edward-snowden-276956).
PARTEII
Aplicando práticas de programação
bem-sucedidas
Figura 4.1 – Uma interface clara enfoca apenas uma questão, de maneira
que o usuário possa entender.
A interface é bem clara. Ela faz uma única pergunta, oferece um número
limitado de respostas e dificulta a entrada de dados indevidos pelo usuário. O
usuário seleciona uma cor, clica no botão e passa para a próxima aba. Várias
aplicações web atualmente usam esse tipo de interface. Você verá essa
interface com frequência em páginas de inscrição. O exemplo conta com a
biblioteca jQuery UI (https://jqueryui.com/) para executar sua tarefa. Eis o
código-fonte desse exemplo:
<!DOCTYPE html>
<html>
<head>
<script
src="https://code.jquery.com/jquery-latest.js">
</script>
<script
src="https://code.jquery.com/ui/1.9.2/jquery-ui.js">
</script>
<link
rel="stylesheet"
href="https://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css" />
<title>Using the Tabs Widget</title>
<style>
#Configuration
{
width: 90%;
text-align: center;
}
#div de Configuration
{
text-align: left;
}
</style>
<script language="JavaScript">
$(function()
{
$(“#Configuration").tabs();
});
</script>
</head>
<body>
<h1>Using the Tabs Widget</h1>
<form id="ConfigForm" method="get" action="Tabs.html">
<div id="Configuration">
<ul>
<li><a href="#Tab1">Foreground Color</a></li>
<li><a href="#Tab2">Background Color</a></li>
<li><a href="#Tab3">Options</a></li>
</ul>
<div id="Tab1">
<input id="FGRed"
type="radio"
name="Foreground"
value="Red"
checked="checked" />
<label for="FGRed">Red</label><br />
<input id="FGOrange"
type="radio"
name="Foreground"
value="Orange" />
<label for="FGOrange">Orange</label><br />
<input id="FGGreen"
type="radio"
name="Foreground"
value="Green" />
<label for="FGGreen">Green</label><br />
<input id="FGBlue"
type="radio"
name="Foreground"
value="Blue" />
<label for="FGBlue">Blue</label>
</div>
<div id="Tab2">
<input id="BGRed"
type="radio"
name="Background"
value="Red"
checked="checked" />
<label for="BGRed">Red</label><br />
<input id="BGOrange"
type="radio"
name="Background"
value="Orange" />
<label for="BGOrange">Orange</label><br />
<input id="BGGreen"
type="radio"
name="Background"
value="Green" />
<label for="BGGreen">Green</label><br />
<input id="BGBlue"
type="radio"
name="Background"
value="Blue" />
<label for="BGBlue">Blue</label>
</div>
<div id="Tab3">
<input id="Sounds"
type="checkbox"
name="Sounds"
value="SpecialSounds" />
<label for="Sounds">Use Special Sounds</label><br />
<input id="Effects"
type="checkbox"
name="Effects"
value="SpecialEffects" />
<label for="Effects">Use Special Effects</label>
</div>
</div>
<input id="ChangeConfig"
type="submit"
value="Change Configuration" />
</form>
</body>
</html>
Para criar essa interface, importe as bibliotecas jQuery (https://jquery.com/) e
jQuery UI, e a folha de estilo associada da jQuery UI. A informação das abas
está em uma <div>, cujo id é Configuration. A mágica usada para criar a
interface é o resultado da chamada a $("#Configuration").tabs().
Criar uma interface com elementos que podem ser movidos é relativamente
simples. O código a seguir mostra como fazer isso (esse código também pode
ser visto no arquivo DragContent.html):
<!DOCTYPE html>
<html>
<head>
<script
src="https://code.jquery.com/jquery-latest.js">
</script>
<script
src="https://code.jquery.com/ui/1.9.2/jquery-ui.js">
</script>
<link
rel="stylesheet"
href="https://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css" />
<style>
#MoveMe
{
border: solid;
width: 200px;
height: 5em;
text-align: center;
line-height: 5em;
}
</style>
<script language="JavaScript">
$(function()
{
$(“#MoveMe").draggable();
});
</script>
<title>Creating a Draggable Element</title>
</head>
<body>
<h1>Creating a Draggable Element</h1>
<p id="MoveMe">
Moveable Paragraph
</p>
</body>
</html>
Nesse caso, o parágrafo MoveMe (elemento <p>) é o alvo. Observe que deixar
o parágrafo móvel não afeta o cabeçalho (elemento <h1>). Tudo que você
precisa fazer é chamar $("#MoveMe").draggable() quando o formulário é
carregado para deixar o elemento de parágrafo móvel.
week
Exibe um selecionador de data que o usuário pode utilizar para selecionar
uma semana e um ano específicos. Os atributos min e max permitem definir
o intervalo de datas possíveis (apesar de estar trabalhando com meses, você
deve fornecer datas para esses atributos). Versões mais recentes de Chrome,
Safari e Opera aceitam esse controle.
É importante lembrar que um hacker não joga de acordo com as regras nem se
sente limitado pelos seus formulários de forma alguma. É possível driblar as
proteções fornecidas por esses controles e submeter dados diretamente ao
servidor em algum outro formato. A capacidade de passar por cima das proteções
é o motivo pelo qual você deve conferir os intervalos e o tipo de qualquer dado
recebido do cliente no servidor.
Para usar esses controles, utilize a tag <input>. Por exemplo, para criar um
tipo de entrada numérico, você pode usar (consulte o arquivo InputTag.html
para ver detalhes):
<input id="NumberInput" type="number" min=1 max=5 value=1 />
Nesse caso, o usuário vê um controle de entrada de texto, mas ele inclui um
controle de setas para cima e para baixo, como mostra a figura 4.3. Além
disso, o atributo value fornece um valor default. O usuário pode facilmente
alterar o valor digitando um novo valor ou simplesmente usando o controle
de seta para cima ou para baixo.
Figura 4.3 – Uma entrada numérica apresenta um controle de seta para
cima e para baixo.
A entrada number não impede que o usuário digite um valor indesejado. No
entanto, uma validação automática é realizada. Conforme o navegador, uma
entrada incorreta recebe algum tipo de destaque. Por exemplo, no caso do
Firefox, a borda se torna mais espessa e a caixa aparece em vermelho, como
mostra a figura 4.4. A questão é que os acréscimos de HTML5 reduzem o
trabalho a ser feito para usuários honestos, mas é possível que um hacker
determinado passe por cima dele.
Alguns controles HTML5 são mais seguros que outros. Por exemplo, o tipo de
entrada range normalmente aparece como um slider, de modo que o usuário não
insere realmente um valor. Porém, você não deve contar com o fato de algum
controle oferecer segurança absoluta.
Validando a entrada
De tudo que você pode fazer para garantir que sua aplicação permaneça
segura, a mais importante é supor que todas as entradas que você receber são
ruins. Ao pressupor que toda entrada que receber contém um vírus ou algum
exploit que causará danos ao seu sistema, você começará a ver os dados de
entrada de uma nova maneira. Sim, soa como paranoia, mas esse ponto de
vista é essencial para manter seus dados seguros. Validar dados de modo a
refletir o ponto de vista de dados de entrada corrompidos é essencial no
ambiente atual das aplicações. Mesmo assumindo esse ponto de vista, você
poderá perceber que não está paranoico o suficiente (hackers são muito
criativos para encontrar novas maneiras de fazer dados ruins parecerem bons)
e que precisa contratar alguém para acrescentar mais paranoia ao seu
comportamento. As próximas seções apresentam algumas ideias sobre como
você pode proteger sua aplicação e seus dados associados validando
absolutamente toda entrada de todas as formas que você puder imaginar.
Esperando o inesperado
Por vezes os usuários são impressionantes. Eles parecem encontrar a única
brecha que você não pensou em corrigir. Um dia tedioso pode se transformar
em uma sessão simplesmente para ver o que é preciso para quebrar uma
aplicação. Na verdade, o usuário pode nem mesmo estar disposto a quebrar a
aplicação; talvez seja apenas uma questão de fazer algo sem prestar muita
atenção, enquanto fala ao telefone. A questão é que os usuários encontrarão
problemas que você jamais esperaria encontrar em sua aplicação. Isso pode
resultar em todo tipo de problemas para proteger a aplicação e seus dados
associados. Às vezes um problema pode fazer a aplicação ou, quem sabe, até
mesmo o servidor em que ela estiver executando, falhar. Você pode ficar
impressionado com o que os usuários conseguem fazer, mas, no mundo real,
usuários entediados podem gerar eventos inesperados.
Hackers também farão o inesperado em sua aplicação. Entretanto, nesse caso,
o inesperado é mais planejado e metódico. Um hacker continuará explorando
suas defesas à procura de um caminho de entrada até outro alvo aparecer, o
hacker ficará entediado ou ele conseguirá um acesso de entrada. Na maioria
dos casos, o hacker encontrará um caminho de entrada quando estiver
realmente determinado a fazer isso. Nunca se trata de saber se o hacker terá
acesso à sua aplicação, mas de quando ele será bem-sucedido em seus
esforços. O uso de medidas de segurança atrasa os hackers e, com uma
monitoração apropriada, você pode descobrir o hacker espreitando seu
sistema antes que seja possível que ele cause algum dano de verdade.
Muitas das tarefas inesperadas que os usuários e os hackers fazem estão
associadas a entradas de dados. Por exemplo, você pode esperar uma string
como entrada, mas recebe um script em seu lugar. Os usuários podem clicar
combinações inesperadas de teclas que resultam em uma string corrompida
que fazem a aplicação ou o servidor falharem. Às vezes, é simplesmente uma
questão de supor que o usuário fará uma ação quando outra bem diferente
parece ser mais apropriada. Por exemplo, um usuário pode responder com
uma string quando um número é exigido (ou vice-versa). Os hackers, é claro,
procuram todo tipo de maneiras nefastas de fornecer dados de entrada
inesperados e fornecerão propositalmente dados de entrada que você não
estava esperando.
1 N.T.: A abordagem “da cenoura e da vareta” é uma expressão que se refere a uma política
de oferecer recompensas e punições para levar a um comportamento. Seu nome baseia-se
na imagem de uma pessoa conduzindo uma carroça com uma cenoura pendurada diante
de uma mula, segurando uma vareta atrás. A mula seguirá a cenoura porque quer a
comida como recompensa, ao mesmo tempo que se move para fugir da vareta atrás dela,
pois não quer a punição da dor, fazendo a carroça se mover. (Baseado em:
https://en.wikipedia.org/wiki/Carrot_and_stick.)
5
CAPÍTULO
Você pode estar se perguntando por que este livro contém um capítulo sobre
como implementar um código confiável quando o assunto é segurança. Há
uma inter-relação entre a velocidade, a confiabilidade e a segurança de uma
aplicação. Cada um desses elementos tem um papel para transformar uma boa
aplicação em uma ótima aplicação. Não é possível dar mais destaque a um
aspecto em relação a outro sem que sua aplicação seja diminuída de alguma
maneira. É claro que as empresas tomam a decisão conscientes de enfatizar
um elemento em relação a outro, mas normalmente para atingir objetivos
específicos. Por exemplo, talvez haja um requisito legal para proteger
aplicações a qualquer custo, caso em que você provavelmente precisará
sacrificar um pouco de velocidade e de confiabilidade para atingir o objetivo.
No entanto, para a maioria das aplicações, o equilíbrio entre os três elementos
é crucial. Até entender as interações entre velocidade, confiabilidade e
segurança, é quase impossível conseguir uma aplicação com o nível máximo
possível de segurança implementado, e é impossível criar uma aplicação que
funcione bem em um ambiente em que todos os três elementos são
valorizados.
Este capítulo mostra a confiabilidade conforme ela se relaciona com a
segurança. Em outras palavras, analisa como equilibrar a confiabilidade para
atingir objetivos específicos de segurança em sua empresa. O capítulo
também considera a confiabilidade como uma ciência estatística, embora não
vá deixar você entediado com as especificidades dos cálculos de
confiabilidade. A questão é entender o conceito de risco calculado no que diz
respeito ao estado da segurança em uma aplicação. Qualquer pessoa que diga
que uma aplicação não cria riscos para a integridade tanto dos dados quanto
da organização não entende realmente nem de confiabilidade nem de
segurança.
Como parte do tratamento de questões de confiabilidade, o capítulo a explora
de vários pontos de vista. Por exemplo, para criar uma aplicação confiável,
você deve definir protocolos de equipe que garantam que todos entendam os
conceitos necessários. Especialistas em confiabilidade também aprendem a
cada iteração dos cálculos que fazem – de modo semelhante, você deve
incorporar um ciclo de feedback para fazer alterações de maneira que a
empresa veja a confiabilidade em seu ambiente único. Há também as
questões ligadas ao uso de soluções prontas. Você não criará muitas
aplicações do zero, portanto é importante conhecer os efeitos que o uso de
uma solução pronta terá em sua aplicação.
A ideia principal a ser extraída deste capítulo é que a aplicação mais confiável do
mundo é aquela que executa tarefas sem nenhum tipo de potencial para falhas.
Isso excluiria o uso de qualquer processamento, entradas ou recursos externos,
pois todos esses três itens têm pontos de falha. Uma aplicação desse tipo não
teria usuários e deveria executar em um hardware com confiabilidade
extremamente alta. No entanto, mesmo com todos esses aspectos implementados,
ainda seria impossível criar uma aplicação que seja 100% confiável. Toda
aplicação tem potencial para falhar, tornando-a menos confiável.
Quanto maior o MTBF de uma aplicação, menos tempo será gasto em seu
suporte e menores serão os custos de manutenção. Além disso, um MTBF
alto também indica uma situação em que as brechas de segurança por falhas
na aplicação são menos prováveis. As falhas na aplicação não ocorrem só por
causa de bugs no software – elas também ocorrem por falhas no uso,
problemas de ambiente (por exemplo, falta de memória), causas que não
podem ser reproduzidas (por exemplo, raios cósmicos causando picos na
alimentação) e outras causas. Como não é possível administrar todas essas
causas de falhas, o software jamais poderá ser 100% confiável. Em algum
momento, até mesmo o melhor software do mundo terá uma falha.
Raios cósmicos realmente afetam os computadores. De fato, quanto maior a
altitude do local de armazenamento do computador, maiores serão os efeitos. O
tamanho dos transistores nos chips também afeta a incidência de erros de
software. Você pode descobrir mais sobre esse efeito interessante em “Cosmic
Rays and Computers” (Raios cósmicos e computadores,
http://www.nature.com/news/1998/980730/full/news980730-7.html), “Effect of
Cosmic Rays on Computer Memories” (Efeitos dos raios cósmicos nas memórias
do computador, http://www.ncbi.nlm.nih.gov/pubmed/17820742) e “Should
Every Computer Chip Have a Cosmic Ray Detector?” (Todo chip de computador
deveria ter um detector de raios cósmicos?,
https://www.newscientist.com/blog/technology/2008/03/do-we-need-cosmic-ray-
alerts-for.html). As informações são interessantes e podem, finalmente, explicar
alguns daqueles erros impossíveis de reproduzir, que você viu no passado.
Um ciclo de feedback para analisar a causa das falhas pode ajudar a aumentar
o MTBF em determinada empresa. Ao analisar as causas das falhas, você
pode criar um plano para melhorar o MTBF pelo menor custo possível. Eis
algumas ideias a serem consideradas como parte da análise das causas de
falhas no software:
Qualidade
À medida que a qualidade do software melhora, o MTBF aumenta. É
possível melhorar a qualidade do software encontrando e removendo bugs,
melhorando a interface de usuário para diminuir as chances de um usuário
cometer erros e acrescentando verificações para garantir que os recursos
necessários estejam disponíveis antes de usá-los.
Pontos de falha
Reduzir o número de pontos de falha em uma aplicação aumenta o MTBF.
A melhor maneira de reduzir os pontos de falha é deixar a aplicação menos
complexa, organizando as rotinas e deixando-as mais eficientes. No
entanto, você também pode tomar atitudes como aumentar a redundância,
quando for possível. Por exemplo, ter duas fontes para os mesmos dados
diminui a probabilidade de que a perda de uma única fonte cause falhas na
aplicação.
Treinamento
Um treinamento melhor reduz erros operacionais e melhora o MTBF. Há
um ponto em que o retorno por causa do treinamento diminui, mas a
maioria dos usuários atualmente não recebe treinamento suficiente para o
software que deveriam usar para realizar tarefas úteis. Além disso, treinar o
pessoal de suporte para lidar com erros de modo mais preciso e os
desenvolvedores a identificar as verdadeiras causas das falhas ajudarão a
melhorar o processo de feedback.
Criar listas completas de falhas, juntamente com suas causas, é a melhor
maneira de começar a entender a dinâmica de sua aplicação. À medida que a
base de conhecimento de uma aplicação aumenta, é possível ver padrões
previsíveis e usá-los como meio para determinar os pontos em que devemos
investir tempo e recursos fazendo correções. É claro que não é possível
corrigir as causas de alguns erros. Sim, é possível proteger todo o seu
hardware para se livrar daqueles raios cósmicos irritantes, mas as chances de
uma empresa gastar dinheiro com isso são extremamente baixas (e o retorno
provavelmente será menor ainda).
Considerando os problemas de soluções prontas
Conforme os capítulos anteriores, a maioria das aplicações atualmente
depende de soluções prontas para executar tarefas comuns. Tentar criar uma
aplicação totalmente do zero consumiria tempo demais e seria inviável do
ponto de vista financeiro. Não há realmente um bom motivo para reinventar a
roda. No entanto, usar essas soluções prontas afetará a confiabilidade de sua
aplicação. Você estará contando com um código escrito por outra pessoa para
fazer sua aplicação funcionar, portanto esse código também deve fazer parte
do cálculo da confiabilidade. As seções a seguir discutem algumas questões
que você deve considerar quando trabalhar com soluções prontas.
Acionando os microsserviços
Em vários aspectos, um microsserviço é simplesmente uma API mais
granular. O conceito de usar porções menores de código para que seja
possível contar com quaisquer recursos necessários para executar bem uma
tarefa específica faz sentido. Por causa do modo como os microsserviços
funcionam, muito do que você sabe sobre APIs do ponto de vista da
confiabilidade também se aplica aos microsserviços. Por exemplo, chamadas
a um microsserviço em particular podem demorar mais que o esperado,
aumentando a frustração do usuário. A forma de contornar esse problema é
implementar timeouts na aplicação. Contudo, no caso de um microsserviço,
você sempre pode tentar fazer a chamada usando uma fonte secundária
quando estiver disponível.
No entanto, os microsserviços também diferem das APIs quanto a alguns
aspectos simplesmente porque são menores e mais personalizados. Com isso
em mente, apresentamos alguns dos problemas de confiabilidade que você
deve considerar quando estiver lidando com microsserviços:
• Usar mais microsserviços de procedências diferentes aumenta o potencial
de uma perda de conexão e reduz a confiabilidade da aplicação.
• Escolher microsserviços que realmente otimizem o serviço oferecido para
a sua necessidade específica aumentará a confiabilidade da aplicação
porque haverá menos riscos de erros significativos.
• Contar com uma interface consistente para chamadas a microsserviços
reduz possíveis erros de programação, aumentando a confiabilidade da
aplicação.
• Ter mais de um local de procedência que possa executar o mesmo serviço
reduz o número de pontos de falha únicos, aumentando a confiabilidade
da aplicação.
• Manter os serviços pequenos significa que a perda de um único serviço
não implicará a indisponibilidade de todos os serviços, como ocorreria
com uma API, portanto a confiabilidade é maior nesse caso também.
1 N.T.: “'Grande Irmão', tradução literal de 'Big Brother' no original, que na verdade
significa 'Irmão Mais Velho', em linguagem coloquial inglesa, é um personagem fictício
no romance 1984 de George Orwell. Na sociedade descrita por Orwell, todas as pessoas
estão sob constante vigilância das autoridades, principalmente por teletelas (telescreen),
sendo constantemente lembradas pela frase propaganda do Estado: 'o Grande Irmão zela
por ti' ou 'o Grande Irmão está te observando' (do original 'Big Brother is watching
you').” (Fonte: https://pt.wikipedia.org/wiki/Grande_Irmão)
2 N.T.: Um exploit “dia zero” (zero-day) é a exploração de uma vulnerabilidade ainda não
documentada, para a qual ainda não existe uma correção.
CAPÍTULO6
Incorporando bibliotecas
Seria difícil encontrar uma aplicação web que não dependa de uma biblioteca
– pelo menos, não de uma que não seja significativa. Bibliotecas são o
epítome da não reinvenção da roda. De fato, assim como as rodas, há
bibliotecas de todo formato, tamanho e cor por aí. Sim, até as cores entram
em ação quando consideramos que muitas bibliotecas incluem temas que
você pode usar para deixar seu site mais elegante. Consequentemente, é
provável que você já tenha gasto um bom tempo trabalhando com bibliotecas
de alguma maneira. De fato, vários dos exemplos do livro em capítulos
anteriores contavam com bibliotecas simplesmente porque reescrever o
código do zero não faz sentido.
Este capítulo não tenta persuadir você sobre a importância de usar
bibliotecas. É provável que você já tenha se convencido de suas vantagens.
No entanto, talvez você não tenha considerado todas as ramificações de usar
o código de outra pessoa em sua aplicação. Sempre há consequências para o
uso de bibliotecas. O objetivo é usar bibliotecas de forma segura para que
você tenha todas as vantagens de poder contar com o código de outra pessoa
sem criar grandes brechas de segurança em sua aplicação. (Tenha ciência de
que você criará algumas brechas de segurança; é impossível evitá-las.)
Obtendo velocidade máxima com bibliotecas
Você pode encontrar sites que dizem para você não usar nenhuma biblioteca porque
elas incorrem em penalidades na velocidade (por exemplo, veja
http://www.giftofspeed.com/dont-use-javascript-libraries/). O fato é que bibliotecas
podem deixar seu site lento, especialmente quando elas não são usadas de forma
inteligente. O impacto na velocidade pode ser grande o suficiente para fazer as pessoas
darem o clique que as levarão para o próximo site, o que significa que seu site deixou
de oferecer um serviço ou outro recurso às pessoas que o acessaram.
Este livro geralmente usa as versões não compactadas das bibliotecas disponíveis para
facilitar o trabalho com os exemplos e executar tarefas, como usar um depurador, para
analisar as aplicações mais facilmente. Contudo, do ponto de vista da velocidade,
normalmente você deve usar a versão compactada da biblioteca. A versão compactada
contém o mesmo código, mas carrega mais rápido e, às vezes, você ganha um pouco de
agilidade também ao fazer chamadas.
Também é importante perceber que você não usará todo o código da biblioteca. Muitas
bibliotecas, como a jQuery UI (http://jqueryui.com/download/), oferecem um builder
que permite criar uma versão personalizada da biblioteca carregada. Depois de
descobrir quais partes de uma biblioteca você realmente usará, utilize um builder para
criar uma versão que tenha somente essas partes. A biblioteca carregará mais rápido e
você também reduzirá sua superfície de ataque, o que representa uma melhoria na
segurança também.
Mesmo após os testes, você deve estar ciente de que há um potencial para
falhas de segurança em uma biblioteca, na aplicação à qual ela oferece
suporte ou como resultado da combinação de ambas. Com isso em mente, eis
uma lista dos tipos mais comuns de ameaças que você poderá encontrar ao
trabalhar com bibliotecas (sem ênfase na origem propriamente dita da falha):
Cross-site scripting (XSS)
O problema mais comum de segurança com que os desenvolvedores se
deparam é o XSS. Há três maneiras simples de driblar o XSS:
• Nunca transmita dados não confiáveis na mesma resposta HTTP como
HTML ou JavaScript. De fato, é melhor se o documento HTML
principal permanecer estático.
Talvez você esteja se perguntando como seu servidor poderia acabar enviando
dados não confiáveis a alguém. É mais fácil do que você imagina. O artigo
“ScriptGard: Automatic Context-Sensitive Sanitization for Large-Scale Legacy
Web Applications” (ScriptGard: sanitização automática sensível ao contexto para
aplicações web legadas de larga escala,
http://www.cs.berkeley.edu/~prateeks/papers/scriptgard-ccs11.pdf) descreve
como é difícil garantir a integridade dos dados, mesmo com o uso de
sanitizadores corretos. A suposição segura é que qualquer dado que você não
tenha criado pessoalmente não é confiável.
É claro que o resultado de toda essa exploração é determinar como você pode
usar APIs de modo seguro como parte da estratégia de desenvolvimento de
sua aplicação. Como as APIs são muito vantajosas, você não as verá
desaparecer em curto prazo, mesmo que elas possam não ser uma boa ideia
do ponto de vista de segurança. Na verdade, você pode contar com o fato de
que o uso de APIs vai se expandir, pois os desenvolvedores têm problemas
constantes de prazo que as APIs podem resolver. À medida que mais pessoas
usam aplicações baseadas em web e essas aplicações se tornam mais
complexas, você pode contar com o uso de APIs para expandir e atender a
necessidades específicas. Conforme o uso aumenta, cresce o interesse em
criar exploits por parte dos hackers que querem acessar seus dados e usá-los
de maneiras que você jamais imaginou. Em suma, no mínimo, a influência
das APIs em segurança aumentará, portanto seu cuidado ao usá-las também
deve aumentar.
Multimídia
Uma API não precisa funcionar apenas com dados textuais ou outros tipos
de dados abstratos. Ela também pode executar tarefas relacionadas a outros
sentidos, em que o visual e o auditivo são os mais comuns. O controle e a
manipulação de multimídia criam um ambiente em que os usuários
interagem com aplicações de maneiras não tradicionais e os resultados
muitas vezes são surpreendentes. Ao combinar multimídia com ciência
aplicada a dados, é possível reconhecer novos padrões e objetos em
situações cotidianas, aumentando a capacidade de um usuário executar
tarefas como visualizar cenas em ultravioleta que, de outro modo, seria
impossível. No entanto, é importante perceber que a multimídia é apenas
outra forma de dados, e dados de todo tipo são facilmente interceptados,
corrompidos ou manipulados por hackers de maneiras indesejadas.
Localização
Embora a geolocalização seja a forma mais comum de aquisição, consulta e
manipulação de localização, é importante entender que há APIs para
trabalhar com todo tipo de informações de localização. A localização, assim
como a multimídia, é um tipo especial de dado. Nesse caso, ela oferece um
ponto bidirecional ou tridimensional no espaço, relativo a um espaço-alvo
em particular, por exemplo, a Terra. A propósito, algumas APIs
acrescentam uma quarta dimensão à equação: o tempo. Pense no que
aconteceria se hackers decidissem modificar os dados de localização de
modo que dois objetos, por exemplo, carros, tentassem ocupar o mesmo
espaço ao mesmo tempo (resultando em um acidente).
Definindo microsserviços
As aplicações que funcionam em uma única plataforma irão se afastar da
maioria dos usuários em algum momento. Sim, elas continuarão existindo
para necessidades especiais, mas as aplicações comuns, com as quais a
maioria dos usuários conta no cotidiano, não se importarão com a plataforma,
os requisitos da linguagem de programação ou qualquer outro aspecto que as
aplicações precisam considerar atualmente. Os microsserviços funcionam
bem no ambiente de programação atual porque definem uma nova maneira de
olhar para o código. Em vez de se preocupar em como criar o código, onde
colocá-lo ou qual linguagem usar, o desenvolvedor pensa em apenas uma
tarefa que o código deve executar. Essa tarefa pode nem mesmo se encaixar,
necessariamente, na aplicação no momento – ela pode simplesmente
representar algo interessante que a aplicação talvez precise fazer quando
estiver trabalhando com os dados. No novo mundo do desenvolvimento de
aplicações, elas executarão em qualquer lugar, a qualquer momento, por
causa de tecnologias como a dos microsserviços. As próximas seções
apresentam uma boa visão geral do que são exatamente os microsserviços e
por que você deve se importar com eles.
String
Uma série de caracteres entre aspas (a maioria dos textos diz que você deve
usar aspas duplas). JSON reconhece caracteres de controle precedidos por
uma barra invertida (\). Esses caracteres são: backspace (\b), formfeed (\f),
quebra de linha (\n), carriage return (\r) e tab horizontal (\t). Você também
pode especificar caracteres Unicode usando \u e um valor hexadecimal de
quatro dígitos. Por exemplo, \u00BC é o símbolo de um quarto (¼).
Número
Um número é uma série de caracteres numéricos sem aspas, com ou sem
ponto decimal. Os sinais de mais e de menos mostram valores positivos e
negativos. Você também pode especificar números usando notação
científica ao adicionar um e ou um E. Por exemplo, -123e20 é uma
apresentação perfeitamente aceitável de um valor.
Falta de consistência
A principal ameaça em potencial representada pelos microsserviços é a falta
de consistência, que parece assombrar praticamente toda biblioteca e API já
criada. Os desenvolvedores de bibliotecas e APIs começam com a simples
ideia de criar uma interface consistente e fácil de usar, mas, com o tempo, a
biblioteca ou a API tornam-se um emaranhado de estratégias conflitantes que
deixam um nó górdio fácil de desfazer, em comparação. Tentar corrigir
qualquer base de código é incrivelmente difícil porque os desenvolvedores
usam bibliotecas e APIs como um código único. Essas inconsistências
provocam problemas de segurança porque os desenvolvedores que usam as
bases de código acham que o código deve funcionar de uma maneira, quando,
na verdade, eles funcionam de outra. O resultado é uma incompatibilidade
entre a base de código e a aplicação que depende dela. Hackers aproveitam
esses erros como um meio para ter acesso à aplicação, seus dados ou ao
sistema em que ela executa.
Os microsserviços também podem sofrer de falta de consistência. É essencial
que você crie um template para descrever exatamente como chamar os
microsserviços o mais cedo possível no processo de desenvolvimento. Assim
como no caso das bibliotecas e das APIs, os hackers poderiam usar as
inconsistências como meio de passar por cima de qualquer sistema de
segurança que você tenha implantado. De modo diferente de bibliotecas e
APIs, a inconsistência afetaria apenas um microsserviço, em vez de afetar
toda a base de código. Corrigir o microsserviço também seria mais simples
porque você estará olhando apenas para uma chamada, e não para uma API
completa. Publicar um novo microsserviço também é mais fácil que publicar
toda uma nova biblioteca ou API. Consequentemente, superar uma
inconsistência de microsserviço é relativamente fácil.
Por causa do modo como esse exploit funciona, o que você realmente precisa
fazer é garantir que a aplicação faça logout do usuário automaticamente após
um período de inatividade. Além disso, você deve procurar por padrões
incomuns de uso e definir limites para o que um usuário pode fazer sem
aprovação. Por exemplo, um usuário pode transferir mil dólares em um
banco, mas transferir dez mil dólares exige a aprovação de um gerente. Usar
fluxos de trabalho de vários passos, em que um invasor precisaria interagir
mais com o usuário para fazer o exploit funcionar, às vezes pode evitar esse
tipo de exploit também, mas então você enfrentará a ira do usuário por ter de
executar mais passos a fim de concluir uma dada tarefa.
Definindo a TLS
O calcanhar de Aquiles tanto de microsserviços quanto de APIs é que ambas
funcionam enviando mensagens de um lado para outro, em vez de executar
processamentos em um único computador. A pedra angular do
desenvolvimento de uma correção para esse problema é a TLS (Transport
Layer Security, ou Segurança da Camada de Transporte). É essencial garantir
que a camada de transporte entre clientes e servidores permaneça segura
durante o processo de troca de mensagens. Isso significa usar tecnologias
como HTTPS e REST para garantir que as comunicações permaneçam tão
seguras quanto possível.
Um problema com o encapsulamento de absolutamente todas as chamadas e
respostas em HTTPS e REST é que a aplicação pode ficar extremamente
lenta. O melhor método para superar esse problema é contar com
balanceamento de carga para terminar comunicações de clientes, ao mesmo
tempo em que um canal permanece aberto para atender às necessidades de
processamento do backend. Manter o canal de processamento do backend
aberto reduz o overhead e ajuda a reduzir os efeitos do uso de HTTPS e de
REST.
Um dos problemas com o uso de HTTPS com redes voltadas ao público é que
você deve ter um certificado de um CA (Certificate Authority, ou Autoridade de
Certificação) – uma proposta cara que pode evitar que algumas empresas usem
HTTPS. Quando você controla os dois lados do canal de comunicação, é possível
criar seu próprio certificado para atingir o mesmo objetivo a um custo
significativamente reduzido.
Figura 9.1 – Iniciar o scan envolve fornecer o URL de seu site e clicar em
um botão.
Se você tiver um site hospedado, não se esqueça de verificar junto ao provedor
de serviços de hospedagem. Muitos deles oferecem scanners de segurança web
de baixo custo. Por exemplo, você pode encontrar a oferta para os usuários do
GoDaddy em https://www.godaddy.com/security/malwarescanner.aspx. O
provedor tem um profundo interesse em garantir que seu site não seja
comprometido, portanto, a oferta de baixo custo beneficia também o provedor.
Após o scan ter sido concluído, você terá uma visão geral do que o scanner
encontrou e uma listagem mais detalhada das verificações propriamente ditas,
como mostra a figura 9.2. É claro que, se você quiser uma verificação mais
detalhada, é possível comprar um dos planos do Sucuri listados à direita da
página. Contudo, para ver o que um scanner pode fazer por você, a versão
gratuita servirá.
Figura 9.2 – O scan completo mostra qualquer problema com seu site.
Pode ser interessante ver as informações de detalhes do website (Website
Details). A figura 9.3 exibe as informações de meu site. O interessante é que
um hacker poderia empregar um scanner como esse para começar a procurar
áreas de interesse em potencial em seu site, por exemplo, qual versão de um
software em particular você usa. O scanner de segurança web ajuda você a
entender os tipos de informação que os hackers têm disponíveis. Ver esse tipo
de informação que todos podem encontrar muitas vezes é um pouco
assustador.
As informações detalhadas podem ser úteis por outro motivo. Quando usar
um site hospedado, como muitos negócios de pequeno porte fazem, é difícil
saber se o provedor dos serviços de hospedagem realmente mantém o
software atualizado. O scanner de segurança web Sucuri (e outros) sonda o
site cuidadosamente e gera listas de informações de versões que você nem
sequer veria ao usar o painel de controle (dashboard) de seu site. Por
exemplo, é possível que uma biblioteca continue funcionando bem, mas
esteja desatualizada e tenha o potencial para criar uma brecha de segurança
em seu sistema. Um telefonema para a empresa de hospedagem normalmente
pode esclarecer rapidamente a questão, mas você precisa conhecer o
problema antes de poder ligar para alguém e falar sobre ele.
Obtendo as ferramentas
A menos que você queira escrever suas próprias aplicações para ferramentas
de segurança (definitivamente, é uma péssima ideia), você precisará obtê-las
de alguém. Felizmente, sites como a McAfee
(http://www.mcafee.com/us/downloads/free-tools/index.aspx) oferecem todo
tipo de ferramentas gratuitas que você possa querer para executar tarefas
como:
• detectar malwares no sistema host;
• avaliar se o sistema é vulnerável a ataques;
• executar análise forense após um ataque;
• usar as ferramentas SASS (Software Application Security Services, ou
Serviços de Segurança de Aplicativos e Software) da Foundstone para
deixar as aplicações mais seguras;
• determinar quando uma invasão ocorreu;
• fazer scan do sistema em busca de várias vulnerabilidades;
• estressar o sistema para testá-lo.
Configurando o sistema
Começar com uma configuração limpa é importante para conduzir uma
análise forense do sistema após atacá-lo. Antes de instalar um software ou
fazer qualquer configuração, certifique-se de que o sistema esteja totalmente
zerado (escreva zeros em tudo). Vários produtos de software permitem que
você execute essa tarefa. Escrever zeros em todo o disco rígido garante que
qualquer dado que você vir será o resultado dos testes executados, e não
informações deixadas por uma instalação anterior.
É importante criar uma instalação limpa para cada plataforma à qual você
pretenda dar suporte desde o início. Não se esqueça de fazer uma cópia da
imagem da configuração para poder restaurá-la posteriormente. A
configuração deve incluir o sistema operacional, os navegadores e qualquer
software de teste necessário para dar suporte ao ambiente de testes. Talvez
você queira também incluir softwares que o usuário normalmente instale no
sistema se a aplicação web interagir com o software de alguma maneira.
Produtos como o Norton Ghost (http://www.symantec.com/page.jsp?id=ghost)
facilitam bastante criar imagens de cada configuração. Certifique-se de que você
tenha uma estratégia de criação de imagens em mente antes de fazer algo com a
configuração limpa que você criar. Você precisará de imagens limpas depois para
restaurar a configuração após arruiná-la quando atacá-la.
Além dos softwares-padrão, talvez você queira instalar softwares para acesso
remoto para poder acessar o sistema de um local remoto, fora da área de
testes fisicamente protegida. Acessos externos devem ocorrer por meio de
uma rede fisicamente separada para garantir que não haja riscos de
contaminar o ambiente de produção. O uso de software para acesso remoto
permite que mais de um testador de software acesse os sistemas conforme for
necessário a partir de seus locais usuais de trabalho, em vez de acessá-los
fisicamente de dentro da área protegida.
Algumas empresas disponibilizam estações de trabalho que acessam os sistemas
de testes usando um controlador KVM (Keyboard, Video, and Mouse, ou
Teclado, Vídeo e Mouse). Usar uma configuração de KVM com um transmissor
permite alternar facilmente entre sistemas de testes a partir de um local remoto.
No entanto, o uso de um software de acesso remoto provavelmente é mais
flexível e mais rápido.
Restaurando o sistema
Não demorará muito para que seu sistema de testes exija uma restauração.
Vírus, adwares1 e cavalos de Troia (Trojans) que você usa para testá-lo são
apenas uma fonte de problemas. Executar exploits e determinar a facilidade
com que sua aplicação falha em algum momento causarão danos ao sistema
operacional, à aplicação de teste, aos dados do teste e às medidas de proteção
do sistema. Em suma, você precisa de algum método para restaurar
rapidamente o sistema a um estado conhecido.
A restauração também inclui a reconfiguração do sistema para simular outro
ambiente. Vale a pena usar imagens para criar vários ambientes de teste
prontamente. Conforme mencionamos, usar máquinas virtuais economiza
bastante tempo porque você não precisa recriar sempre o disco rígido do zero.
No entanto, certifique-se de que você tenha também a imagem de cada
sistema operacional em um disco rígido diferente, em um DVD ou em outra
mídia de armazenagem porque o disco rígido em algum momento será
corrompido.
Agora você pode começar a manipular o URL para ver o que é possível fazer.
Por exemplo, vamos supor que você queira determinar quantas colunas essa
query gera e o que são essas colunas. É possível usar a cláusula SQL ORDER
BY para executar essa tarefa. Altere o URL de modo que ele inclua a cláusula
ORDER BY assim: http://www.mysite.com/index.php?itemid=10’ ORDER
BY 1. Isso equivale a digitar SELECT * WHERE itemid='10' ORDER BY 1 como
um comando. Ao incrementar o valor de ORDER BY em 1 a cada requisição,
em algum momento você verá um erro novamente. Suponha que você veja o
erro quando tentar ORDER BY 10. O resultado da query, na verdade, tem nove
colunas nesse caso.
Um hacker continuará a acrescentar comandos SQL ao URL básico para
saber mais sobre os resultados da query no banco de dados. Por exemplo,
usar a cláusula SELECT ajuda a determinar quais dados aparecem na tela.
Você também pode solicitar informações especiais como parte da cláusula
SELECT, por exemplo, @@version, para obter o número de versão do servidor
SQL (dando uma ideia de quais vulnerabilidades o servidor SQL pode ter). A
questão é que o URL original oferece acesso direto ao servidor SQL,
possibilitando que alguém assuma o controle desse servidor sem muito
trabalho.
Você pode ver outro tipo de ataque de injeção de SQL detalhado em
http://www.w3schools.com/sql/sql_injection.asp. A causa subjacente de todos
esses ataques é que um desenvolvedor usou dados diretamente de uma página
ou de uma requisição sem antes verificá-la para saber se há problemas e,
possivelmente, sem remover informações errôneas.
Gerenciando o projeto
Antes de permitir que alguém execute testes de invasão, você precisa de uma
proposta que defina o escopo, os objetivos e os métodos de teste. Qualquer
teste de invasão deve incluir ataques de engenharia social, pois a maioria dos
hackers os emprega. De fato, as pessoas de sua empresa são o elo mais fraco
em sua segurança. Uma aplicação pode oferecer um sistema quase perfeito de
segurança, mas uma única revelação feita pela pessoa errada pode frustrar
todas as suas tentativas de manter um ambiente seguro.
Garanta que a metodologia de testes esteja bem documentada e esteja de
acordo com as melhores práticas do mercado. Por exemplo, muitas empresas
de segurança seguem o OSSTMM (Open Source Security Testing
Methodology, ou Metodologia Aberta para Testes de Segurança); dê uma
olhada no site do ISECOM (Institute for Security and Open Methodologies,
ou Instituto para Segurança e Metodologias Abertas em
http://www.isecom.org/) para ver mais detalhes. Se o pentester usa outra
metodologia, verifique se você entende exatamente o que é essa metodologia
e quais tipos de vantagens ela traz.
A proposta deve definir o tipo de feedback que você receberá como parte dos
testes. Por exemplo, é importante decidir se os testes de invasão incluem
revelações completas, com uma demonstração de como, exatamente, o
sistema é invadido, ou se o relatório simplesmente informa que uma área em
particular é vulnerável a ataques.
Definir o horário do ataque também é importante. Talvez você não queira
permitir testes durante os horários mais movimentados do dia para evitar que
haja riscos às vendas. Por outro lado, talvez você precise permitir que os
testes sejam realizados em horários menos convenientes se quiser realmente
ver os efeitos da carga no sistema.
Incluindo o essencial
Qualquer empresa que você contratar para testes de invasão deve ter um
único ponto de contato. É importante que você possa acessar esse contato a
qualquer momento. O líder de sua equipe de desenvolvimento e o contato na
equipe de testes de invasão devem ser capazes de se comunicar um com o
outro a qualquer momento para interromper os testes, caso haja necessidade.
O contato também deve ter os detalhes completos sobre como, exatamente, os
testes estão ocorrendo, e deve conhecer as especificidades sobre qualquer
problema em potencial que possa ocorrer durante a fase atual de testes.
Você também deve saber se o pentester tem seguro para cobrir qualquer
perda que possa ocorrer durante os testes. O seguro deve incluir o pagamento
pelo tempo gasto na recuperação dos dados, o tempo de inatividade
(downtime) do sistema e qualquer perda em potencial de receita que sua
empresa possa ter.
A equipe de testes também deve demonstrar competência. Você não vai
querer que qualquer pessoa faça testes de invasão em seu sistema. A equipe
definida na proposta também deve ser a equipe que faz os testes propriamente
ditos. Verifique se há certificações como:
• GIAC Certified Incident Handler (GCIH)
• Certified Ethical Hacker (CEH)
• OSSTMM Professional Security Tester (OPST)
Obtendo o relatório
O resultado de qualquer teste de invasão é apresentado na forma de um
relatório. Para garantir que você obtenha um relatório que realmente possa ser
usado, não se esqueça de pedir um relatório de exemplo antes que os testes
comecem. O relatório deve incluir um resumo dos testes, detalhes sobre
qualquer vulnerabilidade, uma avaliação de riscos e detalhes de todas as
ações envolvidas no teste de invasão. O relatório deve conter informações
técnicas suficientes para que você possa realmente corrigir os problemas
encontrados durante os testes, mas deve ser legível pela equipe de gerência
para que você possa negociar o tempo e os recursos necessários para efetuar
as correções.
Juntamente com o relatório, você também deve receber arquivos de log com
todas as ações executadas durante a fase de teste. Os arquivos de log devem
mostrar todos os pacotes enviados e recebidos durante os testes para que você
possa retornar depois e seguir o processo de testes, passo a passo.
A empresa de segurança contratada também deve manter um arquivo do
processo de testes. Você precisa saber como eles planejam manter esse
arquivo. Parte do motivo para verificar o processo de arquivamento é garantir
que seus dados confidenciais permanecerão confidenciais. É importante que o
arquivamento seja feito como parte de um armazenamento offline, e não em
um drive de rede no sistema do fornecedor.
Qualquer API que você criar ou usar como parte de sua aplicação tem o
potencial para criar uma grande variedade de problemas. No entanto, de
modo diferente das bibliotecas, você pode deixar o uso de uma API muito
mais seguro porque uma API executa em seu próprio espaço de
endereçamento e em seu próprio processo. Colocar a API em uma sandbox
ou em um ambiente virtual (essencialmente, em um ambiente protegido)
possibilita:
• controlar precisamente as ações que a API pode executar, os recursos que
ela pode acessar e as maneiras como ela interage com sua aplicação. É
claro que você também pode deixar a API sem recursos ou fazer com que
seja impossível que ela conclua uma tarefa, deixando a sandbox ou o
ambiente virtual restrito demais. Há um equilíbrio que você deve alcançar
entre riscos (à segurança) e a capacidade de realizar tarefas úteis.
• controlar como a aplicação interage com a API. Por exemplo, você
diminuirá a probabilidade de entradas errôneas ou maliciosas provocarem
algum tipo de efeito desastroso. As entradas da aplicação são estritamente
controladas, e entradas não esperadas tendem a ter um efeito reduzido ou
a não ter efeito algum. É claro que esse tipo de proteção também pode
dificultar fazer experimentos com a API ou realizar determinados tipos de
teste.
Este capítulo ajuda você a entender o conceito de uma sandbox/ambiente
virtual para API e determinar exatamente como você pode usar um ou outro
em seu próximo projeto de programação para manter seu código seguro.
Como parte de trabalhar com sandboxes de API, este capítulo também
discute algumas soluções de sandboxing e ambientes virtuais. Nem toda
solução funciona em todas as situações, portanto é uma boa ideia conhecer
algumas delas em potencial.
A última seção deste capítulo discute uma alternativa ao sandboxing: a
virtualização. Apesar de parecer que um ambiente virtual e uma sandbox
sejam essencialmente iguais, pois em grande medida atingem os mesmos
objetivos, na verdade, são tecnologias diferentes; assim, essa última seção
ajuda a entender as diferenças em detalhes. Um ambiente virtualizado tende a
fazer com que, para a API, ela pareça executar em um ambiente totalmente
aberto. No entanto, um ambiente virtualizado é totalmente isolado de tudo o
mais, e a API funciona por meio de um esquema rigoroso de acesso.
Como ocorre com qualquer solução de segurança, usar sandbox de API não é
uma solução para todos os males. Ela não manterá todos os hackers afastados e
não evitará que todas as APIs causem danos à sua aplicação ou aos dados
associados a ela. Usar uma sandbox de API reduz os riscos. Você deve
determinar se a sandbox de API reduz suficientemente os riscos ou se você
precisa de medidas adicionais para manter sua aplicação segura. A segurança não
tem a ver com apenas uma técnica ou uma medida. Um sistema seguro conta
com uma série de camadas de segurança para fazer seu trabalho.
Figura 10.3 – Alguns simuladores oferecem uma boa dose de controle sobre
a interface de testes.
Nesse caso, você também pode selecionar itens como o verbo usado para
criar a chamada. A questão principal é que um simulador oferece um
ambiente em que você fornece uma entrada específica de forma específica e
obtém um resultado específico de volta.
Os simuladores mais sofisticados, como o Apiary (https://apiary.io/),
oferecem uma variedade de serviços para facilitar o processo de simulação.
Você pode usar esse serviço para gerar documentação, integrar exemplos de
código, executar tarefas de depuração e automatizar testes. Naturalmente, à
medida que a complexidade do simulador aumentar, o mesmo acontecerá
com o preço.
Sandboxie (http://www.sandboxie.com/)
Você pode usar o Sandboxie para executar qualquer aplicação no sistema
host, e não apenas os navegadores. Isso quer dizer que você pode utilizar o
Sandboxie para executar todo tipo de tarefas que outras soluções poderiam
não tratar. Como ele executa no sistema do cliente, todos os seus dados
sensíveis permanecem totalmente protegidos contra visualizações. O
fornecedor oferece uma versão trial para você poder testar. Quando optar
por comprar uma licença, você tem a opção de adquirir uma versão home
(uso doméstico) ou small business (para pequenos negócios) ou uma versão
enterprise (corporativa). Somente a versão corporativa tem um pacote para
suporte. O Sandboxie só funciona com o sistema operacional Windows.
Spoon.net (https://spoon.net/browsers)
Às vezes, você precisa testar muitos navegadores diferentes, mas fazer
download e instalar todos eles em seu sistema é difícil. Configurar todos
esses navegadores conforme for necessário também implica passos
adicionais. Você pode evitar toda essa dificuldade acessando o navegador
por meio do ambiente oferecido pelo Spoon.net. Para usar esse produto,
você deve instalar um plugin para seu navegador e então escolher o
navegador que quer usar, como mostra a figura 10.5. As opções de
navegador não estão limitadas àqueles que sua plataforma normalmente
aceitaria. Por exemplo, mesmo que esteja em um sistema Windows, você
poderá carregar o Safari ou o Firefox Mobile para realizar os testes
necessários.
Ambientes virtuais também podem incluir muito mais que uma sandbox
inclui. É possível criar ambientes virtuais com sistemas operacionais
específicos, ferramentas de desenvolvimento, instalações de aplicações e
navegadores. O ambiente virtual emula todas as partes da experiência de
desenvolvimento para que você possa criar uma configuração de servidor
Apache usando um ambiente virtual e uma configuração de servidor IIS
usando outra. Os dois ambientes virtuais podem existir no mesmo
computador sem problemas com conflitos.
Implementando a virtualização
Um dos ambientes de desenvolvimento virtuais mais interessantes é o
Vagrant (https://www.vagrantup.com/). Esse produto em particular executa
em qualquer sistema Windows, OS X ou Linux comum (há versões de Linux
que não funcionam com o Vagrant, portanto não se esqueça de conferir a lista
para ter certeza de que o Vagrant tem suporte para sua distribuição de Linux).
Para usar esse produto, você deve instalá-lo em seu sistema, configurar o tipo
de ambiente que você quer usar para o desenvolvimento e colocar o arquivo
resultante junto com o código de seu projeto. Sempre que quiser iniciar o
ambiente de desenvolvimento necessário a um projeto em particular, basta
executar o comando vagrant up e ele configurará o ambiente correto para você.
O produto criará o mesmo ambiente, não importa para onde você mova os
arquivos do projeto, de modo que você poderá criar um único ambiente para
todos de sua equipe de desenvolvimento usarem. O Vagrant é a melhor opção
para o desenvolvedor individual ou uma empresa de pequeno porte – ele não
é caro e é fácil de usar.
Outro produto útil para ambientes virtuais é o Puppet
(https://puppetlabs.com/). Esse produto depende do VMware
(http://www.vmware.com/) com o Puppet executando as tarefas de
gerenciamento. A combinação de Puppet com o VMware é mais adequada a
ambientes corporativos, pois o VMware vem acompanhado de uma lista
enorme de ferramentas que você pode usar com ele, além de oferecer suporte
para instalações maiores.
Definindo as metas
As metas definem uma condição que uma pessoa ou entidade pretende
atender. Você pode definir todo tipo de metas para testes de aplicação, como
calcular o valor exato de pi em 42 picossegundos. É claro que a meta não é
alcançável porque não é possível calcular um valor exato para pi. Algumas
empresas definem os mesmos tipos de meta para aplicações e ficam
decepcionadas quando se torna óbvio que o processo de testes não atingiu a
meta. Metas verdadeiras são possíveis de serem alcançadas usando recursos
disponíveis no tempo alocado.
Além disso, uma meta deve definir uma medida para o sucesso. Não é só uma
questão de saber se o teste teve sucesso – é preciso saber quão bem-sucedido
foi o teste. Para obter uma resposta para quão bem-sucedido foi o teste, as
metas que você especificar devem estabelecer uma medida que defina um
intervalo de resultados esperado, por exemplo, a aplicação calculou o
resultado correto no tempo alocado em 99% das vezes.
As metas exatas que você define para sua aplicação dependem do que você
espera dela e do tempo que você tem para implementar as metas. Contudo, é
possível generalizar as metas nas seguintes categorias:
Verificação e validação
O processo de verificação e validação trazem as falhas à tona. No entanto,
ela também garante que a aplicação forneça a saída esperada, considerando
entradas específicas. O software deve funcionar conforme definido pela
especificação. Do ponto de vista de segurança, você deve testar o software
tanto para entradas esperadas quanto para entradas não esperadas e conferir
se ele responde corretamente em cada caso.
Abrangência por prioridade
A mais segura das aplicações no mundo teria todas as funções testadas de
todos os modos possíveis. No entanto, no mundo real, restrições de tempo e
de orçamento impossibilitam testar completamente uma aplicação. Para
testar o software do modo mais completo possível, você deve gerar seu
perfil a fim de determinar os pontos em que o software gasta a maior parte
de seu tempo e concentrar seus esforços aí. Contudo, outros fatores entram
em cena. Mesmo que uma funcionalidade não seja usada regularmente,
você ainda precisará lhe conceder uma ampla abrangência se ela não puder
falhar (uma falha teria um resultado catastrófico). A priorização da
abrangência deve incluir fatores que dizem respeito somente à sua
aplicação.
Equilibradas
O processo de testes deve achar um equilíbrio entre requisitos escritos,
limitações do mundo real e expectativas dos usuários. Quando realizar um
teste, você deve verificar se os resultados são repetíveis e independentes de
quem testa. Evitar posturas tendenciosas no processo de testes é essencial.
Também é possível que o conteúdo da especificação e a expectativa dos
usuários não sejam totalmente compatíveis. Falhas de comunicação (ou, às
vezes, sua total ausência) impedem que a especificação inclua totalmente o
ponto de vista do usuário sobre o que a aplicação deve fazer. Como
resultado, talvez você também precise considerar expectativas não
registradas por escrito como parte do processo de testes.
Rastreáveis
A documentação completa do processo de testes é muito importante para
repetir esse processo posteriormente. Ela deve descrever tanto os sucessos
quanto as falhas. Além do mais, deve especificar o que foi testado e como a
equipe de testes fez os testes. A documentação também inclui o testing
harnesses e outras ferramentas que a equipe usou para realizar os testes de
software. Sem um conjunto completo de tudo o que a equipe de testes usou,
é impossível recriar o ambiente de testes posteriormente.
Determinísticas
Os testes que você fizer não devem ser aleatórios. Qualquer teste deve
incluir recursos específicos de software e você deve saber quais são esses
recursos. Além disso, os testes devem mostrar resultados específicos,
considerando o fornecimento de entradas específicas. A equipe de testes
sempre deve saber com antecedência como os testes devem funcionar
exatamente e definir os resultados que eles devem fornecer para que os
erros sejam óbvios.
Testando o desempenho
Muitas pessoas acham que desempenho é o mesmo que velocidade, mas o
desempenho inclui mais que apenas a velocidade. Uma aplicação que seja
rápida, mas executa a tarefa incorretamente, é inútil. Do mesmo modo, uma
aplicação que execute bem uma tarefa, mas disponibiliza a informação que
ela processa a entidades erradas, também é inútil. Para ter um bom
desempenho, uma aplicação deve executar tarefas de modo confiável, seguro
e rápido.
Cada um desses elementos do desempenho influencia os demais. Aumentar a
segurança necessariamente deixará a aplicação mais lenta porque o
desenvolvedor acrescenta mais código para executar verificações de
segurança. De modo semelhante, a confiabilidade deixará a aplicação mais
lenta porque mais verificações são acrescentadas nesse caso também.
Verificações de segurança podem diminuir a confiabilidade da aplicação ao
reduzirem os riscos às custas da funcionalidade – uma aplicação confiável é
aquela que oferece todas as funcionalidades esperadas em todas as
circunstâncias (ela não falha). Em suma, todos os elementos do desempenho
funcionam contra os demais, como mostra a figura 11.1.
Testando a usabilidade
Muitos cenários de testes falham em testar a usabilidade. Determinar a
facilidade com que o usuário pode interagir com o software é essencial, pois
a meta do software é ajudar os usuários a serem mais produtivos (o fato de
esses usuários serem humanos ou máquinas não é importante). Uma interface
confusa ou inútil causa problemas de segurança ao impedir que os usuários
interajam com o software corretamente. O processo de testes deve considerar
as necessidades físicas e emocionais do usuário, além dos passos necessários
para executar uma tarefa. Por exemplo, pedir a um usuário daltônico que
clique no botão vermelho pode não levar ao resultado desejado. Falhar em
diferenciar o botão que não seja pela cor quase certamente causará problemas
de entrada de dados que, em algum momento, resultará em problemas de
segurança.
É fácil se tornar complacente quando executar os passos dos testes. Um usuário
normalmente pode no mínimo contar com entradas pelo teclado e pelo mouse,
portanto é preciso testar ambos. Contudo, os usuários podem ter uma variedade
maior de opções de acesso. Por exemplo, pressionar uma combinação de teclas
com Control pode executar tarefas de forma diferente em relação a simplesmente
usar teclas-padrão, portanto você deve testar esse tipo de entrada também. Não é
essencial testar todo tipo de entrada em todas as situações possíveis, mas você
deve saber se a aplicação é capaz de lidar com os vários tipos de entrada
corretamente.
Um dos problemas que você deve pesquisar como parte dos estágios de
especificação e de design é a disponibilidade de suítes de testes existentes.
Por exemplo, o site test262 do ECMAScript Language
(http://test262.ecmascript.org/) pode oferecer ótimos insights para sua
aplicação.
Considerando a essência de um ataque
É importante entender que muitos ataques não parecem que estão realmente fazendo
algo, pois você não sabe o que o invasor está tentando fazer. Por exemplo, um ataque
ao protocolo TLS (Transport Layer Security) que dependa da criptografia RC4 (Rivest
Cipher 4) pode dar a impressão de que alguém está tentando transformar o sistema em
um zumbi. Se você é um desenvolvedor que está tentando descobrir o que está
acontecendo com a aplicação, deve conhecer o tipo de ataque que está ocorrendo,
portanto deve garantir que haja um profissional de segurança em sua equipe.
Nesse caso, um ataque depende da geração de uma requisição com informações
repetidas, por exemplo, um cookie. Quem envia os dados incluirá esse cookie em todas
as requisições, mas elas serão criptografadas de modo que a informação pareça
diferente. Somente após obter amostras suficientes, será possível quebrar a criptografia
e começar a obter dados do navegador comprometido.
No mínimo dois grupos quebraram o RC4 o suficiente para obter dados de um
navegador usando TLS. A primeira técnica exige algo em torno de duas mil horas,
enquanto a segunda exige apenas 75 horas. Obviamente, a menos que a informação
obtida tenha valor significativo, provavelmente o tempo médio empregado pelo hacker
não compensa. Mesmo assim, o simples fato de as técnicas existirem quer dizer que
você deve pensar sobre o que um ataque está tentando fazer.
A parte mais interessante desse ataque é que os invasores contam com JavaScript para
implementá-lo (é impressionante para uma linguagem que os desenvolvedores
consideravam ser útil apenas para scripting no passado). Os invasores fazem upload do
código no navegador-alvo usando injeção de script ou um ataque man-in-the-middle.
Você pode ler mais sobre esse ataque em particular em
http://www.computerworld.com/article/2948937/security/encrypted-web-and-wi-fi-
atrisk-as-rc4-attacks-become-more-practical.html.
A correção para esse tipo de ataque consiste em usar um cifrador mais moderno como
parte do protocolo TLS. O TLS aceita vários cifradores, incluindo o AES (Advanced
Encryption Standard, ou Padrão de Criptografia Avançada). Para manter sua aplicação
razoavelmente segura, é preciso garantir que o servidor esteja configurado para não
aceitar RC4 como cifrador, exigindo um cifrador mais moderno em seu lugar.
1 N.T.: Referência à antiga prática de levar canários às minas de carvão para saber se tudo
estava bem. Enquanto o canário cantasse, não havia perigo, mas se a ave silenciasse, era
sinal de um possível vazamento de gases tóxicos, permitindo emitir um alerta para que a
mina fosse evacuada.
CAPÍTULO12
Usando empresas terceirizadas de
testes
Testes feitos por terceiros envolvem contratar uma entidade externa para
realizar testes de vários tipos em sua aplicação, incluindo testes de segurança.
O terceiro pode oferecer uma variedade de serviços – alguns bem
abrangentes. É claro que você precisa saber se pode confiar em um terceiro
antes de iniciar qualquer tipo de teste. Depois que os testes começarem é
preciso garantir que o terceiro receba as informações apropriadas de sua
empresa, tenha o nível correto de monitoração e ofereça um nível desejável
de resultados. O terceiro pode realizar testes semelhantes àqueles que você
usa, porém é necessário saber se o nível de habilidade do terceiro é melhor
que o oferecido por sua própria empresa, ou não haverá motivo para contratar
o terceiro.
Há muitas razões para querer contar, pelo menos parcialmente, com testes de
terceiros. O motivo mais comum para contratá-los é o tempo. No entanto,
muitas empresas não têm as habilidades e outros recursos para realizar um
serviço completo de testes de forma apropriada. Às vezes, as empresas
contratam um terceiro para preservar a honestidade dos testadores de
software internos e garantir que eles não deixaram passar nada. Trabalhar
com terceiros é um processo que comumente segue os quatro passos, assim
descritos:
1. Localizar o serviço de testes de terceiros que você quer usar.
2. Criar um plano de testes (usando o terceiro como um recurso) que defina
exatamente como o terceiro testará o software.
3. Implementar o plano de testes após o terceiro ter tido a chance de
comprometer-se com ele.
4. Validar a aplicação com base em relatórios e outros resultados que você
receber do terceiro.
Embora este livro tenha dedicado um período de tempo considerável trabalhando
com aplicações para desktop, navegadores e aplicativos móveis, é importante
lembrar que os princípios descritos aplicam-se a todos os tipos de aplicações
também – algumas das quais quase sempre exigem testes de terceiros. Por
exemplo, as indústrias automobilísticas provavelmente poderiam ter evitado o
recente recall de muitos automóveis conectados se tivessem empregado terceiros
para garantir que o processo de testes tivesse testado completamente todos os
aspectos da conectividade (veja
http://www.computerworld.com/article/2953832/mobile-security/senators-call-
forinvestigation-of-potential-safety-security-threats-from-connectedcars.html). O
fato é que os hackers sabem como invadir esses veículos e o mesmo acontece
com muitos testadores de software terceirizados (consulte
http://www.computerworld.com/article/2954668/telematics/hacker-shows-he-
can-locateunlock-and-remote-start-gm-vehicles.html).
Testadores de software terceirizados também podem verificar tipos robustos de
hacks exóticos que poderão se tornar bem comuns no futuro (consulte
http://www.computerworld.com/article/2954582/security/researchersdevelop-
astonishing-webbased-attack-on-a-computers-dram.html). Embora técnicas
como rowhammering pareçam bem distantes hoje em dia, você pode apostar que
os hackers as empregarão amanhã e que será necessário ter um testador de
software terceirizado habilidoso para garantir que sua instalação não seja
vulnerável a esse tipo de ataque.
Entrevistando o terceiro
A essa altura você sabe exatamente por que quer a ajuda de terceiros, sabe se
achou uma empresa que ofereça os serviços de que você precisa e se a
empresa é legítima. É hora de ter uma discussão com o pessoal da empresa e
determinar se você pode estabelecer um relacionamento profissional com ela.
Essa entrevista não é como uma entrevista para contratar alguém em sua
empresa – você está contratando toda uma empresa para realizar testes em
sua aplicação a fim de garantir que ela seja segura. Isso significa envolver
todos os stakeholders de sua empresa na entrevista e determinar qual é o
melhor candidato para a tarefa. Os stakeholders incluem a gerência, é claro,
mas também desenvolvedores, instrutores, usuários e qualquer um que seja
afetado pela aplicação. A pergunta a que você deve responder é se a empresa
que você está contratando realmente pode realizar os níveis de teste exigidos
para obter uma aplicação utilizável. Se precisar de outros serviços, também
será necessário entrevistar a empresa para saber que tipo de suporte você
pode esperar dela (é aí que os usuários poderiam se sair bem, se a empresa
oferecer suporte para treinamento).
Procurando upgrades
Os registros de problemas (trouble tickets), coletados pela equipe de suporte
como resultado de reclamações de usuários e interrupções do sistema,
normalmente informam o que você precisa saber sobre upgrades para o
código de sua própria aplicação. Se os registros de problemas não
informarem tudo que for preciso, no mínimo oferecerão informações
suficientes para fazer a pesquisa necessária e descobrir exatamente quais
upgrades você deve criar. No entanto, softwares de aplicações de terceiros
são uma questão diferente. A menos que um desenvolvedor ou outra parte
interessada localize uma correção para um problema como resultado de
depuração de código interno, um upgrade poderá permanecer invisível. É
importante procurar upgrades em softwares de terceiros e garantir que você
tenha uma lista completa deles. Caso contrário, não será possível preservar o
estado de segurança de sua aplicação, e o risco desconhecido em potencial
para uma brecha de segurança aumenta. Muitas empresas acabam não
percebendo que deveriam fazer um upgrade.
Alguns terceiros oferecem notificações automáticas para atualizações. O uso de
notificações automáticas é uma maneira de garantir que você tome conhecimento
dos upgrades, mas você não poderá depender delas. Uma notificação informa que
uma atualização está disponível, mas você também deve ser proativo e verificar
se há atualizações sobre as quais não ouviu falar. Mesmo que um fornecedor seja
diligente em oferecer notificações, elas ainda podem se perder ou acabar na pasta
da lixeira.
Implementando as mudanças
A essa altura você já considerou todos os elementos de um upgrade. O ponto
principal em todo esse trabalho é garantir que o upgrade:
• funcione conforme previsto;
• permaneça estável;
• ofereça a segurança apropriada;
• melhore a confiabilidade;
• crie uma ótima interface de usuário;
• sele qualquer brecha de segurança.
O processo de implementação deve começar pelos itens de mais alta
prioridade em sua lista, em vez de tentar implementar tudo de uma só vez.
Um problema que muitas empresas enfrentam é o fato de um upgrade se
tornar muito pesado. Com frequência as mudanças ocorrem, mas à custa de
testes e da garantia de que elas atendam ao conjunto de especificações
definido para elas. Como resultado, o upgrade acaba precisando de um
upgrade. Em algum momento, o código se torna tão macarrônico que
ninguém o compreende totalmente e, com certeza, ninguém poderá garantir a
sua segurança. Você acabará com o tipo de software que os hackers amam
porque é fácil passar por qualquer defesa implementada no software e é mais
fácil ainda ocultar o hack.
1 N.T.: “Em segurança de computadores, uma DMZ ou zona desmilitarizada (do inglês
demilitarized zone), também conhecida como rede de perímetro, é uma sub-rede física ou
lógica que contém e expõe serviços de fronteira externa de uma organização a uma rede
maior e não confiável, normalmente a internet. Quaisquer dispositivos situados nesta
área, isto é, entre a rede confiável (geralmente a rede privada local) e a rede não
confiável (geralmente a internet), está na zona desmilitarizada.” (Fonte:
https://pt.wikipedia.org/wiki/DMZ_(computação).)
CAPÍTULO14
Considerando as opções de update
Figura 14.1 – Quando usar uma API de microsserviços, teste a API também.
É essencial testar os vários microsserviços diretamente para garantir que o
update não mudou o modo como o microsserviço funcionava originalmente.
Entretanto, você deve testar também a API de microsserviços para garantir
que ela continue respondendo corretamente a todos os tipos de plataforma
aceitos pela aplicação. Caso contrário, você não poderá ter certeza de que a
API de microsserviços continuará a oferecer os resultados corretos de forma
segura e confiável.
Proteger seus dados é essencial nos dias de hoje. Muitas empresas aparecem
na primeira página da imprensa especializada ou nas principais mídias de
notícias após cometerem um erro aparentemente pequeno que acaba dando
acesso aos hackers a informações sensíveis. Em muitos casos, a falha está no
uso incorreto de uma fonte interna de dados que uma empresa deveria
proteger diligentemente, disponibilizando-a a pessoas que realmente não
precisam dela. A melhor pergunta que você pode fazer a si mesmo quando
criar um novo relatório é se as pessoas que verão esse relatório realmente
precisam ver os dados que você está disponibilizando.
Monitorando os resultados
O treinamento é um processo de monitoração e ajustes. Você não pode
simplesmente despejar informações nas cabeças das pessoas e esperar que
elas sejam retidas (ao menos, ainda não). O motivo pelo qual as escolas
devem aplicar exames é ajudar o professor a entender as deficiências no
currículo atual e contribuir para fazer ajustes. O mesmo vale para
treinamentos corporativos. Para atingir os melhores resultados, você deve
monitorar o esforço de treinamento e fazer ajustes para permitir acomodar as
diferenças entre as pessoas e suas compreensões sobre o assunto. É claro que
exames relacionados ao trabalho podem assumir muitas formas. Eis algumas
ideias para monitorar a eficiência do treinamento:
Exames escritos
Usar um exame para medir a eficiência do treinamento funciona na sala de
aula até certo ponto, e funciona também no ambiente corporativo. É claro
que algumas pessoas sabem como manipular um exame conforme sua
vontade (sem realmente se tornar competente), enquanto outras pessoas
simplesmente não se dão bem com provas (apesar de serem bem
competentes), portanto essa não deve ser sua única forma de medir o
sucesso.
Testes práticos
Criar um cenário de teste e fazer o funcionário demonstrar o que aprendeu
no treinamento é outra maneira de verificar se os resultados são os
desejados. Muitas vezes, as pessoas que são reprovadas nos exames escritos
se saem muito melhor nos testes práticos. No entanto, o teste prático ainda
tem os mesmos problemas dos exames escritos – algumas pessoas
simplesmente se saem melhor com eles sem realmente ter conhecimento do
material.
Fatores práticos
O treinamento deve gerar um efeito demonstrável na eficiência e na
produtividade geral do local de trabalho. Simplesmente observar como o
treinamento afeta os negócios pode provar que o treinamento funciona. Por
exemplo, uma queda significativa nos erros relacionados à segurança pode
mostrar que o treinamento em segurança está atingindo a meta desejada.
Resultados monitorados
Observar o negócio como um todo pode não informar tudo que você precisa
saber sobre a eficiência do treinamento. Às vezes, você terá que monitorar
áreas específicas do negócio, por exemplo, menor incidência de ataques
bem-sucedidos via email, para saber se o treinamento está funcionando
conforme desejado.
Treinamento cruzado
Ensinar outra pessoa a executar uma tarefa corretamente é um método em
que muitas empresas não pensam para avaliar o sucesso de uma situação de
treinamento. Para treinar outra pessoa, o funcionário deve absorver bem o
conhecimento a ponto de usá-lo com eficiência. Um cenário de treinamento
cruzado mostra que um funcionário realmente entendeu o material e é capaz
de explicá-lo para que outra pessoa entenda.
Um problema sério durante o processo de monitoração é que as pessoas se
sentem ameaçadas e podem se tornar improdutivas. Para começar, parece que
todos sentem essa necessidade de culpar alguém ou algo por uma falha em
atingir uma meta específica de treinamento. No entanto, a falha simplesmente
aponta para a necessidade de treinamento adicional, e não para a necessidade de
culpar alguém (veja o artigo “Defining the Benefits of Failure” (Definindo os
benefícios das falhas, http://blog.johnmuellerbooks.com/2013/04/26/defining-the-
benefits-of-failure/). Uma falha pode ocorrer por outros motivos que não um erro
da parte de alguém. Desperdiçar tempo no jogo de apontar culpados é
improdutivo. É muito melhor encarar o fato de que uma falha ocorreu e oferecer
o treinamento que remediará a situação.
Não foque em deixar suas orientações por escrito cheias de pompa e floreios.
Você precisa é de um guia simples e prático para as políticas da empresa. Os
funcionários não têm nem tempo nem paciência para lidar com um guia cheio
de termos legais ou jargões. Um guia que apresente as orientações de forma
simples e concisa funciona bem melhor. Lembre-se de que a maioria das
pessoas atualmente consegue focar a atenção por bem menos de um minuto,
portanto se seus funcionários não conseguirem encontrar nenhuma resposta
no guia que você escrever em menos de um minuto, eles não o usarão.
Resuma ao máximo as orientações por escrito. Quanto menos inchada a
linguagem usada para transmitir informações importantes sobre segurança,
mais as pessoas prestarão atenção a ela. Deixe tudo conciso e fácil de
lembrar. Além disso, lembre-se de gerar o guia em formato tanto impresso
quanto eletrônico. Fazer isso permite que um funcionário coloque o guia em
um dispositivo alternativo, por exemplo, em um smartphone, para mantê-lo
sempre disponível.
John Mueller é autor freelance e revisor técnico. Ele tem a escrita no sangue e
já escreveu 99 livros e mais de 600 artigos até hoje. Os assuntos variam de
rede à inteligência artificial e de gerenciamento de banco de dados à pura
programação. Alguns de seus livros atuais incluem uma obra sobre Python
para iniciantes, Python para cientistas de dados e um livro sobre MATLAB.
Também escreveu um kit Java para e-learning, um livro sobre
desenvolvimento de HTML5 com JavaScript e outro sobre CSS3. Suas
habilidades para revisão técnica já ajudaram mais de 60 autores a melhorar o
conteúdo de seus manuscritos. John já fez serviços de revisão técnica para as
revistas Data Based Advisor e Coast Compute. Não deixe de ler o blog de
John em http://blog.johnmuellerbooks.com/.
Quando John não está trabalhando no computador, você pode encontrá-lo no
jardim, cortando madeira ou apreciando a natureza em geral. John também
gosta de produzir vinho, assar biscoitos e tricotar. Quando não está ocupado
com mais nada, ele faz sabonetes de glicerina e velas, que são práticos para
cestas de presente. Você pode entrar em contato com John na internet em
[email protected]. John também está criando um site em
http://www.johnmuellerbooks.com/. Sinta-se à vontade para dar uma olhada e
fazer sugestões sobre como ele pode melhorá-lo.
Colofão