View a markdown version of this page

Centralización de la administración de claves de acceso de IAM en AWS Organizations mediante Terraform - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Centralización de la administración de claves de acceso de IAM en AWS Organizations mediante Terraform

Aarti Rajput, Chintamani Aphale, T.V.R.L.Phani Kumar Dadi, Pratap Kumar Nanda, Pradip kumar Pandey y Mayuri Shinde, Amazon Web Services

Resumen

Hacer cumplir las normas de seguridad para las claves y contraseñas es una tarea esencial para todas las organizaciones. Una regla importante es rotar las claves de AWS Identity and Access Management (IAM) a intervalos regulares para reforzar la seguridad. Por lo general, las claves de acceso de AWS se crean y configuran localmente cuando los equipos quieren acceder a AWS desde la interfaz de la línea de comandos de AWS (AWS CLI) o desde aplicaciones ajenas a AWS. Para mantener una seguridad sólida en toda la organización, las claves de seguridad antiguas deben cambiarse o eliminarse una vez que se haya cumplido el requisito o a intervalos regulares. El proceso de gestionar la rotación de claves en varias cuentas de una organización lleva mucho tiempo y es tedioso. Este patrón lo ayudará a automatizar el proceso de rotación mediante Generador de cuentas para Terraform (AFT) y los servicios de AWS.

El patrón le ofrece las ventajas siguientes:

  • Administra la clave de acceso IDs y las claves de acceso secretas de todas las cuentas de su organización desde una ubicación central.

  • Rota automáticamente las variables de entorno AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY.

  • Exige la renovación de las credenciales de los usuarios si estas se ven comprometidas.

El patrón usa Terraform para implementar funciones de AWS Lambda, reglas de EventBridge Amazon y roles de IAM. Una EventBridge regla se ejecuta a intervalos regulares y llama a una función Lambda que enumera todas las claves de acceso de los usuarios en función del momento en que se crearon. Las funciones de Lambda adicionales crean un nuevo ID de clave de acceso y una clave de acceso secreta, si la clave antigua es anterior al período de rotación que se haya definido (por ejemplo, 45 días); a continuación, se notifica a un administrador de seguridad mediante Amazon Simple Notification Service (Amazon SNS) y Amazon Simple Email Service (Amazon SES). Los secretos se crean en AWS Secrets Manager para ese usuario, la clave de acceso secreta antigua se almacena en Secrets Manager y se configuran los permisos para acceder a la clave antigua. Para garantizar que la clave de acceso anterior ya no se utilice, se deshabilita después de un período de inactividad (por ejemplo, 60 días; en nuestro ejemplo, serán 15 días después de rotar las claves). Tras un período de almacenamiento inactivo (en nuestro ejemplo, 90 días o 45 días después de rotar las claves), las claves de acceso antiguas se eliminan de AWS Secrets Manager. Para obtener información detallada sobre la arquitectura y el flujo de trabajo, consulte la sección Arquitectura.

Requisitos previos y limitaciones

Arquitectura

Repositorios de AFT

Este patrón utiliza el Generador de cuentas para Terraform (AFT) para crear todos los recursos de AWS necesarios y la canalización de código para implementar los recursos en una cuenta de implementación. La canalización de código se ejecuta en dos repositorios:

  • La personalización global contiene el código de Terraform que se aplicará a todas las cuentas registradas en AFT.

  • Las personalizaciones de la cuenta contienen el código de Terraform que se ejecutará en la cuenta de implementación.

Detalles del recurso

Los CodePipeline trabajos de AWS crean los siguientes recursos en la cuenta de implementación:

  • EventBridge Regla de AWS y regla configurada

  • Función de Lambda account-inventory

  • Función de Lambda IAM-access-key-rotation

  • Función de Lambda Notification

  • Bucket de Amazon Simple Storage Service (Amazon S3) que contiene una plantilla de correo electrónico

  • Política de IAM obligatoria

Arquitectura

Arquitectura para centralizar la administración de claves de acceso de IAM en AWS Organizations

En el siguiente diagrama se ilustra lo siguiente:

  1. Una EventBridge regla llama a la función account-inventory Lambda cada 24 horas.

  2. La función account-inventory Lambda consulta a AWS Organizations una lista de todas las cuentas IDs, nombres de cuentas y correos electrónicos de cuentas de AWS. 

  3. La función de Lambda account-inventory inicia una función de Lambda IAM-access-key-auto-rotation para cada cuenta de AWS y le pasa los metadatos para su procesamiento adicional.

  4. La función de Lambda IAM-access-key-auto-rotation utiliza un rol de IAM asumido para acceder a la cuenta de AWS. El script de Lambda ejecuta una auditoría de todos los usuarios y sus claves de acceso de IAM en la cuenta.

  5. El umbral de rotación de la clave de IAM (período de rotación) se configura como una variable de entorno cuando se implementa la función de Lambda IAM-access-key-auto-rotation. Si se modifica el período de rotación, la función de Lambda IAM-access-key-auto-rotation se vuelve a implementar con una variable de entorno actualizada. Puede configurar los parámetros para establecer el período de rotación, el período de inactividad de las claves antiguas y el búfer inactivo tras el cual se eliminarán las claves antiguas (consulte Personalización de los parámetros de la cadena de códigos en la sección Epics).

  6. La función de Lambda IAM-access-key-auto-rotation valida la antigüedad de la clave de acceso en función de su configuración. Si la antigüedad de la clave de acceso de IAM no ha excedido el período de rotación definido, la función de Lambda no realiza ninguna otra acción.

  7. Si la antigüedad de la clave de acceso de IAM ha superado el período de rotación que ha definido, la función de Lambda IAM-access-key-auto-rotation cree una clave nueva y rote la clave existente.

  8. La función de Lambda guarda la clave anterior en Secrets Manager y limita los permisos al usuario cuyas claves de acceso no cumplan con los estándares de seguridad. La función de Lambda también crea una política basada en recursos que sólo permite a la entidad principal de IAM especificada acceder al secreto y recuperarlo.

  9. La función de Lambda IAM-access-key-rotation llama a la función de Lambda Notification.

  10. La función de Lambda Notification consulta el bucket de S3 en busca de una plantilla de correo electrónico y genera dinámicamente mensajes de correo electrónico con los metadatos de actividad relevantes.

  11. La función de Lambda Notification solicita a Amazon SES que tome medidas adicionales.

  12.  Amazon SES envía un correo electrónico a la dirección de correo electrónico del propietario de la cuenta con la información pertinente.

Tools (Herramientas)

Servicios de AWS

  • AWS Identity and Access Management (IAM) le permite administrar de forma segura el acceso a los recursos de AWS mediante el control de quién está autenticado y autorizado a utilizarlos. Este patrón requiere roles y permisos de IAM.

  • AWS Lambda es un servicio de computación que ayuda a ejecutar código sin necesidad de aprovisionar ni administrar servidores. Ejecuta el código solo cuando es necesario y amplía la capacidad de manera automática, por lo que solo pagará por el tiempo de procesamiento que utilice.

  • AWS Secrets Manager le permite reemplazar las credenciales codificadas en el código, incluidas las contraseñas, con una llamada a la API de Secrets Manager para recuperar el secreto mediante programación.

  • Amazon Simple Email Service (Amazon SES) facilita poder enviar y recibir correos electrónicos a través de los dominios y direcciones de correo electrónico propios.

Otras herramientas

  • Terraform es una herramienta de infraestructura como código (IaC) HashiCorp que le ayuda a crear y administrar recursos locales y en la nube.

Repositorio de código

Las instrucciones y el código de este patrón están disponibles en el repositorio de rotación de claves de acceso de GitHub IAM. Puede implementar el código en la cuenta de implementación central de AWS Control Tower para gestionar la rotación de claves desde una ubicación central.

Prácticas recomendadas

Epics

TareaDescripciónHabilidades requeridas

Clonar el repositorio.

  1. Clone el repositorio de rotación GitHub de claves de acceso de IAM:

    $ git clone https://github.com/aws-samples/centralized-iam-key-management-aws-organizations-terraform.git
  2. Confirme que la copia local del repositorio contiene tres carpetas:

    $ cd Iam-Access-keys-Rotation $ ls org-account-customization global-account-customization account-customization
DevOps ingeniero
TareaDescripciónHabilidades requeridas

Configure la cuenta de arranque.

Como parte del proceso de arranque de AFT, debe tener una carpeta llamada aft-bootstrap en su máquina local.

  1. Copie todos los archivos de Terraform manualmente de su GitHub org-account-customizationcarpeta local a su aft-bootstrap carpeta.

  2. Ejecute los comandos de Terraform para configurar el rol global entre cuentas en la cuenta de administración de AWS Control Tower:

    $ cd aft-bootstrap $ terraform init $ terraform apply —auto-approve
DevOps ingeniero

Configure las personalizaciones globales.

Como parte de la configuración de la carpeta AFT, debe tener una carpeta llamada aft-global-customizations en su máquina local.

  1. Copie manualmente todos los archivos de Terraform de su GitHub global-account-customizationcarpeta local a su aft-global-customizations/terraform carpeta.

  2. Envía el código a AWS CodeCommit:

    $ git add * $ git commit -m "message" $ git push
DevOps ingeniero

Configure las personalizaciones de cuentas.

Como parte de la configuración de la carpeta AFT, debe tener una carpeta llamada aft-account-customizations en su máquina local.

  1. Cree una carpeta con el número de cuenta vendida.

  2. Copia manualmente todos los archivos de Terraform de la carpeta de GitHub personalización de tu cuenta local a tu carpeta. aft-account-customizations/<vended account>/terraform

  3. Envía el código a AWS CodeCommit:

    $ git add * $ git commit -m "message" $ git push
DevOps ingeniero
TareaDescripciónHabilidades requeridas

Personalice los parámetros de la canalización de códigos que no sean de Terraform para todas las cuentas.

Cree un archivo llamado input.auto.tfvars en la carpeta aft-global-customizations/terraform/ y proporcione los datos de entrada necesarios. Consulte el archivo del GitHub repositorio para ver los valores predeterminados.

DevOps ingeniero

Personalice los parámetros de la canalización del código para la implementación de la cuenta.

Cree un archivo llamado input.auto.tfvars en la aft-account-customizations/<AccountName>/terraform/ carpeta y envíe el código a AWS CodeCommit. Al enviar código a AWS, CodeCommit se inicia automáticamente la canalización del código.

Especifique los valores de los parámetros en función de los requisitos de su organización, incluidos los siguientes (consulte el archivo del repositorio de Github para ver los valores predeterminados):

  • s3_bucket_name: un nombre de bucket exclusivo para la plantilla de correo electrónico.

  • s3_bucket_prefix: un nombre de carpeta en el bucket de S3.

  • admin_email_address: dirección de correo electrónico del administrador que debe recibir la notificación.

  • org_list_account: número de cuenta de la cuenta de administración.

  • rotation_period: número de días después de los cuales una clave debe pasar de activa a inactiva.

  • inactive_period: número de días después de los cuales se deben desactivar las claves que han pasado la rotación. El valor de debe ser mayor que rotation_period.

  • inactive_buffer: período de gracia entre la rotación y la desactivación de una clave.

  • recovery_grace_period: período de gracia entre la desactivación y la eliminación de una clave.

  • dry_run_flag: establezca su valor en true si quiere enviar una notificación al administrador con fines de prueba, sin necesidad de rotar las claves.

  • store_secrets_in_central_account: establezca su valor en true si quiere almacenar el secreto en la cuenta de administración. Si la variable se establece en false (predeterminado), el secreto se almacenará en la cuenta de miembro.

  • credential_replication_region: región de AWS en la que desea implementar la función de Lambda y los buckets de S3 para la plantilla de correo electrónico.

  • run_lambda_in_vpc: establezca su valor en true para ejecutar la función de Lambda en la VPC.

  • vpc_id: ID de la VPC de la cuenta de implementación, si quiere ejecutar la función de Lambda en la VPC.

  • vpc_cidr: rango CIDR de la cuenta de implementación.

  • subnet_id— La subred de la IDs cuenta de implementación.

  • create_smtp_endpoint: establezca su valor en true si quiere habilitar el punto de conexión de correo electrónico.

DevOps ingeniero
TareaDescripciónHabilidades requeridas

Valide la solución.

  1. Desde la consola de administración de AWS, inicie sesión en la cuenta de implementación.

  2. Abra la consola de IAM y compruebe si las credenciales de usuario (clave de acceso IDs y claves secretas) se rotan según lo especificado.

  3. Tras rotar una clave de IAM, confirme lo siguiente:

    • El valor antiguo se guarda en AWS Secrets Manager.

    • El nombre del secreto tiene el formato Account_<account ID>_User_<username>_AccessKey.

    • El usuario que especificó en el parámetro admin_email_address recibe una notificación por correo electrónico sobre la rotación de claves.

DevOps ingeniero
TareaDescripciónHabilidades requeridas

Personalice la fecha de notificación por correo electrónico.

Si desea enviar notificaciones por correo electrónico un día específico antes de deshabilitar la clave de acceso, puede actualizar la función de Lambda IAM-access-key-auto-rotation con esos cambios:

  1. Defina una variable llamada notify-period.

  2. Añada una condición if en main.py antes de desactivar la clave:

    If (keyage>rotation-period-notify-period){ send_to_notifier(context, aws_account_id, account_name, resource_owner, resource_actions[resource_owner], dryrun, config.emailTemplateAudit) }
DevOps ingeniero

Resolución de problemas

ProblemaSolución

El trabajo de Lambda account-inventory devuelve un error con AccessDenied al enumerar las cuentas.

Si ve este problema, debe validar los permisos:

  1. Inicia sesión en la cuenta recién vendida, abre la CloudWatch consola de Amazon y, a continuación, consulta el grupo /aws/lambda/account-inventory-lambda de CloudWatch registros.

  2. En los CloudWatch registros más recientes, identifica el número de cuenta que está causando el problema de acceso denegado.

  3. Inicie sesión en la cuenta de administración de AWS Control Tower y confirme que se creó el rol allow-list-account.

  4. Si el rol no existe, vuelva a ejecutar el código de Terraform con el comando terraform apply.

  5. Seleccione la pestaña Cuenta de confianza y compruebe que la misma cuenta es de confianza.

Recursos relacionados