Guía de seguridad de la API REST

El conocimiento de cómo proteger las API REST es tan importante como escribir las API en sí. La mayoría de las API REST se basan en el protocolo HTTP, y cualquier usuario que tenga conexión a Internet puede acceder a ellas, y también lo pueden hacer los usuarios malos. Es muy importante escribir API seguras para proteger el negocio.

Antes de comenzar a proteger las API RESTful, entendamos cuáles son todas nuestras opciones como desarrolladores. ¿Qué se adapta bien a nuestro caso de uso?

Table of Contents1. Authentication vs. Authorization2. Four Ways to Secure RESTful Web Services- BASIC Authentication- DIGEST Authentication- Client CERT Authentication- OAUTH2 API Keys3. RESTful Web Services Security Implementations- Using SecurityContext- Using Annotations4. Best Practices

Diferencia entre la autenticación vs autorización

Antes de entrar en la discusión principal, aclaremos nuestros hechos sobre qué es autenticación y qué es autorización.

En inglés simple, la autenticación es el proceso de determinar que «el usuario es realmente alguien que dice ser». En términos técnicos, es el proceso de inicio de sesión en el sistema a través de un nombre de usuario/contraseña o cualquier mecanismo similar, por ejemplo, escaneo de huellas dactilares, token de seguridad, preguntas de seguridad o token SAML recibido de inicio de sesión SSO. Debe haber algo que pueda identificar al usuario de los demás.

Una vez que el usuario está dentro del sistema, la autorización se refiere a reglas que determinan «lo que el usuario puede hacer» y lo que no es, por ejemplo, un usuario normal puede publicar un mensaje en cualquier grupo público, pero los usuarios solo con el rol de editor podrán eliminar algo. La autorización se ve a menudo como la configuración introductoria de permisos por parte de un administrador del sistema y la comprobación de los valores de permisos que ya se han configurado cuando un usuario obtiene acceso al sistema.

Cuando aseguramos servicios web RESTful, necesitamos cuidar ambos factores. Los dos conceptos son completamente ortogonales e independientes, pero ambos son fundamentales para el diseño de seguridad, y el hecho de no obtener uno de ellos correctamente aumenta las posibilidades de que el sistema se vea comprometido..

Cuatro formas de proteger Servicios Web RESTful

Hay varias formas de proteger una API RESTful en Java. Repasemos las 4 opciones más populares:

2.1. Autenticación BÁSICA

Es la técnica más simple de todas y probablemente la más utilizada también. Utiliza formularios de inicio de sesión/contraseña, solo es autenticación básica. Usted ingresa su nombre de usuario y contraseña y envía el formulario al servidor, y la aplicación lo identifica como usuario; se le permite usar el sistema; de lo contrario, obtiene un error.

El principal problema con esta implementación de seguridad es que las credenciales se propagan de forma sencilla desde el cliente al servidor. Las credenciales están simplemente codificadas con Base64 en tránsito, pero no cifradas ni con hash de ninguna manera. De esta manera, cualquier rastreador podría leer los paquetes enviados a través de la red.

HTTPS es, por lo tanto, generalmente preferido o utilizado en conjunto con la autenticación básica, lo que hace que la conversación con el servidor web esté completamente encriptada. La mejor parte es que nadie puede ni siquiera adivinar desde el exterior que la Autenticación básica está teniendo lugar.

2.2. Autenticación DIGEST

Este método de autenticación hace uso de algoritmos de hash para cifrar la contraseña (llamada hash de contraseña) introducida por el usuario antes de enviarla al servidor. Esto, obviamente, lo hace mucho más seguro que el método de autenticación básico, en el que la contraseña del usuario viaja en texto plano que puede ser leído fácilmente por quien la intercepta.

Leer más: Generar contraseñas cifradas

También hay muchos algoritmos de hash en java, que pueden resultar realmente efectivos para la seguridad de contraseñas, como los algoritmos MD5, SHA, BCrypt, SCrypt y PBKDF2WithHmacSHA1.

Recuerde que una vez que este hash de contraseña se genera y almacena en la base de datos, no puede convertirlo de nuevo a la contraseña original. Cada vez que el usuario inicie sesión en la aplicación, debe volver a regenerar el hash de la contraseña y coincidir con el hash almacenado en la base de datos. Por lo tanto, si el usuario olvidó su contraseña, tendrá que enviarle una contraseña temporal y pedirle que la cambie con su nueva contraseña. Bueno, es una tendencia común hoy en día.

2.3. Autenticación de certificado de cliente

Este es un mecanismo en el que se establece un acuerdo de confianza entre el servidor y el cliente a través de certificados. Deben estar firmados por una agencia establecida para garantizar que el certificado presentado para la autenticación es legítimo, lo que se conoce como CA.

Usando esta técnica, cuando el cliente intenta acceder a un recurso protegido, en lugar de proporcionar un nombre de usuario o contraseña, presenta el certificado al servidor. El certificado contiene la información de usuario para la autenticación, incluidas las credenciales de seguridad, además de un par de claves públicas y privadas únicas. A continuación, el servidor determina si el usuario es legítimo a través de la CA. Además, debe verificar si el usuario tiene acceso al recurso. Este mecanismo debe usar HTTPS como protocolo de comunicación, ya que no tenemos un canal seguro para evitar que nadie robe la identidad del cliente.

Puede encontrar un tutorial completo para generar certificados de seguridad en documentos oficiales de oracle.

2.4. Claves API OAUTH2

Si alguna vez ha desarrollado aplicaciones que interactúan con otras aplicaciones a través de la nube, por ejemplo, integración de facebook o autenticación de Twitter, etc. entonces ya has usado esto. Requieren que proporcione una clave de API y un secreto de API para identificarlo correctamente. Estas claves de API y secretos son una cadena codificada al azar que es imposible de adivinar.

Para entender cómo funciona, supongamos que está utilizando una aplicación para compartir fotos (Flickr) y desea publicar algunas de sus fotos utilizando su API REST. Crea la solicitud como está documentada en los documentos de Flickr y, a continuación, envíala.

Luego, al recibir la solicitud, Flickr autentica al usuario leyendo la información de la clave API con la clave secreta que pertenece al usuario. Una vez que estas validaciones se realizan correctamente, el servidor entrega la respuesta al cliente. Así, obtenemos una respuesta con todas las fotos que se han publicado recientemente en Flickr.

Como notará, de esta manera, puede crear aplicaciones fácilmente utilizando la API del proveedor. Además, el proveedor le permitirá autenticar y acceder a la información pública.

Si alguien comienza a faltar al respeto de los acuerdos, por ejemplo, enviando tráfico no deseado o cualquier violación de la política, el proveedor retira la clave de API y evita el uso abusivo de sus API.

Implementaciones de seguridad de API REST

Aparte de los conceptos anteriores, generalmente necesitará proteger sus API RESTful en su empresa utilizando los métodos a continuación.

3.1. Instancia JAX-RS SecurityContext

La interfaz javax.ws.rs.core.SecurityContext proporciona acceso a información relacionada con la seguridad para una solicitud y es muy similar a javax.servlet.http.HttpServletRequest.

Se accede a SecurityContext inyectando una instancia en un campo de clase, método de configuración o parámetro de método utilizando la anotación javax.ws.rs.core.Context, por ejemplo, en el código inferior, se usa sc.isUserInRole() para verificar la autorización del usuario.

3.2. Anotaciones JAR-RS para autorización de nivel de método

Esta técnica se usa ampliamente en aplicaciones empresariales y se usa para verificar roles y responsabilidades de un usado autenticado para cualquier operación determinada. JAX-RS proporciona a continuación anotaciones para este propósito.

  • @PermitAll
  • @DenyAll
  • @RolesAllowed

Un ejemplo de uso de anotación puede ser:

Leer Más : Ejemplo de autenticación y autorización JAX-RS

Prácticas recomendadas de seguridad de la API REST

Anote algunos puntos importantes al diseñar la seguridad para sus servicios web RESTful.

  1. Use solo el protocolo HTTPS para que toda su comunicación esté siempre encriptada.
  2. Nunca envíe credenciales de autenticación o claves de API como parámetro de consulta. Aparecen en la URL y se pueden registrar o rastrear fácilmente.
  3. Utilice siempre el nivel de cifrado más difícil. Ayudará a tener más confianza.
  4. Para los recursos expuestos por los servicios web RESTful, es importante asegurarse de que cualquier solicitud PUT, POST y DELETE esté protegida de la Falsificación de Solicitudes de Sitios Cruzados.
  5. Valide siempre los datos de entrada lo antes posible que se reciban en el método del servidor. Utilice solo datos primitivos como parámetro de entrada tanto como sea posible.
  6. Confíe en las características de validación proporcionadas por el marco, ya que ya están probadas por una gran comunidad.

Hágame saber sus ideas y experiencias sobre cómo proteger los servicios web RESTful en su organización.

Feliz Aprendizaje !!

¿Fue útil este post?

Háganos saber si le gustó la publicación. Es la única manera de mejorar.
No

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

More: