¿Cómo puedo configurar mi servidor para que solo acepte solicitudes de mi propia aplicación cliente? (similar a los certificados de cliente SSL)

4

Me gustaría que las API de mi servidor solo acepten solicitudes de mi propia aplicación, para evitar que otros clientes "maliciosos" de mi servicio.

Según tengo entendido, la forma de hacerlo sería con un "certificado de cliente" que la aplicación envía y que el servidor web está configurado para verificar.

Sin embargo, estoy hospedando mi aplicación en Heroku, y creo que no es posible hacerlo, así que estoy buscando algo lo mejor que me permita lograrlo.

Pensé que tal vez podría tener un par de claves, donde el cliente usa una clave privada para firmar un determinado token acordado (más algo de sal aleatoria, de modo que la cadena cifrada sea siempre diferente), y el servidor usa la clave pública para verificar el token (y rechaza las sales duplicadas para evitar la reproducción). O tal vez el cliente firme la solicitud completa con su clave privada, o algo así.

La idea sería que incluso si alguien se las arregla para sortear nuestro PIN SSL (potencialmente con un interruptor de apagado de iOS, e potencialmente) e inspeccionar nuestro tráfico y descubrir cómo funciona nuestra API, todavía no pueden llamarnos a menos que inviertan diseñar el binario para extraer ese certificado / clave privada. Entiendo que es posible hacer eso, solo intento poner tantas barreras como sea posible.

¿Cuáles son las buenas maneras de hacer esto?

Gracias!
Daniel

    
pregunta Daniel Magliola 17.02.2015 - 14:01
fuente

4 respuestas

7

Este tipo de problema se presta a Seguridad de carga-culto tipo "soluciones".

En el mundo real no hay ningún mecanismo posible que pueda evitar que un cliente no autorizado se conecte a su servicio. Una VPN es un sistema de seguridad comprobado que permite el acceso de clientes de confianza a una red de confianza , pero Internet es intrínsecamente no confiable. El atacante tendrá acceso a cualquier secreto incrustado en su aplicación, o almacenado en la memoria de la aplicación, los certificados de cliente TLS se basan en un secreto.

Al diseñar un servicio web, nunca olvide: " El cliente es el atacante, y nunca se le puede confiar. " Si ha cometido este error, debe volver al tablero de dibujo.

    
respondido por el rook 17.02.2015 - 15:44
fuente
1

Nota

Esta respuesta solo es aplicable bajo los supuestos establecidos. Los he hecho en base a la redacción explícita de la pregunta, que explícitamente permite que un vector de ataque conocido no se mitigue.

La seguridad es un equilibrio relativo entre el valor de la pérdida en caso de que se comprometa un activo y el esfuerzo (incluido el costo, etc.) que un adversario está dispuesto a realizar para lograr dicho compromiso. Es una prerrogativa del autor decidir el equilibrio, ya que tienen una visión completa de los interesados.

Asumptions

La amenaza que está intentando mitigar es la de un adversario que puede leer / manipular sus propias comunicaciones, hacerse pasar por el cliente, pero no aplicar ingeniería inversa el contenido del binario (ya sea debido a una falta de capacidad técnica, o falta de voluntad).

TL;DR

HMAC(message | nonce, key) junto con el mensaje del cliente / nonce "en claro" (sobre TLS, pero sin más encriptación).

Respuesta detallada

Su pregunta es una de autenticación , pero parece que intenta resolverla con encriptación (sí, en algunas circunstancias existe un cruce, pero separar las dos hacer la respuesta más fácil).

Si una clave secreta (no una clave privada asimétrica, solo un número aleatorio criptográficamente seguro y suficientemente grande) se almacena en el binario (como estaba proponiendo con un par de claves pública / privada), entonces no se revela. conocimiento del HMAC / texto sin formato.

Su servidor también tiene conocimiento de la clave, calcula el HMAC para el mensaje recibido y descarta cualquier comunicación del cliente que no sea válida. El servidor proporciona el nonce al cliente antes de enviar el mensaje y es único. Actúa para proteger contra las repeticiones de mensajes interceptados.

Caveat

Como se señaló anteriormente y en otras respuestas / comentarios, aún se puede obtener la clave del binario. Para aquellos que estén interesados, existe una técnica realmente genial que calcula la entropía para todas las regiones del binario y luego asigna la posición lineal a una Curva de Hilbert . Las regiones de código de máquina tendrán una entropía relativamente más baja que las regiones 'clave'. Chris Domas lo demuestra en uno de sus videos; posiblemente su charla TED aunque no puedo recordar (ver el video TED de cualquier manera).

    
respondido por el Arran Schlosberg 30.04.2015 - 12:27
fuente
0

Puede utilizar cualquiera de los mecanismos de túnel para aceptar las IP particulares en el lado del servidor o simplemente configurar su firewall para aceptar la lista de clientes de confianza.

    
respondido por el user45475 17.02.2015 - 19:08
fuente
0

Utilice OAuth2.0 . No solo autoriza al usuario, sino también a la aplicación cliente con las propiedades client_id y client_key .

    
respondido por el yeulucay 30.04.2015 - 10:17
fuente

Lea otras preguntas en las etiquetas