Pergunta

Ao projetar uma API REST ou serviço existem melhores práticas estabelecidas para lidar com segurança (Autenticação, Autorização, Gerenciamento de Identidade) ?

Quando a construção de uma API SOAP você tem WS-Security como um guia e tanto a literatura existe sobre o tema.Eu tenho encontrado menos informações sobre como proteger o RESTO de pontos de extremidade.

Embora eu entenda RESTO intencionalmente não tem especificações análogo ao WS-* eu estou esperando as melhores práticas recomendadas ou padrões surgiram.

Qualquer discussão ou links para documentos relevantes seria muito apreciado.Se isso importa, estaríamos usando WCF com POX/JSON serializado mensagens para a nossa API REST do/Serviços criados usando v3.5 do .NET Framework.

Foi útil?

Solução

Como tweakt disse, o Amazon S3 é um bom modelo para se trabalhar.Seu pedido de assinaturas têm algumas características (como a incorporação de um carimbo de data / hora) que ajudam a proteger contra ambos acidental e malicioso pedido de repetição.

A coisa agradável sobre HTTP Básica é que praticamente todos os HTTP bibliotecas de suporte.Você vai, naturalmente, precisa exigir SSL, neste caso, porque o envio de senhas de texto sem formatação sobre a rede é quase universalmente uma coisa ruim.Basic é preferível a Digest ao utilizar o SSL, porque mesmo se o chamador já sabe que são necessárias credenciais, Digerir requer uma viagem extra para trocar o nonce valor.Com o Basic, o que os chamadores simplesmente envia as credenciais do primeiro tempo.

Uma vez que a identidade do cliente é estabelecida, a autorização é realmente apenas um problema de implementação.No entanto, você pode delegar a autorização para algum outro componente com uma autorização de modelo.Novamente, a coisa agradável sobre Básica aqui é o seu servidor termina com um texto simples cópia da palavra-passe do cliente que você pode simplesmente passar para outro componente dentro de sua infra-estrutura, conforme necessário.

Outras dicas

Não existem normas para o RESTO diferente de HTTP.Há estabeleceu RESTO serviços lá fora.Eu sugiro que você dê uma olhadinha no-los e ter uma idéia de como eles funcionam.

Por exemplo, pegamos emprestado um monte de idéias a partir de S3 da Amazon RESTO serviço ao desenvolver o nosso próprio.Mas optamos por não usar o mais avançado modelo de segurança baseado no pedido de assinaturas.A abordagem mais simples é o HTTP Basic auth através de SSL.Você tem que decidir o que funciona melhor na sua situação.

Também, eu recomendo o livro Os Serviços Web RESTful da O'reilly.Ele explica os principais conceitos e fornece algumas práticas recomendadas.Geralmente, você pode levar o modelo que eles oferecem e mapeá-la para o seu próprio aplicativo.

Você também pode querer dar uma olhada em OAuth, o aparecimento de um protocolo aberto para com o token de autorização visando especificamente apis de http.

É muito semelhante à abordagem feita por flickr e lembre-se que o leite "resto" apis (não necessariamente bons exemplos de apis restful, mas bons exemplos de token-based approach).

Há uma grande lista de verificação encontrado no Github:

Autenticação

  • Não reinvente a roda de Autenticação, geração de token de senha de armazenamento.Usar os padrões.

  • Utilização Max Retry e a prisão de recursos no início de sessão.

  • O uso de criptografia em todos os dados sensíveis.

JWT (JSON Web Token)

  • Use um aleatório complicado chave (JWT Segredo) para fazer bruta forçando o token muito difícil.

  • Não extraia o algoritmo de carga.Força o algoritmo de back-end (HS256 ou RS256).

  • Fazer expiração do token (TTL, RTTL) o mais curto possível.

  • Não armazenar dados sensíveis em JWT carga útil, ele pode ser facilmente decodificada.

OAuth

  • Sempre validar redirect_uri do lado do servidor para permitir que apenas na lista de permissões de URLs.

  • Sempre tente trocar para o código e não tokens (não permitir response_type=token).

  • Use o parâmetro de estado com um random de hash para evitar CSRF no OAuth processo de autenticação.

  • Definir o escopo padrão e validar os parâmetros de escopo para cada aplicação.

Acesso

  • Limite de pedidos (Estrangulamento) para evitar DDoS / ataques de força bruta.

  • Usar o HTTPS no lado do servidor, para evitar MITM (Man In The Middle Attack)

  • Utilização HSTS cabeçalho com o SSL para evitar Faixa de SSL ataque.

Entrada

  • Use o bom método HTTP, de acordo com a operação: GET (ler), POST (crie), PUT/PATCH (substitua/atualização), e DELETE (para excluir um registro), e para responder com 405 Method Not Allowed se o método não é apropriado para o recurso solicitado.

  • Validar tipo de conteúdo, a pedido, Accept cabeçalho (Negociação de Conteúdo) para permitir que apenas o seu formato suportado (por exemplo, application/xml, application/json, etc.) e responder com 406 Not Acceptable a resposta se não correspondido.

  • Validar content-type de dados registados como você aceitar (e.g. application/x-www-form-urlencoded, multipart/form-data, application/json, etc.).

  • Validar a entrada do Usuário para evitar vulnerabilidades comuns (e.g.XSS, SQL Injection, de Execução Remota de Código, etc.).

  • Não utilizar quaisquer dados sensíveis (credenciais, Senhas, tokens de segurança, ou de chaves de API) no URL, mas usar padrão Authorization cabeçalho.

  • Usar um Gateway de API de serviço para habilitar o cache, Rate Limit políticas (e.g.Cota, Pico de Prisão, em Simultâneo Limite de Taxa) e implementar APIs recursos dinamicamente.

Processamento de

  • Verifique se todos os pontos de extremidade são protegidos por autenticação para evitar quebrado processo de autenticação.

  • Utilizador própria ID de recurso deve ser evitado.Uso /me/ordens em vez de /user/654321/ordens.

  • Não se auto-incremento de Id.Usar UUID.

  • Se a análise de ficheiros XML, certifique-se de entidade de análise não está activada para evitar XXE (XML entidade externa ataque).

  • Se a análise de ficheiros XML, certifique-se de entidade de expansão não está activada para evitar Bilhões Ri/XML bomba através exponencial expansão de entidade de ataque.

  • Usar um CDN para uploads de arquivos.

  • Se você está lidando com uma quantidade enorme de dados, use os Trabalhadores e Filas para o processo o máximo possível no plano de retorno e de resposta rápida para evitar HTTP Bloqueio.

  • Não se esqueça de ativar o DEPURAÇÃO DESATIVAR o modo.

Saída

  • Enviar X-Content-Type-Options: nosniff cabeçalho.

  • Enviar X-Frame-Options: deny cabeçalho.

  • Enviar Content-Security-Policy: default-src 'none' cabeçalho.

  • Remover impressões digitais de cabeçalhos - X-Powered-By, Server, X-AspNet-Version etc.

  • Força content-type para sua resposta, se você voltar application/json em seguida, a sua resposta de tipo de conteúdo é application/json.

  • Não retornar dados sensíveis como credenciais, Senhas, tokens de segurança.

  • Retorno adequada código de status de acordo com a operação realizada.(e.g. 200 OK, 400 Bad Request, 401 Unauthorized, 405 Method Not Allowed, etc.).

Eu estou meio surpreso com certificados de cliente SSL não foi mencionado ainda.Concedido, esta abordagem só é realmente útil se você pode contar com a comunidade de utilizadores a ser identificados por meio de certificados.Mas um grande número de governos/empresas fazem questão-los para seus usuários.O usuário não terá de se preocupar em criar ainda outro nome de utilizador/palavra-passe de combinação, e a identidade é estabelecida em cada conexão para comunicação com o servidor pode ser inteiramente sem estado, sem sessões de usuário necessária.(Não significa que qualquer uma das outras soluções mencionados requerem sessões)

Todos estas respostas tem negligenciado verdadeiro controle de acesso / autorização.

Se, por exemplo, o de APIs REST / serviços web são cerca de Postagem / GETing registros médicos, você pode querer definir controle de acesso policie sobre quem pode acessar os dados e em que circunstâncias.Por exemplo:

  • os médicos podem OBTER o prontuário de um paciente, eles têm uma relação de ajuda com
  • ninguém pode POSTAR dados médicos fora de horas de prática (e.g.9 5)
  • os usuários finais podem OBTER registros médicos eles próprios ou registros médicos de pacientes para os quais eles são o guardião
  • as enfermeiras podem ATUALIZAR o prontuário de um paciente, que pertence à mesma unidade como a enfermeira.

A fim de definir e implementar essas autorizações refinadas, você vai precisar usar um atributo de controle de acesso baseado em linguagem chamada XACML, a eXtensible Access Control Markup Language.

As outras normas aqui são as seguintes:

  • OAuth:id.a federação e a delegação de autorização e.g.deixando um serviço de agir em meu nome em outro serviço (Facebook pode lançar meu Twitter)
  • SAML:a federação de identidade / SSO da web.SAML é muito sobre quem é o usuário.
  • WS-Security / padrões WS -*:estas centram-se na comunicação entre os serviços SOAP.Eles são específicos para o nível da aplicação de formato de mensagens (SOAP) que lidam com aspectos de mensagens e.g.confiabilidade, segurança, confidencialidade, integridade, atomicidade, eventos...Nenhum tampa do controle de acesso e todos são específicas para SABÃO.

XACML é a tecnologia de agnóstico.Ele pode ser aplicado para aplicativos java, .NET, Python, Ruby...web services, REST APIs, e muito mais.

A seguir, são recursos interessantes:

Eu usei OAuth algumas vezes, e também alguns outros métodos (BASIC/DIGEST).Eu sinceramente sugiro OAuth.O link a seguir é o melhor tutorial que eu já vi usando OAuth:

http://hueniverse.com/oauth/guide/

Um dos melhores posts que eu já encontrei com relação a Segurança, como ele se relaciona com o RESTO é mais em 1 Gota de chuva.O MySpace da API usa OAuth também para a segurança e você tem total acesso aos seus canais personalizados no RestChess código, que eu fiz um monte de exploração.Esta foi a demo tinha na Mistura e você pode encontrar a postagem aqui.

Obrigado pelas excelentes conselhos.Acabamos usando um cabeçalho HTTP personalizado para passar um token de identidade do cliente para o serviço, em preparação para a integração de nossos API RESTful com o próximo Zermatt Identidade framework da Microsoft.Eu tenho descrito o problema aqui e nossa solução aqui.Eu também fiz tweakt's conselhos e comprei Os Serviços Web RESTful - um livro muito bom se você está construindo uma API RESTful de qualquer tipo.

OWASP(Open Web Application Security Project) tem algum cheat sheets, cobrindo todos os aspectos do desenvolvimento de aplicações Web.Este Projeto é uma importante e confiável fonte de informação.Com relação ao REPOUSO serviços que você pode verificar isso: https://www.owasp.org/index.php/REST_Security_Cheat_Sheet

Eu recomendaria OAuth 2/3.Você pode encontrar mais informações em http://oauth.net/2/

Eu procurei muito sobre restful ws segurança e nós também acabou com o uso de token, através do cookie do cliente para o servidor para autenticar as solicitações .Eu usei primavera de segurança para autorização de pedidos no serviço, pois eu tinha para autenticar e autorizados de cada pedido com base no especificada políticas de segurança que já foi em DB.

O fato de que o SABÃO mundo está muito bem coberto com os padrões de segurança, não significa que é seguro por padrão.Em primeiro lugar, as normas são muito complexo.A complexidade não é um bom amigo de segurança e implementação de vulnerabilidades como Assinatura XML de moldagem de ataques são endémicas aqui.

Como para .NET ambiente que não ajuda muito, mas "A criação de web services com Java" (um tijolo com ~10 autores) fez me ajudar um monte no entendimento do WS-* arquitetura de segurança e, especialmente, suas peculiaridades.

DESCANSO em si não oferece padrões de segurança, mas coisas como OAuth e o SAML estão rapidamente se tornando os padrões deste espaço.No entanto, a autenticação e a autorização são apenas uma pequena parte do que você precisa considerar.Muitas das vulnerabilidades conhecidas relativas a aplicações web aplicar muito para apis REST.Você tem que considerar a validação de entrada, sessão de fissuras, inadequado mensagens de erro, de funcionários internos vulnerabilidades e assim por diante.Ele é um grande sujeito.

Eu quero adicionar(em linha com stinkeymatt), solução mais simples seria para adicionar certificados SSL para o seu site.Em outras palavras, certifique-se de que o url é HTTPS://.Que irá cobrir a sua segurança de transporte (de estrondo para o fanfarrão).Com RESTful url, a ideia é mantê-lo simples (ao contrário de WS* segurança/SAML), você pode usar oAuth2/openID ligar ou até mesmo Basic Auth (em casos simples).Mas você ainda vai precisar SSL/HTTPS.Por favor, verifique ASP.NET Web API de segurança 2 aqui: http://www.asp.net/web-api/overview/security (Artigos e Vídeos)

Como o @Nathan acabou com o que é, um simples Cabeçalho HTTP, e alguns tinham disse OAuth2 e do lado do cliente certificados SSL.A essência do que é isso...sua API REST não deveria ter que lidar com a segurança como deve ser realmente fora do âmbito da API.

Em vez disso, uma camada de segurança deve ser colocado em cima dele, se ele é um Cabeçalho de HTTP atrás de um proxy da web (uma abordagem comum como SiteMinder, Zermatt ou até mesmo o Apache), ou tão complicado como OAuth 2.

O fundamental é as solicitações devem funcionar sem qualquer interação do usuário.Tudo o que é necessário para assegurar que a conexão com a API REST é autenticado.No Java EE temos a noção de um userPrincipal o que pode ser obtido em um HttpServletRequest.Ele também é gerenciado no descritor de implementação do que um padrão de URL que pode ser seguro para o RESTO da API de código não precisa verificar mais.

No WCF mundo, gostaria de usar ServiceSecurityContext.Current para obter o contexto de segurança atual.Você precisa configurar o aplicativo para exigir autenticação.

Há uma exceção para a instrução que eu tinha acima e que o uso de um nonce para evitar repetições (que pode ser de ataques ou de alguém, enviando os mesmos dados duas vezes).Essa parte só podem ser tratados na camada de aplicação.

Para Segurança de aplicações Web, você deve dar uma olhada no OWASP (https://www.owasp.org/index.php/Main_Page), que fornece cheatsheets para vários ataques de segurança.Você pode incorporar todas as medidas possíveis para garantir sua Aplicação.Com relação à API de segurança (autorização, autenticação, gerenciamento de identidade), existem várias maneiras como já mencionado (Basic,Digest e OAuth).Há brechas na OAuth1.0, de modo que você pode usar OAuth1.0a (OAuth2.0 não é amplamente adotada, devido a preocupações com a especificação)

Já faz um tempo, mas a questão ainda é relevante, embora a resposta pode ter mudado um pouco.

Um Gateway de API seria flexível e altamente configurável solução.Eu testei e usados KONG um pouco e realmente gostei do que vi.KONG proporciona um administrador API REST do seu próprio que você pode usar para gerenciar os usuários.

Express-gateway.io é mais recente, e também é um Gateway de API.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top