Mejores prácticas para la gestión segura de credenciales con la AWS CLI

Aprenda las mejores prácticas definitivas para proteger sus credenciales de la AWS CLI. Esta guía cubre el orden de carga de credenciales, el uso adecuado de archivos de configuración, variables de entorno y, de manera crucial, cómo aprovechar los roles de IAM y AWS SSO para eliminar el riesgo de almacenar claves de acceso estáticas de larga duración. Implemente estas estrategias para lograr una seguridad sólida en sus flujos de trabajo de automatización y gestión de AWS.

Mejores Prácticas para Gestionar Credenciales de Forma Segura con la CLI de AWS

Las credenciales de la CLI de AWS pueden crear, eliminar y exponer recursos reales en la nube, por lo que una clave de acceso filtrada no es un error menor. La configuración más segura proporciona a los humanos credenciales de corta duración a través de IAM Identity Center y otorga a las cargas de trabajo credenciales temporales mediante roles.

Estas mejores prácticas para gestionar credenciales de forma segura con la CLI de AWS explican dónde busca la CLI las credenciales, cuándo usar perfiles y cómo evitar claves estáticas de larga duración en scripts.

Entendiendo el Orden de Carga de Credenciales de la CLI de AWS

La CLI de AWS resuelve las credenciales a través de una cadena de proveedores. La cadena exacta puede variar según la versión de la CLI y la configuración, pero el orden práctico que solucionarás con más frecuencia es:

  1. Variables de Entorno: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY y opcionalmente AWS_SESSION_TOKEN.
  2. Configuración de asunción de roles e identidad web: Perfiles que indican a la CLI que llame a AWS STS para obtener credenciales temporales.
  3. Credenciales de IAM Identity Center: Perfiles creados por aws configure sso o aws configure sso-session.
  4. Archivo de credenciales compartido: Generalmente ~/.aws/credentials.
  5. Archivo de configuración compartido: Generalmente ~/.aws/config, incluyendo entradas credential_process.
  6. Credenciales de contenedor: Roles de tarea de ECS y endpoints de credenciales de contenedor compatibles.
  7. Credenciales de perfil de instancia EC2: Credenciales temporales del Servicio de Metadatos de Instancia (IMDS).

La CLI de AWS no utiliza los indicadores de línea de comandos --access-key-id o --secret-access-key para comandos normales. Si ves esos en un script, probablemente se esté confundiendo el comportamiento de la CLI de AWS con otra herramienta o SDK.

1. Asegurando Credenciales en Archivos de Configuración (~/.aws/credentials)

El archivo de credenciales compartido, típicamente ~/.aws/credentials, es conveniente pero debería ser un recurso de respaldo para casos donde no puedas usar IAM Identity Center o roles. Si debes almacenar claves estáticas allí, protege el archivo y mantén los permisos restringidos.

Protección del Archivo y Permisos

Es vital restringir el acceso de lectura a este archivo. En sistemas Linux/macOS, establece permisos para que solo el propietario pueda leer o escribir el archivo:

chmod 600 ~/.aws/credentials

Uso de Perfiles para Segregación

Usar perfiles distintos te permite separar credenciales para diferentes entornos (por ejemplo, desarrollo, pruebas, producción) o diferentes cuentas. Esto evita acciones accidentales entre entornos.

Ejemplo de ~/.aws/credentials:

[default]
aws_access_key_id = AKIAEXAMPLE000000000
aws_secret_access_key = exampleSecretAccessKeyDoNotUse

[production-user]
aws_access_key_id = AKIAEXAMPLE111111111
aws_secret_access_key = anotherExampleSecretDoNotUse

Al usar un perfil con nombre, debes especificarlo con el indicador --profile:

aws s3 ls --profile production-user

2. Aprovechando las Variables de Entorno

Las variables de entorno proporcionan credenciales al proceso actual y sus procesos hijos sin editar los archivos de configuración de AWS. Son útiles para sesiones temporales y trabajos de CI, pero aún pueden filtrarse a través de entornos de proceso, registros de depuración o un historial de shell descuidado.

Establece las siguientes variables en tu sesión de shell:

export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE"
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
export AWS_SESSION_TOKEN="temporary-session-token-if-using-sts"
export AWS_DEFAULT_REGION="us-east-1"

Nota Importante sobre Prioridad: Las credenciales establecidas mediante variables de entorno siempre anulan las que se encuentran en el archivo ~/.aws/credentials, ya que aparecen más arriba en la cadena de carga de credenciales.

Advertencia de Seguridad: Ten cuidado al exportar variables de entorno, especialmente en terminales compartidas o scripts que puedan ser registrados. Siempre anúlalas inmediatamente después de usarlas:

unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset AWS_SESSION_TOKEN

3. Prefiere Roles de IAM para Cargas de Trabajo en AWS

Para cargas de trabajo que se ejecutan en infraestructura de AWS, como EC2, Lambda, ECS y EKS, evita las credenciales estáticas. Usa roles de IAM para que AWS emita credenciales temporales automáticamente.

En EC2, un perfil de instancia expone credenciales temporales a través de IMDS. En ECS, los roles de tarea exponen credenciales a través del endpoint de credenciales del contenedor. En EKS, los Roles de IAM para Cuentas de Servicio utilizan tokens de identidad web. La CLI de AWS y los SDKs saben cómo usar estos proveedores sin almacenar claves de larga duración en disco.

Cómo Funciona:

  1. Se lanza una instancia EC2 con un rol de IAM asociado a través de un perfil de instancia.
  2. La CLI que se ejecuta en esa instancia consulta el Servicio de Metadatos de Instancia (IMDS) para obtener credenciales temporales.
  3. La CLI utiliza estas credenciales temporales para todas las llamadas API posteriores.

Esto elimina por completo el riesgo asociado con las claves de acceso de larga duración.

4. Usa IAM Identity Center para Acceso Humano

Para ingenieros que usan la CLI de AWS desde portátiles, IAM Identity Center suele ser más seguro que las claves de acceso de usuario de IAM. Inicias sesión a través de un navegador, eliges una cuenta y un rol, y la CLI utiliza credenciales almacenadas en caché de corta duración.

Configúralo con:

aws configure sso

Luego inicia sesión cuando tu sesión expire:

aws sso login --profile <nombre-del-perfil>

IAM Identity Center se llamaba anteriormente AWS SSO, por lo que aún puedes ver sso en comandos de la CLI y claves de configuración.

5. Usa credential_process para Agentes Externos

Puedes configurar la CLI para llamar a una herramienta externa, como un agente de bóveda o un agente de credenciales empresarial, para obtener credenciales dinámicamente. Esto se especifica en ~/.aws/config:

Ejemplo de ~/.aws/config:

[profile my-vault-profile]
region = us-west-2
credential_process = /usr/local/bin/my-vault-cli get-aws-creds --profile my-vault-profile

Este método es crucial al integrarse con herramientas de gestión de secretos como HashiCorp Vault.

Resumen de Mejores Prácticas y Lista de Verificación

Para maximizar la seguridad de tus operaciones con la CLI de AWS, adhiérete a estos principios fundamentales:

  • Principio de Mínimo Privilegio: Asegúrate de que todos los usuarios y roles de IAM tengan solo los permisos estrictamente necesarios para realizar sus trabajos.
  • Prefiere Roles sobre Claves: Siempre usa Roles de IAM (Perfiles de Instancia) al operar dentro de la infraestructura de AWS.
  • Usa IAM Identity Center: Para uso interactivo humano, usa IAM Identity Center para gestionar el acceso a múltiples cuentas.
  • Nunca Codifiques Claves: Evita poner Claves de Acceso directamente en scripts, código fuente o historial de comandos.
  • Protege el Archivo de Credenciales: Restringe los permisos del sistema de archivos (chmod 600) en ~/.aws/credentials.
  • Rota las Claves Regularmente: Si se deben usar claves estáticas, impón un programa de rotación estricto.

Tu opción predeterminada deben ser las credenciales temporales: IAM Identity Center para personas, roles de IAM para cargas de trabajo y credential_process para acceso empresarial intermediado. Usa claves de acceso estáticas solo cuando no haya una mejor opción, luego delimítalas estrictamente, gíralas y elimínalas tan pronto como desaparezca la dependencia.