La seguridad es una preocupación fundamental cuando se implementan y administran dispositivos de IoT. Cloud IoT Core ofrece las siguientes funciones de seguridad:
- Autenticación de clave pública/privada por dispositivo con tokens web JSON (JWT, RFC 7519)
- Esto limita la superficie de exposición a un ataque, ya que una clave vulnerada afectaría a un solo dispositivo y no a toda la flota.
- Los JWT son válidos durante un tiempo limitado, por lo que las claves vulneradas vencerán.
- Compatibilidad con algoritmos de RSA o de curva elíptica para verificar firmas con aplicación forzosa para tamaños de claves sólidos.
- Compatibilidad para rotar las claves por dispositivo permitiendo que se registren claves simultáneas, y compatibilidad con hora de vencimiento por credencial.
- Conexión TLS 1.2, con autoridades de certificación raíz (necesarias para MQTT).
- El acceso a la API de Cloud IoT Core se controla mediante funciones y permisos de la Administración de identidades y accesos (IAM).
Aprovisiona credenciales
En el siguiente diagrama, se resume el proceso para aprovisionar credenciales de dispositivos. Se supone que el usuario autenticado que configuró el dispositivo creó un proyecto y un registro, y tiene permisos para crear dispositivos. El aprovisionador usa la API de Cloud IoT Core, los comandos de gcloud o Cloud Platform Console para crear un dispositivo lógico en la nube.
- El aprovisionador genera el par de claves públicas/privadas.
- El aprovisionador crea el dispositivo con la API de Cloud IoT Core, los comandos de gcloud o Cloud Platform Console, y especifica la clave pública que se acaba de crear. Se usará para verificar la identidad del dispositivo.
- El administrador de dispositivos de Cloud IoT Core almacena el recurso del dispositivo y la clave pública.
- El administrador de dispositivos responde al aprovisionador para indicar que se creó el dispositivo.
- La clave privada se almacena en el dispositivo para usarla más adelante en la autenticación. En este paso, se puede usar el Módulo de plataforma segura de hardware (TPM).
Ten en cuenta que el orden de los pasos que se muestra aquí no es prescriptivo. Por ejemplo, la clave se puede almacenar en el dispositivo antes de que se registre en Cloud IoT Core.
Para obtener información sobre cómo crear claves, consulta Cómo crear pares de claves.
Authentication
En el siguiente diagrama, se resume la autenticación en Cloud IoT Core con MQTT:
- El dispositivo prepara un token web JSON (JWT), como se describe en Cómo usar tokens web JSON. El JWT se firma con la clave privada del flujo de autenticación.
- Cuando se conecta al puente MQTT, el dispositivo presenta el JWT como contraseña en el mensaje
CONNECT
de MQTT. El contenido del nombre de usuario se ignora. Sin embargo, algunas bibliotecas cliente de WebRTC no enviarán la contraseña, a menos que se especifique un nombre de usuario. Para obtener mejores resultados, establece el nombre de usuario en un valor arbitrario, comounused
oignored
. - El puente MQTT verifica el JWT con la clave pública del dispositivo.
- El puente MQTT acepta la conexión.
- La conexión se cierra cuando vence el JWT (después de considerar el desvío permitido del reloj).
Estándares de seguridad
Cloud IoT Core usa autenticación basada en firmas digitales para tokens firmados de RSA y curva elíptica. Se admiten los siguientes algoritmos específicos:
- JWT
RS256
(RSASSA-PKCS1-v1_5 con SHA-256 RFC 7518 sec 3.3) - JWT
ES256
(ECDSA con P-256 y SHA-256 RFC 7518 sec 3.4), definido en OpenSSL como la curva prime256v1
El algoritmo de RSA se usa con frecuencia y es ampliamente compatible con las bibliotecas cliente. Sin embargo, las claves y las firmas generadas pueden ser bastante grandes (en general, de uno a dos kilobytes). Además, los RSA pueden usar una cantidad significativa de recursos (en términos de longitud de clave y CPU) que pueden afectar a los dispositivos que tienen recursos limitados.
El algoritmo de curva elíptica es compatible, pero no se usa tanto como los RSA. Para usar la curva elíptica, es posible que debas instalar dependencias adicionales en tu biblioteca cliente. Sin embargo, las claves y las firmas generadas son significativamente más pequeñas que las que generan los RSA, lo que puede ser útil para los dispositivos con recursos limitados.
Solidez de la clave
Cloud IoT Core requiere un mínimo de 112 bits de seguridad según las recomendaciones del NIST (sección 5.6.2, páginas 55 y 56). Esto se traduce en un tamaño de clave mínimo de 2048 bits para RS256 (consulta la tabla 2 en las recomendaciones del NIST, página 53).
ES256 tiene un nivel predeterminado de seguridad de 128 bits (el tamaño de la clave es fijo).
Formato de clave pública
Cuando registres la clave pública de un dispositivo, esta debe tener uno de los siguientes formatos:
Formato | Descripción |
---|---|
RSA_PEM | Una clave pública RSA codificada en base64. Se puede usar para verificar las firmas RS256 en tokens de JWT (RFC 7518). |
RSA_X509_PEM | Una clave RSA_PEM, codificada en base64, unida con un certificado X.509v3 (RFC 5280). El certificado puede ser autofirmado; de lo contrario, Cloud IoT Core puede comparar la firma del certificado del dispositivo con los certificados de nivel de registro para verificar el origen del certificado. |
ES256_PEM | La clave pública para el algoritmo ECDSA (con P-256 y SHA-256), codificada en base64. Se puede usar para verificar los tokens JWT con el algoritmo ES256 (RFC 7518). Esta clave pública no está unida a un certificado; por lo tanto, es pequeña, lo que representa una de las principales ventajas de ES256. |
ES256_X509_PEM | Una clave ES256_PEM, codificada en base64, unida en un certificado X.509v3 (RFC 5280). El certificado puede ser autofirmado; de lo contrario, Cloud IoT Core puede comparar la firma del certificado del dispositivo con los certificados de nivel de registro para verificar el origen del certificado. |
Para obtener información sobre cómo crear claves, consulta Cómo crear pares de claves públicas y privadas.
Rotación de claves
Cloud IoT Core admite varias claves activas (hasta 3 por dispositivo) para permitir una rotación sin interrupciones. El servicio intentará verificar los JWT con cada una de las claves activas y aceptará una conexión si alguna clave activa coincide.
La API te permite definir un expirationTime
para cada credencial de dispositivo (clave pública). Una vez que venza, se ignorará la clave, pero no se borrará automáticamente. Se aplica un sesgo de reloj de 10 minutos. Si no se especifica una hora de vencimiento para una clave, esta nunca caducará.
Recomendaciones de seguridad del dispositivo
Cloud IoT Core no aplica forzosamente las siguientes recomendaciones de seguridad, pero te ayudarán a proteger tus dispositivos y conexiones.
- Mantenga la clave privada en secreto.
- Usa TLS 1.2 cuando te comuniques con
mqtt.googleapis.com
omqtt.2030.ltsapis.goog
en los puertos 8883 y 443. Para mantener las conexiones TLS, haz lo siguiente:- Verifica que el certificado del servidor sea válido mediante un certificado de CA raíz de Google.
- Realiza actualizaciones de firmware relacionadas con la seguridad de manera habitual para mantener los certificados de servidor actualizados.
- Consulte esta nota de seguridad para conocer los requisitos detallados de TLS y la compatibilidad futura.
- Cada dispositivo debe tener un par de claves públicas/privadas único. Si varios dispositivos comparten una sola clave y uno de ellos se ve comprometido, un atacante podría robar la identidad de todos los dispositivos que se configuraron con esa clave.
- Mantenga la clave pública segura cuando la registre en Cloud IoT Core. Si un atacante puede alterar la clave pública y engañar al aprovisionador para que cambie la clave pública y registre una incorrecta, el atacante luego podrá autenticarse en nombre del dispositivo.
- El par de claves que se usa para autenticar el dispositivo en Cloud IoT Core no debe usarse con otros fines ni protocolos.
- Según la capacidad del dispositivo de almacenar claves de forma segura, los pares de claves se deben rotar periódicamente. Cuando sea práctico, todas las claves deben descartarse cuando se restablece el dispositivo.
- Si tu dispositivo ejecuta un sistema operativo, asegúrate de tener una forma de actualizarlo de manera segura. Para los dispositivos que no tienen un sistema operativo, asegúrate de poder actualizar de forma segura el software del dispositivo si se descubren vulnerabilidades de seguridad después de la implementación.
- Asegúrate de tener una forma de actualizar los certificados raíz. Para averiguar más detalles, consulte el sitio de la autoridad de Internet de Google.
- Asegúrate de que el reloj del dispositivo no esté alterado. Si el reloj del dispositivo está comprometido, un atacante potente puede engañar al dispositivo para que emita tokens que serán válidos en el futuro y eluda el tiempo de vencimiento del token. Para obtener mejores resultados, usa el Servidor NTP público de Google.