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
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.
Artigo original de codigofonte.uol.com.br