it-swarm-es.com

¿Cómo puedo autenticar de forma segura la aplicación cliente que me envía datos?

Tenemos un servicio web que registra/registra datos de usuario enviados a través de https por nuestra aplicación cliente. ¿Hay alguna manera de garantizar de forma segura que la aplicación cliente envíe los datos y no una herramienta falsa que se hace pasar por nuestra aplicación? Idealmente, no me gustaría tener que recurrir a cosas como ocultar una clave ofuscada en el cliente u otras técnicas de "seguridad a través del secreto" ...

12

No puedes Básicamente, un servidor no puede confiar en un cliente (hay algunas excepciones: si la máquina del cliente está reforzada (el hardware verifica el firmware, el firmware verifica el sistema operativo, el sistema operativo verifica cada aplicación en ejecución), podría ser posible hacer eso (pero no realmente, alguien con un soldador siempre podría modificar la verificación del hardware), pero si no controlas al 100% al cliente, no tienes suerte.

Debe preguntarse: ¿Cuáles son los riesgos de que el cliente cargue datos falsos? ¿Cuáles son las consecuencias de no autenticar que es s aplicación cargando los datos? Una pregunta difícil que debe hacer: ¿Tiene el cliente un incentivo para cargar datos falsos? Si el usuario no tiene un incentivo para cargar datos falsos, probablemente no se molestará.

Una cosa que usted puede hacer: puede autenticar al usuario que ejecuta la aplicación (a través de cualquiera de varios mecanismos de autenticación) y luego guardar los datos cargados junto con el ID de usuario autenticado (y la dirección IP) . De esa manera, si el usuario lo hace carga datos falsos, puede rastrear quién realizó el cambio. Por supuesto, ahora ha realizado la PII de datos que puede tener problemas de privacidad para su servicio.

Es necesario autenticar al cliente, y eso requiere que haya algún tipo de secreto. Si un usuario humano está controlando al cliente, es posible que solo pueda registrar y autenticar al usuario, utilizando algún secreto que conozca o al que tenga acceso.

Si el cliente está automatizado y usted no controla el entorno de hardware y software en el que se basa el cliente, no tiene suerte frente a un atacante determinado que tiene el control del cliente. Pero puedes hacerlo difícil.

Su problema parece estar relacionado con el problema general de licenciar aplicaciones de cliente, y una buena descripción de un enfoque al respecto (para aplicaciones Android, en Java) está aquí:

http://Android-developers.blogspot.com/2010/09/securing-Android-lvl-applications.html

Puede adaptar eso a su entorno o buscar otras bibliotecas de código abierto adecuadas para su situación.

Por cierto, "la seguridad a través del secreto" está bien: los secretos como las claves privadas son parte de la mayoría de los buenos esquemas. Es "Seguridad a través de la oscuridad" lo que las personas intentan evitar, es decir, complicando las cosas o pretendiendo que los atacantes no entiendan sus algoritmos.

8
nealmcb

Si observa el 10 leyes de seguridad inmutables , la ley n. ° 3 explica el problema en un nivel fundamental:

Ley # 3: si un chico malo tiene acceso físico sin restricciones a su computadora, ya no es su computadora

2
Steve

Puede usar kerberos para realizar la autenticación mutua entre el cliente y el servidor. Preferiblemente tendría algún método fuera de banda para identificar inicialmente al cliente, p. emitir al usuario con un identificador. por supuesto, ahora confías en que ese identificador no se vea comprometido ...

1
user185

Como dijeron los otros chicos, no puedes confiar en un cliente, hasta que el cliente se autentique con un certificado que TÚ creaste. En este momento, todo el problema se reduce a un problema de distribución de clave/certificado:

  1. ¿Cómo sabe el cliente que está obteniendo un buen certificado de un servidor real?
  2. ¿Cómo sabe el servidor que no está dando buenos certificados a clientes maliciosos?

Hasta que se respondan estas preguntas (¡correctamente!), Todos los demás eventos posteriores a la autenticación son discutibles.

0
Marcin