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.