O objetivo deste artigo é explicar, de uma forma simples e dinâmica, os principais conceitos de segurança da informação envolvendo seu aspecto defensivo e ofensivo. Além de expor cada um dos princípios, vamos explicar conceitos importantes como Security by Design, Stride e Dread, e entender mais a fundo sobre a importância da aplicação da segurança proativa. Vamos nessa?
Criando segurança com inteligência
Inicialmente, vamos apresentar duas facetas da segurança da informação que são fundamentais para essa leitura: a segurança defensiva e a ofensiva.
Para explicar sobre esses dois métodos, utilizaremos uma analogia: quando uma casa é construída, a construtora tem o dever de fornecer o mapa descritivo da rede elétrica e hidráulica, que vai indicar os pontos de manutenção ou expansão inevitáveis no futuro, correto?
Este é um documento essencial, porque permite que a pessoa proprietária do imóvel possa ter em mãos as informações necessárias para fazer um furo na parede, desentupir um cano ou, até mesmo, construir um novo andar na residência.
Nesse sentido, entendemos que pensar em segurança proativa no design da arquitetura pode ser uma ferramenta poderosa no dia a dia e, por esse motivo, devemos considerar Security by Design como um forte aliado dos times na aplicação das melhores práticas de desenvolvimento seguro.
O que é Security by Design?
A aplicação do Security by Design corresponde a diversos benefícios como economia e eficiência para resolver e corrigir problemas, bem como possibilita sistemas mais seguros conforme as soluções de segurança se adaptam às mudanças no processo de desenvolvimento.
Com isso em mente, a OWASP (Open Project Application Security Project) criou princípios norteadores do Security by Design (SbD), herdando conceitos STRIDE de identificação de riscos e ameaças e de DREAD para classificação das ameaças.
Princípios do Security by Design
Agora que você já teve uma boa introdução sobre o tema, vamos conhecer os princípios do Security by Design:
1. Minimizar superfícies de ataque
Significa restringir as funções que um perfil pode acessar, em outras palavras, corresponde a identificação de vulnerabilidades e vetores de ataque no aspecto digital (sites, softwares, servidores e etc.) ou físico (dispositivos, armazenamento e etc.) que um agente mal intencionado poderia utilizar.
Nesse sentido, as organizações devem elaborar meios e técnicas para reduzir essas superfícies, como: mecanismos de controle de acesso, restrições de perfil, protocolos de segurança para acesso remoto e outros.
2. Estabelecer Padrões de Segurança
É atribuir padrões elevados de segurança em desenvolvimento. Por isso, a padronização é um importante fator para elaborar segurança de forma inteligente, pois ela possibilita que sejam criadas soluções mais eficientes, confiáveis e até econômicas.
Dessa forma, adotar padrões mais rígidos de segurança garantem aplicações mais seguras e suscetíveis a melhorias contínuas.
3. Adotar o princípio do mínimo privilégio
Aqui é o caso de fornecer acesso às pessoas usuárias apenas aos privilégios estritamente necessários. A ideia é receber autorização para dispor de privilégios somente para executar determinada atividade.
Nesse caso, é importante dar atenção às permissões solicitadas para acessar um serviço, não compartilhar informações sensíveis e configurar protocolos de gestão de privacidade são exemplos de ações relacionadas a este princípio.
4. Defesa em profundidade
Acrescentar camadas de segurança em todos os níveis de uma aplicação, ao invés de criar apenas camadas primárias de validação de inputs ou regras de negócio, por exemplo, garantem a aplicação da defesa em profundidade. Portanto, as squads devem implementar diversas camadas de segurança.
5. Falhar com segurança
As falhas não devem comprometer a segurança ou expor informações críticas. Seguindo a ideia de falhar seguro e falhar rápido, as mensagens de falhas e erros devem ser apresentadas o mais cedo possível e evitar que isso ocorra em momentos cruciais, além de filtrar com cuidado as informações expostas em um log de erro, por exemplo.
6. Não confiar em serviços
Sim, deve-se considerar serviços de terceiros como ameaças em potencial até uma validação profunda. Todo serviço terceirizado deve ser considerado inseguro como regra, uma vez que pode conter vetores de ataque ou mesmo propósitos maléficos em si, comprometendo a segurança da aplicação.
Dessa forma, todo serviço deve ser validado conforme rígidos padrões de segurança.
7. Separar funções
Refere-se ao nível de acesso e privilégios de users, que jamais devem quebrar os grupamentos definidos por devs, garantindo amplo controle de acessos e manutenção de privilégios. As funções devem executar ações específicas, evitando um aumento desnecessário da sua complexidade.
8. Evitar segurança por obscuridade
Soluções fortes de segurança devem ser adotadas, afinal ocultar falhas de segurança não é uma tratativa aceitável. Em outras palavras, a segurança deve ser facilmente identificada e interpretada por users, evitando uma complexidade muito maior do que a necessária.
9. Mantenha segurança simples
Arquiteturas muito complexas podem deixar as aplicações muito mais suscetíveis a erros. Seguindo raciocínio semelhante aos princípios 7 e 8, quanto maior é a complexidade de um sistema, mais detalhes e falhas de segurança poderão passar despercebidos, ou seja, complexidade excessiva resulta em uma aplicação muito menos segura.
10. Manutenção e correção segura de problemas
A gestão de vulnerabilidades deve ser aplicada como forma de identificar e mapear as vulnerabilidades, bem como seus riscos e formas de mitigação. Além disso, adotar estratégias de melhoria contínua são excelentes práticas para um desenvolvimento mais seguro.
Segurança defensiva x ofensiva
Agora vamos imaginar que a construtora não entregou esse mapa descritivo da rede elétrica e hidráulica, qual seria o impacto se houvesse a necessidade de realizar alguma manutenção ou expansão no local? Pois é, um problemão, não é?!
Podemos então imaginar que o mapa descritivo da rede elétrica e hidráulica seja uma forma preventiva de evitar um risco para a pessoa que irá morar na residência, já que acarreta uma enorme perda financeira quebrar paredes para descobrir que um cano de água ou um condutor elétrico está no caminho.
Desta forma, então, voltando ao que entendemos por entregar uma segurança defensiva, ela se aplicaria ao documento de mapa descritivo da rede elétrica e hidráulica. A construtora entrega um ‘scan’ da casa e assegura que existem pontos de manutenção, registros de água, caixa elétrica, etc. e permite que a casa seja habitada no padrão aderente às normas vigentes (HABITE-SE).
Ao contrário disto, a ausência do mapa descritivo acarreta em uma segurança ofensiva, pois a construtora não forneceu o documento e o município não irá certificar o imóvel e, pior, haverá o custo altíssimo de quebrar o que está pronto para identificar onde estão os condutores de rede elétrica e da rede hidráulica.
Isso é o que ocorre em segurança quando aplicamos agentes que são defensivos e preventivos dentro das aplicações. Tanto no sentido de ‘construir junto com a pessoa usuária’, quanto no de ajustar adequadamente ainda na edificação.
O resultado é um custo muito baixo e qualidade na entrega, assegurando que os riscos críticos e altos estão identificados e corrigidos, levando valor para a solução como um todo.
Caso essa etapa não esteja planejada no desenvolvimento de sistemas, será necessário utilizar da técnica de segurança ofensiva para identificar onde está a vulnerabilidade no código.
Geralmente, esse tipo de ação acontece em razão de eventos não desejados, como incidente de segurança em produção ou por um órgão certificador que realize alguma auditoria dentro dos ambientes e constate que a aplicação não tem evidências de testes de segurança.
Quer saber mais sobre Security by design? Então ouça esse episódio do Zupcast exclusivo sobre o tema:
Conclusão
Vale ressaltar a importância da entidade Application Security na difusão desses princípios por meio de treinamentos e no convívio com os times de desenvolvimento. Compreender e adotar os princípios do DREAD, STRIDE e Security by Design são aspectos fundamentais para escalar segurança em qualquer projeto e organização, uma vez que construir segurança com inteligência é papel do AppSec e uma responsabilidade de todo mundo.
Portanto, é válido reconhecer que os princípios da segurança devem nortear a segurança proativa dentro do ciclo de desenvolvimento e do dia a dia de toda equipe de desenvolvimento de sistemas.
Gostou desse conteúdo? Ele é um dos assuntos que zuppers que fazem parte do nosso programa de Security Champions tem acesso. Esperamos que seja útil para você também!
Acompanhe a nossa central de conteúdos para conferir as novidades sobre segurança da informação e outros temas ligados ao universo tech.