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

Repositorio de código: - amazon-guardduty-for-aws organizations-with-terraform

Entorno: producción

Tecnologías: seguridad, identidad, cumplimiento; DevOps

Carga de trabajo: todas las demás cargas de trabajo

AWSservicios: Amazon GuardDuty; AWS Organizations

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 AWS entorno. Habilitar GuardDuty manualmente varias cuentas u organizaciones, en varias AWS regiones o a través de la consola AWS de administración puede resultar engorroso. 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.

AWSrecomienda 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 AWS las cuentas que son miembros actuales de la organización de destino 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 tienen experiencia con Terraform GuardDuty, Python y AWS Organizations.

Requisitos previos y limitaciones

Requisitos previos 

  • Una cuenta de AWS activa.

  • Una organización se configura en AWS Organizations y contiene 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 la configuración requerida, consulte Crear una estructura de cuentas (AWSWell-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 vas a realizar el despliegue en una zona de aterrizaje de la Torre de AWS Control Tower, puedes reutilizar el depósito 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 Get Started 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).

  • AWSSDKpara Python (Boto3) está 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 está diseñado para una zona de AWS landing zone que sigue las siguientes prácticas recomendadas:

    • La landing zone se creó utilizando la Torre AWS de Control.

    • Se utilizan AWS cuentas separadas 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 desplegados en las distintas cuentas de la organización, dentro de una sola AWS región.

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

  2. Terraform crea un bucket de S3 en la AWS región predeterminada de la cuenta de registro. Este depósito 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 AWS clave del servicio de administración de claves (AWSKMS) en la cuenta de seguridad que se utiliza para cifrar los hallazgos del depósito de S3 y configura el archivado automático de los hallazgos del depósito de S3 en el almacenamiento de S3 Glacier Flexible Retrieval.

  3. Desde la cuenta de administración, Terraform designa la cuenta de seguridad como administradora delegada. 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 de 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 del 3 al 7 para cada AWS región 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

AWSservicios

  • Amazon DynamoDB es un servicio SQL sin base de datos totalmente administrado que proporciona 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 AWS entorno.

  • AWSIdentity and Access Management (IAM) le ayuda a administrar de forma segura el acceso a sus AWS recursos al controlar quién está autenticado y autorizado a usarlos.

  • AWSEl Servicio de administración de claves (AWSKMS) le ayuda a crear y controlar claves criptográficas para proteger sus datos.

  • AWSOrganizations es un servicio de administración de cuentas que le ayuda a consolidar varias AWS cuentas en una organización que usted crea y administra de forma 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.

  • AWSSDKfor Python (Boto3) es un kit de desarrollo de software que le ayuda a integrar su aplicación, biblioteca o script de Python con AWS los servicios.

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 GitHub, en el amazon-guardduty-for-aws repositorio -. 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, puede copiar el comando completo que contiene el URL 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 AWS las regiones en las que desea activar. GuardDuty

    • organization_id— ID de AWS organización 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 IAM rol en las cuentas de seguridad y registro. Creará este nuevo rol en la siguiente historia. Terraform asume esta función para crearla GuardDutyTerraformOrgRole IAM 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— AWS KMS alias de 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 grupo debe estar en la misma AWS región que el grupo 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, GeneralAWS, Terraform, Python

Genere CloudFormation plantillas para nuevos IAM roles.

Este patrón incluye una solución de IaC para crear dos CloudFormation plantillas. Estas plantillas crean dos IAM funciones que Terraform utiliza 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 códigos auxiliares.

  2. Ejecute el siguiente comando de la . 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 IAM rol 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 mismo en las cuentas de seguridad y registro. IAM Terraform asume esta función para crear la función en estas cuentas. GuardDutyTerraformOrgRole

DevOps ingeniero, general AWS

Crea los IAM roles.

Siguiendo las instrucciones de Crear 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 hayas creado correctamente la pila y veas su estado, en el resultado, anota el nombre del recurso de Amazon (ARN) de esta nueva función. CREATE_COMPLETE

DevOps ingeniero, general AWS

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

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

DevOps ingeniero, general AWS

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 del AWSCLI.

  • 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 AWS KMS clave para cifrar los hallazgos en la cuenta de seguridad

  • Funciona GuardDuty en toda la organización y en todas las regiones seleccionadas, tal y como se describe en la sección 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, GeneralAWS, Terraform, Python

Eliminar IAM roles.

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, general AWS

Recursos relacionados

AWSdocumentación

AWSmarketing

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 la IAM función de cuenta de administración

Para asumir el IAM rol en la cuenta de administración, ejecute el siguiente comando. <IAM role ARN>ARNSustitúyalo por el del IAM rol.

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')