Revisión de FIDO2
Este flujo de autenticación incluye los siguientes componentes para admitir el inicio de sesión con un FIDO2:
- Almacenamiento en DynamoDB: Las credenciales FIDO2 se almacenan en una tabla de Amazon DynamoDB, permitiendo un almacenamiento virtualmente ilimitado de credenciales, con detalles como: nombre amigable ("Mi iPhone"), fecha de último uso, número de veces usado, etc.
- API REST de Amazon: Soporta la creación, actualización y eliminación de credenciales FIDO2. Esta API REST está protegida por un autorizador de Amazon Cognito User Pools, lo que significa que debes estar autenticado previamente por otros medios (por ejemplo, usando un Magic Link) para registrar una credencial FIDO2. Solo el recurso de desafío de inicio de sesión es público, para habilitar la autenticación sin nombre de usuario ("usernameless").
- Funciones AWS Lambda: Implementan el flujo de autenticación personalizada de Amazon Cognito, leyendo las claves públicas de las credenciales FIDO2 desde la tabla de DynamoDB
- Bibliotecas de Front End: Incluyen funciones para trabajar con este flujo de autenticación personalizada, que pueden utilizarse en aplicaciones Web, React y React Native.
- Componente React Preconstruido: Incluye un componente React de muestra para agregar, actualizar y eliminar autenticadores.
Primero, hacemos clic en "Manage Authenticators" y luego en "Register New Authenticator".
Lo anterior, genera una petición POST se envía a ite70zpr5g.execute-api.us-east-1.amazonaws.com con la ruta /v1/register-authenticator/start?rpId=d3ghvinynpdcuw.cloudfront.net. Los puntos clave de la petición incluyen:
- Autorización: La cabecera Authorization contiene un token Bearer, que se utiliza para autenticar la solicitud y asegurar que el usuario tenga permiso para realizar esta acción.
La respuesta del servidor es un HTTP 200 OK, indicando que la solicitud fue procesada exitosamente. Los puntos clave de la respuesta incluyen un JSON con varios campos importantes para la configuración del autenticador: un challenge, que es un desafío criptográfico que debe ser resuelto por el autenticador; attestation, que especifica el tipo de atestación requerida, en este caso "none"; rp, que proporciona información sobre el Relying Party, incluyendo el nombre y el ID; user, con información del usuario, como su ID, nombre y nombre para mostrar; pubKeyCredParams, que son los parámetros de la clave pública soportados; authenticatorSelection, que indica que la verificación del usuario es requerida; timeout, que establece el tiempo de espera para completar el proceso en 300,000 milisegundos (5 minutos); y excludeCredentials, una lista vacía que indica que no se excluyen credenciales existentes.
Y lo anterior genera en nuestro navegador el siguiente popup:
Vamos a selección “Windows Hello o llave de seguridad externa” y esto provocara el despliegue del siguiente popup:
Aquí debemos ingresar nuestro PIN, utilizar el reconocimiento facial o, si tenemos un dispositivo como un Flipper, seleccionar la opción de usar otro dispositivo.
Luego de lo anterior, saldrá el siguiente mensaje:
Posteriormente, se genera la siguiente petición:
La petición POST se envía a ite70zpr5g.execute-api.us-east-1.amazonaws.com con la ruta /v1/register-authenticator/complete. Esta solicitud es parte del proceso de registro de un nuevo autenticador en un sistema de autenticación sin contraseñas (passwordless) utilizando FIDO2.
Los puntos clave de la petición incluyen:
- attestationObjectB64: Un objeto de atestación codificado en base64 que contiene información sobre la autenticación realizada.
- clientDataJSON_B64: Datos del cliente codificados en base64 que incluyen el tipo de operación, el desafío, el origen y la configuración del navegador.
- transports: Métodos de transporte soportados por el autenticador (en este caso, "internal").
- friendlyName: Un nombre amigable para el autenticador, proporcionado por el usuario.
En el contexto de la autenticación FIDO2/WebAuthn, una atestación es un proceso de verificación y validación en el que un autenticador (como una llave de seguridad, un teléfono móvil, o un dispositivo biométrico) prueba su autenticidad y su origen legítimo a un servidor (o Relying Party).
Detalles Clave de la Atestación:
Proporciona Garantías de Seguridad:
La atestación permite que el servidor confíe en que el autenticador es genuino y que no ha sido comprometido. Esto es esencial para asegurar que los dispositivos utilizados para autenticarse no sean falsificados o maliciosos.
Certificados de Atestación:
Durante el proceso de atestación, el autenticador presenta un certificado de atestación, que generalmente incluye una clave pública firmada por una autoridad de certificación (CA) de confianza. Este certificado demuestra que el autenticador ha sido fabricado por un proveedor legítimo y sigue estándares de seguridad específicos.
Tipos de Atestación:
Existen varios tipos de atestación:
- Atestación Básica: Proporciona una clave pública y un certificado que indica el fabricante del autenticador.
- Atestación de Auto-Firma (Self-Attestation): El autenticador genera su propio certificado sin una autoridad externa, útil en casos donde se necesita privacidad adicional.
- Atestación de Anonimato (Anonymized Attestation): Proporciona anonimato al autenticador, protegiendo la privacidad del usuario.
Proceso de Verificación:
El servidor recibe los datos de atestación y verifica su validez comprobando la firma digital y asegurándose de que el certificado corresponde a un autenticador confiable.
Configuración de Seguridad:
La atestación puede incluir configuraciones de seguridad adicionales, como métodos de transporte soportados y capacidades del autenticador (por ejemplo, si soporta verificación biométrica o si puede ser usado como respaldo).
Importancia de la Atestación
La atestación es crucial para establecer una relación de confianza entre el usuario, el autenticador y el servidor. Asegura que solo dispositivos legítimos y seguros puedan ser utilizados para autenticarse, lo que protege contra intentos de acceso no autorizados y mantiene la integridad del sistema de autenticación.
Por otro lado, la respuesta del servidor es un HTTP 200 OK, indicando que la solicitud fue procesada exitosamente. Los puntos clave de la respuesta incluyen:
Contenido de la Respuesta:
La respuesta proporciona un JSON con varios campos importantes:
- credentialId: Identificador de la credencial registrada.
- signCount: Contador de firmas, que es 0 en este caso.
- friendlyName: El nombre amigable del autenticador, en este caso "TestGerh".
- flagUserVerified: Indica que el usuario ha sido verificado.
- flagBackupEligibility y flagBackupState: Indicadores relacionados con la elegibilidad y el estado de respaldo del autenticador.
- transports: Métodos de transporte soportados.
- aaguid: Identificador global del autenticador.
- rpId: Identificador del Relying Party, que en este caso es "d3ghvinynpdcuw.cloudfront.net".
Y finalmente, si clickeamos en “Manage Authenticators” se genera la siguiente petición:
Por lo tanto, cerramos la sesión haciendo clic en "Sign Out" para generar la siguiente petición:
Y finalicemos, nuevamente intentando iniciar sesión, pero seleccionando la opción de “Sign in with Face or Touch”.
Al clickear en dicha opción, se puede apreciar el siguiente popup de Windows:
Y luego de colocar nuestro PIN o utilizar el método de autenticación, se puede apreciar la siguiente petición: