Configurando Autenticación Multifactor (MFA) utilizando AWS CLI
Tags: aws, cibersecurity, cli
Published: 2023-09-13 09:47:20

---
title: Configurando Autenticación Multifactor (MFA) utilizando AWS CLI
published: true
date: 2023-09-13 08:00:59 UTC
tags: AWS,aws,cibersecurity,cli
canonical_url: https://iaasgeek.com/2023/09/configurando-autenticacion-multifactor-mfa-utilizando-aws-cli/
series: AWS Security desde la CLI
---

El uso de la Autenticación Multifactor (MFA) proporciona una capa adicional de seguridad que ayuda a proteger las cuentas y datos de accesos no autorizados, reduciendo significativamente el riesgo asociado a la exposición accidental de credenciales o a ataques dirigidos.

##### ¿Por qué debería interesarme esto?

La mejor manera de entender el por qué es con un par de ejemplos. Veamos los siguientes casos de uso para tus aplicaciones:

1. **Prevención de accesos no autorizados debido a filtraciones de credenciales:** Las filtraciones de credenciales son comunes, solo tienes que ir a alguno de los portales disponibles en Internet como _**[mypwd](https://mypwd.io/)**_ o _**[haveibeenpwned.com](https://haveibeenpwned.com/Passwords)**_ para comprobarlo. Si un atacante obtiene la contraseña de un usuario, aún necesitaría el segundo factor de autenticación para acceder a la cuenta. En el caso de aplicaciones críticas o de alto valor, esto es esencial. Por ejemplo, si administras una aplicación financiera o una tienda en línea, la MFA protegería las cuentas de usuario y las transacciones contra accesos indebidos, incluso si las contraseñas son comprometidas.
2. **Acceso seguro a entornos de producción o desarrollo:** Si tienes desarrolladores o administradores que acceden a entornos sensibles, como servidores de producción, bases de datos o sistemas de control de versiones, la MFA garantiza que solo los individuos autorizados puedan realizar cambios o acceder a datos críticos. Esto es especialmente crucial si tus aplicaciones manejan información personal, datos de salud, información financiera u otros datos sensibles o si estás desarrollando nuevos servicios cloud!
3. **Protección contra ataques de tipo phishing y replay:** Los ataques de phishing buscan engañar a los usuarios para que proporcionen credenciales de acceso. Si bien la formación y la concienciación pueden reducir el riesgo, no lo eliminan por completo. Con MFA, incluso si un usuario es engañado para que introduzca su contraseña, el atacante aún necesitaría el factor de autenticación adicional, que es mucho más difícil de obtener. Por ejemplo, si tu aplicación tiene un portal para clientes o empleados, la MFA protegería a esos usuarios de los riesgos asociados a los ataques de phishing.

La MFA actúa como un disuasivo efectivo y una barrera adicional contra la mayoría de las tácticas de ataque más comunes, garantizando que tus aplicaciones y datos estén más seguros.

Veamos cómo podemos configurar la Autenticación Multifactor (MFA) en AWS utilizando la AWS CLI.

**DISCLAIMER:**  Es importante señalar que aunque en el blog podamos mostrar comandos, scripts, u otros ejemplos de código como parte de las demostraciones o discusiones, estos  **se ofrecen**  únicamente  **con fines educativos y de entretenimiento**. Utilice la información proporcionada bajo su propio riesgo.

##### Pre-requisitos:

- Asegúrate de tener instalada y configurada la AWS CLI con las claves de acceso necesarias.
- Consigue un dispositivo MFA físico o instala una aplicación virtual MFA, como Google Authenticator, Authy, o LastPass Authenticator en tu smartphone.

El siguiente diagrama de flujo te mostrará los pasos que ejecutaremos a lo largo de este artículo:

![Diagrama Flujo MFA Config](https://iaasgeek.com/wp-content/uploads/2023/08/MFA-DiagramaFlujo.jpeg)

##### Creando un Dispositivo Virtual MFA:

**Paso 1. Inicializa la creación del dispositivo MFA** :

```
aws iam create-virtual-mfa-device --virtual-mfa-device-name <nombre-del-dispositivo-mfa>
```

Reemplaza `<nombre-del-dispositivo-mfa>` con el nombre deseado para el dispositivo MFA. Este comando devolverá un `SerialNumber` y un `QRCodePNG`, que necesitarás en el siguiente paso.

```
{
    "VirtualMFADevice": {
        "SerialNumber": "arn:aws:iam::123456789012:mfa/<nombre-del-dispositivo-mfa>",
        "Base32StringSeed": "<base32-string>",
        "QRCodePNG": "<binary-data>"
    }
}
```

Dónde:

- **SerialNumber** : Es el número de serie ARN del nuevo dispositivo virtual MFA.
- **Base32StringSeed** : Es la base que se utilizará para configurar la aplicación de autenticación (como Google Authenticator o Authy) para este dispositivo MFA. Normalmente ésta es la cadena que meteríamos en la aplicación si no puedes escanear el código QR proporcionado.
- **QRCodePNG** : Es una representación binaria del código QR que se puede escanear usando una aplicación de autenticación. Si estás trabajando en una interfaz gráfica, podrías redirigir esta salida a un archivo PNG para obtener una imagen escaneable del código QR. Por ejemplo, podrías usar las herramientas `jq` (para procesar JSON) y `base64` para decodificar la información binaria del código QR.

```
jq -r '.VirtualMFADevice.QRCodePNG' output.json | base64 --decode > qr-code.png
```

Esto es lo que sucede:

1. `jq -r '.VirtualMFADevice.QRCodePNG' output.json`: Extrae el valor del campo `QRCodePNG` del archivo JSON y produce una cadena base64 sin comillas.
2. `base64 --decode`: Decodifica la cadena base64 a datos binarios.
3. `> qr-code.png`: Redirige la salida (los datos binarios decodificados) a un archivo llamado `qr-code.png`.

**Nota:** Asegúrate de manejar esta información con cuidado, especialmente la `Base32StringSeed`, ya que alguien con acceso a esta cadena podría configurar un dispositivo MFA para tu cuenta.

**Paso 2. Escanea el código QR** :

Si recibes el código QR como una imagen PNG codificada en Base64 (del campo `QRCodePNG`), necesitarás decodificarlo (como os acabamos de mostrar) y luego escanearlo con tu aplicación virtual MFA.

Si ya tenemos la imagen y solo queremos decodificarlo…

```
echo <valor-QRCodePNG> | base64 --decode > qr.png
```

Después de decodificar, escanea el `qr.png` con tu aplicación virtual MFA.

**Paso 3. Activa el dispositivo MFA** :

En tu aplicación virtual MFA, recupera dos-tres códigos MFA consecutivos. Luego, activa el dispositivo MFA utilizando:

```
aws iam enable-mfa-device --user-name <nombre-de-usuario-aws> --serial-number <numero-de-serie-paso-1> --authentication-code1 <primer-codigo> --authentication-code2 <segundo-codigo>
```

##### Forzar MFA para AWS CLI:

Después de configurar MFA, necesitarás usar un token MFA cada vez que quieras usar la CLI para acciones que requieran MFA. Esto se puede hacer asumiendo un rol o obteniendo un token de sesión con MFA.

Por ejemplo, para obtener un token de sesión con MFA:

```
aws sts get-session-token --serial-number <numero-de-serie-paso-1> --token-code <codigo-mfa-de-la-aplicacion>
```

Esto devolverá credenciales temporales: `AccessKeyId`, `SecretAccessKey`, y `SessionToken` que luego podrás usar para operaciones con la CLI.

```
{
    "Credentials": {
        "AccessKeyId": "ASIA...",
        "SecretAccessKey": "qwe...",
        "SessionToken": "FwoGZXI...",
        "Expiration": "2023-05-15T00:00:00Z"
    }
}
```

Si deseas realizar las operaciones asumiendo un rol en la CLI tienes que añadir una capa adicional de seguridad, ya que requiere que los usuarios autentiquen su identidad usando algo que saben (su contraseña) y algo que tienen (un dispositivo MFA). Primero, debemos crear o modificar una política de permisos que requiera el uso de MFA para poder asumir un rol. Para ello crearemos una política a la que básicamente le diremos: “Niega la acción `sts:AssumeRole` si MFA no está presente”.

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RequireMFA",
            "Effect": "Deny",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::<account-id>:role/<role-name>",
            "Condition": {
               "BoolIfExists": {
                   "aws:MultiFactorAuthPresent": "false"
               }
            }
        }
    ]
}
```

**Asociar la Política al Rol** :

A continuación, debes asociar esta política al rol que deseas proteger con MFA. Utiliza esas credenciales temporales obtenidas de `aws sts get-sesson-token ...` para asumir el rol:

```
aws sts assume-role --role-arn <arn-del-rol> --role-session-name <nombre-de-sesion> --serial-number <arn-del-dispositivo-mfa> --token-code <codigo-mfa-de-la-aplicacion>
```

Esto te proporcionará un nuevo conjunto de credenciales temporales que puedes usar para operaciones con ese rol.

**Configurar las Credenciales** :

Para utilizar estas credenciales temporales en la CLI, debes exportarlas como variables de entorno o almacenarlas en tu archivo de configuración de AWS. Si las quieres exportar como variables de entorno en una terminal Linux o macOS, usa los siguientes comandos:

```
export AWS_ACCESS_KEY_ID=ASIA...
export AWS_SECRET_ACCESS_KEY=qwe...
export AWS_SESSION_TOKEN=FwoGZXI...
```

Una vez que hayas establecido estas variables de entorno, cualquier herramienta o script que uses y que dependa de AWS CLI utilizará estas credenciales temporales hasta que expiren o hasta que cierres la terminal. Si necesitas que persistan entre sesiones utiliza...

**Bash** (la shell predeterminada en muchas versiones de macOS y en Linux)

Abre tu archivo `.zsh` (macOS) o `.bashrc` (Linux) en tu editor preferido. Por ejemplo, con `nano` sería:

```
nano ~/.zshrc # en macos
```

o

```
nano ~/.bashrc # en Linux
```

Añade las siguientes líneas al final del archivo:

```
export AWS_ACCESS_KEY_ID=ASIA...
export AWS_SECRET_ACCESS_KEY=qwe...
export AWS_SESSION_TOKEN=FwoGZXI...
```

Guarda y cierra el archivo. Luego, ejecuta el siguiente comando para que los cambios surtan efecto:

```
source ~/.zshrc # en macos
```

o

```
source ~/.bashrc # en Linux
```

**Nota:** Es importante recordar que guardar credenciales en archivos de perfil puede ser un riesgo de seguridad. Siempre es recomendable cifrar el disco duro y establecer una contraseña segura en tu cuenta de usuario. Adicionalmente, es mejor utilizar herramientas de gestión de credenciales o servicios específicos para la gestión de secretos cuando trabajas en entornos de producción o con datos sensibles. Si lo prefieres, AWS ofrece los siguientes servicios para hacerte la vida más sencilla:

1. **AWS Secrets Manager:** Es un servicio que ayuda a proteger el acceso a tus aplicaciones, servicios y recursos de TI sin el trastorno de rediseñar la infraestructura de tus aplicaciones. Secrets Manager te permite rotar, administrar y recuperar secretos de base de datos y API de forma centralizada a lo largo de su ciclo de vida.
2. **AWS Key Management Service (KMS):** Es un servicio administrado que hace más fácil la creación y control de claves de cifrado utilizadas para cifrar datos. Es integrado con otros servicios de AWS para ayudar a proteger los datos que se almacenan con estos servicios y para las aplicaciones que se ejecutan en Amazon EC2.

##### Consideraciones:

- Recuerda hacer copias de seguridad regularmente de tu configuración (código QR o clave secreta). No os podéis imaginar lo que ayuda en caso de que pierdas el acceso a tu dispositivo MFA.
- Si pierdes tu dispositivo MFA o no puedes acceder a él, deberás contactar al administrador de tu cuenta AWS para desactivar el MFA de tu cuenta.
- Rota regularmente tu secreto MFA para mayor seguridad.

##### Conclusiones

En este artículo hemos visto el proceso de configurar la Autenticación de Dos Factores (MFA) utilizando la CLI de AWS. Esta funcionalidad nos proporciona una capa adicional de seguridad para proteger los recursos y datos en AWS. Ya no tenemos excusas para no fortalecer significativamente la postura de seguridad de nuestra cuenta AWS.

Nos vemos en el siguiente artículo!