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.
Top comments (0)