Baixe o app para aproveitar ainda mais
Prévia do material em texto
Arquitetura Segura de Software Introdução Quando tentamos solucionar um problema, é possível identificar diversas soluções que poderiam ser utilizadas visando resolvê-lo. Contudo, outros fatores como custo e eficiência influenciam na escolha da solução a ser adotada. No contexto do desenvolvimento de software, o mesmo pode ser observado ao se analisar os requisitos visando à construção de um software: várias soluções computacionais podem ser definidas para atender a esses requisitos, mas uma análise deve ser feita para definir a mais adequada ao contexto de desenvolvimento da aplicação. Para se representar essas soluções, a arquitetura de software é uma das abordagens que podem ser usadas. Com isso, para se obter a arquitetura (solução) mais adequada para atender aos requisitos do software (problema), uma avaliação dessa estrutura deve ser realizada. A arquitetura, portanto, consiste em um modelo de alto nível que possibilita um entendimento e uma análise mais fácil do software a ser desenvolvido. O uso de arquitetura para representar soluções de software foi incentivado principalmente por duas tendências: o reconhecimento por parte dos projetistas de que o uso de abstrações facilita a visualização e o entendimento de certas propriedades do software; a exploração cada vez maior de frameworks visando diminuir o esforço de construção de produtos através da integração de partes previamente desenvolvidas. Uma outra propriedade da arquitetura é a possibilidade de usá-la como ferramenta para comunicar a solução projetada às diversas partes interessadas que participam do processo de desenvolvimento do software. Contudo, para que essa comunicação seja possível, a arquitetura deve ser representada através de um documento conhecido como documento arquitetural. Para se construir a arquitetura de um software, e por consequência o documento arquitetural que a representa, os requisitos são as principais informações usadas. Durante o processo de especificação arquitetural, além dos requisitos, outras fontes de conhecimento podem ser utilizadas para definir os elementos arquiteturais e a forma como eles devem estar organizados. Entre essas fontes de conhecimento se destacam principalmente a experiência do arquiteto, o raciocínio sobre os requisitos e os estilos e princípios arquiteturais. Dentre os objetivos e desafios da fase de elaboração da arquitetura de software estão: Garantir o alinhamento técnico do projeto às diretrizes e estratégias tecnológicas da organização, bem como à sua cultura; Atender as restrições gerenciais de um projeto tais como custo, prazo e competências técnicas da equipe; Identificar e detalhar requisitos significativos para a arquitetura de software; Antecipar e mitigar os riscos técnicos de um projeto; Construir provas de conceito e gerar código executável para os principais pontos de risco do projeto; Orientar e acompanhar o time técnico para garantir a aderência do código construído às diretrizes arquiteturais do projeto; Validar a estabilidade e objetivos da arquitetura do produto; Coletar lições aprendidas e promover um novo ciclo de melhorias; Manter a rastreabilidade entre os resquisitos, as definições arquiteturais e o código construído. Vale a pena destacar o último objetivo pois consiste em garantir a rastreabilidade entre o que foi especificado pelo Analista de Requisitos, o que está sendo projetado pelo Arquiteto e ainda pelo que será codificado pelo desenvolvedor. Esta rastreabilidade facilita uma análise dos controles de segurança que serão adotados no software. Por meio dela é possível saber que determinada função implementada no software está aderente ao padrão arquitetural adotado e que este padrão atende aos requisitos de segurança. O objetivo do ciclo de desenvolvimento seguro de software é garantir que o produto final de software tenha o nível de segurança adequado, levando em consideração o ambiente em que será executado. Para isso, é muito importante executar atividades de segurança durante a definição da arquitetura. As atividades de segurança conduzidas na fase de Requisitos produziram a categorização de segurança do sistema, os requisitos especificados (inclusive os de segurança) e os diagramas de caso de abuso. Na fase de Análise e Projeto, temos que definir orientações técnicas para auxiliar o Arquiteto de Segurança. Dois guias são fundamentais: Definição dos frameworks de segurança recomendados; e Uma lista de princípios de arquitetura segura. A definição de uma arquitetura segura inicia-se pela Análise da Superfície de Ataque, onde o Arquiteto de segurança verifica os pontos de entrada que podem ser utilizados para fins maliciosos no software. Depois disso, deve ser feita uma Modelagem de Ameaças para entender a que ameaças o sistema está exposto e quais são os riscos dessas ameaças. Por fim a Arquitetura Segura do software é definida com todos os controles de segurança que deverão ser implementados. 1 Frameworks de segurança " Framework é um conjunto de classes que colaboram para realizar uma responsabilidade para um domínio de um subsistema da aplicação" 1 . Um framework define parâmetros de projeto, a forma como é realizada a divisão em classes e objetos e suas responsabilidades, a maneira como colaboram entre si e o fluxo de controle, ditando, assim, a arquitetura de software das aplicações que os utilizam. Além disso, fornece padrões de projetos - estruturas essenciais para o desenvolvimento de projetos de aplicações de software - uma espinha dorsal e o continente para os componentes criados nas aplicações e que irão funcionar dentro delas. Os principais objetivos dos frameworks e das metodologias de desenvolvimento baseadas em componentes são a reutilização de softwares, a padronização de desenvolvimento, a difusão do entendimento comum entre equipes de desenvolvimento, entre outros. Os frameworks permitem que as aplicações sejam desenvolvidas mais rapidamente e mais facilmente, além de contribuir para a qualidade do produto final. Por meio dos frameworks os desenvolvedores contam com estruturas bem definidas, revisadas por outras pessoas e melhoradas constantemente. Portanto, os desenvolvedores podem se beneficiar com o uso dos frameworks quando escolhem utilizá-los para resolver alguma função de codificação em vez de criar do zero. Do ponto de vista da segurança do software, os frameworks podem ajudar o desenvolvedor no sentido de fornecer funções de segurança, como: autenticação/autorização; validação/codificação de dados; tratamento de erros; logs; detecção de intrusão; criptografia. Existem algumas bibliotecas livres que exercem este papel muito bem. Para o desenvolvimento em plataforma .NET, a biblioteca de proteção web da Microsoft (Web Protection Library) fornece funções para proteger a aplicação de ataques Cross Site Scripting (XSS) e SQL Injection. Os ataques serão explicados nos módulos mais adiante. A biblioteca de segurança mais atual e completa hoje é a ESAPI (Enterprise Security API), mantida pela comunidade OWASP (explicada no Módulo 1). A ESAPI é complexa e exige um bom esforço para dominá-la, mas existem muitas pessoas contribuindo para a melhoria da documentação da ESAPI de forma a facilitar sua adoção.No SERPRO recomendamos o uso desta biblioteca e dedicaremos uma parte do nosso curso para explicá-la com mais detalhes. Uma boa referência para implementação da ESAPI está disponível no portal da COGSI . Outro framework de segurança é o Apache Shiro, voltado para aplicações JAVA. Apesar de ser mais simplesde usar e entender do que a ESAPI, ele cobre parte das funções de segurança (autenticação, autorização, gerenciamento de sessões e criptografia) e deixa de fora funções muito importantes, como a validação e codificação de entradas/saídas. Além da ESAPI, que é a biblioteca recomendada e mais abrangente, existem outros frameworks para atender controles de segurança específicos, conforme mostra a tabela 3.1. Tabela 3.1 Nome Descrição Desenvolvedor Spring Security Segurança para Spring Acegi Security System AntiSamy Sanitização de rich HTML OWASP CSRFGuard Proteção de Cross Site Request Forgery (CSRF) OWASP Java Simplified Encryption Libray Para criptografia Jasypt Bibliotecas da Bouncy Castle Para criptografia Java e C# Bouncy Castle JSReg Expressões regulares Google Java HTML Sanitizer JAVA Google Javascript Sandboxing Para Javacript Google XHP Para PHP Facebook Django Security Para Python com Django SD Elements Podemos ver que a lista de frameworks é bem extensa. É importante que os Arquitetos de Segurança contribuam na especificação dos componentes recomendados para a empresa, inclusive sugerindo melhorias corporativas desses frameworks. Outra tarefa essencial é disponibilizar ao desenvolvedor toda documentação e orientação de uso dos frameworks de segurança. 2 Princípios de arquitetura segura Durante a elaboração da arquitetura do software temos que balancear os objetivos como o custo, a performance, a manutenibilidade , a segurança, etc. É provável que um sistema completamente seguro apresente baixa performance. O objetivo é projetar um sistema que seja seguro enquanto tenha uma boa performance e confiança. Os hackers tecnicamente competentes geralmente encontram um modo de burlar o sistema, tendo em vista o tempo e os recursos empregados que costumam ser suficientes para atingir seus propósitos. A proteção da informação armazenada em um sistema deve ser projetada durante a fase de arquitetura do sistema. É importante que os princípios de segurança sejam observados. Privilégios mínimos: qualquer entidade (usuário, processo, etc.) deve receber os privilégios mínimos e os recursos durante o menor tempo possível para cumprir uma tarefa. Esta abordagem evita que uma entidade receba permissões que elas não precisam ter, reduzindo a oportunidade de acesso não autorizado às informações sigilosas. Defesa em profundidade: consiste na aplicação de múltiplas camadas de proteção para que uma camada bloqueie um ataque se a camada anterior foi transposta. Separação de responsabilidades: este princípio orienta que devem ser atendidas múltiplas condições para completar uma determinada tarefa sensível ou acessar uma informação sigilosa. Por exemplo, determinada transação será aceita somente com a assinatura de mais de um indivíduo. Arquitetura aberta: há uma discussão no mérito e nível de segurança de projetos que são mantidos em segredo contra os que são abertos para a comunidade avaliar e contribuir. Um bom exemplo é a criptografia. Alguns defendem que os algoritmos mantidos em segredo são mais difíceis de quebrar que um algoritmo público. Outros defendem que a força de um algoritmo de criptografia reside somente na chave. Para a maioria dos casos, um projeto aberto que foi avaliado e testado por muitos experts, provavelmente deve possuir uma segurança maior do que aqueles que não foram largamente acessados e testados. A segurança desses sistemas não deve se concentrar apenas na forma como trabalham (algoritmo), mas deve-se garantir o sigilo e manutenção 1 das chaves. Falha segura: este princípio significa que caso ocorra uma falha no sistema ele deve retornar a um estado onde a segurança não seja comprometida. Uma implementação desta ideia seria fazer com que o sistema passe para um estado padrão onde os usuários e processos não podem acessar o sistema. Uma regra complementar é assegurar que o sistema seja recuperado para um estado seguro. Nos casos onde a recuperação é feita manualmente, o sistema em falha deve restringir o acesso somente ao administrador e deixar que os usuários acessem somente depois de restabelecer os controles de segurança. Economia de mecanismos: defende que o projeto ou a implementação dos controles de segurança seja simples e compreensível. Isto evita que o sistema apresente corvert channels 2 . Carga de trabalho : o custo de um controle de segurança necessário para diminuir um risco deve ser comparado com o custo da perda da informação resultante de um ataque que explora a vulnerabilidade associada à este risco. Elo mais fraco: como no ditado que diz "uma corrente é tão forte quanto o seu elo mais fraco", a segurança da informação é tão boa quanto o seu componente mais frágil. Portanto, é importante identificar o mecanismo mais fraco em uma arquitetura e fortalecê-lo para que os riscos ao sistema sejam mitigados até o nível aceitável. Evitar segurança por obscuridade : este princípio é a generalização do princípio de arquitetura aberta. Ele defende que a segurança não deve ser obtida pelo desconhecimento de como o sistema funciona, mas sim por um controle de segurança bem implementado (um desafio/resposta, certificado digital, etc.) Isolamento de entidades não confiáveis: consiste em isolar as entidades ou os processos não confiáveis para que o comportamento deles não afete o funcionamento esperado do sistema ou consiga acesso a áreas restritas. Este princípio pode ser obtido por meio de sandboxing, máquinas virtuais, módulos de processamento confiáveis e configurações do controle de acesso. A tabela 3.2 agrupa os princípios de segurança em 3 objetivos gerais: Tabela 3.2 1. Minimizar o número de alvos de alta consequência 2. Não expor componentes vulneráveis 3. Negar ataques que venham a comprometer o sistema privilégios mínimos manter arquivos de configuração do sistemaseparados da aplicação simplificar o design separação de trabalhos isolamento de entidades não confiáveis manter todos os autores responsabilizados minimizar o número de pontos de entradas/saída evitar problemas de temporização, sincronização e sequenciamento assumir que os dados do ambiente não são confiáveis falha segura usar somente interfaces seguras para os recursos do ambiente funções do servidor nunca devem confiar em dados originados pelo cliente 3 Análise da superfície de ataque Os pontos de entrada e saída de uma aplicação que são acessíveis aos usuários e atacantes são referenciados como a superfície de ataque da aplicação. O objetivo é analisar e reduzir a superfície de ataques de uma aplicação. Os pontos de entrada são as interfaces, serviços, protocolos, códigos, etc. Os pontos de saída consistem nas mensagens produzidas pela aplicação, relatório, respostas a uma interação, etc. Esses pontos de entrada/saída devem estar acessíveis somente aos usuários que possuam o nível adequado de confiança. Michael Howard mostra em seu artigo "Fending Off Future Attacks by Reducing Attack Surface" que é possível calcular a "atacabilidade", a probabilidade de um sistema ser atacado ou a exposição da aplicação a ataques, mas não necessariamente a vulnerabilidade. Esta é uma ideia muito importante a respeito da superfície de ataque. Uma aplicação com superfície de ataque muito grande implica em sua exposição ser alta e, consequentemente, um aumento em sua probabilidade de ser atacada. Porém, isso não quer dizer que a aplicação necessariamente esteja vulnerável a esses ataques. Para analisar a superfície de ataque de uma aplicação é necessário identificar as funcionalidades ou os pontos de entrada e saída que são passíveisde serem atacados. Esses pontos podem ser chamados de vetores de ataques. Em uma arquitetura é importante identificarmos todos esses vetores para que sejam aplicados controles de segurança quando necessário. Para cada projeto de software é necessário criar uma visão simplificada da arquitetura geral. Esta visão deve ter como base os artefatos do projeto já produzidos (especificação de requisitos, modelos de análise, etc). É importante cobrir todos os módulos do sistema, mas a granularidade da visão geral da arquitetura deve ser decidida de acordo com o tamanho e complexidade do sistema. O desafio é obter uma visão simples da arquitetura e ao mesmo tempo com todas as informações relevantes das interfaces do sistema. A partir da visão simplificada da arquitetura devemos analisar cada componente em termos de acessibilidade das interfaces. Esta análise envolve verificar se cada interface pode ser acessada por usuários autorizados, usuários anônimos ou por papéis específicos da aplicação. Os componentes que fornecem a interface também devem ser considerados no contexto da visão geral da arquitetura para que seja possível identificar delegações de função ou dados que passam de um componente a outro. Neste momento podemos agrupar as interfaces e componentes com perfis de acesso semelhantes. O conjunto dessas interfaces e componentes formam a superfície de ataque da aplicação. Com base nos grupos de interfaces e componentes da superfície de ataque, é importante verificar a segurança das interfaces. Essa análise deve ser conduzida por alguém experiente na área de segurança, pode ser um Arquiteto de Segurança ou um consultor externo. Uma forma de verificar a segurança das interfaces e componentes é atribuir pesos de acordo com a probabilidade de ser atacada e impacto ao sistema caso o ataque ocorra nesses locais. Para identificar a probabilidade do ataque podemos verificar o nível de acesso necessário para se "chegar" a determinada função do sistema. O nível de acesso pode variar tanto pelas permissões necessárias quanto pela sua exposição. A figura 3.2 mostra que quanto maior a permissão de acesso e quanto mais exposto está o sistema, maior a superfície de ataque. O eixo X representa as permissões necessárias para acessar determinada interface, componente ou função do sistema. Um acesso administrativo diminui a probabilidade de que um ataque ocorra através do recurso que está sendo analisado. O eixo Y representa a exposição de determinada interface, componente ou função do sistema. Um componente que é acessado somente em seu escopo local, ou seja, somente por outros componentes da própria aplicação, tem menos probabilidade de ser explorado do que uma interface pública que pode ser acessada por requisições de fora da aplicação. Por fim, é importante destacar que a análise da superfície de ataque deve ser atualizada sempre que houver mudanças nas interfaces ou componentes do sistema durante a fase de Análise e Projeto. 4 Modelagem de ameaças Uma ameaça pode ser definida como "um ator, agente, circunstância ou evento que tem potencial para causar prejuízos a um sistema ou a seus dados e recursos." Uma ameaça pode ser categorizada por sua intenção: não intencional; intencional, mas não maliciosa; e maliciosa (que necessariamente é intencional). Todas as ameaças, independentemente da categoria, são capazes de comprometer o software, porém somente as ameaças maliciosas são realizadas por meio de um ataque. A maioria dos ataques contra softwares se aproveitam de (ou exploram) alguma vulnerabilidade ou falha no sistema. Fazer a modelagem de um software é uma forma de visualizar as interações do sistema dentro do ambiente em que será executado. Quanto mais a modelagem refletir o ambiente operacional em que o software irá operar, mais útil será para a análise de segurança. Esta análise de segurança consiste em incorporar as ameaças nos documentos de modelagem. Daí a definição de modelagem de ameças: "uma metodologia para avaliar e documentar os pontos fracos ou riscos de segurança de uma aplicação". A modelagem de ameaças ajuda a equipe de projeto a identificar os componentes de maior risco, analisando o sistema sobre a perspectiva de um atacante que tem o objetivo de comprometer o sistema. Existem muitas sistemáticas e ferramentas para apoiar a modelagem de ameaças de um software. As vantagens de usar ferramentas em vez de fazer um processo manual são: a modelagem e análise manual tendem a consumir muito mais tempo; quando o software a ser analisado é muito grande, a probabilidade de erros na análise é maior; por meio da ferramenta é possível gerar novas ameaças quando alguma alteração é feita no ambiente da aplicação; a ferramenta auxilia o processo de gerar diferentes visualizações do sistema e suas ameaças; todos os requisitos de segurança do software são centralizados na base de dados da ferramenta, auxiliando na rastreabilidade e entendimento dos controles de segurança. A tabela 3.3 mostra algumas sistemáticas que podem auxiliar uma equipe na tarefa de modelagem de ameaças. Essas sistemáticas podem servir também como um guia de referência para elaborar uma sistemática própria do SERPRO. Tabela 3.3 Application Threat Modeling - Microsoft http://msdn.microsoft.com/en- us/security/aa570413.aspx Calculative Threat Modeling Methodology http://www.ptatechnologies.com/ Trike http://www.octotrike.org/ Consultative Object Risk Analysis System (CORAS) http://coras.sourceforge.net Threat Modeling based on Attacking Path (T-MAP) http://sunset.usc.edu/csse/research/COTS_Security/ A sistemática descrita na dissertação de doutorado de Yue Chen (SOFTWARE SECURITY ECONOMICS AND THREAT MODELING BASED ON ATTACK PATH ANALYSIS) mostra como quantificar as ameaças de segurança pelo cálculo do peso dado à severidade de caminhos de ataques relevantes aos softwares de prateleira (commercial off the shelf). Esta metodologia leva em consideração as prioridades das partes interessadas e o ambiente operacional de TI. Outra característica da sistemática apresentada por Yue Chen é permitir a rastreabilidade entre os objetivos de negócio, as ameaças de segurança e seus respectivos controles. A Microsoft possui uma sistemática própria bastante popular, que tem evoluído ao longo do tempo. Em sua primeira versão, a modelagem de ameaças da Microsoft usava 6 categorias gerais de ameaças. Enganação ou Imitação (Spoffing): tentativa de oter acesso a um sistema usando uma identidade falsa. Isto pode ser realizado usando uma credencial falsa ou roubada. Depois que o atacante ganhou acesso como um usuário ou máquina legítima, ele pode tentar a elevação de privilégios ou o abuso de funções. Falsificação (Tampering): modificação não autorizada de dados, como, por exemplo, o tráfego que passa na rede entre dois computadores. Repúdio (Repudiation): habilidade de um usuário (legítimo ou não) de negar que tenha realizado uma ação ou transação. Sem a adequada auditoria, o não repúdio é difícil de ser obtido. Divulgação de Informação (Information Disclosure): divulgação não autorizada de informações privadas. Por exemplo, um usuário visualiza o conteúdo de uma tabela ou arquivo que ele não tem permissão de abrir ou monitora os dados que passam em claro pela rede. Algumas vulnerabilidades de vazamento de informações incluem: campos escondidos em código HTML; comentários embutidos no código que revelam informações sobre conexão com o banco ou até mesmo senhas; tratamento de exceções mal-implementado que revela informações do sistema para o cliente; etc. Negaçãode Serviço (Denial of Service): processo de deixar a aplicação ou um sistema indisponível. Este ataque pode ser conseguido pelo "bombardeamento" de requisições para consumir todos os recursos do sistema ou submeter uma entrada maliciosa que causa a parada total do sistema (crash). Elevação de Privilégios (Elevation of Privileges): ocorre quando um usuário com privilégios limitados assume a identidade de um usuário com mais privilégios. Por exemplo, um atacante com privilégio restrito poderia elevar seu privilégio para comprometer ou tomar controle de uma conta ou processo de privilégio mais alto. Essas categorias são chamadas de STRIDE, que vem do termo em inglês, conforme mostra a tabela 3.4. Tabela 3.4 Ameaça Princípio de Segurança Definição Spoofing Autenticação Personalização de algo ou alguém Tampering Integridade Alteração de código ou de dados Repudiation Não repúdio Alegar não ter realizado determinada ação Information Disclosure Confidencialidade Expor informações a alguém que não tenha permissão Denial of Service Disponibilidade Negar ou degradar o serviço aos usuários Elevation of Privilege Autorização Ganhar permissões ou capacidades sem a devida autorização Para complementar o STRIDE, uma metodologia de cálculo dos riscos chamada DREAD foi criada: Damage potential (potencial de dano): Quão alto é o dano se a vulnerabilidade for explorada? Reproducibility (facilidade de reprodução): Quão fácil é reproduzir o ataque? Exploitability (facilidade de exploração): Quão fácil é executar o ataque? Affected users (usuários afetados): Qual é a estimativa de usuários afetados (em porcentagem)? Discoverability (facilidade de descobrimeto): Quão fácil é descobrir a vulnerabilidade? Podemos notar alguns pontos fracos na primeira versão da metodologia de modelagem de ameaças da Microsoft: (i) o STRIDE e DREAD são subjetivos e precisam ser aplicados por pessoas com conhecimento em segurança para serem efetivos; (ii) são focados em ataques em vez de ter o foco em ameaças. Por conta disso, a Microsoft evoluiu a metodologia para um processo mais simples e compreensível. A nova versão da metodologia ficou mais amigável para os desenvolvedores, arquitetos e outras partes interessadas que não são especialistas em segurança. Os guias de uso da metodologia e as ferramentas de apoio podem ser acessados em: http://www.microsoft.com/security/sdl/adopt/threatmodeling.aspx http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=2955 5 Arquitetura segura A última atividade de segurança da fase de Análise e Projeto é documentar a Arquitetura Segura do software. Nesta atividade, o Arquiteto de Segurança identificará os controles para cada ameaça levantada na modelagem de ameaças. O arquiteto pode obter auxílio de listas de verificação contendo controles de segurança divididos em categorias específicas. Um bom documento da OWASP que foi traduzido para português é o ASVS. No Módulo 01 apresentamos o ASVS como Application Security Verification Standard (ASVS). Este documento descreve quatro níveis de segurança que podem ser atribuídos a uma aplicação web e, para cada um dos níveis, os requisitos arquiteturais que devem ser atendidos. Nossa atenção será na parte dos requisitos arquiteturais do documento chamados de requisitos de verificação. As tabelas a seguir representam alguns requisitos de verificação do ASVS. Tabela 3.5 Requisitos de Verificação da Arquitetura de Segurança (V1) Requisitos de Verificação Nível 1A Nível 1B Nível 2A Nível 2B Nível 3 Nível 4 V1.1: Identificar todos os componentes da aplicação (tanto individuais como grupos de códigos-fonte, bibliotecas e/ou executáveis). x x x x x x V1.2: Definir ou checar a existência de uma arquitetura de alto nível para a aplicação. x x x x V1.3: Identificar as interconexões lógicas entre componentes da aplicação, grupos de componentes e sistemas externos. x x V1.4: Verificar que na definição da arquitetura da aplicação os aspectos de segurança foram documentados. x x V1.5: Verificar a integridade de códigos interpretados, bibliotecas, executáveis e arquivos de configuração, utilizando checksums ou hashes. x Observe que para cada requisito de verificação o documento associa em qual nível de segurança cada requisito deve ser atendido. Por exemplo, para as aplicações menos críticas (de nível 1) basta atender o requisito de verificação V1.1. Por outro lado uma aplicação crítica (nível 4) deve atender todos os requisitos de verificação (V1.1 ao V.1.5) no caso acima. O ASVS define 4 níveis de verificação de segurança, onde o rigor e a cobertura das verificações aumentam a cada nível. O Nível 1 consiste na verificação automática, sendo dividido em análise de vulnerabilidades e análise de código. O Nível 2 consiste na verificação manual e é dividida em testes de invasão e revisão de código. O Nível 3 consiste na verificação da arquitetura e o Nível 4 na verificação interna da aplicação (incluindo todas as bibliotecas utilizadas). O ASVS agrupa os requisitos de verificação em 14 categorias ao todo: V1. Arquitetura de Segurança V2. Autenticação V3. Gerenciamento de Sessões V4. Controle de Acesso V5. Validação de Entradas V6. Codificação/Escape de saídas V7. Criptografia V8. Tratamento de Erros e Logs V9. Proteção de Dados V10. Segurança da Comunicação V11. Segurança do HTTP V12. Configuração da Segurança V13. Investigação de Códigos Maliciosos V14. Segurança Interna Tabela 3.6 - Requisitos de Verificação do Controle de Acesso (V4) Requisitos de Verificação Nível 1A Nível 1B Nível 2A Nível 2B Nível 3 Nível 4 V4.1: Verificar que os usuários podem acessar somente URLs nas quais eles possuem autorização específica. x x x x x V4.2: Verificar que os usuários podem acessar somente arquivos para os quais eles possuem autorização específica. x x x x x V4.3: Verificar que a navegação pelos diretórios está desabilitada, a menos que explicitamente desejada. x x x x V4.4: Verificar que os usuários podem acessar somente funções protegidas para as quais eles possuem autorização específica. x x x x x x V4.5: Verificar que os usuários podem acessar somente serviços para os quais eles possuem autorização específica. x x x x V4.6: Verificar que os usuários podem acessar somente dados para os quais eles possuem autorização específica. x x x x V4.7: Verificar que os controles de acesso falham de forma segura (princípio do fail safe). x x x x V4.8: Verificar que as decisões de controle de acesso são registradas (logs), inclusive as decisões de falha de acesso. x x x V4.9: Verificar que as mesmas regras de controle de acesso aplicadas pela camada de apresentação são executadas no lado servidor. x x x x V4.10: Verificar que toda informação usada pelos controles de acesso não pode ser manipulada pelos usuários finais, a menos que especificamente autorizado. x x x x V4.11: Verificar que referências diretas a objetos são protegidas, tal que somente objetos autorizados são acessíveis para cada usuário. x x x x x V4.12: Verificar que para cada tipo de recurso x x x protegido, existe um controle de segurança único que é usado para proteger aquele tipo de recurso. V4.13: Verificar que todos os controles de acesso são executados do lado servidor. x x x x V4.14: Verificar que todos os códigos que implementam ouusam controles de acesso não são afetados por nenhum código malicioso. x V4.15: Verificar que as regras de negócio que limitam o controle de acesso (por exemplo, limite de transações diárias) não são burladas. x x x x A tabela 3.6 é outro exemplo de requisitos de verificação definidos no ASVS. Estes são específicos para o controle de acesso da aplicação. Esse tipo de checklist contendo controles de segurança divididos em categorias específicas podem auxiliar o Arquiteto de Software na atividade de Gerenciar os Riscos Arquiteturais . Um checklist deve ser customizado pela organização para atender os princípios de arquitetura segura respeitando os padrões arquiteturais da empresa. Como o SERPRO possui diversos clientes, cada um com requisitos muito específicos, é possível haver um checklist geral e outros específicos para determinados clientes. Outra tarefa importante é definir a prioridade de cada controle e selecionar os frameworks de segurança que serão adotados. A prioridade deve ter como base a probabilidade e impacto da ameaça a que a interface ou componente da aplicação estão expostos (atividade realizada na modelagem de ameaças). A tabela 3.7 representa a estrutura geral de um checklist, composto pelo grupo, descrição do item e prioridade de adoção do requisito, sendo esta última definida para cada aplicação. Tabela 3.7 ID Grupo Descrição Prioridade 1 Registro de Auditoria Aplicação apta a receber auditorias de segurança. 2 Controle de Acesso A autorização controlada tanto nas telas quanto nas chamadas às regras de negócio. 3 Banco de Dados A base de dados do sistema acessada para alteração de estruturas (DDL), o que será realizado apenas por um usuário administrador do banco de dados, e não por usuários da aplicação. 4 Controle de Acesso Antirrobô na Autenticação 5 Tráfego de dados Certificação de que as informações transmitidas não são alteradas acidental ou maliciosamente em nenhum ponto de seu trajeto entre um emissor e um receptor. 6 Controle de Acesso Credenciais de acesso ao sistema individuais para cada usuário (CPF ou um Código Especial). 7 Não repúdio Não Repúdio, garantia, através de criptografia, de que um emissor não pode negar que enviou uma mensagem que foi recebida por um receptor. 8 Controle de Sessão O sistema expira a sessão do usuário por inatividade, configurável para a aplicação. 9 Infraestrutura Balaceamento de Carga na Aplicação 10 Modelo Arquitetural Acesso à camada de negócio protegida ... ... ... Para cada aplicação que será construída, é necessário que um checklist deste seja respondido. A próxima fase do ciclo de desenvolvimento seguro, a fase de codificação, deve atender às especificações de arquitetura. A figura 3.3 resume as atividades da fase de Análise e Projeto ligadas à segurança da aplicação a ser construída.
Compartilhar