Entrada

Script de automatización de renovación MFA para AWS-CLI

Compartiendo el método de creación de scripts shell para automatizar la autenticación MFA en múltiples regiones de AWS. Resuelve la molestia de autenticación repetitiva al usar AWS CLI.

Introducción

Al usar AWS CLI con cuentas que tienen MFA habilitado, debes autenticarte a través del token MFA del perfil.
Cuando necesitas autenticarte en múltiples regiones, el proceso de autenticación MFA para cada perfil puede ser tedioso.

Quiero escribir un script local para automatizar esto. (Actualmente se puede recibir el valor mfa directamente en el pc.. podría ser más simple..)

Consideraciones principales

1. Análisis de datos Json

  • Usar la herramienta estándar Unix sed en lugar de la librería jq
  • sed tiene la ventaja de no requerir instalación adicional, pero solo es aplicable a estructuras JSON predecibles
    • Como es literalmente una herramienta de edición de texto, solo ayuda cuando los datos a editar son predecibles.
    • En este caso, se usa solo para procesar datos json devueltos por aws sts get-session-token y como la estructura de datos es fija (a menos que aws la cambie) se necesita manejo de exit code

2. Estructura del script

  • Escribir con los valores de configuración necesarios agregados a este script
  • Ejecutar el archivo script con el valor del token mfa como parámetro ej) ./aws_login.sh 123456
  • Usar aws-cli ej) asumiendo consultar lista de buckets s3 aws s3 ls --profile {myProfile}

3. Consideraciones de seguridad

  • Usar solo en entorno local (contiene información sensible como token MFA, token de acceso)
  • También es importante la configuración del tiempo de expiración del token (más tiempo es más conveniente, pero significa más vulnerabilidad de seguridad)

Código

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/bin/bash

# Almacenar valor del token mfa recibido como parámetro en variable
mfa_token=$1

# Configurar valores necesarios para la configuración
aws_access_key_id={}
aws_secret_access_key={}
aws_region={}
arn_number={}
duration_time={}

# Verificar que cada valor de configuración esté ingresado correctamente
if [[ -z $aws_access_key_id || -z $aws_secret_access_key || -z $aws_region || -z $arn_number || -z $duration_time ]]; then
    echo "Las variables de entorno no están configuradas. Por favor verifique e intente de nuevo."
    exit 1
fi

read -p "Primero se limpiará el contenido existente de ~/.aws/config y ~/.aws/credentials. ¿Desea continuar? (y/n): " response
if [[ "$response" != "y" ]]; then
    echo "Terminando el script."
    exit 1
fi

echo "Limpiando config."
> ~/.aws/config

echo "Limpiando credentials."
> ~/.aws/credentials

echo "Limpieza completada"

aws configure set aws_access_key_id $aws_access_key_id
aws configure set aws_secret_access_key $aws_secret_access_key
aws configure set region $aws_region

echo "Configuración completada"

sts_output=$(aws sts get-session-token --serial-number "${arn_number}" --token-code "${mfa_token}" --duration-seconds $duration_time)

# Verificar código de salida (normal:0)
if [ $? -ne 0 ]; then
    echo "Ocurrió un error durante la solicitud de token STS."
    exit 1
fi

echo "STS completado"

access_key_id=$(echo "$sts_output" | sed -n 's/.*"AccessKeyId": "\([^"]*\)".*/\1/p')
secret_access_key=$(echo "$sts_output" | sed -n 's/.*"SecretAccessKey": "\([^"]*\)".*/\1/p')
session_token=$(echo "$sts_output" | sed -n 's/.*"SessionToken": "\([^"]*\)".*/\1/p')

# Verificar si los valores extraídos están vacíos
if [[ -z "$access_key_id" || -z "$secret_access_key" || -z "$session_token" ]]; then
  echo "Falló la extracción de valores de sts_output"
  exit 1
fi

cat <<EOF > ~/.aws/credentials
[default]
aws_access_key_id = ${access_key_id}
aws_secret_access_key = ${secret_access_key}
aws_session_token = ${session_token}
EOF

echo "Éxito"

Resultado

  • Como se muestra abajo, ingresando el valor del token mfa, la autenticación mfa se puede hacer muy simplemente.

result - image

Sin embargo, también existen limitaciones ya que incluso con script de automatización no fue posible autenticar múltiples perfiles de región a la vez porque, como se muestra abajo, un token mfa ya usado no puede usarse para autenticación de perfil de otra región

  • Necesito considerar un método que permita seleccionar la región deseada y autenticar una por una
1
2
An error occurred (AccessDenied) when calling the GetSessionToken operation: MultiFactorAuthentication failed with invalid MFA one time pass code.
Ocurrió un error durante la solicitud de token STS.
Esta entrada está licenciada bajo CC BY 4.0 por el autor.