¿Cómo puedo identificar de manera segura un dispositivo remoto (programado y auto programado) en PHP?

1

¿Existe una forma confiable en PHP para identificar un dispositivo que pueda estar detrás de un enrutador (por lo que la IP no es única)?

Antecedentes: tengo varios dispositivos integrados (auto-programados y adaptables) que contactan con un servidor web (php + mysql) con actualizaciones de estado. Estas actualizaciones se guardan en una base de datos, si se confirma la fuente.

  • Tal como lo entiendo, $_SERVER['REMOTE_ADDR'] por lo general se puede confiar (excepto en algunas configuraciones de IIS donde puede, en circunstancias especiales, devolver 127.0.0.1, pero una historia diferente)

  • De todos modos, ya que uso SSL, la dirección IP realmente no debería ser un problema, porque se requiere un protocolo de enlace y si la IP es falsa o simplemente incorrecta, no se debe establecer la conexión

  • Por ahora solicito que las direcciones IP estén en la lista blanca del administrador, para que se acepte una actualización de estado

  • El dispositivo además envía la dirección MAC a través de $_POST para identificar los diferentes módulos con una dirección IP idéntica (Sé que esto puede ser fácilmente falsificado, y ahora se confiará si la dirección IP es confiable)

En primer lugar, no estoy seguro de que la dirección IP sea suficiente para estar a salvo de los ataques desde el exterior

En segundo lugar, si el dispositivo está detrás de un enrutador, tendrá la misma dirección IP que todas las PC / dispositivos en esa red. Por lo tanto, cualquier persona podría forjar una actualización de estado con una dirección MAC falsa (simplemente como variable de publicación), y dado que la dirección IP está en la lista blanca, será de confianza

Entonces, ¿existe alguna forma de confirmar la identidad de un dispositivo o conoces una mejor manera de hacerlo?

Aparte: Yendo hacia el otro lado, y haga que el servidor web examine los diferentes dispositivos podría ser una opción, pero ya que puede haber muchos (> 2000) dispositivos de los cuales necesitamos el último estado (cambio) I pensé que era ineficiente.

También he oído hablar sobre el uso de un certificado firmado o múltiple (para diferentes clientes), pero no sé cómo hacerlo, así que gracias de antemano por cada bit de información.

Por lo general, no publico (muchas) preguntas, pero esto es realmente difícil de buscar en Google, ¡al menos para mí!

    
pregunta Levit 29.07.2013 - 09:39
fuente

2 respuestas

2

Punto de vista criptográfico: la única manera de distinguir, desde el exterior, un dispositivo falso de uno genuino es hacer que el dispositivo genuino "sepa" algún valor que el atacante no sepa .

Esto puede ser el equivalente de una "contraseña" (ya que no hay personas involucradas, esa contraseña puede ser una secuencia de 40 caracteres aleatorios, es decir, algo bastante fuerte y, por lo tanto, no puede ser descifrado por los atacantes). Puede almacenarlo en un encabezado HTTP personalizado o en el estándar "Encabezado de autorización" , o como un valor de cookie, o codificado como parámetro en la URL; todos estos son compatibles con la mayoría de los marcos web, tanto en el cliente como en el servidor.

También puede utilizar certificados X.509 . SSL es compatible con la autenticación de certificado del lado del cliente. En ese caso, el valor "secreto" en el dispositivo es una clave privada asimétrica (generalmente RSA) y usted debe organizar (con una costumbre PKI ) para la emisión de un certificado por dispositivo. Los certificados son geniales si no desea que su servidor guarde una copia de los secretos del dispositivo (o la versión de hash del mismo), por ejemplo. porque le gustaría implementar nuevos dispositivos sin tener que informar el servidor. Si eso no es un problema para usted, el método de "contraseña" será más fácil que tratar con certificados.

De cualquier manera, ciertamente no quiere poner el mismo valor secreto en dos dispositivos distintos. Realmente quieres tener secretos específicos del dispositivo ; de lo contrario, alguien que "abra" uno de sus dispositivos pondrá en peligro todo el sistema. Con los secretos específicos del dispositivo, puede deshabilitar la autenticación para algunos dispositivos subvertidos conocidos, desde el servidor, sin afectar a los otros dispositivos.

Sin un valor secreto de dispositivo de ningún tipo, su problema no tiene solución. En el Protocolo de Internet , las máquinas están aisladas unas de otras; solo ven las direcciones IP, que no están "protegidas" de ninguna manera. El alcance de los elementos de hardware como direcciones MAC se detiene en el primer enrutador (y pueden falsificarse fácilmente de todos modos).

    
respondido por el Tom Leek 29.07.2013 - 15:54
fuente
1
  

si el dispositivo está detrás de un enrutador ... cualquiera podría forjar una actualización de estado con una dirección MAC falsa

Las direcciones MAC no cruzan los enrutadores.

  

haga que el servidor web realice una encuesta a los diferentes dispositivos podría ser una opción

Difícil cuando no sabes sus direcciones IP / están detrás de los enrutadores NAT.

  

hay alguna forma de confirmar la identidad de un dispositivo

Posibles soluciones:

1) use SSL para el intercambio de datos, y solo acepte datos de dispositivos que incluyan un secreto compartido en la solicitud (GET / POST / Cookies).

2) Utilice SSL con autenticación de certificado de cliente

3) use un mecanismo de autenticación basado en desafíos (tenga en cuenta que la autenticación de resumen HTTP tiene una serie de problemas que reducen su efectividad en ausencia de SSL) y con SSL, no hay una gran ventaja sobre la autenticación HTTP estándar

4) valida la solicitud contra un hash de variante de tiempo (sujeto a ataques de repetición dentro de la ventana de tiempo, requiere sincronización de reloj), por ejemplo,

url="http://yourserver.com/beacon?device=me";
var t = new Date();
t=t.getTime();
url+="&t=" + t;
var hash=md5(url+"sharedSecret");
url+="&hash=" + hash;
    
respondido por el symcbean 29.07.2013 - 12:12
fuente

Lea otras preguntas en las etiquetas