DEV Community

olcortesb for AWS Español

Posted on

▶️ Habilitar MFA (Multi-Factor Authentication)🔐 en AWS Cognito usando Terraform

Source: https://olcortesb.hashnode.dev/habilitar-mfa-multi-factor-authentication-en-aws-cognito-usando-terraform

En un post anterior, comentaba como desplegar AWS Cognito y una aplicación cliente utilizando Terraform. Este artículo es parte de la serie que comente realizaría sobre Cognito + Terraform. En el post de hoy nos centraremos en ver como habilitar el Multi Factor de Autenticación en Cognito con Terraform y realizaremos algunas pruebas.

Estructura del repositorio:

Similar al repositorio anterior, pero ahora en una nueva rama “add-mfa-configuration” tenemos el código de Terraform para desplegar nuestra infraestructura.

https://github.com/olcortesb/cognito-terraform/tree/feat/add-mfa-configuration

  • cognito.tf – Main Cognito resources configuration

  • config.tf – Terraform backend configuration

  • variables.tf – Input variable definition

  • maint.tf – AWS provider configuration

  • sns_sms.tf Role and policy for SMS

  • terraform.tfvars – Variable values for deployment

Habilitando el MFA:

Para habilitar el MFA es necesario agregar dentro de la definición del Cognito, además de activar el mfa_configuration es necesario activar el software_token_mfa_configuration, acorde a las definiciones y documentación de Terraform:

 // cognito.tf resource "aws_cognito_user_pool" "this" { ... mfa_configuration = "ON" sms_authentication_message = "Your code is {####}" sms_configuration { external_id = "cognito-external-id" sns_caller_arn = aws_iam_role.cognito_sms_role.arn sns_region = var.region } software_token_mfa_configuration { enabled = true } ... } 
Enter fullscreen mode Exit fullscreen mode

Creando Roles y Policy

El archivo sns_sms.tf tiene los roles y Policy necesarios para el Cognito.

# IAM Role for Cognito to send SMS via SNS resource "aws_iam_role" "cognito_sms_role" { name = "cognito-sms-role" assume_role_policy = jsonencode({ Version = "2012-10-17", Statement = [ { Effect = "Allow", Principal = { Service = "cognito-idp.amazonaws.com" }, Action = "sts:AssumeRole", Condition = { StringEquals = { "sts:ExternalId" = "cognito-external-id" } } } ] }) } # IAM Policy for Cognito SMS Role resource "aws_iam_role_policy" "cognito_sms_policy" { name = "cognito-sms-policy" role = aws_iam_role.cognito_sms_role.id policy = jsonencode({ Version = "2012-10-17", Statement = [ { Effect = "Allow", Action = [ "sns:Publish" ], Resource = "*" // Remplazar por el resources para ambientes productivos } ] }) } 
Enter fullscreen mode Exit fullscreen mode

Configurando el Sandbox para el envío de mensajes:

Es necesario para las pruebas habilitar los números de teléfono en un ambiente de sandbox controlado los teléfonos a los que permitiremos el envío de mensaje, es recomendado probar primero en sandbox antes de pasa a un esquema productivo

Cognito MFA Terraform 1

Es necesario dar de alta los teléfonos que vamos a utilizar en las pruebas.

Cognito MFA Terraform 1.1

Damos de alta un usuario:

En esta configuración no habilitamos la autoverificación del teléfono para asegurarnos que el usuario cargue un teléfono válido

Cognito MFA Terraform 2

Cognito MFA Terraform 3

Prueba de Login:

A continuación un video de ejemplo de como funciona el doble factor de autenticación en Cognito:

Conclusiones

  • Hemos habilitado el MFA con Terraform agregando una configuración al Cognito y un par de Policy y roles.

  • Hemos habilitado el Sandbox, con números de teléfono específicos para las pruebas del Cognito.

  • ⚠️ Importante para remover el MFA por seguridad es necesario dar de baja el Cognito, tener en cuenta para ambientes productivos.

Referencias

Top comments (0)