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