A proteção de uma API é um dos pontos mais cruciais a serem considerados em praticamente qualquer desenvolvimento de software.
Atualmente, as APIs representam o método mais eficiente para integrar seu aplicativo a outros sistemas. Elas servem como uma porta de entrada para sua aplicação, portanto, a segurança das APIs precisa ser robusta para evitar acessos indesejados.
Vamos explorar algumas vulnerabilidades em APIs que podem representar um risco para sua aplicação.
Vulnerabilidades Comuns em APIs
#1. Cross-Site Scripting (XSS)
Ataques XSS são frequentes em aplicações web e também podem ocorrer por meio de APIs caso os dados recebidos do usuário não sejam devidamente tratados. Invasores podem executar scripts maliciosos no servidor e obter acesso a dados confidenciais.
#2. Violação de Limitação de Taxa
A exploração da limitação de taxa de uma API pode dar a invasores a oportunidade de sobrecarregar seu servidor com uma quantidade excessiva de requisições. Isso pode causar a paralisação do servidor, impedindo que sua base de clientes acesse seus serviços.
#3. Autenticação Inadequada
Se a configuração da API não utilizar um método de autenticação confiável, qualquer pessoa poderá acessar seu sistema pela API. A autorização também é essencial, pois define quem pode acessar quais recursos da API, e por quanto tempo.
#4. Transmissão de Dados Insegura
Os dados transmitidos aos usuários da sua API devem ser criptografados durante o tráfego. Caso contrário, há risco de vazamento de dados por invasores que utilizam ataques do tipo “man-in-the-middle”. Portanto, é vital usar protocolos seguros, como HTTPS, para transferir dados.
#5. Dependências Obsoletas/Desatualizadas
As APIs dependem de várias bibliotecas externas para realizar tarefas complexas e transferir parte da lógica. Se essas dependências possuírem vulnerabilidades, sua API também estará vulnerável. É imprescindível manter as versões das dependências sempre atualizadas.
Agora que você está ciente das vulnerabilidades, vamos analisar algumas práticas recomendadas para proteger sua API.
Leia também: Melhores alternativas ao Postman para testes de API para desenvolvedores
Segurança de API – Melhores Práticas
Versionamento de API
Manter suas APIs atualizadas e monitoradas regularmente, com dependências recentes, é vital pois essas dependências podem conter falhas de segurança graves. Você pode informar seus usuários sobre as atualizações da API através do lançamento de versões de correção, seguindo o versionamento semântico.
Manter sua API atualizada é o mínimo que você pode fazer para evitar exploração por invasores.
Autenticação
Existem várias formas de autenticar um usuário da API. A mais básica é utilizar o método usuário/senha, mas essa abordagem depende da robustez da senha.
Outra opção é o uso de chaves de API, nas quais cada usuário recebe uma chave única para acesso.
A autenticação JWT transforma as credenciais do usuário em um token assinado digitalmente, que é enviado ao usuário e reenviado ao servidor em cada requisição para validação. Tokens JWT também possuem prazo de validade.
O OAuth é uma solução eficaz, permitindo acesso de terceiros à API utilizando credenciais de login já existentes. Por exemplo, ao já estar logado no Google, um aplicativo pode usar essas credenciais para acessar sua conta, sem necessitar de uma senha. Sua conta do Google passa a servir como senha.
Autorização
Autorização é diferente de autenticação. Enquanto a autenticação identifica o usuário, a autorização define o que o usuário autenticado pode acessar na API.
Por exemplo, um professor pode acessar dados de todos os alunos, enquanto um aluno individual só pode acessar seus próprios dados. Ambos estão autenticados no mesmo sistema, mas estão autorizados a realizar ações diferentes.
Garantir que a autorização da API funcione corretamente impede o acesso não autorizado a um recurso.
Redação de Dados
A redação de dados é a prática de exibir seletivamente informações aos usuários, protegendo dados confidenciais. A autorização adequada leva a uma melhor redação de dados. Regulamentações de privacidade de dados, como o GDPR, também dependem da redação de dados. Informações pessoais ou confidenciais não devem ser acessíveis a terceiros não autorizados.
A redação de dados pode ser implementada usando um middleware ou um gerenciador de gateway.
Criptografia
Essa é uma medida de segurança essencial nos dias atuais. A criptografia é crucial para dados confidenciais. O mínimo é usar o protocolo HTTPS, que utiliza TLS (Transport Layer Security) e SSL (Secure Socket Layer).
A criptografia ponta a ponta é outra forma de proteger dados em trânsito. Os dados armazenados em bancos de dados também devem ser criptografados, prevenindo acesso mesmo em caso de invasão do banco de dados.
Tratamento de Erros
Mensagens de erro detalhadas podem revelar informações sobre a infraestrutura do aplicativo a invasores. Para evitar isso, mantenha as mensagens de erro genéricas e implemente um tratamento de erros personalizado. As mensagens de erro não devem registrar informações confidenciais do sistema.
Validação de Entrada e Limpeza de Dados
A validação de entrada é crucial ao trabalhar com APIs, pois a entrada de dados é desconhecida até ser enviada pelo usuário.
A limpeza de dados remove códigos executáveis indesejados. Um invasor pode inserir um script JavaScript que, se não for limpo, pode ser executado e extrair dados.
A falta de limpeza de dados pode levar a ataques do tipo Cross-Site Scripting (XSS).
Sistemas de Detecção de Intrusão
Também conhecidos como IDS, os Sistemas de Detecção de Intrusão auxiliam no monitoramento do tráfego de rede direcionado à API. Eles detectam comportamentos incomuns, registram e alertam as autoridades competentes.
Existem dois tipos: sistemas baseados em rede, distribuídos em vários pontos para monitorar o tráfego, e sistemas baseados em host, instalados em um único servidor.
Esses sistemas são cruciais para identificar tentativas de acesso à rede antes que ocorra qualquer dano aos dados.
Lista de Permissões de IP
A lista de permissões de IP restringe o acesso à API e à rede a endereços IP específicos. Essa técnica pode ser inviável para APIs públicas, devido à complexidade de listar todos os IPs.
É útil em cenários onde se sabe que apenas um grupo seleto de sistemas acessará a API.
JSON Web Tokens
JWTs são usados para autenticar um usuário, enviando um token assinado digitalmente, criado a partir de suas credenciais. Eles ocultam as credenciais reais e dispensam o armazenamento de credenciais no banco de dados ou no lado do usuário.
O JWT é dividido em três partes: cabeçalho, payload e assinatura. O payload contém as credenciais do usuário, o cabeçalho pode conter informações como o algoritmo usado e a assinatura é criada pelo servidor e cliente em cada solicitação.
Os JWTs possuem prazos de validade, após os quais um novo token é gerado e enviado ao usuário.
Registro e Monitoramento
O monitoramento do tráfego da API pode ser benéfico para detectar visitantes indesejados. É possível monitorar todas as solicitações, mas é fundamental que os registros não contenham dados confidenciais.
Limitação de Taxa
Se uma API não implementar limitação de taxa, ela fica vulnerável a ataques DDoS devido ao fluxo excessivo de tráfego. Invasores podem sobrecarregar o sistema com inúmeras solicitações, causando a paralisação do servidor.
A limitação de taxa previne ataques de negação de serviço, restringindo o fluxo de tráfego da API.
Dependências Seguras
Vulnerabilidades podem surgir tanto do código da API quanto de suas dependências. É essencial monitorar e verificar regularmente as dependências, identificando possíveis vulnerabilidades.
É recomendável automatizar verificações e atualizações de dependências, especialmente se houver uma versão de correção que resolva a vulnerabilidade. Também é importante usar dependências que sejam mais seguras e ofereçam atualizações de segurança frequentes.
Os cabeçalhos de segurança devem ser incluídos na resposta da API para informar o navegador sobre a segurança e como ele deve agir. Alguns cabeçalhos importantes são:
- Cache-Control: Definir como no-store para evitar armazenamento de informações sensíveis no navegador.
- Política de Segurança de Conteúdo: Definir frame-ancestors como ‘none’ para evitar o enquadramento das respostas da API em um iframe.
- Content-Type: Essencial para evitar que o navegador tente adivinhar o tipo de resposta, o que pode levar a ataques. Para respostas JSON, use application/json.
- X-Content-Type-Options: Definir como nosniff para que o navegador use o Content-Type informado e não adivinhe o tipo MIME da resposta.
Padrões e Estruturas de Segurança
Projete sua API com o suporte de estruturas e padrões de segurança predefinidos para garantir a conformidade com as considerações de segurança mais recentes.
Expiração do Token
Ao usar tokens portadores, o tempo de expiração deve ser curto, pois força a reautenticação do usuário, o que é positivo. Em JWTs, geralmente existem dois tokens: de acesso (curta duração) e de atualização (longa duração). Em ambos os casos, os tokens devem ter prazos de validade.
Firewall de Aplicações Web
Um WAF (Web Application Firewall) é um gateway que monitora, filtra e bloqueia tráfego de rede malicioso. É um ótimo recurso para prevenir ataques que utilizam o protocolo HTTP.
Usando Gateways de API
Para simplificar a segurança da API e gerenciar rotas e acessos, gateways de API são uma excelente opção. Eles também fornecem ferramentas de monitoramento, registro e análise, facilitando o monitoramento da API.
Confiança Zero
A estratégia de confiança zero tem como premissa não confiar em nenhuma fonte centralizada. A segurança deve ser dividida em camadas e implementada em vários pontos de verificação.
Essencialmente, ninguém é confiável, nem mesmo os desenvolvedores da API. Cada ponto de acesso deve ser monitorado e analisado para evitar brechas de segurança.
A automação é muito útil nesses casos. Use ferramentas automatizadas para monitorar e bloquear atividades incomuns ou suspeitas regularmente.
Considerações Finais
A proteção das APIs é um processo contínuo. Sempre haverá brechas que podem ser exploradas, as chamadas vulnerabilidades de dia zero. Portanto, para proteger suas APIs, é essencial mantê-las atualizadas com os padrões de segurança mais recentes.
Explore também as melhores ferramentas para testes dinâmicos de segurança de aplicativos.