▶️ 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
  }
  ...
}

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
      }
    ]
  })
}

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

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

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

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

0
Subscribe to my newsletter

Read articles from Oscar Cortes Bracho directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Oscar Cortes Bracho
Oscar Cortes Bracho

Cloud Software Engineer