Segurança
Categorias

17 Dicas de Segurança Para Seu Projeto

Não se passa uma semana sem que alguma notícia de falha de segurança apareça nos noticiários: são senhas vazadas, dados pessoais comprometidos e até cartões de crédito ameaçados.

Engenheiros de computação, especialistas de segurança, hackers e autoridades são unânimes em afirmar que é impossível proteger o seu sistema com 100% de certeza. Mas também são unânimes em afirmar que a maioria das falhas surgem dos erros mais simples.

Para aumentar a segurança do seu código e do seu projeto, trazemos 17 dicas que evitarão que você se arrependa amargamente mais tarde.

1) Teste a entrada de dados com rigor

Invasores  precisam de um ponto de acesso para seu sistema e o caminho mais fácil costuma ser através de portas que seu próprio código deixa abertas. Se o seu programa ou site recebe dados da Internet, alguém com certeza irá tentar forçar a entrada.

A solução é testar o tamanho e a estrutura dos dados que chegam e nunca, jamais, confiar na pessoa do outro lado da internet. Campos de formulário podem ser justamente aquela porta de entrada que o invasor precisa.

De uma forma geral, programadores querem oferecer mais flexibilidade e menos restrições. Checar cada bit dos dados consome tempo de resposta do programa e energia do desenvolvedor. Linguagens de transporte de dados como XML e JSON não fazem muita coisa para se certificar que os dados não estejam comprometidos. Mas, realizar esta checagem constantemente é uma função do programador se ele quiser mesmo garantir a segurança do seu código.

2) Armazene apenas o que você necessita e nem um único bit a mais

Antes de pedir ao seu usuário pelo seu endereço físico, pergunte a si mesmo se você vai enviar alguma coisa fisicamente a ele pelos Correios algum dia. Se apenas o endereço de email é suficiente, você deve reavaliar se dados como “endereço residencial” ou “endereço de trabalho” são realmente necessários para sua aplicação. Este tipo de informação exige tempo para ser processada, ocupa espaço em disco e torna seu banco de dados mais atraente para ladrões de informação.

Programadores ocasionalmente pensam como acumuladores obsessivos, armazenando cópias de tudo que um dia possa ter alguma utilidade. Este comportamento pode ser prático na hora de debugar um problema, mas deixa um rastro de dados tentador

Cada coluna e tabela no banco de dados é absolutamente necessária? Em caso de dúvida, reduza o tamanho dos formulários e diminua as tabelas. Evite a tentação de ser um colecionador de dados.

3) Evite confiar em senhas em demasia

Senhas não são esta maravilha de segurança. Há problemas demais com elas, incluindo usuários que insistem em usar palavras manjadas. Algumas empresas já estão usando outras formas de autenticação, como N-Factor ou dispositivos de hardware específicos que armazenam chaves criptográficas. Outros sites mantém registros dos endereços IP que você usa para fazer login, enviando uma mensagem de alerta se o sistema detecta um IP diferente do habitual.

Tais soluções costumam ser dispendiosas demais para serem empregadas em todos os cenários. Mas é importante ter em mente que não é mais possível confiar apenas em uma string de caracteres, independente do comprimento ou mistura.

4) Negocie requisitos

Escrever um código seguro não é algo que acontece apenas dentro do editor. Muitas decisões equivocadas acontecem fora da alçada do programador. Quando gerentes especificam requerimentos e os discutem com os desenvolvedores, todos devem considerar seriamente como cada requisição poderia abrir as portas para um problema de segurança mais à frente.

Uma funcionalidade parece muito interessante no papel, mas irá forçar o sistema a manter mais dados sensíveis em uma posição vulnerável?  Será que esta funcionalidade adiciona benefícios que compensem o aumento no nível de segurança necessário? O momento certo para começar a proteger o seu projeto contra brechas futuras é quando o documento de requisitos ainda está flexível e os usuários ainda não estão ansiosos pelas funcionalidades que você já prometeu.

5) Adicione intervalos ao seu código

Muitos ataques são baseados em força bruta. Pode demorar trilhões de iterações para funcionar, mas o computador não se importa. Alguns programas invadem bancos de dados enviando milhões de consultas, outros tentam bilhões de senhas possíveis até que a correta seja encontrada.

O truque aqui é adicionar progressivamente intervalos maiores para atrasar estes programas automáticos. Você deseja que seu sistema seja rápido o bastante para atender seres humanos mas lento demais para que robôs invasores consigam realizar alguma coisa ainda neste século.

Alguns sistemas de login dobram o intervalo permitido entre cada tentativa incorreta de acesso. Alguns bancos de dados limitam o número de consultas por endereço IP. Outros sistemas deliberadamente pedem uma resposta por email para atrasar robôs. Humanos não percebem o segundo extra ou mesmo 30 segundos, dependendo do sistema. Mas um robô perderá sua vantagem competitiva e será atrasado até se tornar ineficiente.

6) Abuse da encriptação

Encriptação é frequentemente pouco usada porque adiciona mais uma etapa de processamento e torna o debug muito mais complicado. Dependendo da complexidade do sistema, encontrar um erro nele pode ser bastante difícil, mas, com encriptação isso se torna uma tarefa de analisar exaustivamente uma pilha incompreensível de caracteres.

Mas aquilo que é incompreensível para seu criador é ainda mais incompreensível para quem está do lado de fora. Encriptando dados pessoais antes mesmo de armazená-los é peça fundamental em sua estratégia de segurança.

7) Erga Muralhas

Segurança frequentemente compete com a demanda pela facilidade de uso. Usuários odeiam ter que se logar em diferentes pontos do sistema, mas pode ser perigoso ligar tudo a um único portal. Não há uma resposta certa para o quão fácil um sistema deve ser para o usuário navegar antes da segurança ser comprometida, afinal, quanto mais fácil para usuários legítimos, mais fácil para potenciais invasores.

Mas seria de bom tom segregar as operações mais arriscadas para um sistema separado e solicitar que os usuários façam login novamente quando desejarem usar esta parte do sistema. Um banco pode dar ao seu portal a habilidade de conferir seu saldo ou depositar dinheiro mas deve exigir um nível de autenticação extra antes que quantias sejam sacadas ou transferidas.

8) Use Bibliotecas testadas

Encriptação é algo muito complicado de se fazer corretamente e mesmo o melhor código feito após extensiva análise pode conter falhas e brechas. É considerado um erro tentar reinventar uma biblioteca bem testada que já exista, mas esta verdade é ainda mais dramática quando se trata de encriptação. Bibliotecas que resistiram ao teste do tempo em diversos ambientes são mais importantes neste campo do que em outros!

Escolha a melhor solução neste caso e não tente inventar seus próprios algoritmos.

9) Use APIs internas

Quebrar o seu código em módulos e implementar a comunicação através de APIs bem desenvolvidas é uma antiga lição que todos deveriam aprender em suas carreiras. É uma lição ainda mais valiosa quando se trata de segurança porque APIs podem tornar mais simples o processo de auditar iterações, encontrar brechas e corrigir problemas. Módulos podem ser analisados individualmente e os resultados podem ser combinados.

Dentro deste mesmo conceito, também é recomendável criar submódulos. Partes são mais fáceis de serem visualizadas do que o todo.

10) Traga auditores de fora para testar o sistema

Se uma empresa está mesmo determinada a construir um sistema seguro, deveria estar investindo também em uma auditoria externa. Estes especialistas podem identificar vulnerabilidades e fornecer sugestões que quem está envolvido diariamente com o código pode ter deixado escapar.

De uma forma geral, quanto mais olhos em cima de um código, maiores as chances de visualizar problemas antes que eles aconteçam. Pessoas de fora também podem passar por cima de políticas internas e quebrar protocolos. É raro que estes especialistas conheçam mais do sistema que seus próprios criadores, mas eles estão mais focados na identificação de falhas e tem a vantagem de não estarem afiliados a nenhuma facção interna da empresa.

11) Utilize analisadores de código

Programas de análise de código estão longe da perfeição e não são tão inteligentes quanto um ser humano, mas, mesmo assim, valem a pena. Afinal, eles são metódicos, nunca se cansam, ou dispersam suas atenções.

Analisadores de código podem localizar erros comuns que todos nós cometemos mesmo sem perceber. Muitos desses erros podem não ter nada a ver com segurança, mas alguns podem ser cruciais para uma invasão.

12) Limite privilégios

Desenvolvedores são bons em pensar no futuro e dar a alguém todo o acesso que pode um dia ser necessário é uma forma de prevenir algumas dores de cabeça depois. Embora estas portas abertas possam ser úteis em desbaratar futuros problemas, estas mesmas portas abertas, como vimos na primeiríssima dica, costumam ser a rota mais direta para uma invasão. A norma é oferecer ao código e aos envolvidos apenas a menor quantidade de privilégio necessária para que a tarefa seja feita.

Se esta norma se tornar uma fonte de dor de cabeça para a gerência devido à grande quantidade de solicitações por mais acesso, talvez seja melhor repensar a arquitetura dos dados. Você está segurando informação demais? Se as pessoas e aplicações estão solicitando mais privilégios do que você se sente confortável em liberar, talvez você esteja armazenando informação demais.

13) Modele sua ameaça

Seu sistema armazena números de cartão de crédito? Então um ladrão pode estar atrás de suas informações. Seu sistema rastreia a localização de pessoas através de seus celulares? O tipo de ameaça é ainda pior.

Gastar um tempo pensando em quem desejaria seus dados e por que motivo pode ser um bom ponto de partida para se estabelecer uma estratégia de segurança. Se você consegue imaginar a ameaça, você pode manter o tipo de atacante em mente enquanto desenha e implementa o sistema. Este modelo é o oposto de um caso de uso, aquele que se deseja evitar.

É importante observar que nenhuma lista ou modelo será perfeito. E apenas porque uma ameaça não possa ser imaginada tampouco significa que ela não exista.

14) Confiança é uma via de mão dupla

É fácil suspeitar daqueles que tentam acessar seu site ou sistema, mas lembre-se de que eles também deveriam suspeitar de você! Será que o seu site é mesmo o banco onde eles tem conta, ou será um site de phishing tentando roubar tudo o que eles tem?

Alguns sites estão investindo em formas de provar ao usuário que eles são quem dizem que são. Eles solicitam que seus clientes façam upload de uma foto ou grupo de palavras que o site pode exibir depois para provar que tem estas informações armazenadas. Esta é uma forma de deixar o outro lado mais confiante da segurança.

15) Mantenha-se informado sobre as últimas ameaças

Seguir os principais sites da indústria de segurança e de informática é absolutamente essencial. Felizmente, o Código Fonte é um destes portais que costuma cobrir falhas de segurança com frequência. Bons artigos podem mostrar o que outros fizeram de errado e dar um indício de como pensam e agem os invasores.

Compreender o que aconteceu no passado é uma excelente forma de planejar o futuro quando uma ameaça similar for atrás do seu sistema com os mesmos métodos. Um atacante similar que também pode estar lendo os mesmos artigos para tirar suas ideias… Uma vez que as táticas são reveladas, é uma questão de quem será mais rápido: um novo invasor em replicá-las ou um defensor em se precaver.

16) Pesquise sempre

A imprensa convencional oferece apenas a primeira lição sobre como não cometer erros. O aprendizado mais profundo vem depois, através de livros e artigos científicos escritos por pesquisadores, depois que eles tiveram tempo para analisar o problema em profundidade. Estas fontes geralmente trazem novas regras e métodos para evitar aquele problema no futuro.

Invistir algum tempo e dinheiro em livros pode ser uma alternativa bastante barata para se obter conhecimento de consultores de alto níveis. Um livro importado que custe R$400 ou R$500 pode parecer um preço exorbitante, mas é pouco se comparado com consultores que cobram por hora ou, pior, com o prejuízo derivado de uma brecha de segurança.

17) Nunca pare de aprender

Aprimore-se sempre. O campo da computação evolui a passos largos a cada ano e o segmento de segurança pode ficar obsoleto em meses, semanas.

Algumas informações são recentes demais até para terem sido publicadas em livros e velocidade de aprendizado pode ser a diferença entre a segurança e o vazamento de um banco de dados. Mesmo que você já se considere atualizado sobre as últimas descobertas, pode ser essencial manter essa informação fresca na mente ou podem aparecer dicas novas que você ainda não conheça. Participe de seminários, eduque sua equipe, realize cursos online, frequente fóruns.