Usa Terraform para habilitar Amazon automáticamente GuardDuty para una organización - 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.

Usa Terraform para habilitar Amazon automáticamente GuardDuty para una organización

Creado por Aarthi Kannan (AWS)

Resumen

Amazon supervisa GuardDuty continuamente sus cuentas de Amazon Web Services (AWS) y utiliza información sobre amenazas para identificar actividades inesperadas y potencialmente maliciosas en su entorno de AWS. La activación manual GuardDuty de varias cuentas u organizaciones, en varias regiones de AWS o a través de la consola de administración de AWS puede resultar engorrosa. Puede automatizar el proceso mediante una herramienta de infraestructura como código (IaC) como Terraform, capaz de aprovisionar y administrar servicios y recursos de múltiples cuentas y regiones en la nube.

AWS recomienda usar AWS Organizations para configurar y administrar varias cuentas en GuardDuty. Este patrón sigue dicha recomendación. Una de las ventajas de este enfoque es que, cuando se creen o agreguen nuevas cuentas a la organización, se GuardDuty habilitarán automáticamente en estas cuentas para todas las regiones compatibles, sin necesidad de intervención manual.

Este patrón muestra cómo usar HashiCorp Terraform para habilitar Amazon GuardDuty para tres o más cuentas de Amazon Web Services (AWS) en una organización. El código de ejemplo proporcionado en este patrón hace lo siguiente:

  • Se habilita GuardDuty para todas las cuentas de AWS que son miembros actuales de la organización objetivo en AWS Organizations

  • Activa la función de activación automática en GuardDuty, que se habilita automáticamente GuardDuty para cualquier cuenta que se añada a la organización de destino en el futuro

  • Te permite seleccionar las regiones en las que quieres activarlas GuardDuty

  • Utiliza la cuenta de seguridad de la organización como GuardDuty administrador delegado

  • Crea un depósito de Amazon Simple Storage Service (Amazon S3) en la cuenta de registro y se GuardDuty configura para publicar los resultados agregados de todas las cuentas de este depósito.

  • Asigna una política de ciclo de vida que, de forma predeterminada, transfiere los resultados del bucket de S3 al almacenamiento de Amazon S3 Glacier Flexible Retrieval después de 365 días

Puede ejecutar manualmente este código de ejemplo o bien integrarlo en su proceso de integración y entrega continuas (CI/CD).

Público objetivo

Este patrón se recomienda para los usuarios que tengan experiencia con Terraform GuardDuty, Python y AWS Organizations.

Requisitos previos y limitaciones

Requisitos previos

  • Una cuenta de AWS activa.

  • Una organización configurada en AWS Organizations que contenga, al menos, las tres cuentas siguientes:

    • Una cuenta de administración: esta es la cuenta desde la que se implementa el código de Terraform, ya sea de forma independiente o como parte del proceso de CI/CD. El estado de Terraform también se almacena en esta cuenta.

    • Una cuenta de seguridad: esta cuenta se utiliza como administrador GuardDuty delegado. Para obtener más información, consulte Consideraciones importantes para los administradores GuardDuty delegados (GuardDuty documentación).

    • Una cuenta de registro: esta cuenta contiene el depósito de S3, donde se GuardDuty publican los resultados agregados de todas las cuentas de los miembros.

    Para obtener más información sobre cómo configurar la organización con los ajustes requeridos, consulte Crear una estructura de cuentas (AWS Well-Architected Labs).

  • Un bucket de Amazon S3 y una tabla de Amazon DynamoDB que sirvan como backend remoto para almacenar el estado de Terraform en la cuenta de administración. Para obtener más información sobre el uso de backends remotos para el estado de Terraform, consulte los backends de S3 (documentación de Terraform). Para ver un ejemplo de código que configura la administración remota del estado con un backend de S3, consulte remote-state-s3-backend (Terraform Registry). Tenga en cuenta los siguientes requisitos:

    • El bucket de S3 y la tabla de DynamoDB deben estar en la misma región.

    • Al crear la tabla de DynamoDB, la clave de partición debe ser LockID (distingue entre mayúsculas y minúsculas), y el tipo de clave de partición debe ser String. Todos los demás valores de la tabla deben estar en sus valores predeterminados. Para obtener más información, consulte Acerca de las claves principales y Creación de una tabla (documentación de DynamoDB).

  • Un depósito de S3 que se utilizará para almacenar los registros de acceso del depósito de S3 en el que GuardDuty se publicarán los resultados. Para obtener más información, consulte Habilitar el registro de acceso al servidor de Amazon S3 (documentación de Amazon S3). Si va a realizar la implementación en una zona de aterrizaje de AWS Control Tower, puede reutilizar el bucket de S3 de la cuenta del archivo de registros para este fin.

  • Terraform version 0.14.6 o versión posterior, instalada y configurada. Para obtener más información, consulte Introducción - AWS (documentación de Terraform).

  • Python versión 3.9.6 o una versión posterior, instalada y configurada. Para obtener más información, consulte Versiones de origen (sitio web de Python).

  • AWS SDK para Python (Boto3) instalado. Para obtener más información, consulte Instalación (documentación de Boto3).

  • jq está instalado y configurado. Para obtener más información, consulte Descargar jq (documentación de jq).

Limitaciones

  • Este patrón es compatible con los sistemas operativos macOS y Amazon Linux 2. No se ha probado el uso de este patrón en sistemas operativos Windows.

    nota

    Amazon Linux 2 está a punto de finalizar el soporte. Para obtener más información, consulte Amazon Linux 2 FAQs.

  • GuardDuty no debe estar ya activado en ninguna de las cuentas ni en ninguna de las regiones de destino.

  • La solución IaC de este patrón no implementa los requisitos previos.

  • Este patrón ha sido diseñado para una AWS Landing Zone que satisfaga las siguientes prácticas recomendadas:

    • Zona de aterrizaje creada mediante AWS Control Tower.

    • Cuentas de AWS independientes para la seguridad y el registro.

Versiones de producto

  • Versión de Terraform 0.14.6 o posterior. El código de ejemplo se ha probado en la versión 1.2.8.

  • Python, versión 3.9.6 o posterior.

Arquitectura

En esta sección se ofrece información general de alto nivel sobre esta solución y la arquitectura establecida en el código de ejemplo. El siguiente diagrama muestra los recursos implementados en las distintas cuentas de la organización, dentro de una única región de AWS.

Diagrama de arquitectura que muestra los recursos de administración, seguridad, registro y cuentas de miembros.
  1. Terraform crea el rol GuardDutyTerraformOrgRoleAWS Identity and Access Management (IAM) en la cuenta de seguridad y en la cuenta de registro.

  2. Terraform crea un bucket de S3 en la región de AWS predeterminada de la cuenta de registro. Este segmento se usa como destino de publicación para agregar todos los GuardDuty hallazgos de todas las regiones y de todas las cuentas de la organización. Terraform también crea una clave de AWS Key Management Service (AWS KMS) en la cuenta de seguridad usada para cifrar los resultados del bucket de S3, y configura el archivo automático de los resultados del bucket de S3 en el almacenamiento de S3 Glacier Flexible Retrieval.

  3. Desde la cuenta de administración, Terraform designa la cuenta de seguridad como administrador delegado. GuardDuty Esto significa que la cuenta de seguridad ahora administra el GuardDuty servicio para todas las cuentas de los miembros, incluida la cuenta de administración. Las cuentas de los miembros individuales no se pueden suspender ni deshabilitar GuardDuty por sí mismas.

  4. Terraform crea el GuardDuty detector en la cuenta de seguridad para el administrador GuardDuty delegado.

  5. Si aún no está activado, Terraform habilita la protección S3. GuardDuty Para obtener más información, consulte la protección de Amazon S3 en Amazon GuardDuty (GuardDuty documentación).

  6. Terraform inscribe como miembros a todas las cuentas actuales y activas de la organización. GuardDuty

  7. Terraform configura al administrador GuardDuty delegado para que publique los resultados agregados de todas las cuentas de los miembros en el segmento S3 de la cuenta de registro.

  8. Terraform repite los pasos 3 a 7 para cada región de AWS que elija.

Automatizar y escalar

El código de muestra proporcionado está modularizado para que pueda integrarlo en su proceso de CI/CD con el fin de lograr una implementación automatizada.

Herramientas

Servicios de AWS

  • Amazon DynamoDB es un servicio de base de datos de NoSQL completamente administrado que ofrece un rendimiento rápido, predecible y escalable.

  • Amazon GuardDuty es un servicio de supervisión continua de la seguridad que analiza y procesa los registros para identificar actividades inesperadas y potencialmente no autorizadas en su entorno 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.

  • AWS Key Management Service (AWS KMS) le ayuda a crear y controlar claves criptográficas para proteger sus datos.

  • AWS Organizations es un servicio de administración de cuentas que le permite agrupar varias cuentas de AWS en una organización que usted crea y administra de manera centralizada.

  • Amazon Simple Storage Service (Amazon S3) es un servicio de almacenamiento de objetos basado en la nube que le ayuda a almacenar, proteger y recuperar cualquier cantidad de datos.

  • AWS SDK para Python (Boto3) es un kit de desarrollo de software que permite integrar su aplicación, biblioteca o script de Python con los servicios de AWS.

Otras herramientas y servicios

  • HashiCorp Terraform es una aplicación de interfaz de línea de comandos que le ayuda a usar código para aprovisionar y administrar la infraestructura y los recursos de la nube.

  • Python es un lenguaje de programación informático de uso general.

  • jq es un procesador de línea de comandos que le ayuda a trabajar con archivos JSON.

Repositorio de código

El código de este patrón está disponible en el GitHub repositorio -. amazon-guardduty-for-aws organizations-with-terraform

Epics

TareaDescripciónHabilidades requeridas

Clonar el repositorio.

En un intérprete de comandos de Bash, ejecute el siguiente comando. En Clonar el repositorio, en la sección de información adicional, puedes copiar el comando completo que contiene la URL del GitHub repositorio. Esto clona el organizations-with-terraform repositorio amazon-guardduty-for-aws- desde GitHub.

git clone <github-repository-url>
DevOps ingeniero

Edite el archivo de configuración de Terraform.

  1. En la carpeta root del repositorio clonado, replique el archivo configuration.json.sample ejecutando el siguiente comando.

    cp configuration.json.sample configuration.json
  2. Edite el nuevo archivo configuration.json y defina los valores de cada una de las siguientes variables:

    • management_acc_id – ID de cuenta de la cuenta de administración.

    • delegated_admin_acc_id – ID de cuenta de la cuenta de seguridad.

    • logging_acc_id – ID de cuenta de la cuenta de registro.

    • target_regions— Lista separada por comas de las regiones de AWS en las que desea habilitar. GuardDuty

    • organization_id— ID de AWS Organizations de la organización en la que está realizando la activación GuardDuty.

    • default_region – Región en la que se almacena su estado de Terraform en la cuenta de administración. Es la misma región en la que implementó el bucket de S3 y la tabla de DynamoDB para el backend de Terraform.

    • role_to_assume_for_role_creation – Nombre que desea asignar a un nuevo rol de IAM en las cuentas de seguridad y registro. Creará este nuevo rol en la siguiente historia. Terraform asume este rol para crear el rol de IAM GuardDutyTerraformOrgRole en las cuentas de seguridad y registro.

    • finding_publishing_frequency— Frecuencia con la que se GuardDuty publican los resultados en el segmento S3.

    • guardduty_findings_bucket_region – Región preferida en la que desea crear el bucket de S3 para los resultados publicados.

    • logging_acc_s3_bucket_name – Nombre preferido del bucket de S3 para los resultados publicados.

    • security_acc_kms_key_alias— Alias de AWS KMS para la clave utilizada para cifrar GuardDuty los hallazgos.

    • s3_access_log_bucket_name— Nombre de un depósito de S3 preexistente en el que desea recopilar los registros de acceso del depósito de S3 utilizado para GuardDuty las búsquedas. Este depósito debe estar en la misma región de AWS que el depósito de GuardDuty hallazgos.

    • tfm_state_backend_s3_bucket – Nombre del bucket de S3 preexistente para almacenar el estado del backend remoto de Terraform.

    • tfm_state_backend_dynamodb_table – Nombre de la tabla de DynamoDB preexistente para bloquear el estado de Terraform.

  3. Guarde y cierre el archivo de configuración.

DevOps ingeniero, AWS general, Terraform, Python

Genere CloudFormation plantillas para nuevas funciones de IAM.

Este patrón incluye una solución de IaC para crear dos CloudFormation plantillas. Estas plantillas crean dos roles de IAM que Terraform usará durante el proceso de configuración. Estas plantillas satisfacen las prácticas recomendadas de seguridad de permisos con privilegio mínimo.

  1. En un intérprete de comandos de Bash, en la carpeta root del repositorio, acceda a cfn-templates/. Esta carpeta contiene archivos de CloudFormation plantillas con talones.

  2. Ejecute el siguiente comando. Este paso reemplaza los stubs por los valores que proporcionó en el archivo configuration.json.

    bash scripts/replace_config_stubs.sh
  3. Confirme que se hayan creado CloudFormation las siguientes plantillas en la cfn-templates/ carpeta:

    • management-account-role.yaml: este archivo contiene la definición del rol y los permisos asociados al rol de IAM en la cuenta de administración, que tiene los permisos mínimos necesarios para completar este patrón.

    • role-to-assume-for-role-creation.yaml: este archivo contiene la definición del rol y los permisos asociados al rol de IAM en las cuentas de seguridad y registro. Terraform asume esta función para crear la función en estas cuentas. GuardDutyTerraformOrgRole

DevOps ingeniero, AWS general

Cree el rol de IAM.

Siguiendo las instrucciones de Creación de una pila (CloudFormation documentación), haga lo siguiente:

  1. Implemente la pila role-to-assume-for-role-creation.yaml tanto en la cuenta de seguridad como en la de registro.

  2. Implemente la pila .yaml en la cuenta de administraciónmanagement-account-role. Cuando haya creado correctamente la pila y el resultado muestre el estado CREATE_COMPLETE, anote el nombre de recurso de Amazon (ARN) de este nuevo rol.

DevOps ingeniero, AWS general

Asuma el rol de IAM de la cuenta de administración

Como práctica recomendada de seguridad, le recomendamos que asuma la nueva función de management-account-roleIAM antes de continuar. En la interfaz de la línea de comandos de AWS (AWS CLI), ejecute el comando de Asumir el rol de IAM de la cuenta de administración, en la sección Información adicional.

DevOps ingeniero, AWS general

Ejecute el script de configuración.

En la carpeta root del repositorio, ejecute el siguiente comando para iniciar el script de configuración.

bash scripts/full-setup.sh

El script full-setup.sh realiza las siguientes acciones:

  • Exporta todos los valores de configuración como variables de entorno

  • Genera los archivos de código backend.tf y terraform.tfvars para cada módulo de Terraform

  • Permite un acceso confiable a GuardDuty la organización a través de la AWS CLI.

  • Importa el estado de la organización al estado de Terraform

  • Crea el bucket de S3 para publicar los resultados en la cuenta de registro

  • Crea la clave de AWS KMS para cifrar los resultados en la cuenta de seguridad

  • Se habilita GuardDuty en toda la organización y en todas las regiones seleccionadas, tal y como se describe en la sección de arquitectura

DevOps ingeniero, Python
TareaDescripciónHabilidades requeridas

Ejecute el script de limpieza.

Si utilizó este patrón GuardDuty para activarlo en la organización y desea deshabilitarlo GuardDuty, ejecute el siguiente comando en la root carpeta del repositorio para iniciar el script cleanup-gd.sh.

bash scripts/cleanup-gd.sh

Este script se desactiva GuardDuty en la organización de destino, elimina todos los recursos desplegados y restaura la organización a su estado anterior antes de utilizar Terraform para activarlo. GuardDuty

nota

Este script no elimina los archivos de estado de Terraform ni bloquea los archivos de los backends locales y remotos. Si necesita hacerlo, debe llevar a cabo estas acciones manualmente. Este script tampoco elimina la organización importada ni las cuentas que gestiona. El acceso seguro para GuardDuty no está desactivado como parte del script de limpieza.

DevOps ingeniero, AWS general, Terraform, Python

Elimine los roles de IAM.

Elimine las pilas que se crearon con las plantillas role-to-assume-for-role-creation.yaml y .yaml. management-account-role CloudFormation Para obtener más información, consulta Eliminar una pila (documentación). CloudFormation

DevOps ingeniero, AWS general

Recursos relacionados

Documentación de AWS

Marketing de AWS

Otros recursos

Información adicional

Clone el repositorio

Ejecute el siguiente comando para clonar el GitHub repositorio.

git clone https://github.com/aws-samples/amazon-guardduty-for-aws-organizations-with-terraform

Asuma el rol de IAM de la cuenta de administración

Para asumir el rol de IAM en la cuenta de administración, ejecute el siguiente comando. Sustituya <IAM role ARN> con el ARN del rol de IAM.

export ROLE_CREDENTIALS=$(aws sts assume-role --role-arn <IAM role ARN> --role-session-name AWSCLI-Session --output json) export AWS_ACCESS_KEY_ID=$(echo $ROLE_CREDENTIALS | jq .Credentials.AccessKeyId | sed 's/"//g') export AWS_SECRET_ACCESS_KEY=$(echo $ROLE_CREDENTIALS | jq .Credentials.SecretAccessKey | sed 's/"//g') export AWS_SESSION_TOKEN=$(echo $ROLE_CREDENTIALS | jq .Credentials.SessionToken | sed 's/"//g')