Implemente y gestione los controles de la Torre de Control de AWS mediante AWS CDK y AWS CloudFormation - 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.

Implemente y gestione los controles de la Torre de Control de AWS mediante AWS CDK y AWS CloudFormation

Creado por Iker Reina Fuente (AWS) e Ivan Girardi (AWS)

Repositorio de código: -cdk aws-control-tower-controls

Entorno: producción

Tecnologías: seguridad, identidad y cumplimiento; infraestructura CloudNative; gestión y gobierno

Servicios de AWS: AWS CloudFormation; Torre de Control de AWS; AWS Organizations; AWS CDK

Resumen

Este patrón describe cómo usar AWS CloudFormation y el AWS Cloud Development Kit (AWS CDK) para implementar y administrar controles preventivos, detectivescos y proactivos de la Torre de Control de AWS como infraestructura como código (IaC). Un control (también conocido como barrera de protección) es una regla de alto nivel que proporciona gobernanza continua para su entorno general de AWS Control Tower. Por ejemplo, puede usar controles para exigir registrarse en sus cuentas de AWS y, a continuación, configurar notificaciones automáticas si se producen eventos específicos relacionados con la seguridad.

AWS Control Tower ayuda a implementar controles preventivos, de detección y proactivos que regulen sus recursos de AWS y supervisen el cumplimiento en varias cuentas de AWS. Cada control aplica una única regla. En este patrón, debe utilizar la plantilla de IaC proporcionada para especificar qué controles desea implementar en su entorno.

Los controles de AWS Control Tower se aplican a toda una unidad organizativa (OU), y el control afecta a todas las cuentas de AWS de la OU. Por lo tanto, cuando los usuarios realicen cualquier acción en cualquier cuenta de su zona de aterrizaje, la acción queda sujeta a los controles que rigen la OU.

La implementación de los controles de AWS Control Tower ayuda a establecer una base de seguridad sólida para su AWS landing zone. Al usar este patrón para implementar los controles como IaC o AWS CDK, puede estandarizar los controles en su landing zone CloudFormation e implementarlos y administrarlos de manera más eficiente. Esta solución utiliza cdk_nag para analizar la aplicación AWS CDK durante la implementación. Esta herramienta comprueba si la aplicación cumple con las prácticas recomendadas de AWS.

Para implementar los controles de la Torre de Control de AWS como iAC, también puede usar HashiCorp Terraform en lugar de AWS CDK. Para obtener más información, consulte Implementación y administración de los controles de AWS Control Tower mediante Terraform.

Público objetivo

Este patrón se recomienda para los usuarios que tengan experiencia con AWS Control Tower CloudFormation, AWS CDK y AWS Organizations.

Requisitos previos y limitaciones

Requisitos previos 

  • Cuentas de AWS activas administradas como una organización en AWS Organizations y en una zona de aterrizaje de AWS Control Tower. Para obtener instrucciones, consulte Crear una estructura de cuentas (AWS Well-Architected Labs).

  • Interfaz de la línea de comandos de AWS (AWS CLI) instalada y configurada.

  • Administrador de paquetes de nodos (npm), instalado y configurado para AWS CDK.

  • Requisitos previos para AWS CDK.

  • Permisos para asumir un rol existente de AWS Identity and Access Management (IAM) en una cuenta de implementación.

  • Permisos para asumir un rol de IAM en la cuenta de administración de la organización que se pueden utilizar para iniciar AWS CDK. El rol debe tener permisos para modificar e implementar CloudFormation los recursos. Para obtener más información, consulte Proceso de arranque en la documentación de AWS CDK.

  • Permisos para crear roles y políticas de IAM en la cuenta de administración de la organización. Para obtener más información, consulte Permisos necesarios para acceder a los recursos de IAM en la documentación de IAM.

  • Aplique el control basado en la política de control de servicio (SCP) con el identificador CT.CLOUDFORMATION.PR.1. Este SCP debe estar activado para implementar controles proactivos. Para obtener instrucciones, consulte No permitir la administración de tipos de recursos, módulos y enlaces en el CloudFormation registro de AWS.

Limitaciones

  • Este patrón proporciona instrucciones para implementar esta solución en todas las cuentas de AWS, desde una cuenta de implementación hasta la cuenta de administración de la organización. Para realizar pruebas, puede implementar esta solución directamente en la cuenta de administración, pero las instrucciones para esta configuración no se proporcionan de forma explícita.

Versiones de producto

  • Python, versión 3.9 o posterior

  • npm versión 8.9.0 o posterior

Arquitectura

Arquitectura de destino

En esta sección se ofrece información general sobre esta solución y la arquitectura establecida en el código de ejemplo. El siguiente diagrama muestra los controles implementados en las distintas cuentas de la OU.

Diagrama de la arquitectura de los controles implementados en todas las cuentas de AWS de la unidad organizativa

Los controles de AWS Control Tower se clasifican según su comportamiento y sus directrices.

Existen tres tipos principales de comportamientos de control:

  1. Los controles preventivos están diseñados para evitar que se produzcan acciones. Se implementan con políticas de control de servicio (SCP) en AWS Organizations. El estado de una medida de seguridad preventiva es uno de los siguientes: aplicado o no habilitado. Las medidas de seguridad preventivas se admiten en todas las regiones de AWS.

  2. Los controles de Detective están diseñados para detectar eventos específicos cuando se producen y registrar la acción CloudTrail. Se implementan con las reglas AWS Config. El estado de una medida de seguridad de detección es uno de los siguientes: limpio, infraccióno no habilitado. Los controles de detección solo se aplican en las regiones de AWS compatibles con AWS Control Tower.

  3. Los controles proactivos analizan los recursos que AWS aprovisionaría CloudFormation y comprueban si cumplen con las políticas y los objetivos de su empresa. Los recursos que no sean conformes no se aprovisionarán. Se implementan con los CloudFormation ganchos de AWS. El estado de un control proactivo es PASS, FAIL o SKIP.

Las directrices de los controles se refieren a la práctica recomendada relativa a cómo aplicar cada control a las unidades organizativas. AWS Control Tower ofrece tres categorías de directrices: obligatorias, altamente recomendadas y opcionales. La directriz de un control es independiente de su comportamiento. Para obtener más información, consulte Directrices y comportamiento de control.

Herramientas

Servicios de AWS

  • AWS Cloud Development Kit (AWS CDK) es un marco de desarrollo de software que le ayuda a definir y aprovisionar la infraestructura de la nube de AWS en código. El kit de herramientas de AWS CDK es la herramienta principal para interactuar con la aplicación de AWS CDK.

  • AWS le CloudFormation ayuda a configurar los recursos de AWS, aprovisionarlos de forma rápida y coherente y gestionarlos durante todo su ciclo de vida en todas las cuentas y regiones de AWS.

  • AWS Config proporciona una visión detallada de los recursos de su cuenta de AWS y de cómo están configurados. Le ayuda a identificar cómo se relacionan los recursos entre sí y cómo han cambiado sus configuraciones a lo largo del tiempo.

  • AWS Control Tower le ayuda a configurar y regular un entorno de cuentas múltiples de AWS siguiendo las prácticas recomendadas prescriptivas.

  • 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.

Otras herramientas

  • cdk_nag es una herramienta de código abierto que utiliza una combinación de paquetes de reglas para comprobar si las aplicaciones del AWS Cloud Development Kit (AWS CDK) cumplen las prácticas recomendadas.

  • npm es un registro de software que se ejecuta en un entorno Node.js y se utiliza para compartir o tomar prestados paquetes y administrar la implementación de paquetes privados.

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

Repositorio de código

El código de este patrón está disponible en el repositorio GitHub Implementar controles de la Torre de Control de AWS mediante AWS CDK. El archivo cdk.json se utiliza para interactuar con la aplicación AWS CDK y el archivo package.json se utiliza para instalar los paquetes npm.

Prácticas recomendadas

Epics

TareaDescripciónHabilidades requeridas

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

  1. Cree una política de IAM en la cuenta de administración con los permisos definidos en la Política de IAM, en la sección Información adicional. Para obtener más información, consulte Creación de políticas de IAM en la documentación de IAM. Tome nota del nombre de recurso de Amazon (ARN) de la política. A continuación se muestra un ejemplo de ARN.

    arn:aws:iam::<MANAGEMENT-ACCOUNT-ID>:policy/<POLICY-NAME>
  2. Cree un rol de IAM en la cuenta de administración, adjunte la política de permisos de IAM que ha creado en el paso anterior y adjunte la política de confianza personalizada de la Política de confianza en la sección Información adicional. Para obtener instrucciones, consulte Creación de un rol mediante políticas de confianza personalizadas en la documentación de IAM. A continuación se muestra un ejemplo de ARN para el nuevo rol.

    arn:aws:iam:: <MANAGEMENT-ACCOUNT-ID>:role/<ROLE-NAME>
DevOps ingeniero, AWS general

Arrancar el AWS CDK.

  1. En la cuenta de administración, asuma un rol que tenga permisos para arrancar el AWS CDK.

  2. Introduzca el siguiente comando, reemplazando lo siguiente:

    • <MANAGEMENT-ACCOUNT-ID> es el ID de la cuenta de administración de la organización.

    • <AWS-CONTROL-TOWER-REGION> es la región de AWS en la que se implementa el Control Tower. Para obtener la lista completa de códigos de región, consulte Puntos de conexión regionales en la Referencia general de AWS.

    • <DEPLOYMENT-ACCOUNT-ID> es el ID de la cuenta de implementación.

    • <DEPLOYMENT-ROLE-NAME> es el nombre del rol de IAM que está utilizando en la cuenta de implementación.

    • <POLICY-NAME> es el nombre de la política que ha creado en la cuenta de administración.

    $ npx cdk bootstrap aws://<MANAGEMENT-ACCOUNT-ID>/<AWS-CONTROL-TOWER-REGION> \ --trust arn:aws:iam::<DEPLOYMENT-ACCOUNT-ID>:role/<DEPLOYMENT-ROLE-NAME> \ --cloudformation-execution-policies arn:aws:iam::<MANAGEMENT-ACCOUNT-ID>:policy/<POLICY-NAME>
DevOps ingeniero, AWS general, Python

Clonar el repositorio.

En un shell de bash, ingrese el siguiente comando: Esto clona los controles de la Torre de Control de AWS mediante el repositorio CDK de AWS desde GitHub.

git clone https://github.com/aws-samples/aws-control-tower-controls-cdk.git
DevOps ingeniero, AWS general

Editar el archivo de configuración de AWS CDK.

  1. En el repositorio clonado, abra el archivo constants.py.

  2. En el parámetro ACCOUNT_ID, introduzca el ID de su cuenta de administración.

  3. En el parámetro <AWS-CONTROL-TOWER-REGION>, introduzca la región de AWS en la que se implementa AWS Control Tower.

  4. En el parámetro ROLE_ARN, introduzca el ARN del rol que ha creado en la cuenta de administración.

  5. En la sección GUARDRAILS_CONFIGURATION, en el parámetro Enable-Control, introduzca los identificadores de API de los controles. Introduzca el identificador entre comillas dobles y separe los diversos identificadores con comas. Cada control tiene un identificador de API único para cada Región en la que está disponible AWS Control Tower. Para buscar el identificador del control, haga lo siguiente:

    1. En las Tablas de metadatos de los controles, localice el control que desee activar.

    2. En la columna Identificadores de la API de control, por región, localice el identificador de API de la región en la que va a realizar la llamada a la API, por ejemplo arn:aws:controltower:us-east-1::control/AWS-GR_ENCRYPTED_VOLUMES.

    3. Extraiga el identificador de control del identificador regional, por ejemplo AWS-GR_ENCRYPTED_VOLUMES.

  6. En la sección GUARDRAILS_CONFIGURATION, en el parámetro OrganizationalUnitIds, introduzca el ID de la unidad organizativa en la que quiere habilitar el control, por ejemplo ou-1111-11111111. Introduzca el identificador entre comillas dobles y separe los identificadores múltiples con comas. Para obtener más información sobre cómo recuperar los ID de una OU, consulte Visualización de los detalles de una OU.

  7. Guarde y cierre el archivo constants.py. Para ver un ejemplo de un archivo constants.py actualizado, consulte la sección Información adicional de este patrón.

TareaDescripciónHabilidades requeridas

Asumir el rol de IAM en la cuenta de implementación.

En la cuenta de implementación, asuma el rol de IAM que tiene permisos para implementar las pilas de AWS CDK en la cuenta de administración. Para obtener más información sobre cómo asumir un rol de IAM en la AWS CLI, consulte Uso de un rol de IAM en la AWS CLI.

DevOps ingeniero, AWS general

Activar el entorno.

Si utiliza Linux o MacOS:

  1. Especifique el siguiente comando para crear un entorno virtual.

    $ python3 -m venv .venv
  2. Una vez creado el entorno virtual, introduzca el siguiente comando para activarlo.

    $ source .venv/bin/activate

Si utiliza Windows:

  1. Especifique el siguiente comando para activar un entorno virtual.

    % .venv\Scripts\activate.bat
DevOps ingeniero, AWS general

Instalar las dependencias.

Una vez activado el entorno virtual, introduzca el siguiente comando para ejecutar el script install_deps.sh. Este script instala las dependencias requeridas.

$ ./scripts/install_deps.sh
DevOps ingeniero, AWS general, Python

Implemente la pila.

Introduzca los siguientes comandos para sintetizar e implementar la CloudFormation pila.

$ npx cdk synth $ npx cdk deploy
DevOps ingeniero, AWS general, Python

Recursos relacionados

Documentación de AWS

Otros recursos

Información adicional

Ejemplo de archivo constants.py

El siguiente es un ejemplo de un archivo constants.py.

ACCOUNT_ID = 111122223333 AWS_CONTROL_TOWER_REGION = us-east-2 ROLE_ARN = "arn:aws:iam::111122223333:role/CT-Controls-Role" GUARDRAILS_CONFIGURATION = [ { "Enable-Control": { "AWS-GR_ENCRYPTED_VOLUMES", ... }, "OrganizationalUnitIds": ["ou-1111-11111111", "ou-2222-22222222"...], }, { "Enable-Control": { "AWS-GR_SUBNET_AUTO_ASSIGN_PUBLIC_IP_DISABLED", ... }, "OrganizationalUnitIds": ["ou-2222-22222222"...], }, ]

Política de IAM

El siguiente ejemplo de política permite realizar las acciones mínimas necesarias para habilitar o deshabilitar los controles de AWS Control Tower al implementar pilas de AWS CDK desde una cuenta de implementación a la cuenta de administración.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "controltower:EnableControl", "controltower:DisableControl", "controltower:GetControlOperation", "controltower:ListEnabledControls", "organizations:AttachPolicy", "organizations:CreatePolicy", "organizations:DeletePolicy", "organizations:DescribeOrganization", "organizations:DescribeOrganizationalUnit", "organizations:DetachPolicy", "organizations:ListAccounts", "organizations:ListAWSServiceAccessForOrganization", "organizations:ListChildren", "organizations:ListOrganizationalUnitsForParent", "organizations:ListParents", "organizations:ListPoliciesForTarget", "organizations:ListRoots", "organizations:UpdatePolicy", "ssm:GetParameters" ], "Resource": "*" } ] }

Política de confianza

La siguiente política de confianza personalizada permite que un rol de IAM específico en la cuenta de implementación asuma el rol de IAM en la cuenta de administración. Sustituya lo siguiente:

  • <DEPLOYMENT-ACCOUNT-ID> es el ID de la cuenta de implementación

  • <DEPLOYMENT-ROLE-NAME> es el nombre del rol en la cuenta de implementación que tiene permitido asumir el rol en la cuenta de administración

{ “Version”: “2012-10-17”, “Statement”: [ { “Effect”: “Allow”, “Principal”: { “AWS”: “arn:aws:iam::<DEPLOYMENT-ACCOUNT-ID>:role/<DEPLOYMENT-ROLE-NAME>” }, “Action”: “sts:AssumeRole”, “Condition”: {} } ] }