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 CLIcon cuentas que tienenMFAhabilitado, debes autenticarte a través del tokenMFAdel perfil.
Cuando necesitas autenticarte en múltiples regiones, el proceso de autenticaciónMFApara cada perfil puede ser tedioso.
Quiero escribir un script local para automatizar esto. (Actualmente se puede recibir el valormfadirectamente en elpc.. podría ser más simple..)
Consideraciones principales
1. Análisis de datos Json
- Usar la herramienta estándar Unix
seden lugar de la libreríajq sedtiene la ventaja de no requerir instalación adicional, pero solo es aplicable a estructurasJSONpredecibles- 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
jsondevueltos poraws sts get-session-tokeny como la estructura de datos es fija (a menos que aws la cambie) se necesita manejo deexit code
- Como es literalmente una herramienta de edición de texto, solo ayuda cuando los datos a editar son
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 mfacomo parámetroej) ./aws_login.sh 123456 - Usar
aws-cliej) asumiendo consultar lista de buckets s3aws 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.
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.
