Al diseñar una API o servicio REST, ¿existen mejores prácticas establecidas para tratar con la seguridad (Autenticación, Autorización, Gestión de Identidad)?
Al crear una API SOAP, tiene WS-Security como guía y existe mucha literatura sobre el tema. He encontrado menos información sobre cómo asegurar puntos finales REST.
Si bien entiendo que REST intencionalmente no tiene especificaciones análogas a WS- * espero que hayan surgido las mejores prácticas o los patrones recomendados.
Cualquier discusión o enlaces a documentos relevantes sería muy apreciada. Si es importante, estaríamos usando WCF con mensajes serializados POX / JSON para nuestros API / Servicios REST creados utilizando v3.5 de .NET Framework.
wcf
security
rest
authorization
rest-security
Nathan
fuente
fuente
Respuestas:
Como dijo tweakt, Amazon S3 es un buen modelo para trabajar. Sus firmas de solicitud tienen algunas características (como la incorporación de una marca de tiempo) que ayudan a proteger contra la repetición de solicitudes accidentales y maliciosas.
Lo bueno de HTTP Basic es que prácticamente todas las bibliotecas HTTP lo admiten. Por supuesto, necesitará requerir SSL en este caso porque enviar contraseñas de texto sin formato a través de la red es casi universalmente algo malo. Basic es preferible a Digest cuando se usa SSL porque incluso si la persona que llama ya sabe que se requieren credenciales, Digest requiere un viaje de ida y vuelta adicional para intercambiar el valor nonce. Con Basic, las personas que llaman simplemente envían las credenciales la primera vez.
Una vez que se establece la identidad del cliente, la autorización es realmente solo un problema de implementación. Sin embargo, puede delegar la autorización a algún otro componente con un modelo de autorización existente. Una vez más, lo bueno de Basic aquí es que su servidor termina con una copia en texto plano de la contraseña del cliente que simplemente puede pasar a otro componente dentro de su infraestructura según sea necesario.
fuente
"sending plaintext passwords over the net is almost universally a bad thing"
- ¿Puedes dar más detalles sobre el "casi"? ¿Cuándo no es una mala idea?No hay estándares para REST que no sean HTTP. Hay servicios REST establecidos por ahí. Te sugiero que les eches un vistazo y entiendas cómo funcionan.
Por ejemplo, tomamos prestadas muchas ideas del servicio REST S3 de Amazon cuando desarrollamos las nuestras. Pero optamos por no usar el modelo de seguridad más avanzado basado en firmas de solicitud. El enfoque más simple es la autenticación básica HTTP sobre SSL. Tienes que decidir qué funciona mejor en tu situación.
Además, recomiendo el libro RESTful Web Services de O'reilly. Explica los conceptos básicos y proporciona algunas mejores prácticas. En general, puede tomar el modelo que proporcionan y asignarlo a su propia aplicación.
fuente
También es posible que desee echar un vistazo a OAuth , un protocolo abierto emergente para la autorización basada en tokens que se dirige específicamente a las apis http.
Es muy similar al enfoque adoptado por flickr y recuerda los apis de "descanso" de la leche (no necesariamente buenos ejemplos de apis relajantes, pero buenos ejemplos del enfoque basado en tokens).
fuente
Hay una gran lista de verificación en Github :
Autenticación
No reinvente la rueda en Autenticación, generación de tokens, almacenamiento de contraseñas. Usa los estándares.
Max Retry
Funciones de uso y cárcel en Iniciar sesión.Use el cifrado en todos los datos confidenciales.
JWT (JSON Web Token)
Use una clave aleatoria complicada (JWT Secret) para hacer que el bruto fuerce la ficha muy difícil.
No extraiga el algoritmo de la carga útil. Forzar el algoritmo en el backend (HS256 o RS256).
Haga que la expiración del token (
TTL
,RTTL
) sea lo más corta posible.No almacene datos confidenciales en la
JWT
carga útil, se pueden decodificar fácilmente.OAuth
Valide siempre el
redirect_uri
lado del servidor para permitir solo las URL incluidas en la lista blanca.Siempre trate de intercambiar por código y no por tokens (no permitir
response_type=token
).Utilice el parámetro de estado con un hash aleatorio para evitar
CSRF
elOAuth
proceso de autenticación.Defina el alcance predeterminado y valide los parámetros de alcance para cada aplicación.
Acceso
Limite las solicitudes (aceleración) para evitar ataques DDoS / fuerza bruta.
Use HTTPS en el lado del servidor para evitar MITM (Man In The Middle Attack)
Use el
HSTS
encabezado con SSL para evitar el ataque SSL Strip.Entrada
Use el método HTTP adecuado de acuerdo con la operación:
GET
(leer),POST
(crear),PUT/PATCH
(reemplazar / actualizar) yDELETE
(para eliminar un registro), y responda405 Method Not Allowed
si el método solicitado no es apropiado para el recurso solicitado.Validar el tipo de contenido a petición
Accept
de cabecera (Negociación de contenido) para permitir sólo a su formato compatible (por ejemploapplication/xml
,application/json
, etc) y responder con la406 Not Acceptable
respuesta si no emparejado.Validar
content-type
de datos publicada como aceptes (por ejemploapplication/x-www-form-urlencoded
,multipart/form-data
,application/json
, etc.).Valide la entrada del usuario para evitar vulnerabilidades comunes (por ejemplo, XSS, inyección de SQL, ejecución remota de código, etc.).
No use datos confidenciales (credenciales, contraseñas, tokens de seguridad o claves API) en la URL, pero use el
Authorization
encabezado estándar .Use un servicio API Gateway para habilitar el almacenamiento en caché, las
Rate Limit
políticas (por ejemplo, Cuota, detención de picos, límite de velocidad concurrente) e implemente los recursos de API dinámicamente.Procesando
Compruebe si todos los puntos finales están protegidos detrás de la autenticación para evitar un proceso de autenticación interrumpido.
Se debe evitar la identificación del recurso propio del usuario. Use / me / orders en lugar de / user / 654321 / orders.
No incremente automáticamente las ID. Use UUID en su lugar.
Si está analizando archivos XML, asegúrese de que el análisis de entidades no esté habilitado para evitar XXE (ataque de entidad externa XML).
Si está analizando archivos XML, asegúrese de que la expansión de la entidad no esté habilitada para evitar la bomba Billion Laughs / XML a través del ataque de expansión de entidad exponencial.
Use un CDN para cargar archivos.
Si está tratando con una gran cantidad de datos, use Trabajadores y Colas para procesar la mayor cantidad posible en segundo plano y devolver la respuesta rápidamente para evitar el Bloqueo HTTP.
No se olvide de apagar el DEBUG OFF.
Salida
Enviar
X-Content-Type-Options: nosniff
encabezado.Enviar
X-Frame-Options: deny
encabezado.Enviar
Content-Security-Policy: default-src 'none'
encabezado.Retire las huellas digitales de cabeceras -
X-Powered-By
,Server
,X-AspNet-Version
etc.Fuerza
content-type
para su respuesta, si regresa,application/json
entonces su tipo de contenido de respuesta esapplication/json
.No devuelva datos confidenciales como credenciales, contraseñas, tokens de seguridad.
Devuelva el código de estado adecuado de acuerdo con la operación completada. (por ejemplo
200 OK
,400 Bad Request
,401 Unauthorized
,405 Method Not Allowed
, etc).fuente
Estoy un poco sorprendido de que aún no se haya mencionado SSL con certificados de cliente. De acuerdo, este enfoque solo es realmente útil si puede contar con la comunidad de usuarios identificados por certificados. Sin embargo, varios gobiernos / empresas los emiten a sus usuarios. El usuario no tiene que preocuparse por crear otra combinación de nombre de usuario / contraseña, y la identidad se establece en todas y cada una de las conexiones para que la comunicación con el servidor pueda ser completamente apátrida, no se requieren sesiones de usuario. (No implica que alguna / todas las otras soluciones mencionadas requieran sesiones)
fuente
Todos en estas respuestas han pasado por alto el verdadero control / autorización de acceso.
Si, por ejemplo, sus API / servicios web REST se refieren a PUBLICAR / OBTENER registros médicos, es posible que desee definir una política de control de acceso sobre quién puede acceder a los datos y en qué circunstancias. Por ejemplo:
Para definir e implementar esas autorizaciones específicas, deberá utilizar un lenguaje de control de acceso basado en atributos llamado XACML, el Lenguaje de marcado de control de acceso extensible.
Las otras normas aquí son para lo siguiente:
XACML es independiente de la tecnología. Se puede aplicar a aplicaciones java, .NET, Python, Ruby ... servicios web, API REST y más.
Los siguientes son recursos interesantes:
fuente
He usado OAuth varias veces, y también he usado algunos otros métodos (BASIC / DIGEST). Sugiero de todo corazón a OAuth. El siguiente enlace es el mejor tutorial que he visto sobre el uso de OAuth:
http://hueniverse.com/oauth/guide/
fuente
Una de las mejores publicaciones que he encontrado con respecto a la Seguridad en lo que respecta a REST ha terminado en 1 RainDrop . Las API de MySpace usan OAuth también por seguridad y usted tiene acceso completo a sus canales personalizados en el código RestChess, con el que hice mucha exploración. Esto se demostró en Mix y puedes encontrar la publicación aquí .
fuente
Gracias por el excelente consejo. Terminamos usando un encabezado HTTP personalizado para pasar un token de identidad del cliente al servicio, en preparación para integrar nuestra API RESTful con el próximo marco de identidad Zermatt de Microsoft. He descrito el problema aquí y nuestra solución aquí . También tomé el consejo de tweakt y compré RESTful Web Services , un libro muy bueno si está creando una API RESTful de cualquier tipo.
fuente
OWASP (Open Web Application Security Project) tiene algunas hojas de trucos que cubren todos los aspectos del desarrollo de aplicaciones web. Este proyecto es una fuente de información muy valiosa y confiable. Con respecto a los servicios REST, puede verificar esto: https://www.owasp.org/index.php/REST_Security_Cheat_Sheet
fuente
Recomendaría OAuth 2/3. Puede encontrar más información en http://oauth.net/2/
fuente
Busqué mucho sobre la seguridad tranquila de ws y también terminamos usando token a través de cookies del cliente al servidor para autenticar las solicitudes. Utilicé Spring Security para la autorización de solicitudes en servicio porque tuve que autenticar y autorizar cada solicitud en función de las políticas de seguridad especificadas que ya estaban en DB.
fuente
El hecho de que el mundo SOAP esté bastante bien cubierto con estándares de seguridad no significa que sea seguro de forma predeterminada. En primer lugar, los estándares son muy complejos. La complejidad no es muy buena amiga de la seguridad y las vulnerabilidades de implementación, como los ataques de envoltura de firmas XML, son endémicas aquí.
En cuanto al entorno .NET, no ayudaré mucho, pero "Construir servicios web con Java" (un ladrillo con ~ 10 autores) me ayudó mucho a comprender la arquitectura de seguridad WS- * y, especialmente, sus peculiaridades.
fuente
REST en sí no ofrece estándares de seguridad, pero cosas como OAuth y SAML se están convirtiendo rápidamente en los estándares en este espacio. Sin embargo, la autenticación y la autorización son solo una pequeña parte de lo que debe tener en cuenta. Muchas de las vulnerabilidades conocidas relacionadas con las aplicaciones web se aplican mucho a las API REST. Debe tener en cuenta la validación de entrada, el craqueo de sesión, los mensajes de error inapropiados, las vulnerabilidades internas de los empleados, etc. Es un gran tema.
fuente
Quiero agregar (en línea con stinkeymatt), la solución más simple sería agregar certificados SSL a su sitio. En otras palabras, asegúrese de que su url sea HTTPS: //. Eso cubrirá su seguridad de transporte (por el dinero). Con la URL RESTful, la idea es mantenerlo simple (a diferencia de WS * security / SAML), puede usar oAuth2 / openID connect o incluso Basic Auth (en casos simples). Pero aún necesitará SSL / HTTPS. Verifique la seguridad de ASP.NET Web API 2 aquí: http://www.asp.net/web-api/overview/security (Artículos y videos)
fuente
Como @Nathan terminó con un simple encabezado HTTP, y algunos habían dicho OAuth2 y certificados SSL del lado del cliente. La esencia de esto es ... su API REST no debería tener que manejar la seguridad, ya que realmente debería estar fuera del alcance de la API.
En cambio, se debe colocar una capa de seguridad encima, ya sea un Encabezado HTTP detrás de un proxy web (un enfoque común como SiteMinder, Zermatt o incluso Apache HTTPd), o tan complicado como OAuth 2.
La clave es que las solicitudes deberían funcionar sin ninguna interacción del usuario final. Todo lo que se necesita es garantizar que la conexión a la API REST esté autenticada. En Java EE tenemos la noción de a
userPrincipal
que se puede obtener en unHttpServletRequest
. También se gestiona en el descriptor de despliegue que un patrón de URL puede ser seguro, por lo que el código REST API ya no necesita verificar.En el mundo WCF, usaría
ServiceSecurityContext.Current
para obtener el contexto de seguridad actual. Necesita configurar su aplicación para requerir autenticación.Hay una excepción a la declaración que tenía arriba y es el uso de un nonce para evitar repeticiones (que pueden ser ataques o que alguien simplemente envíe los mismos datos dos veces). Esa parte solo se puede manejar en la capa de aplicación.
fuente
Para la seguridad de aplicaciones web, debe echar un vistazo a OWASP ( https://www.owasp.org/index.php/Main_Page ) que proporciona hojas de referencia para varios ataques de seguridad. Puede incorporar tantas medidas como sea posible para asegurar su aplicación. Con respecto a la seguridad API (autorización, autenticación, gestión de identidad), hay varias formas como ya se mencionó (Basic, Digest y OAuth). Hay agujeros de bucle en OAuth1.0, por lo que puede usar OAuth1.0a (OAuth2.0 no es ampliamente adoptado debido a preocupaciones con la especificación)
fuente
Ha pasado un tiempo, pero la pregunta sigue siendo relevante, aunque la respuesta podría haber cambiado un poco.
Un API Gateway sería una solución flexible y altamente configurable. Probé y usé KONG bastante y realmente me gustó lo que vi. KONG proporciona una API REST de administrador propia que puede usar para administrar usuarios.
Express-gateway.io es más reciente y también es una API Gateway.
fuente