Neste artigo veremos alguns dos maiores riscos à segurança de aplicações web e como evitar que estes riscos se concretizem, apresentando alguns princípios arquiteturais genéricos e algumas soluções técnicas específicas a cada tipo de risco.
Para que serve:
A informação é um ativo que, assim como muitos outros ativos de negócio, é essencial para o funcionamento de uma organização, e consequentemente precisa ser adequadamente protegida. A preocupação com a segurança da informação durante o desenvolvimento de sistemas visa, em última instância, à proteção dos ativos da organização objetivando a competitividade, continuidade do negócio e até a imagem comercial da organização.
Em que situação o tema útil:
As organizações e os seus sistemas da informação se deparam com ameaças à segurança a partir de várias fontes, incluindo fraude computacional, espionagem, sabotagem, vandalismo, incêndios ou enchentes. Alguns tipos de ataques estão se tornando extremamente sofisticados e cada vez mais comuns, portanto é imprescindível que a cultura de desenvolvimento de aplicações seguras se dissemine pelas organizações, contando sempre com o preparo daqueles responsáveis pela sua arquitetura.
Segurança em Aplicações Java:
O artigo apresenta um breve conceito do que é a segurança da informação e algumas práticas de arquitetura de software para minimizar o risco do surgimento de vulnerabilidades e pontos de falhas. Com um viés bastante técnico, discutimos alguns dos riscos mais comuns à segurança de aplicações web e propomos soluções para evitar que atacantes tenham sucesso ao investir tempo e recursos contra a sua organização.
A Segurança da Informação (SI), segundo definida pela ISO/IEC 27002, é a proteção da informação de uma grande variedade de ameaças com o objetivo de garantir a continuidade do negócio e minimizar os seus riscos, ao mesmo tempo em que maximiza o retorno do investimento e as oportunidades de negócio.
Apesar de começarmos esse artigo com uma definição técnica, não temos a intenção de entrar profundamente nos conceitos e variações da SI como, por exemplo, diferenciar Segurança Computacional, Segurança da Tecnologia da Informação ou Proteção da Informação. Nosso objetivo será, a partir de uma abordagem pragmática, apresentar as vulnerabilidades mais comuns que afetam os sistemas computacionais da atualidade e propor algumas contramedidas para aumentar a segurança de nossas aplicações.
A riqueza do assunto de segurança em aplicações Java é enorme, tanto pelas vulnerabilidades que surgem por falhas no desenvolvimento ou quaisquer outras razões, quanto pelas possíveis soluções para cada tipo de ataque existente. O maior propósito deste artigo é despertar o interesse do leitor para esse aspecto por muitas vezes negligenciado no desenvolvimento. Apresentaremos tanto as armadilhas mais comuns quanto algumas recomendações de como evitar cair nelas, tudo com um enfoque exclusivo nas aplicações web.
Neste artigo vamos discutir algumas práticas genéricas que direta ou indiretamente levam à produção de aplicações mais seguras, e em seguida estudaremos os três maiores riscos de aplicações web conforme levantado pelo grupo do OWASP (veja o quadro “OWASP”).
Segurança em Camadas (Defense in Depth)
A Segurança em Camadas é uma estratégia de defesa de sistemas computacionais proposta pela NSA (National Security Agency) que visa à construção de várias camadas de proteção para isolar os possíveis atacantes daquilo que se quer proteger. Esse é um dos conceitos mais importantes da Segurança da Informação e deve-se tê-lo sempre em mente ao montar a arquitetura de um sistema, pois de nada adiantaria colocar um firewall de última geração, ter um antivírus atualizado, fazer a validação de dados no front end e back end de sua aplicação e, ao mesmo tempo, manter uma senha de acesso ao banco de dados armazenada sem criptografia.
Não existe um sistema 100% seguro. A melhor abordagem então é uma combinação de fatores para dificultar o acesso do atacante ao seu alvo, tornando o objetivo dele tão custoso que não valha a pena para ele. Se você fortalece e protege o seu sistema, o atacante irá procurar um alvo mais fácil.
Um exemplo de Segurança em Camadas pode ser visto na Figura 1. Claro que é possível adicionar ou diminuir algumas destas camadas. Tudo vai depender da relação de valor daquilo que se quer proteger versus o custo para instalar e manter esta proteção.
Figura 1. Exemplo de Segurança em Camadas.
A Segurança em Camadas extrapola o lado tecnológico e computacional, abrangendo também as Pessoas e os Processos. Veja a seção Links ao final do artigo para ter mais informações sobre esse conceito.
Segundo a própria definição do grupo o OWASP “é uma organização não governamental e sem fins lucrativos que se dedica a melhorar a segurança das aplicações”. É um repositório de informações relacionadas à Segurança da Informação, contendo artigos, apresentações, pesquisas, vídeos e muito mais com o objetivo de dar condições às organizações de conceber, desenvolver, adquirir, operar e manter aplicações confiáveis.
Além desse repositório de informações o grupo oferece a oportunidade de criar projetos voltados à Segurança da Informação que contribuam de alguma maneira com a comunidade de Tecnologia da Informação. Basta para isso tornar-se membro – gratuitamente – do OWASP e participar de um projeto ou iniciar o seu próprio, submetendo-o à aprovação do Comitê Global de Projetos. Várias ferramentas estão disponíveis lá e para várias linguagens de programação de Java a .NET, de PHP a Python.
Anualmente o grupo apresenta um artigo com a lista dos 10 maiores riscos à segurança em aplicações web. Essa é uma lista que traz também recomendações de como evitar as falhas que levam à concretização do risco, por isso o OWASP faz questão de frisar que busca atingir a comunidade de desenvolvedores e não apenas a comunidade de segurança de aplicações. A lista divulgada em abril/2010 aponta as seguintes vulnerabilidades:
- Injection;
- Cross-Site Scripting (XSS);
- Broken Authentication and Session Management;
- Insecure Direct Object References;
- Cross-Site Request Forgery (CSRF);
- Security Misconfiguration;
- Insecure Cryptographic Storage;
- Failure to Restrict URL Access;
- Insufficient Transport Layer Protection;
- Unvalidated Redirects and Forwards.
Perceba que falamos de uma lista com os maiores riscos à segurança e não das maiores falhas. É um enfoque diferenciado, pois visa conscientizar a comunidade sobre a necessidade de fazer a avaliação dos riscos inerentes às aplicações. O artigo sugere também um modelo simples de quantificação do risco, que seria uma maneira estruturada para definir o tamanho do investimento a ser feito no processo de construção de software para atingir o nível satisfatório de segurança.
Princípios de Arquitetura (Design Principles)
Sabemos que mesmo em sistemas projetados tendo a Segurança da Informação como um objetivo formal, falhas de arquitetura ou de implementação acabam abrindo vulnerabilidades que um atacante com tempo e determinação suficientes acabará encontrando e explorando. Em um artigo da década de 70 – isso mesmo, da década de 70 do século passado – Saltzer e Schroeder já haviam mapeado a dificuldade de construir um sistema à prova de acessos indevidos, porém propõem uma abordagem consistente para atingir níveis adequados de proteção.
Essa abordagem é independente de linguagem de programação ou arquitetura e pode ser encaixada em praticamente qualquer metodologia de desenvolvimento, pois se baseia em uma coleção de princípios e boas práticas a serem seguidas na especificação e desenvolvimento dos sistemas. Um destes princípios é a Segurança em Camadas, apresentada anteriormente. Listamos abaixo algumas outras que julgamos imprescindíveis, mas recorra aos links do final do artigo para encontrar a proposta original de Saltzer e Schroeder ou a lista de princípios proposta pelo OWASP:
...